summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt21
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java4
-rw-r--r--cmds/dpm/src/com/android/commands/dpm/Dpm.java6
-rw-r--r--core/java/android/app/Activity.java7
-rw-r--r--core/java/android/app/ActivityManager.java83
-rw-r--r--core/java/android/app/ActivityManagerNative.java28
-rw-r--r--core/java/android/app/ActivityThread.java9
-rw-r--r--core/java/android/app/ActivityTransitionCoordinator.java23
-rw-r--r--core/java/android/app/BackStackRecord.java49
-rw-r--r--core/java/android/app/EnterTransitionCoordinator.java4
-rw-r--r--core/java/android/app/ExitTransitionCoordinator.java5
-rw-r--r--core/java/android/app/Fragment.java5
-rw-r--r--core/java/android/app/FragmentManager.java1
-rw-r--r--core/java/android/app/IActivityManager.java2
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java49
-rw-r--r--core/java/android/content/Intent.java4
-rw-r--r--core/java/android/content/pm/PackageParser.java35
-rw-r--r--core/java/android/content/res/TypedArray.java7
-rw-r--r--core/java/android/ddm/DdmHandleViewDebug.java21
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java6
-rw-r--r--core/java/android/hardware/camera2/impl/CameraDeviceImpl.java25
-rw-r--r--core/java/android/hardware/camera2/legacy/CameraDeviceState.java119
-rw-r--r--core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java58
-rw-r--r--core/java/android/hardware/camera2/legacy/CaptureCollector.java180
-rw-r--r--core/java/android/hardware/camera2/legacy/GLThreadManager.java82
-rw-r--r--core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java95
-rw-r--r--core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java14
-rw-r--r--core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java12
-rw-r--r--core/java/android/hardware/camera2/legacy/RequestHolder.java79
-rw-r--r--core/java/android/hardware/camera2/legacy/RequestQueue.java16
-rw-r--r--core/java/android/hardware/camera2/legacy/RequestThreadManager.java168
-rw-r--r--core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java4
-rw-r--r--core/java/android/hardware/camera2/utils/ArrayUtils.java13
-rw-r--r--core/java/android/hardware/input/KeyboardLayout.java15
-rw-r--r--core/java/android/net/ConnectivityManager.java14
-rw-r--r--core/java/android/net/NetworkStats.java11
-rw-r--r--core/java/android/nfc/cardemulation/AidGroup.java11
-rw-r--r--core/java/android/nfc/cardemulation/ApduServiceInfo.java6
-rw-r--r--core/java/android/os/UserManager.java41
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java12
-rw-r--r--core/java/android/service/voice/AlwaysOnHotwordDetector.java11
-rw-r--r--core/java/android/speech/tts/TextToSpeech.java11
-rw-r--r--core/java/android/speech/tts/TextToSpeechService.java2
-rw-r--r--core/java/android/speech/tts/Voice.java9
-rw-r--r--core/java/android/transition/Fade.java12
-rw-r--r--core/java/android/transition/Transition.java8
-rw-r--r--core/java/android/view/HardwareRenderer.java15
-rw-r--r--core/java/android/view/LayoutInflater.java6
-rw-r--r--core/java/android/view/MenuInflater.java21
-rw-r--r--core/java/android/view/ThreadedRenderer.java15
-rw-r--r--core/java/android/view/ViewRootImpl.java15
-rw-r--r--core/java/android/view/WindowManager.java20
-rw-r--r--core/java/android/view/WindowManagerGlobal.java34
-rw-r--r--core/java/android/view/WindowManagerPolicy.java30
-rw-r--r--core/java/android/view/accessibility/AccessibilityCache.java27
-rw-r--r--core/java/android/view/inputmethod/InputMethodInfo.java3
-rw-r--r--core/java/android/widget/EdgeEffect.java2
-rw-r--r--core/java/android/widget/FastScroller.java17
-rw-r--r--core/java/android/widget/RadialTimePickerView.java2
-rw-r--r--core/java/android/widget/RemoteViews.java6
-rw-r--r--core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl34
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java3
-rw-r--r--core/java/com/android/internal/app/WindowDecorActionBar.java9
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java20
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java2
-rw-r--r--core/java/com/android/internal/view/StandaloneActionMode.java7
-rw-r--r--core/java/com/android/internal/widget/ActionBarContainer.java42
-rw-r--r--core/java/com/android/internal/widget/ActionBarView.java29
-rw-r--r--core/java/com/android/internal/widget/DecorToolbar.java1
-rw-r--r--core/java/com/android/internal/widget/PreferenceImageView.java69
-rw-r--r--core/java/com/android/internal/widget/ToolbarWidgetWrapper.java47
-rw-r--r--core/jni/AndroidRuntime.cpp14
-rw-r--r--core/res/res/drawable-hdpi/spinner_textfield_activated_mtrl_alpha.9.pngbin455 -> 0 bytes
-rw-r--r--core/res/res/drawable-hdpi/spinner_textfield_default_mtrl_alpha.9.pngbin454 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_textfield_activated_mtrl_alpha.9.pngbin359 -> 0 bytes
-rw-r--r--core/res/res/drawable-mdpi/spinner_textfield_default_mtrl_alpha.9.pngbin356 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_textfield_activated_mtrl_alpha.9.pngbin526 -> 0 bytes
-rw-r--r--core/res/res/drawable-xhdpi/spinner_textfield_default_mtrl_alpha.9.pngbin522 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/spinner_textfield_activated_mtrl_alpha.9.pngbin769 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxhdpi/spinner_textfield_default_mtrl_alpha.9.pngbin769 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/spinner_textfield_activated_mtrl_alpha.9.pngbin1575 -> 0 bytes
-rw-r--r--core/res/res/drawable-xxxhdpi/spinner_textfield_default_mtrl_alpha.9.pngbin1520 -> 0 bytes
-rw-r--r--core/res/res/drawable/ic_ab_back_material.xml2
-rw-r--r--core/res/res/drawable/ic_corp_icon_badge.xml23
-rw-r--r--core/res/res/drawable/ic_corp_statusbar_icon.xml30
-rw-r--r--core/res/res/drawable/ic_dialog_alert_material.xml2
-rw-r--r--core/res/res/drawable/ic_go_search_api_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_copy_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_cut_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_moreoverflow_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_paste_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_selectall_material.xml2
-rw-r--r--core/res/res/drawable/ic_menu_share_material.xml2
-rw-r--r--core/res/res/drawable/ic_search_api_material.xml2
-rw-r--r--core/res/res/drawable/ic_voice_search_api_material.xml2
-rw-r--r--core/res/res/drawable/spinner_textfield_background_material.xml30
-rw-r--r--core/res/res/drawable/stat_notify_disabled_data.xml2
-rw-r--r--core/res/res/drawable/stat_notify_wifi_in_range.xml4
-rw-r--r--core/res/res/drawable/stat_sys_tether_wifi.xml2
-rw-r--r--core/res/res/layout/preference_material.xml5
-rw-r--r--core/res/res/layout/screen.xml3
-rw-r--r--core/res/res/layout/screen_custom_title.xml3
-rw-r--r--core/res/res/layout/screen_progress.xml3
-rw-r--r--core/res/res/layout/screen_simple.xml3
-rw-r--r--core/res/res/layout/screen_simple_overlay_action_mode.xml3
-rw-r--r--core/res/res/layout/screen_title.xml3
-rw-r--r--core/res/res/layout/screen_title_icons.xml3
-rw-r--r--core/res/res/values-am/strings.xml32
-rw-r--r--core/res/res/values-ca/strings.xml3
-rw-r--r--core/res/res/values-fa/strings.xml2
-rw-r--r--core/res/res/values-hi/strings.xml18
-rw-r--r--core/res/res/values-hy-rAM/strings.xml2
-rw-r--r--core/res/res/values-iw/strings.xml10
-rw-r--r--core/res/res/values-lv/strings.xml4
-rw-r--r--core/res/res/values-mcc204-mnc04/config.xml5
-rw-r--r--core/res/res/values-mcc238-mnc06/config.xml23
-rw-r--r--core/res/res/values-mcc310-mnc150/config.xml4
-rw-r--r--core/res/res/values-mcc310-mnc410/config.xml3
-rw-r--r--core/res/res/values-mcc311-mnc480/config.xml4
-rw-r--r--core/res/res/values-pl/strings.xml6
-rw-r--r--core/res/res/values-pt/strings.xml638
-rw-r--r--core/res/res/values-ro/strings.xml8
-rw-r--r--core/res/res/values-sw/strings.xml6
-rw-r--r--core/res/res/values-sw600dp/dimens_material.xml4
-rw-r--r--core/res/res/values-ta-rIN/strings.xml6
-rw-r--r--core/res/res/values-ur-rPK/strings.xml3
-rw-r--r--core/res/res/values-zh-rCN/strings.xml2
-rw-r--r--core/res/res/values/attrs.xml5
-rw-r--r--core/res/res/values/colors_material.xml18
-rw-r--r--core/res/res/values/config.xml17
-rw-r--r--core/res/res/values/dimens_material.xml8
-rw-r--r--core/res/res/values/public.xml963
-rw-r--r--core/res/res/values/symbols.xml4
-rw-r--r--core/res/res/values/themes.xml1
-rw-r--r--core/res/res/values/themes_holo.xml1
-rw-r--r--core/res/res/values/themes_material.xml25
-rw-r--r--core/tests/coretests/src/android/net/NetworkStatsTest.java10
-rw-r--r--data/keyboards/Vendor_0a5c_Product_8502.kl42
-rw-r--r--data/sounds/AudioPackage10.mk2
-rw-r--r--data/sounds/AudioPackage11.mk2
-rw-r--r--data/sounds/AudioPackage12.mk4
-rw-r--r--data/sounds/AudioPackage12_48.mk6
-rw-r--r--data/sounds/AudioPackage13.mk4
-rw-r--r--data/sounds/AudioPackage13_48.mk6
-rw-r--r--data/sounds/AudioPackage6.mk2
-rw-r--r--data/sounds/AudioPackage7.mk2
-rw-r--r--data/sounds/AudioPackage7alt.mk2
-rw-r--r--data/sounds/AudioPackage8.mk2
-rw-r--r--data/sounds/AudioPackage9.mk2
-rw-r--r--data/sounds/effects/material/ogg/camera_click.oggbin0 -> 7010 bytes
-rw-r--r--data/sounds/effects/material/ogg/camera_click_48k.oggbin0 -> 6863 bytes
-rw-r--r--docs/html/google/play/billing/index.jd3
-rw-r--r--docs/html/google/play/billing/v2/api.jd23
-rw-r--r--docs/html/google/play/billing/v2/billing_integrate.jd23
-rw-r--r--docs/html/google/play/billing/v2/billing_reference.jd23
-rw-r--r--docs/html/google/play/billing/v2/billing_subscriptions.jd23
-rw-r--r--graphics/java/android/graphics/ColorMatrixColorFilter.java6
-rw-r--r--graphics/java/android/graphics/LightingColorFilter.java11
-rw-r--r--graphics/java/android/graphics/PorterDuffColorFilter.java4
-rw-r--r--include/android_runtime/AndroidRuntime.h3
-rw-r--r--include/androidfw/ResourceTypes.h2
-rw-r--r--libs/androidfw/ResourceTypes.cpp38
-rwxr-xr-xlibs/androidfw/tests/data/basic/build4
-rw-r--r--libs/hwui/Caches.cpp1
-rwxr-xr-xlibs/hwui/OpenGLRenderer.cpp7
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h1
-rw-r--r--libs/hwui/Properties.h2
-rw-r--r--libs/hwui/RenderProperties.h4
-rw-r--r--libs/hwui/StatefulBaseRenderer.cpp7
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp8
-rw-r--r--libs/hwui/renderthread/EglManager.cpp18
-rw-r--r--libs/hwui/renderthread/EglManager.h2
-rw-r--r--location/java/android/location/LocationManager.java3
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java2
-rw-r--r--packages/PrintSpooler/res/values-es-rUS/strings.xml2
-rw-r--r--packages/PrintSpooler/res/values-eu-rES/strings.xml4
-rw-r--r--packages/PrintSpooler/res/values-hi/strings.xml4
-rw-r--r--packages/PrintSpooler/res/values-lo-rLA/strings.xml6
-rw-r--r--packages/PrintSpooler/res/values-pt-rPT/strings.xml2
-rw-r--r--packages/PrintSpooler/res/values-pt/strings.xml2
-rw-r--r--packages/PrintSpooler/res/values-ro/strings.xml21
-rw-r--r--packages/PrintSpooler/res/values-zh-rCN/strings.xml21
-rw-r--r--packages/PrintSpooler/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/model/MutexFileProvider.java2
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java45
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java26
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java16
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java22
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java4
-rw-r--r--packages/SettingsProvider/res/values-af/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-am/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-bg/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-bn-rBD/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ca/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-cs/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-da/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-de/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-el/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-en-rGB/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-en-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-es-rUS/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-es/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-et-rEE/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-eu-rES/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-fi/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-fr-rCA/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-fr/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-gl-rES/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-hi/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-hr/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-hu/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-hy-rAM/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-in/defaults.xml1
-rw-r--r--packages/SettingsProvider/res/values-is-rIS/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-it/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ja/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ka-rGE/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-kk-rKZ/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-km-rKH/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-kn-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ko/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ky-rKG/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-lo-rLA/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-lt/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-lv/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-mk-rMK/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ml-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-mn-rMN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-mr-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ms-rMY/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-nb/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ne-rNP/defaults.xml1
-rw-r--r--packages/SettingsProvider/res/values-nl/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-pl/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-pt-rPT/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-pt/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ro/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ru/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-si-rLK/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-sk/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-sl/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-sr/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-sv/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-sw/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ta-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-te-rIN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-th/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-tl/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-tr/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-uk/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-ur-rPK/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-uz-rUZ/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-vi/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-zh-rCN/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-zh-rHK/defaults.xml3
-rw-r--r--packages/SettingsProvider/res/values-zh-rTW/defaults.xml3
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java4
-rw-r--r--packages/SystemUI/AndroidManifest.xml15
-rw-r--r--packages/SystemUI/res/drawable/android.xml37
-rw-r--r--packages/SystemUI/res/drawable/cloud.xml24
-rw-r--r--packages/SystemUI/res/drawable/cloud_off.xml24
-rw-r--r--packages/SystemUI/res/drawable/moon.xml24
-rw-r--r--packages/SystemUI/res/drawable/placeholder.xml51
-rw-r--r--packages/SystemUI/res/drawable/recents_task_view_header_bg_color.xml (renamed from core/res/res/values/removed.xml)16
-rw-r--r--packages/SystemUI/res/drawable/scorecard.xml10
-rw-r--r--packages/SystemUI/res/drawable/scorecard_gameover.xml10
-rw-r--r--packages/SystemUI/res/drawable/star.xml24
-rw-r--r--packages/SystemUI/res/drawable/sun.xml29
-rw-r--r--packages/SystemUI/res/drawable/sun2.xml24
-rw-r--r--packages/SystemUI/res/layout/lland.xml53
-rw-r--r--packages/SystemUI/res/layout/recents_task_view.xml48
-rw-r--r--packages/SystemUI/res/layout/super_status_bar.xml8
-rw-r--r--packages/SystemUI/res/layout/zen_mode_panel.xml2
-rw-r--r--packages/SystemUI/res/values-af/config.xml2
-rw-r--r--packages/SystemUI/res/values-af/strings.xml2
-rw-r--r--packages/SystemUI/res/values-am/config.xml2
-rw-r--r--packages/SystemUI/res/values-am/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ar/config.xml2
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml2
-rw-r--r--packages/SystemUI/res/values-bg/config.xml26
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml2
-rw-r--r--packages/SystemUI/res/values-bn-rBD/config.xml2
-rw-r--r--packages/SystemUI/res/values-bn-rBD/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ca/config.xml2
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml10
-rw-r--r--packages/SystemUI/res/values-cs/config.xml2
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml2
-rw-r--r--packages/SystemUI/res/values-da/config.xml2
-rw-r--r--packages/SystemUI/res/values-da/strings.xml2
-rw-r--r--packages/SystemUI/res/values-de/config.xml2
-rw-r--r--packages/SystemUI/res/values-de/strings.xml2
-rw-r--r--packages/SystemUI/res/values-el/config.xml2
-rw-r--r--packages/SystemUI/res/values-el/strings.xml2
-rw-r--r--packages/SystemUI/res/values-en-rGB/config.xml2
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml1
-rw-r--r--packages/SystemUI/res/values-en-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml1
-rw-r--r--packages/SystemUI/res/values-es-rUS/config.xml2
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml2
-rw-r--r--packages/SystemUI/res/values-es/config.xml2
-rw-r--r--packages/SystemUI/res/values-es/strings.xml2
-rw-r--r--packages/SystemUI/res/values-et-rEE/config.xml2
-rw-r--r--packages/SystemUI/res/values-et-rEE/strings.xml2
-rw-r--r--packages/SystemUI/res/values-eu-rES/config.xml2
-rw-r--r--packages/SystemUI/res/values-eu-rES/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fa/config.xml2
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml4
-rw-r--r--packages/SystemUI/res/values-fi/config.xml26
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fr-rCA/config.xml2
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml2
-rw-r--r--packages/SystemUI/res/values-fr/config.xml2
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-gl-rES/config.xml2
-rw-r--r--packages/SystemUI/res/values-gl-rES/strings.xml6
-rw-r--r--packages/SystemUI/res/values-hi/config.xml2
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml14
-rw-r--r--packages/SystemUI/res/values-hr/config.xml2
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hu/config.xml2
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml2
-rw-r--r--packages/SystemUI/res/values-hy-rAM/config.xml26
-rw-r--r--packages/SystemUI/res/values-hy-rAM/strings.xml6
-rw-r--r--packages/SystemUI/res/values-in/config.xml2
-rw-r--r--packages/SystemUI/res/values-in/strings.xml2
-rw-r--r--packages/SystemUI/res/values-is-rIS/config.xml2
-rw-r--r--packages/SystemUI/res/values-is-rIS/strings.xml2
-rw-r--r--packages/SystemUI/res/values-it/config.xml2
-rw-r--r--packages/SystemUI/res/values-it/strings.xml2
-rw-r--r--packages/SystemUI/res/values-iw/config.xml2
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ja/config.xml2
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ka-rGE/config.xml26
-rw-r--r--packages/SystemUI/res/values-ka-rGE/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kk-rKZ/config.xml2
-rw-r--r--packages/SystemUI/res/values-kk-rKZ/strings.xml2
-rw-r--r--packages/SystemUI/res/values-km-rKH/config.xml2
-rw-r--r--packages/SystemUI/res/values-km-rKH/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kn-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-kn-rIN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ko/config.xml26
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ky-rKG/config.xml2
-rw-r--r--packages/SystemUI/res/values-ky-rKG/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lo-rLA/config.xml26
-rw-r--r--packages/SystemUI/res/values-lo-rLA/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lt/config.xml26
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml2
-rw-r--r--packages/SystemUI/res/values-lv/config.xml2
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-mk-rMK/config.xml26
-rw-r--r--packages/SystemUI/res/values-mk-rMK/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ml-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-ml-rIN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-mn-rMN/config.xml2
-rw-r--r--packages/SystemUI/res/values-mn-rMN/strings.xml7
-rw-r--r--packages/SystemUI/res/values-mr-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-mr-rIN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ms-rMY/config.xml26
-rw-r--r--packages/SystemUI/res/values-ms-rMY/strings.xml2
-rw-r--r--packages/SystemUI/res/values-my-rMM/config.xml2
-rw-r--r--packages/SystemUI/res/values-my-rMM/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nb/config.xml26
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ne-rNP/config.xml2
-rw-r--r--packages/SystemUI/res/values-ne-rNP/strings.xml2
-rw-r--r--packages/SystemUI/res/values-nl/config.xml2
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pl/config.xml2
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rPT/config.xml2
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml2
-rw-r--r--packages/SystemUI/res/values-pt/config.xml2
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ro/config.xml26
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml4
-rw-r--r--packages/SystemUI/res/values-ru/config.xml26
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml2
-rw-r--r--packages/SystemUI/res/values-si-rLK/config.xml26
-rw-r--r--packages/SystemUI/res/values-si-rLK/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sk/config.xml2
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sl/config.xml2
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sr/config.xml2
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sv/config.xml2
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml2
-rw-r--r--packages/SystemUI/res/values-sw/config.xml2
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ta-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-ta-rIN/strings.xml14
-rw-r--r--packages/SystemUI/res/values-te-rIN/config.xml2
-rw-r--r--packages/SystemUI/res/values-te-rIN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-th/config.xml2
-rw-r--r--packages/SystemUI/res/values-th/strings.xml2
-rw-r--r--packages/SystemUI/res/values-tl/config.xml2
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml2
-rw-r--r--packages/SystemUI/res/values-tr/config.xml26
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml2
-rw-r--r--packages/SystemUI/res/values-uk/config.xml2
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml2
-rw-r--r--packages/SystemUI/res/values-ur-rPK/config.xml26
-rw-r--r--packages/SystemUI/res/values-ur-rPK/strings.xml10
-rw-r--r--packages/SystemUI/res/values-uz-rUZ/config.xml2
-rw-r--r--packages/SystemUI/res/values-uz-rUZ/strings.xml2
-rw-r--r--packages/SystemUI/res/values-vi/config.xml26
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rCN/config.xml26
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zh-rHK/config.xml26
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml4
-rw-r--r--packages/SystemUI/res/values-zh-rTW/config.xml26
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml2
-rw-r--r--packages/SystemUI/res/values-zu/config.xml2
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml2
-rw-r--r--packages/SystemUI/res/values/colors.xml6
-rw-r--r--packages/SystemUI/res/values/config.xml17
-rw-r--r--packages/SystemUI/res/values/dimens.xml14
-rw-r--r--packages/SystemUI/res/values/lland_config.xml45
-rw-r--r--packages/SystemUI/res/values/lland_strings.xml22
-rw-r--r--packages/SystemUI/res/values/strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeHost.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeLog.java211
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeService.java212
-rw-r--r--packages/SystemUI/src/com/android/systemui/egg/LLand.java748
-rw-r--r--packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTileView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/Constants.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java48
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java77
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java286
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java69
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java124
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java43
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java173
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BackDropView.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java123
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java42
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java121
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java105
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java37
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java31
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java19
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindow.java115
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java144
-rw-r--r--policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java1
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java34
-rw-r--r--services/accessibility/java/com/android/server/accessibility/TouchExplorer.java110
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java16
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java4
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java14
-rw-r--r--services/core/java/com/android/server/InputMethodManagerService.java17
-rw-r--r--services/core/java/com/android/server/SystemConfig.java32
-rwxr-xr-xservices/core/java/com/android/server/am/ActiveServices.java12
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityManagerService.java57
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityRecord.java33
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityStack.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java59
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java7
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java25
-rw-r--r--services/core/java/com/android/server/am/TaskPersister.java30
-rw-r--r--services/core/java/com/android/server/am/TaskRecord.java85
-rw-r--r--services/core/java/com/android/server/am/UriPermission.java6
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkMonitor.java76
-rw-r--r--services/core/java/com/android/server/connectivity/PacManager.java4
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java187
-rw-r--r--services/core/java/com/android/server/input/InputManagerService.java41
-rw-r--r--services/core/java/com/android/server/location/GpsLocationProvider.java56
-rw-r--r--services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java37
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerInternal.java2
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java24
-rw-r--r--services/core/java/com/android/server/notification/NotificationRecord.java3
-rw-r--r--services/core/java/com/android/server/notification/ZenModeHelper.java15
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java37
-rw-r--r--services/core/java/com/android/server/power/Notifier.java30
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java20
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java21
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java60
-rw-r--r--services/core/jni/com_android_server_UsbHostManager.cpp10
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java31
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java80
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java11
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java42
-rw-r--r--telecomm/java/android/telecom/Call.java11
-rw-r--r--telecomm/java/android/telecom/DisconnectCause.java11
-rw-r--r--telecomm/java/android/telecom/RemoteConnectionService.java6
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java75
-rw-r--r--telecomm/java/com/android/internal/telecom/ITelecomService.aidl5
-rw-r--r--tests/Compatibility/Android.mk2
-rw-r--r--tests/Compatibility/AndroidManifest.xml2
-rw-r--r--tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java12
-rw-r--r--tools/aapt/AaptAssets.h3
-rw-r--r--tools/aapt/Images.cpp5
-rw-r--r--tools/aapt/Images.h2
-rw-r--r--tools/aapt/Main.h3
-rw-r--r--tools/aapt/Resource.cpp74
-rw-r--r--tools/aapt/ResourceTable.cpp357
-rw-r--r--tools/aapt/ResourceTable.h51
-rw-r--r--tools/aapt/XMLNode.cpp56
-rw-r--r--tools/aapt/XMLNode.h7
516 files changed, 8007 insertions, 2916 deletions
diff --git a/api/current.txt b/api/current.txt
index cbf4d67319b0..2cd1708727be 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -409,6 +409,7 @@ package android {
field public static final int colorControlActivated = 16843818; // 0x101042a
field public static final int colorControlHighlight = 16843820; // 0x101042c
field public static final int colorControlNormal = 16843817; // 0x1010429
+ field public static final int colorEdgeEffect = 16843982; // 0x10104ce
field public static final int colorFocusedHighlight = 16843663; // 0x101038f
field public static final int colorForeground = 16842800; // 0x1010030
field public static final int colorForegroundInverse = 16843270; // 0x1010206
@@ -10707,9 +10708,6 @@ package android.graphics {
public class ColorMatrixColorFilter extends android.graphics.ColorFilter {
ctor public ColorMatrixColorFilter(android.graphics.ColorMatrix);
ctor public ColorMatrixColorFilter(float[]);
- method public android.graphics.ColorMatrix getColorMatrix();
- method public void setColorMatrix(android.graphics.ColorMatrix);
- method public void setColorMatrix(float[]);
}
public class ComposePathEffect extends android.graphics.PathEffect {
@@ -10786,10 +10784,6 @@ package android.graphics {
public class LightingColorFilter extends android.graphics.ColorFilter {
ctor public LightingColorFilter(int, int);
- method public int getColorAdd();
- method public int getColorMultiply();
- method public void setColorAdd(int);
- method public void setColorMultiply(int);
}
public class LinearGradient extends android.graphics.Shader {
@@ -11295,8 +11289,6 @@ package android.graphics {
public class PorterDuffColorFilter extends android.graphics.ColorFilter {
ctor public PorterDuffColorFilter(int, android.graphics.PorterDuff.Mode);
- method public int getColor();
- method public android.graphics.PorterDuff.Mode getMode();
}
public class PorterDuffXfermode extends android.graphics.Xfermode {
@@ -27286,7 +27278,7 @@ package android.speech.tts {
method public boolean isSpeaking();
method public int playEarcon(java.lang.String, int, android.os.Bundle, java.lang.String);
method public deprecated int playEarcon(java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>);
- method public int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>, java.lang.String);
+ method public int playSilence(long, int, java.lang.String);
method public deprecated int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>);
method public int setAudioAttributes(android.media.AudioAttributes);
method public deprecated int setEngineByPackageName(java.lang.String);
@@ -27374,7 +27366,7 @@ package android.speech.tts {
public abstract class TextToSpeechService extends android.app.Service {
ctor public TextToSpeechService();
method public android.os.IBinder onBind(android.content.Intent);
- method protected java.lang.String onGetDefaultVoiceNameFor(java.lang.String, java.lang.String, java.lang.String);
+ method public java.lang.String onGetDefaultVoiceNameFor(java.lang.String, java.lang.String, java.lang.String);
method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String);
method protected abstract java.lang.String[] onGetLanguage();
method public java.util.List<android.speech.tts.Voice> onGetVoices();
@@ -27404,6 +27396,7 @@ package android.speech.tts {
method public int getQuality();
method public boolean isNetworkConnectionRequired();
method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
field public static final int LATENCY_HIGH = 400; // 0x190
field public static final int LATENCY_LOW = 200; // 0xc8
field public static final int LATENCY_NORMAL = 300; // 0x12c
@@ -28179,6 +28172,7 @@ package android.telecom {
public final class DisconnectCause implements android.os.Parcelable {
ctor public DisconnectCause(int);
ctor public DisconnectCause(int, java.lang.String);
+ ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
ctor public DisconnectCause(int, java.lang.CharSequence, java.lang.CharSequence, java.lang.String, int);
method public int describeContents();
method public int getCode();
@@ -28355,11 +28349,9 @@ package android.telecom {
method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
method public void cancelMissedCallsNotification();
method public void clearAccounts();
- method public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts();
method public android.telecom.PhoneAccountHandle getConnectionManager();
- method public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(java.lang.String);
method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
- method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(java.lang.String);
+ method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage();
method public boolean handleMmi(java.lang.String);
method public boolean hasMultipleCallCapableAccounts();
method public boolean isInCall();
@@ -28733,6 +28725,7 @@ package android.telephony {
field public static final java.lang.String MMS_CONFIG_UA_PROF_TAG_NAME = "uaProfTagName";
field public static final java.lang.String MMS_CONFIG_UA_PROF_URL = "uaProfUrl";
field public static final java.lang.String MMS_CONFIG_USER_AGENT = "userAgent";
+ field public static final int MMS_ERROR_CONFIGURATION_ERROR = 7; // 0x7
field public static final int MMS_ERROR_HTTP_FAILURE = 4; // 0x4
field public static final int MMS_ERROR_INVALID_APN = 2; // 0x2
field public static final int MMS_ERROR_IO_ERROR = 5; // 0x5
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index 57c1505d2ac3..5ba7d507f8f1 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -48,6 +48,7 @@ import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
@@ -726,6 +727,7 @@ public class Am extends BaseCommand {
IActivityManager.WaitResult result = null;
int res;
+ final long startTime = SystemClock.uptimeMillis();
if (mWaitOption) {
result = mAm.startActivityAndWait(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo, null, mUserId);
@@ -734,6 +736,7 @@ public class Am extends BaseCommand {
res = mAm.startActivityAsUser(null, null, intent, mimeType,
null, null, 0, mStartFlags, profilerInfo, null, mUserId);
}
+ final long endTime = SystemClock.uptimeMillis();
PrintStream out = mWaitOption ? System.out : System.err;
boolean launched = false;
switch (res) {
@@ -811,6 +814,7 @@ public class Am extends BaseCommand {
if (result.totalTime >= 0) {
System.out.println("TotalTime: " + result.totalTime);
}
+ System.out.println("WaitTime: " + (endTime-startTime));
System.out.println("Complete");
}
mRepeat--;
diff --git a/cmds/dpm/src/com/android/commands/dpm/Dpm.java b/cmds/dpm/src/com/android/commands/dpm/Dpm.java
index b8b20873066d..3b9a7857f660 100644
--- a/cmds/dpm/src/com/android/commands/dpm/Dpm.java
+++ b/cmds/dpm/src/com/android/commands/dpm/Dpm.java
@@ -94,7 +94,7 @@ public final class Dpm extends BaseCommand {
mDevicePolicyManager.removeActiveAdmin(component, UserHandle.USER_OWNER);
throw e;
}
- System.out.println("Device owner set to package " + packageName);
+ System.out.println("Success: Device owner set to package " + packageName);
System.out.println("Active admin set to component " + component.toShortString());
}
@@ -113,8 +113,8 @@ public final class Dpm extends BaseCommand {
mDevicePolicyManager.removeActiveAdmin(component, userId);
throw e;
}
- System.out.println("Active admin and profile owner set to " + component.toShortString() +
- " for user " + userId);
+ System.out.println("Success: Active admin and profile owner set to "
+ + component.toShortString() + " for user " + userId);
}
private ComponentName parseComponentName(String component) {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 701ab1d809dc..25c489736dfa 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -745,6 +745,11 @@ public class Activity extends ContextThemeWrapper
public View findViewById(int id) {
return Activity.this.findViewById(id);
}
+ @Override
+ public boolean hasView() {
+ Window window = Activity.this.getWindow();
+ return (window != null && window.peekDecorView() != null);
+ }
};
// Most recent call to requestVisibleBehind().
@@ -5066,7 +5071,7 @@ public class Activity extends ContextThemeWrapper
public void setTaskDescription(ActivityManager.TaskDescription taskDescription) {
ActivityManager.TaskDescription td;
// Scale the icon down to something reasonable if it is provided
- if (taskDescription.getIcon() != null) {
+ if (taskDescription.getIconFilename() == null && taskDescription.getIcon() != null) {
final int size = ActivityManager.getLauncherLargeIconSizeInner(this);
final Bitmap icon = Bitmap.createScaledBitmap(taskDescription.getIcon(), size, size, true);
td = new ActivityManager.TaskDescription(taskDescription.getLabel(), icon,
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 9486a72f91d4..85d4839d0c6e 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -56,9 +56,11 @@ import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Size;
import android.util.Slog;
+import org.xmlpull.v1.XmlSerializer;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -508,8 +510,18 @@ public class ActivityManager {
* Information you can set and retrieve about the current activity within the recent task list.
*/
public static class TaskDescription implements Parcelable {
+ /** @hide */
+ public static final String ATTR_TASKDESCRIPTION_PREFIX = "task_description_";
+ private static final String ATTR_TASKDESCRIPTIONLABEL =
+ ATTR_TASKDESCRIPTION_PREFIX + "label";
+ private static final String ATTR_TASKDESCRIPTIONCOLOR =
+ ATTR_TASKDESCRIPTION_PREFIX + "color";
+ private static final String ATTR_TASKDESCRIPTIONICONFILENAME =
+ ATTR_TASKDESCRIPTION_PREFIX + "icon_filename";
+
private String mLabel;
private Bitmap mIcon;
+ private String mIconFilename;
private int mColorPrimary;
/**
@@ -529,6 +541,12 @@ public class ActivityManager {
mColorPrimary = colorPrimary;
}
+ /** @hide */
+ public TaskDescription(String label, int colorPrimary, String iconFilename) {
+ this(label, null, colorPrimary);
+ mIconFilename = iconFilename;
+ }
+
/**
* Creates the TaskDescription to the specified values.
*
@@ -559,7 +577,10 @@ public class ActivityManager {
* Creates a copy of another TaskDescription.
*/
public TaskDescription(TaskDescription td) {
- this(td.getLabel(), td.getIcon(), td.getPrimaryColor());
+ mLabel = td.mLabel;
+ mIcon = td.mIcon;
+ setPrimaryColor(td.mColorPrimary);
+ mIconFilename = td.mIconFilename;
}
private TaskDescription(Parcel source) {
@@ -579,7 +600,7 @@ public class ActivityManager {
* @hide
*/
public void setPrimaryColor(int primaryColor) {
- mColorPrimary = primaryColor;
+ mColorPrimary = 0xFF000000 | primaryColor;
}
/**
@@ -591,6 +612,16 @@ public class ActivityManager {
}
/**
+ * Moves the icon bitmap reference from an actual Bitmap to a file containing the
+ * bitmap.
+ * @hide
+ */
+ public void setIconFilename(String iconFilename) {
+ mIconFilename = iconFilename;
+ mIcon = null;
+ }
+
+ /**
* @return The label and description of the current state of this task.
*/
public String getLabel() {
@@ -601,7 +632,22 @@ public class ActivityManager {
* @return The icon that represents the current state of this task.
*/
public Bitmap getIcon() {
- return mIcon;
+ if (mIcon != null) {
+ return mIcon;
+ }
+ if (mIconFilename != null) {
+ try {
+ return ActivityManagerNative.getDefault().
+ getTaskDescriptionIcon(mIconFilename);
+ } catch (RemoteException e) {
+ }
+ }
+ return null;
+ }
+
+ /** @hide */
+ public String getIconFilename() {
+ return mIconFilename;
}
/**
@@ -611,6 +657,30 @@ public class ActivityManager {
return mColorPrimary;
}
+ /** @hide */
+ public void saveToXml(XmlSerializer out) throws IOException {
+ if (mLabel != null) {
+ out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, mLabel);
+ }
+ if (mColorPrimary != 0) {
+ out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(mColorPrimary));
+ }
+ if (mIconFilename != null) {
+ out.attribute(null, ATTR_TASKDESCRIPTIONICONFILENAME, mIconFilename);
+ }
+ }
+
+ /** @hide */
+ public void restoreFromXml(String attrName, String attrValue) {
+ if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) {
+ setLabel(attrValue);
+ } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) {
+ setPrimaryColor((int) Long.parseLong(attrValue, 16));
+ } else if (ATTR_TASKDESCRIPTIONICONFILENAME.equals(attrName)) {
+ setIconFilename(attrValue);
+ }
+ }
+
@Override
public int describeContents() {
return 0;
@@ -631,12 +701,19 @@ public class ActivityManager {
mIcon.writeToParcel(dest, 0);
}
dest.writeInt(mColorPrimary);
+ if (mIconFilename == null) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(1);
+ dest.writeString(mIconFilename);
+ }
}
public void readFromParcel(Parcel source) {
mLabel = source.readInt() > 0 ? source.readString() : null;
mIcon = source.readInt() > 0 ? Bitmap.CREATOR.createFromParcel(source) : null;
mColorPrimary = source.readInt();
+ mIconFilename = source.readInt() > 0 ? source.readString() : null;
}
public static final Creator<TaskDescription> CREATOR
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 677fcef8d01a..11470e336b65 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2253,6 +2253,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case GET_TASK_DESCRIPTION_ICON_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ String filename = data.readString();
+ Bitmap icon = getTaskDescriptionIcon(filename);
+ reply.writeNoException();
+ if (icon == null) {
+ reply.writeInt(0);
+ } else {
+ reply.writeInt(1);
+ icon.writeToParcel(reply, 0);
+ }
+ return true;
+ }
+
case REQUEST_VISIBLE_BEHIND_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder token = data.readStrongBinder();
@@ -5241,6 +5255,20 @@ class ActivityManagerProxy implements IActivityManager
}
@Override
+ public Bitmap getTaskDescriptionIcon(String filename) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeString(filename);
+ mRemote.transact(GET_TASK_DESCRIPTION_ICON_TRANSACTION, data, reply, 0);
+ reply.readException();
+ final Bitmap icon = reply.readInt() == 0 ? null : Bitmap.CREATOR.createFromParcel(reply);
+ data.recycle();
+ reply.recycle();
+ return icon;
+ }
+
+ @Override
public boolean requestVisibleBehind(IBinder token, boolean visible) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index b4877de7a2e5..dd49009281f3 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -123,7 +123,6 @@ import libcore.io.DropBox;
import libcore.io.EventLogger;
import libcore.io.IoUtils;
import libcore.net.event.NetworkEventDispatcher;
-
import dalvik.system.CloseGuard;
import dalvik.system.VMDebug;
import dalvik.system.VMRuntime;
@@ -5088,10 +5087,8 @@ public final class ActivityThread {
mInstrumentation = new Instrumentation();
ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
- Application app = Instrumentation.newApplication(Application.class, context);
- mAllApplications.add(app);
- mInitialApplication = app;
- app.onCreate();
+ mInitialApplication = context.mPackageInfo.makeApplication(true, null);
+ mInitialApplication.onCreate();
} catch (Exception e) {
throw new RuntimeException(
"Unable to instantiate Application():" + e.toString(), e);
@@ -5135,6 +5132,8 @@ public final class ActivityThread {
// process.
if (!ActivityManager.isHighEndGfx()) {
HardwareRenderer.disable(true);
+ } else {
+ HardwareRenderer.enableForegroundTrimming();
}
ActivityThread thread = new ActivityThread();
thread.attach(true);
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index 137f77d038b6..540376ec5fb7 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -219,7 +219,9 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
protected void viewsReady(ArrayMap<String, View> sharedElements) {
sharedElements.retainAll(mAllSharedElementNames);
- mListener.onMapSharedElements(mAllSharedElementNames, sharedElements);
+ if (mListener != null) {
+ mListener.onMapSharedElements(mAllSharedElementNames, sharedElements);
+ }
mSharedElementNames.addAll(sharedElements.keySet());
mSharedElements.addAll(sharedElements.values());
if (getViewsTransition() != null && mTransitioningViews != null) {
@@ -461,7 +463,8 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
if (sharedElementState != null) {
Matrix tempMatrix = new Matrix();
RectF tempRect = new RectF();
- for (int i = 0; i < mSharedElementNames.size(); i++) {
+ final int numSharedElements = mSharedElements.size();
+ for (int i = 0; i < numSharedElements; i++) {
View sharedElement = mSharedElements.get(i);
String name = mSharedElementNames.get(i);
SharedElementOriginalState originalState = getOldSharedElementState(sharedElement,
@@ -471,12 +474,16 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
tempMatrix, tempRect, null);
}
}
- mListener.onSharedElementStart(mSharedElementNames, mSharedElements, snapshots);
+ if (mListener != null) {
+ mListener.onSharedElementStart(mSharedElementNames, mSharedElements, snapshots);
+ }
return originalImageState;
}
protected void notifySharedElementEnd(ArrayList<View> snapshots) {
- mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, snapshots);
+ if (mListener != null) {
+ mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, snapshots);
+ }
}
protected void scheduleSetSharedElementEnd(final ArrayList<View> snapshots) {
@@ -544,7 +551,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
if (sharedElementBundle != null) {
Parcelable parcelable = sharedElementBundle.getParcelable(KEY_SNAPSHOT);
View snapshot = null;
- if (parcelable != null) {
+ if (parcelable != null && mListener != null) {
snapshot = mListener.onCreateSnapshotView(context, parcelable);
}
if (snapshot != null) {
@@ -659,7 +666,11 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver {
sharedElementBundle.putFloat(KEY_TRANSLATION_Z, view.getTranslationZ());
sharedElementBundle.putFloat(KEY_ELEVATION, view.getElevation());
- Parcelable bitmap = mListener.onCaptureSharedElementSnapshot(view, tempMatrix, tempBounds);
+ Parcelable bitmap = null;
+ if (mListener != null) {
+ bitmap = mListener.onCaptureSharedElementSnapshot(view, tempMatrix, tempBounds);
+ }
+
if (bitmap != null) {
sharedElementBundle.putParcelable(KEY_SNAPSHOT, bitmap);
}
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 832e1e38d322..0092ee78ccd3 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -868,6 +868,9 @@ final class BackStackRecord extends FragmentTransaction implements
*/
private void calculateFragments(SparseArray<Fragment> firstOutFragments,
SparseArray<Fragment> lastInFragments) {
+ if (!mManager.mContainer.hasView()) {
+ return; // nothing to see, so no transitions
+ }
Op op = mHead;
while (op != null) {
switch (op.cmd) {
@@ -923,6 +926,9 @@ final class BackStackRecord extends FragmentTransaction implements
*/
public void calculateBackFragments(SparseArray<Fragment> firstOutFragments,
SparseArray<Fragment> lastInFragments) {
+ if (!mManager.mContainer.hasView()) {
+ return; // nothing to see, so no transitions
+ }
Op op = mHead;
while (op != null) {
switch (op.cmd) {
@@ -1104,7 +1110,8 @@ final class BackStackRecord extends FragmentTransaction implements
final Transition enterTransition, final Transition sharedElementTransition,
final Transition overallTransition, final View container,
final Fragment inFragment, final Fragment outFragment,
- final ArrayList<View> hiddenFragmentViews, final boolean isBack) {
+ final ArrayList<View> hiddenFragmentViews, final boolean isBack,
+ final ArrayList<View> sharedElementTargets) {
if (enterTransition == null && sharedElementTransition == null &&
overallTransition == null) {
return null;
@@ -1123,6 +1130,15 @@ final class BackStackRecord extends FragmentTransaction implements
ArrayMap<String, View> namedViews = null;
if (sharedElementTransition != null) {
namedViews = mapSharedElementsIn(state, isBack, inFragment);
+ removeTargets(sharedElementTransition, sharedElementTargets);
+ sharedElementTargets.clear();
+ if (namedViews.isEmpty()) {
+ sharedElementTargets.add(state.nonExistentView);
+ } else {
+ sharedElementTargets.addAll(namedViews.values());
+ }
+
+ addTargets(sharedElementTransition, sharedElementTargets);
setEpicenterIn(namedViews, state);
@@ -1203,11 +1219,17 @@ final class BackStackRecord extends FragmentTransaction implements
Transition transition;
if (overlap) {
// Regular transition -- do it all together
- transition = TransitionUtils.mergeTransitions(enterTransition, exitTransition,
- sharedElementTransition);
- if (!(transition instanceof TransitionSet)) {
- transition = new TransitionSet().addTransition(transition);
+ TransitionSet transitionSet = new TransitionSet();
+ if (enterTransition != null) {
+ transitionSet.addTransition(enterTransition);
+ }
+ if (exitTransition != null) {
+ transitionSet.addTransition(exitTransition);
}
+ if (sharedElementTransition != null) {
+ transitionSet.addTransition(sharedElementTransition);
+ }
+ transition = transitionSet;
} else {
// First do exit, then enter, but allow shared element transition to happen
// during both.
@@ -1268,8 +1290,15 @@ final class BackStackRecord extends FragmentTransaction implements
enterTransition.addTarget(state.nonExistentView);
}
ArrayMap<String, View> namedViews = null;
+ ArrayList<View> sharedElementTargets = new ArrayList<View>();
if (sharedElementTransition != null) {
namedViews = remapSharedElements(state, outFragment, isBack);
+ if (namedViews.isEmpty()) {
+ sharedElementTargets.add(state.nonExistentView);
+ } else {
+ sharedElementTargets.addAll(namedViews.values());
+ }
+ addTargets(sharedElementTransition, sharedElementTargets);
// Notify the start of the transition.
SharedElementCallback callback = isBack ?
@@ -1306,7 +1335,7 @@ final class BackStackRecord extends FragmentTransaction implements
ArrayList<View> hiddenFragments = new ArrayList<View>();
ArrayList<View> enteringViews = addTransitionTargets(state, enterTransition,
sharedElementTransition, transition, sceneRoot, inFragment, outFragment,
- hiddenFragments, isBack);
+ hiddenFragments, isBack, sharedElementTargets);
transition.setNameOverrides(state.nameOverrides);
// We want to exclude hidden views later, so we need a non-null list in the
@@ -1318,7 +1347,7 @@ final class BackStackRecord extends FragmentTransaction implements
// Remove the view targeting after the transition starts
removeTargetedViewsFromTransitions(sceneRoot, state.nonExistentView,
enterTransition, enteringViews, exitTransition, exitingViews,
- transition, hiddenFragments);
+ sharedElementTransition, sharedElementTargets, transition, hiddenFragments);
}
}
}
@@ -1331,8 +1360,9 @@ final class BackStackRecord extends FragmentTransaction implements
final ViewGroup sceneRoot, final View nonExistingView,
final Transition enterTransition, final ArrayList<View> enteringViews,
final Transition exitTransition, final ArrayList<View> exitingViews,
+ final Transition sharedElementTransition, final ArrayList<View> sharedElementTargets,
final Transition overallTransition, final ArrayList<View> hiddenViews) {
- if (enterTransition != null || exitTransition != null) {
+ if (overallTransition != null) {
sceneRoot.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
@@ -1344,6 +1374,9 @@ final class BackStackRecord extends FragmentTransaction implements
if (exitTransition != null) {
removeTargets(exitTransition, exitingViews);
}
+ if (sharedElementTransition != null) {
+ removeTargets(sharedElementTransition, sharedElementTargets);
+ }
int numViews = hiddenViews.size();
for (int i = 0; i < numViews; i++) {
overallTransition.excludeTarget(hiddenViews.get(i), false);
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 16a3575933eb..216d6bab38ad 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -306,7 +306,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator {
ArrayList<String> rejectedNames = new ArrayList<String>(mAllSharedElementNames);
rejectedNames.removeAll(mSharedElementNames);
ArrayList<View> rejectedSnapshots = createSnapshots(sharedElementState, rejectedNames);
- mListener.onRejectSharedElements(rejectedSnapshots);
+ if (mListener != null) {
+ mListener.onRejectSharedElements(rejectedSnapshots);
+ }
startRejectedAnimations(rejectedSnapshots);
// Now start shared element transition
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index 812dfdb41d74..d4d3eda91e75 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -181,7 +181,10 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator {
});
setGhostVisibility(View.INVISIBLE);
scheduleGhostVisibilityChange(View.INVISIBLE);
- mListener.onSharedElementEnd(mSharedElementNames, mSharedElements, sharedElementSnapshots);
+ if (mListener != null) {
+ mListener.onSharedElementEnd(mSharedElementNames, mSharedElements,
+ sharedElementSnapshots);
+ }
TransitionManager.beginDelayedTransition(decorView, transition);
scheduleGhostVisibilityChange(View.VISIBLE);
setGhostVisibility(View.VISIBLE);
diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java
index a95abab94eb9..5196834eefed 100644
--- a/core/java/android/app/Fragment.java
+++ b/core/java/android/app/Fragment.java
@@ -2015,6 +2015,11 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene
}
return mView.findViewById(id);
}
+
+ @Override
+ public boolean hasView() {
+ return (mView != null);
+ }
}, this);
}
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index ef69fddf01e7..fc761fe54a45 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -395,6 +395,7 @@ final class FragmentManagerState implements Parcelable {
*/
interface FragmentContainer {
public View findViewById(int id);
+ public boolean hasView();
}
/**
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 8fa1fd539973..aa5fea0a9e1e 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -451,6 +451,7 @@ public interface IActivityManager extends IInterface {
public void setTaskDescription(IBinder token, ActivityManager.TaskDescription values)
throws RemoteException;
+ public Bitmap getTaskDescriptionIcon(String filename) throws RemoteException;
public boolean requestVisibleBehind(IBinder token, boolean visible) throws RemoteException;
public boolean isBackgroundVisibleBehind(IBinder token) throws RemoteException;
@@ -775,4 +776,5 @@ public interface IActivityManager extends IInterface {
int RELEASE_ACTIVITY_INSTANCE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+235;
int RELEASE_SOME_ACTIVITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+236;
int BOOT_ANIMATION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+237;
+ int GET_TASK_DESCRIPTION_ICON_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+238;
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 13ed8d1f7bce..2eba29a8adfe 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2408,8 +2408,8 @@ public class DevicePolicyManager {
}
/**
- * Sets the name of the Managed profile. In the device owner case it sets the name of the user
- * which it is called from. Only the profile owner or device owner can call this. If this is
+ * Sets the name of the profile. In the device owner case it sets the name of the user
+ * which it is called from. Only a profile owner or device owner can call this. If this is
* never called by the profile or device owner, the name will be set to default values.
*
* @see #isProfileOwnerApp
@@ -2428,9 +2428,9 @@ public class DevicePolicyManager {
}
/**
- * Used to determine if a particular package is registered as the Profile Owner for the
+ * Used to determine if a particular package is registered as the profile owner for the
* current user. A profile owner is a special device admin that has additional privileges
- * within the managed profile.
+ * within the profile.
*
* @param packageName The package name of the app to compare with the registered profile owner.
* @return Whether or not the package is registered as the profile owner.
@@ -2568,12 +2568,10 @@ public class DevicePolicyManager {
/**
* Called by a profile or device owner to set the application restrictions for a given target
- * application running in the managed profile.
+ * application running in the profile.
*
* <p>The provided {@link Bundle} consists of key-value pairs, where the types of values may be
- * boolean, int, String, or String[]. The recommended format for keys
- * is "com.example.packagename/example-setting" to avoid naming conflicts with library
- * components such as {@link android.webkit.WebView}.
+ * boolean, int, String, or String[].
*
* <p>The application restrictions are only made visible to the target application and the
* profile or device owner.
@@ -2645,8 +2643,8 @@ public class DevicePolicyManager {
}
/**
- * Called by a profile owner to set whether caller-Id information from the managed
- * profile will be shown for incoming calls.
+ * Called by a profile owner of a managed profile to set whether caller-Id information from
+ * the managed profile will be shown in the parent profile, for incoming calls.
*
* <p>The calling device admin must be a profile owner. If it is not, a
* security exception will be thrown.
@@ -2665,7 +2663,8 @@ public class DevicePolicyManager {
}
/**
- * Determine whether or not caller-Id information has been disabled.
+ * Called by a profile owner of a managed profile to determine whether or not caller-Id
+ * information has been disabled.
*
* <p>The calling device admin must be a profile owner. If it is not, a
* security exception will be thrown.
@@ -2701,8 +2700,8 @@ public class DevicePolicyManager {
}
/**
- * Called by the profile owner so that some intents sent in the managed profile can also be
- * resolved in the parent, or vice versa.
+ * Called by the profile owner of a managed profile so that some intents sent in the managed
+ * profile can also be resolved in the parent, or vice versa.
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param filter The {@link IntentFilter} the intent has to match to be also resolved in the
* other profile
@@ -2720,8 +2719,8 @@ public class DevicePolicyManager {
}
/**
- * Called by a profile owner to remove the cross-profile intent filters that go from the
- * managed profile to the parent, or from the parent to the managed profile.
+ * Called by a profile owner of a managed profile to remove the cross-profile intent filters
+ * that go from the managed profile to the parent, or from the parent to the managed profile.
* Only removes those that have been set by the profile owner.
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
*/
@@ -2982,7 +2981,7 @@ public class DevicePolicyManager {
/**
* Called by a profile or device owner to get the application restrictions for a given target
- * application running in the managed profile.
+ * application running in the profile.
*
* <p>The calling device admin must be a profile or device owner; if it is not, a security
* exception will be thrown.
@@ -3090,8 +3089,7 @@ public class DevicePolicyManager {
/**
* Called by profile or device owner to re-enable a system app that was disabled by default
- * when the managed profile was created. This can only be called from a profile or device
- * owner running within a managed profile.
+ * when the user was initialized.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param packageName The package to be re-enabled in the current profile.
@@ -3108,8 +3106,7 @@ public class DevicePolicyManager {
/**
* Called by profile or device owner to re-enable system apps by intent that were disabled
- * by default when the managed profile was created. This can only be called from a profile
- * or device owner running within a managed profile.
+ * by default when the user was initialized.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param intent An intent matching the app(s) to be installed. All apps that resolve for this
@@ -3391,10 +3388,10 @@ public class DevicePolicyManager {
}
/**
- * Called by the profile owner to enable widget providers from a given package
- * to be available in the parent profile. As a result the user will be able to
+ * Called by the profile owner of a managed profile to enable widget providers from a
+ * given package to be available in the parent profile. As a result the user will be able to
* add widgets from the white-listed package running under the profile to a widget
- * host which runs under the device owner, for example the home screen. Note that
+ * host which runs under the parent profile, for example the home screen. Note that
* a package may have zero or more provider components, where each component
* provides a different widget type.
* <p>
@@ -3420,8 +3417,8 @@ public class DevicePolicyManager {
}
/**
- * Called by the profile owner to disable widget providers from a given package
- * to be available in the parent profile. For this method to take effect the
+ * Called by the profile owner of a managed profile to disable widget providers from a given
+ * package to be available in the parent profile. For this method to take effect the
* package should have been added via {@link #addCrossProfileWidgetProvider(
* android.content.ComponentName, String)}.
* <p>
@@ -3448,7 +3445,7 @@ public class DevicePolicyManager {
}
/**
- * Called by the profile owner to query providers from which packages are
+ * Called by the profile owner of a managed profile to query providers from which packages are
* available in the parent profile.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index ff9f6abec1a0..a19fbd368903 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3587,7 +3587,7 @@ public class Intent implements Parcelable, Cloneable {
* creating new document tasks.
*
* <p>This flag is ignored if one of {@link #FLAG_ACTIVITY_NEW_TASK} or
- * {@link #FLAG_ACTIVITY_NEW_TASK} is not also set.
+ * {@link #FLAG_ACTIVITY_NEW_DOCUMENT} is not also set.
*
* <p>See
* <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back
@@ -4295,7 +4295,7 @@ public class Intent implements Parcelable, Cloneable {
int j = uri.indexOf(')', i);
while (i < j) {
int sep = uri.indexOf('!', i);
- if (sep < 0) sep = j;
+ if (sep < 0 || sep > j) sep = j;
if (i < sep) {
intent.addCategory(uri.substring(i, sep));
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index ffde7cefa943..3364741e52c4 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -4675,6 +4675,28 @@ public class PackageParser {
return ai;
}
+ public static ApplicationInfo generateApplicationInfo(ApplicationInfo ai, int flags,
+ PackageUserState state, int userId) {
+ if (ai == null) return null;
+ if (!checkUseInstalledOrHidden(flags, state)) {
+ return null;
+ }
+ // This is only used to return the ResolverActivity; we will just always
+ // make a copy.
+ ai = new ApplicationInfo(ai);
+ if (userId != 0) {
+ ai.uid = UserHandle.getUid(userId, ai.uid);
+ ai.dataDir = PackageManager.getDataDirForUser(userId, ai.packageName);
+ }
+ if (state.stopped) {
+ ai.flags |= ApplicationInfo.FLAG_STOPPED;
+ } else {
+ ai.flags &= ~ApplicationInfo.FLAG_STOPPED;
+ }
+ updateApplicationInfo(ai, flags, state);
+ return ai;
+ }
+
public static final PermissionInfo generatePermissionInfo(
Permission p, int flags) {
if (p == null) return null;
@@ -4738,6 +4760,19 @@ public class PackageParser {
return ai;
}
+ public static final ActivityInfo generateActivityInfo(ActivityInfo ai, int flags,
+ PackageUserState state, int userId) {
+ if (ai == null) return null;
+ if (!checkUseInstalledOrHidden(flags, state)) {
+ return null;
+ }
+ // This is only used to return the ResolverActivity; we will just always
+ // make a copy.
+ ai = new ActivityInfo(ai);
+ ai.applicationInfo = generateApplicationInfo(ai.applicationInfo, flags, state, userId);
+ return ai;
+ }
+
public final static class Service extends Component<ServiceIntentInfo> {
public final ServiceInfo info;
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 186623aa78d5..73b93c64d524 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -16,6 +16,7 @@
package android.content.res;
+import android.annotation.Nullable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
@@ -728,15 +729,13 @@ public class TypedArray {
}
/**
- * Retrieve the Drawable for the attribute at <var>index</var>. This
- * gets the resource ID of the selected attribute, and uses
- * {@link Resources#getDrawable Resources.getDrawable} of the owning
- * Resources object to retrieve its Drawable.
+ * Retrieve the Drawable for the attribute at <var>index</var>.
*
* @param index Index of attribute to retrieve.
*
* @return Drawable for the attribute, or null if not defined.
*/
+ @Nullable
public Drawable getDrawable(int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
diff --git a/core/java/android/ddm/DdmHandleViewDebug.java b/core/java/android/ddm/DdmHandleViewDebug.java
index ce837966c12b..3a36b0a91a15 100644
--- a/core/java/android/ddm/DdmHandleViewDebug.java
+++ b/core/java/android/ddm/DdmHandleViewDebug.java
@@ -56,6 +56,9 @@ public class DdmHandleViewDebug extends ChunkHandler {
/** Capture View Layers. */
private static final int VURT_CAPTURE_LAYERS = 2;
+ /** Dump View Theme. */
+ private static final int VURT_DUMP_THEME = 3;
+
/**
* Generic View Operation, first parameter in the packet should be one of the
* VUOP_* constants below.
@@ -131,6 +134,8 @@ public class DdmHandleViewDebug extends ChunkHandler {
return dumpHierarchy(rootView, in);
else if (op == VURT_CAPTURE_LAYERS)
return captureLayers(rootView);
+ else if (op == VURT_DUMP_THEME)
+ return dumpTheme(rootView);
else
return createFailChunk(ERR_INVALID_OP, "Unknown view root operation: " + op);
}
@@ -258,6 +263,22 @@ public class DdmHandleViewDebug extends ChunkHandler {
return new Chunk(CHUNK_VURT, data, 0, data.length);
}
+ /**
+ * Returns the Theme dump of the provided view.
+ */
+ private Chunk dumpTheme(View rootView) {
+ ByteArrayOutputStream b = new ByteArrayOutputStream(1024);
+ try {
+ ViewDebug.dumpTheme(rootView, b);
+ } catch (IOException e) {
+ return createFailChunk(1, "Unexpected error while dumping the theme: "
+ + e.getMessage());
+ }
+
+ byte[] data = b.toByteArray();
+ return new Chunk(CHUNK_VURT, data, 0, data.length);
+ }
+
private Chunk captureView(View rootView, View targetView) {
ByteArrayOutputStream b = new ByteArrayOutputStream(1024);
try {
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index c52534823ad6..55ca4865b409 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -391,9 +391,9 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
* <p>Not all the auto-focus modes may be supported by a
* given camera device. This entry lists the valid modes for
* {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} for this camera device.</p>
- * <p>All camera devices will support OFF mode, and all camera devices with
- * adjustable focuser units (<code>{@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance} &gt; 0</code>)
- * will support AUTO mode.</p>
+ * <p>All LIMITED and FULL mode camera devices will support OFF mode, and all
+ * camera devices with adjustable focuser units
+ * (<code>{@link CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE android.lens.info.minimumFocusDistance} &gt; 0</code>) will support AUTO mode.</p>
*
* @see CaptureRequest#CONTROL_AF_MODE
* @see CameraCharacteristics#LENS_INFO_MINIMUM_FOCUS_DISTANCE
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 1dc5533aa288..257809371f4f 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -51,7 +51,6 @@ import java.util.TreeSet;
* HAL2.1+ implementation of CameraDevice. Use CameraManager#open to instantiate
*/
public class CameraDeviceImpl extends CameraDevice {
-
private final String TAG;
private final boolean DEBUG;
@@ -1136,7 +1135,6 @@ public class CameraDeviceImpl extends CameraDevice {
}
public class CameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {
-
//
// Constants below need to be kept up-to-date with
// frameworks/av/include/camera/camera2/ICameraDeviceCallbacks.h
@@ -1149,34 +1147,29 @@ public class CameraDeviceImpl extends CameraDevice {
/**
* Camera has been disconnected
*/
- static final int ERROR_CAMERA_DISCONNECTED = 0;
-
+ public static final int ERROR_CAMERA_DISCONNECTED = 0;
/**
* Camera has encountered a device-level error
* Matches CameraDevice.StateCallback#ERROR_CAMERA_DEVICE
*/
- static final int ERROR_CAMERA_DEVICE = 1;
-
+ public static final int ERROR_CAMERA_DEVICE = 1;
/**
* Camera has encountered a service-level error
* Matches CameraDevice.StateCallback#ERROR_CAMERA_SERVICE
*/
- static final int ERROR_CAMERA_SERVICE = 2;
-
+ public static final int ERROR_CAMERA_SERVICE = 2;
/**
* Camera has encountered an error processing a single request.
*/
- static final int ERROR_CAMERA_REQUEST = 3;
-
+ public static final int ERROR_CAMERA_REQUEST = 3;
/**
* Camera has encountered an error producing metadata for a single capture
*/
- static final int ERROR_CAMERA_RESULT = 4;
-
+ public static final int ERROR_CAMERA_RESULT = 4;
/**
* Camera has encountered an error producing an image buffer for a single capture
*/
- static final int ERROR_CAMERA_BUFFER = 5;
+ public static final int ERROR_CAMERA_BUFFER = 5;
@Override
public IBinder asBinder() {
@@ -1187,9 +1180,9 @@ public class CameraDeviceImpl extends CameraDevice {
public void onDeviceError(final int errorCode, CaptureResultExtras resultExtras) {
if (DEBUG) {
Log.d(TAG, String.format(
- "Device error received, code %d, frame number %d, request ID %d, subseq ID %d",
- errorCode, resultExtras.getFrameNumber(), resultExtras.getRequestId(),
- resultExtras.getSubsequenceId()));
+ "Device error received, code %d, frame number %d, request ID %d, subseq ID %d",
+ errorCode, resultExtras.getFrameNumber(), resultExtras.getRequestId(),
+ resultExtras.getSubsequenceId()));
}
synchronized(mInterfaceLock) {
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
index 2fa9d8520b8d..e96c15f7a270 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceState.java
@@ -16,8 +16,8 @@
package android.hardware.camera2.legacy;
+import android.hardware.camera2.impl.CameraDeviceImpl;
import android.hardware.camera2.impl.CameraMetadataNative;
-import android.hardware.camera2.utils.CameraBinderDecorator;
import android.os.Handler;
import android.util.Log;
@@ -49,14 +49,22 @@ public class CameraDeviceState {
private static final int STATE_IDLE = 3;
private static final int STATE_CAPTURING = 4;
+ private static final String[] sStateNames = { "ERROR", "UNCONFIGURED", "CONFIGURING", "IDLE",
+ "CAPTURING"};
+
private int mCurrentState = STATE_UNCONFIGURED;
- private int mCurrentError = CameraBinderDecorator.NO_ERROR;
+ private int mCurrentError = NO_CAPTURE_ERROR;
private RequestHolder mCurrentRequest = null;
private Handler mCurrentHandler = null;
private CameraDeviceStateListener mCurrentListener = null;
+ /**
+ * Error code used by {@link #setCaptureStart} and {@link #setCaptureResult} to indicate that no
+ * error has occurred.
+ */
+ public static final int NO_CAPTURE_ERROR = -1;
/**
* CameraDeviceStateListener callbacks to be called after state transitions.
@@ -79,7 +87,7 @@ public class CameraDeviceState {
* </p>
*
* @param error the error to set. Should be one of the error codes defined in
- * {@link android.hardware.camera2.utils.CameraBinderDecorator}.
+ * {@link CameraDeviceImpl.CameraDeviceCallbacks}.
*/
public synchronized void setError(int error) {
mCurrentError = error;
@@ -94,11 +102,11 @@ public class CameraDeviceState {
* {@link CameraDeviceStateListener#onConfiguring()} will be called.
* </p>
*
- * @return {@link CameraBinderDecorator#NO_ERROR}, or an error if one has occurred.
+ * @return {@code false} if an error has occurred.
*/
- public synchronized int setConfiguring() {
+ public synchronized boolean setConfiguring() {
doStateTransition(STATE_CONFIGURING);
- return mCurrentError;
+ return mCurrentError == NO_CAPTURE_ERROR;
}
/**
@@ -109,11 +117,11 @@ public class CameraDeviceState {
* {@link CameraDeviceStateListener#onIdle()} will be called.
* </p>
*
- * @return {@link CameraBinderDecorator#NO_ERROR}, or an error if one has occurred.
+ * @return {@code false} if an error has occurred.
*/
- public synchronized int setIdle() {
+ public synchronized boolean setIdle() {
doStateTransition(STATE_IDLE);
- return mCurrentError;
+ return mCurrentError == NO_CAPTURE_ERROR;
}
/**
@@ -126,12 +134,16 @@ public class CameraDeviceState {
*
* @param request A {@link RequestHolder} containing the request for the current capture.
* @param timestamp The timestamp of the capture start in nanoseconds.
- * @return {@link CameraBinderDecorator#NO_ERROR}, or an error if one has occurred.
+ * @param captureError Report a recoverable error for a single request using a valid
+ * error code for {@code ICameraDeviceCallbacks}, or
+ * {@link #NO_CAPTURE_ERROR}
+ * @return {@code false} if an error has occurred.
*/
- public synchronized int setCaptureStart(final RequestHolder request, long timestamp) {
+ public synchronized boolean setCaptureStart(final RequestHolder request, long timestamp,
+ int captureError) {
mCurrentRequest = request;
- doStateTransition(STATE_CAPTURING, timestamp);
- return mCurrentError;
+ doStateTransition(STATE_CAPTURING, timestamp, captureError);
+ return mCurrentError == NO_CAPTURE_ERROR;
}
/**
@@ -144,28 +156,41 @@ public class CameraDeviceState {
* the {@code ERROR} state,
* </p>
*
- * @param request the {@link RequestHolder} request that created this result.
- * @param result the {@link CameraMetadataNative} result to set.
- * @return {@link CameraBinderDecorator#NO_ERROR}, or an error if one has occurred.
+ * @param request The {@link RequestHolder} request that created this result.
+ * @param result The {@link CameraMetadataNative} result to set.
+ * @param captureError Report a recoverable error for a single buffer or result using a valid
+ * error code for {@code ICameraDeviceCallbacks}, or
+ * {@link #NO_CAPTURE_ERROR}.
+ * @return {@code false} if an error has occurred.
*/
- public synchronized int setCaptureResult(final RequestHolder request,
- final CameraMetadataNative result) {
+ public synchronized boolean setCaptureResult(final RequestHolder request,
+ final CameraMetadataNative result,
+ final int captureError) {
if (mCurrentState != STATE_CAPTURING) {
Log.e(TAG, "Cannot receive result while in state: " + mCurrentState);
- mCurrentError = CameraBinderDecorator.INVALID_OPERATION;
+ mCurrentError = CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE;
doStateTransition(STATE_ERROR);
- return mCurrentError;
+ return mCurrentError == NO_CAPTURE_ERROR;
}
if (mCurrentHandler != null && mCurrentListener != null) {
- mCurrentHandler.post(new Runnable() {
- @Override
- public void run() {
- mCurrentListener.onCaptureResult(result, request);
- }
- });
+ if (captureError != NO_CAPTURE_ERROR) {
+ mCurrentHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCurrentListener.onError(captureError, request);
+ }
+ });
+ } else {
+ mCurrentHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCurrentListener.onCaptureResult(result, request);
+ }
+ });
+ }
}
- return mCurrentError;
+ return mCurrentError == NO_CAPTURE_ERROR;
}
/**
@@ -181,14 +206,16 @@ public class CameraDeviceState {
}
private void doStateTransition(int newState) {
- doStateTransition(newState, /*timestamp*/0);
+ doStateTransition(newState, /*timestamp*/0, NO_CAPTURE_ERROR);
}
- private void doStateTransition(int newState, final long timestamp) {
- if (DEBUG) {
- if (newState != mCurrentState) {
- Log.d(TAG, "Transitioning to state " + newState);
+ private void doStateTransition(int newState, final long timestamp, final int error) {
+ if (newState != mCurrentState) {
+ String stateName = "UNKNOWN";
+ if (newState >= 0 && newState < sStateNames.length) {
+ stateName = sStateNames[newState];
}
+ Log.i(TAG, "Legacy camera service transitioning to state " + stateName);
}
switch(newState) {
case STATE_ERROR:
@@ -206,7 +233,7 @@ public class CameraDeviceState {
case STATE_CONFIGURING:
if (mCurrentState != STATE_UNCONFIGURED && mCurrentState != STATE_IDLE) {
Log.e(TAG, "Cannot call configure while in state: " + mCurrentState);
- mCurrentError = CameraBinderDecorator.INVALID_OPERATION;
+ mCurrentError = CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE;
doStateTransition(STATE_ERROR);
break;
}
@@ -228,7 +255,7 @@ public class CameraDeviceState {
if (mCurrentState != STATE_CONFIGURING && mCurrentState != STATE_CAPTURING) {
Log.e(TAG, "Cannot call idle while in state: " + mCurrentState);
- mCurrentError = CameraBinderDecorator.INVALID_OPERATION;
+ mCurrentError = CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE;
doStateTransition(STATE_ERROR);
break;
}
@@ -247,17 +274,27 @@ public class CameraDeviceState {
case STATE_CAPTURING:
if (mCurrentState != STATE_IDLE && mCurrentState != STATE_CAPTURING) {
Log.e(TAG, "Cannot call capture while in state: " + mCurrentState);
- mCurrentError = CameraBinderDecorator.INVALID_OPERATION;
+ mCurrentError = CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE;
doStateTransition(STATE_ERROR);
break;
}
+
if (mCurrentHandler != null && mCurrentListener != null) {
- mCurrentHandler.post(new Runnable() {
- @Override
- public void run() {
- mCurrentListener.onCaptureStarted(mCurrentRequest, timestamp);
- }
- });
+ if (error != NO_CAPTURE_ERROR) {
+ mCurrentHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCurrentListener.onError(error, mCurrentRequest);
+ }
+ });
+ } else {
+ mCurrentHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCurrentListener.onCaptureStarted(mCurrentRequest, timestamp);
+ }
+ });
+ }
}
mCurrentState = STATE_CAPTURING;
break;
diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
index 410934e3629b..4aa330d6b874 100644
--- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
+++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java
@@ -341,6 +341,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
Log.d(TAG, "disconnect called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.w(TAG, "Cannot disconnect, device has already been closed.");
+ }
+
try {
mLegacyDevice.close();
} finally {
@@ -355,6 +359,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "submitRequest called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot submit request, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot submit request, configuration change in progress.");
@@ -370,6 +379,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "submitRequestList called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot submit request list, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot submit request, configuration change in progress.");
@@ -384,6 +398,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "cancelRequest called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot cancel request, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot cancel request, configuration change in progress.");
@@ -400,6 +419,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "beginConfigure called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot begin configure, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot begin configure, configuration change already in progress.");
@@ -415,6 +439,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "endConfigure called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot end configure, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
ArrayList<Surface> surfaces = null;
synchronized(mConfigureLock) {
if (!mConfiguring) {
@@ -438,6 +467,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "deleteStream called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot delete stream, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (!mConfiguring) {
Log.e(TAG, "Cannot delete stream, beginConfigure hasn't been called yet.");
@@ -458,6 +492,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "createStream called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot create stream, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (!mConfiguring) {
Log.e(TAG, "Cannot create stream, beginConfigure hasn't been called yet.");
@@ -474,6 +513,10 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "createDefaultRequest called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot create default request, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
CameraMetadataNative template;
try {
@@ -503,6 +546,11 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "waitUntilIdle called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot wait until idle, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot wait until idle, configuration change in progress.");
@@ -518,13 +566,21 @@ public class CameraDeviceUserShim implements ICameraDeviceUser {
if (DEBUG) {
Log.d(TAG, "flush called.");
}
+ if (mLegacyDevice.isClosed()) {
+ Log.e(TAG, "Cannot flush, device has been closed.");
+ return CameraBinderDecorator.ENODEV;
+ }
+
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot flush, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
- // TODO: implement flush.
+ long lastFrame = mLegacyDevice.flush();
+ if (lastFrameNumber != null) {
+ lastFrameNumber.setNumber(lastFrame);
+ }
return CameraBinderDecorator.NO_ERROR;
}
diff --git a/core/java/android/hardware/camera2/legacy/CaptureCollector.java b/core/java/android/hardware/camera2/legacy/CaptureCollector.java
index 307e466883df..8404e86905b3 100644
--- a/core/java/android/hardware/camera2/legacy/CaptureCollector.java
+++ b/core/java/android/hardware/camera2/legacy/CaptureCollector.java
@@ -15,12 +15,14 @@
*/
package android.hardware.camera2.legacy;
+import android.hardware.camera2.impl.CameraDeviceImpl;
import android.util.Log;
import android.util.MutableLong;
import android.util.Pair;
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
@@ -44,7 +46,7 @@ public class CaptureCollector {
private static final int MAX_JPEGS_IN_FLIGHT = 1;
- private class CaptureHolder {
+ private class CaptureHolder implements Comparable<CaptureHolder>{
private final RequestHolder mRequest;
private final LegacyRequest mLegacy;
public final boolean needsJpeg;
@@ -53,6 +55,10 @@ public class CaptureCollector {
private long mTimestamp = 0;
private int mReceivedFlags = 0;
private boolean mHasStarted = false;
+ private boolean mFailedJpeg = false;
+ private boolean mFailedPreview = false;
+ private boolean mCompleted = false;
+ private boolean mPreviewCompleted = false;
public CaptureHolder(RequestHolder request, LegacyRequest legacyHolder) {
mRequest = request;
@@ -74,11 +80,43 @@ public class CaptureCollector {
}
public void tryComplete() {
- if (isCompleted()) {
- if (needsPreview && isPreviewCompleted()) {
- CaptureCollector.this.onPreviewCompleted();
+ if (!mPreviewCompleted && needsPreview && isPreviewCompleted()) {
+ CaptureCollector.this.onPreviewCompleted();
+ mPreviewCompleted = true;
+ }
+
+ if (isCompleted() && !mCompleted) {
+ if (mFailedPreview || mFailedJpeg) {
+ if (!mHasStarted) {
+ // Send a request error if the capture has not yet started.
+ mRequest.failRequest();
+ CaptureCollector.this.mDeviceState.setCaptureStart(mRequest, mTimestamp,
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_REQUEST);
+ } else {
+ // Send buffer dropped errors for each pending buffer if the request has
+ // started.
+ if (mFailedPreview) {
+ Log.w(TAG, "Preview buffers dropped for request: " +
+ mRequest.getRequestId());
+ for (int i = 0; i < mRequest.numPreviewTargets(); i++) {
+ CaptureCollector.this.mDeviceState.setCaptureResult(mRequest,
+ /*result*/null,
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_BUFFER);
+ }
+ }
+ if (mFailedJpeg) {
+ Log.w(TAG, "Jpeg buffers dropped for request: " +
+ mRequest.getRequestId());
+ for (int i = 0; i < mRequest.numJpegTargets(); i++) {
+ CaptureCollector.this.mDeviceState.setCaptureResult(mRequest,
+ /*result*/null,
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_BUFFER);
+ }
+ }
+ }
}
- CaptureCollector.this.onRequestCompleted(this);
+ CaptureCollector.this.onRequestCompleted(CaptureHolder.this);
+ mCompleted = true;
}
}
@@ -103,7 +141,8 @@ public class CaptureCollector {
if (!mHasStarted) {
mHasStarted = true;
- CaptureCollector.this.mDeviceState.setCaptureStart(mRequest, mTimestamp);
+ CaptureCollector.this.mDeviceState.setCaptureStart(mRequest, mTimestamp,
+ CameraDeviceState.NO_CAPTURE_ERROR);
}
tryComplete();
@@ -126,6 +165,20 @@ public class CaptureCollector {
tryComplete();
}
+ public void setJpegFailed() {
+ if (DEBUG) {
+ Log.d(TAG, "setJpegFailed - called for request " + mRequest.getRequestId());
+ }
+ if (!needsJpeg || isJpegCompleted()) {
+ return;
+ }
+ mFailedJpeg = true;
+
+ mReceivedFlags |= FLAG_RECEIVED_JPEG;
+ mReceivedFlags |= FLAG_RECEIVED_JPEG_TS;
+ tryComplete();
+ }
+
public void setPreviewTimestamp(long timestamp) {
if (DEBUG) {
Log.d(TAG, "setPreviewTimestamp - called for request " + mRequest.getRequestId());
@@ -148,7 +201,8 @@ public class CaptureCollector {
if (!needsJpeg) {
if (!mHasStarted) {
mHasStarted = true;
- CaptureCollector.this.mDeviceState.setCaptureStart(mRequest, mTimestamp);
+ CaptureCollector.this.mDeviceState.setCaptureStart(mRequest, mTimestamp,
+ CameraDeviceState.NO_CAPTURE_ERROR);
}
}
@@ -171,8 +225,37 @@ public class CaptureCollector {
mReceivedFlags |= FLAG_RECEIVED_PREVIEW;
tryComplete();
}
+
+ public void setPreviewFailed() {
+ if (DEBUG) {
+ Log.d(TAG, "setPreviewFailed - called for request " + mRequest.getRequestId());
+ }
+ if (!needsPreview || isPreviewCompleted()) {
+ return;
+ }
+ mFailedPreview = true;
+
+ mReceivedFlags |= FLAG_RECEIVED_PREVIEW;
+ mReceivedFlags |= FLAG_RECEIVED_PREVIEW_TS;
+ tryComplete();
+ }
+
+ // Comparison and equals based on frame number.
+ @Override
+ public int compareTo(CaptureHolder captureHolder) {
+ return (mRequest.getFrameNumber() > captureHolder.mRequest.getFrameNumber()) ? 1 :
+ ((mRequest.getFrameNumber() == captureHolder.mRequest.getFrameNumber()) ? 0 :
+ -1);
+ }
+
+ // Comparison and equals based on frame number.
+ @Override
+ public boolean equals(Object o) {
+ return o instanceof CaptureHolder && compareTo((CaptureHolder) o) == 0;
+ }
}
+ private final TreeSet<CaptureHolder> mActiveRequests;
private final ArrayDeque<CaptureHolder> mJpegCaptureQueue;
private final ArrayDeque<CaptureHolder> mJpegProduceQueue;
private final ArrayDeque<CaptureHolder> mPreviewCaptureQueue;
@@ -200,6 +283,7 @@ public class CaptureCollector {
mJpegProduceQueue = new ArrayDeque<>(MAX_JPEGS_IN_FLIGHT);
mPreviewCaptureQueue = new ArrayDeque<>(mMaxInFlight);
mPreviewProduceQueue = new ArrayDeque<>(mMaxInFlight);
+ mActiveRequests = new TreeSet<>();
mIsEmpty = mLock.newCondition();
mNotFull = mLock.newCondition();
mPreviewsEmpty = mLock.newCondition();
@@ -263,7 +347,7 @@ public class CaptureCollector {
mPreviewProduceQueue.add(h);
mInFlightPreviews++;
}
-
+ mActiveRequests.add(h);
mInFlight++;
return true;
@@ -440,7 +524,9 @@ public class CaptureCollector {
try {
CaptureHolder h = mPreviewCaptureQueue.poll();
if (h == null) {
- Log.w(TAG, "previewCaptured called with no preview request on queue!");
+ if (DEBUG) {
+ Log.d(TAG, "previewCaptured called with no preview request on queue!");
+ }
return null;
}
h.setPreviewTimestamp(timestamp);
@@ -471,6 +557,81 @@ public class CaptureCollector {
}
}
+ /**
+ * Called to alert the {@link CaptureCollector} that the next pending preview capture has failed.
+ */
+ public void failNextPreview() {
+ final ReentrantLock lock = this.mLock;
+ lock.lock();
+ try {
+ CaptureHolder h1 = mPreviewCaptureQueue.peek();
+ CaptureHolder h2 = mPreviewProduceQueue.peek();
+
+ // Find the request with the lowest frame number.
+ CaptureHolder h = (h1 == null) ? h2 :
+ ((h2 == null) ? h1 :
+ ((h1.compareTo(h2) <= 0) ? h1 :
+ h2));
+
+ if (h != null) {
+ mPreviewCaptureQueue.remove(h);
+ mPreviewProduceQueue.remove(h);
+ mActiveRequests.remove(h);
+ h.setPreviewFailed();
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * Called to alert the {@link CaptureCollector} that the next pending jpeg capture has failed.
+ */
+ public void failNextJpeg() {
+ final ReentrantLock lock = this.mLock;
+ lock.lock();
+ try {
+ CaptureHolder h1 = mJpegCaptureQueue.peek();
+ CaptureHolder h2 = mJpegProduceQueue.peek();
+
+ // Find the request with the lowest frame number.
+ CaptureHolder h = (h1 == null) ? h2 :
+ ((h2 == null) ? h1 :
+ ((h1.compareTo(h2) <= 0) ? h1 :
+ h2));
+
+ if (h != null) {
+ mJpegCaptureQueue.remove(h);
+ mJpegProduceQueue.remove(h);
+ mActiveRequests.remove(h);
+ h.setJpegFailed();
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * Called to alert the {@link CaptureCollector} all pending captures have failed.
+ */
+ public void failAll() {
+ final ReentrantLock lock = this.mLock;
+ lock.lock();
+ try {
+ CaptureHolder h;
+ while ((h = mActiveRequests.pollFirst()) != null) {
+ h.setPreviewFailed();
+ h.setJpegFailed();
+ }
+ mPreviewCaptureQueue.clear();
+ mPreviewProduceQueue.clear();
+ mJpegCaptureQueue.clear();
+ mJpegProduceQueue.clear();
+ } finally {
+ lock.unlock();
+ }
+ }
+
private void onPreviewCompleted() {
mInFlightPreviews--;
if (mInFlightPreviews < 0) {
@@ -496,6 +657,7 @@ public class CaptureCollector {
}
mCompletedRequests.add(capture);
+ mActiveRequests.remove(capture);
mNotFull.signalAll();
if (mInFlight == 0) {
diff --git a/core/java/android/hardware/camera2/legacy/GLThreadManager.java b/core/java/android/hardware/camera2/legacy/GLThreadManager.java
index 2c584ef7752c..c8e014783239 100644
--- a/core/java/android/hardware/camera2/legacy/GLThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/GLThreadManager.java
@@ -17,6 +17,7 @@
package android.hardware.camera2.legacy;
import android.graphics.SurfaceTexture;
+import android.hardware.camera2.impl.CameraDeviceImpl;
import android.os.ConditionVariable;
import android.os.Handler;
import android.os.Message;
@@ -42,6 +43,8 @@ public class GLThreadManager {
private CaptureCollector mCaptureCollector;
+ private final CameraDeviceState mDeviceState;
+
private final SurfaceTextureRenderer mTextureRenderer;
private final RequestHandlerThread mGLHandlerThread;
@@ -76,42 +79,47 @@ public class GLThreadManager {
if (mCleanup) {
return true;
}
- switch (msg.what) {
- case MSG_NEW_CONFIGURATION:
- ConfigureHolder configure = (ConfigureHolder) msg.obj;
- mTextureRenderer.cleanupEGLContext();
- mTextureRenderer.configureSurfaces(configure.surfaces);
- mCaptureCollector = checkNotNull(configure.collector);
- configure.condition.open();
- mConfigured = true;
- break;
- case MSG_NEW_FRAME:
- if (mDroppingFrames) {
- Log.w(TAG, "Ignoring frame.");
+ try {
+ switch (msg.what) {
+ case MSG_NEW_CONFIGURATION:
+ ConfigureHolder configure = (ConfigureHolder) msg.obj;
+ mTextureRenderer.cleanupEGLContext();
+ mTextureRenderer.configureSurfaces(configure.surfaces);
+ mCaptureCollector = checkNotNull(configure.collector);
+ configure.condition.open();
+ mConfigured = true;
+ break;
+ case MSG_NEW_FRAME:
+ if (mDroppingFrames) {
+ Log.w(TAG, "Ignoring frame.");
+ break;
+ }
+ if (DEBUG) {
+ mPrevCounter.countAndLog();
+ }
+ if (!mConfigured) {
+ Log.e(TAG, "Dropping frame, EGL context not configured!");
+ }
+ mTextureRenderer.drawIntoSurfaces(mCaptureCollector);
+ break;
+ case MSG_CLEANUP:
+ mTextureRenderer.cleanupEGLContext();
+ mCleanup = true;
+ mConfigured = false;
+ break;
+ case MSG_DROP_FRAMES:
+ mDroppingFrames = true;
+ break;
+ case MSG_ALLOW_FRAMES:
+ mDroppingFrames = false;
+ break;
+ default:
+ Log.e(TAG, "Unhandled message " + msg.what + " on GLThread.");
break;
- }
- if (DEBUG) {
- mPrevCounter.countAndLog();
- }
- if (!mConfigured) {
- Log.e(TAG, "Dropping frame, EGL context not configured!");
- }
- mTextureRenderer.drawIntoSurfaces(mCaptureCollector);
- break;
- case MSG_CLEANUP:
- mTextureRenderer.cleanupEGLContext();
- mCleanup = true;
- mConfigured = false;
- break;
- case MSG_DROP_FRAMES:
- mDroppingFrames = true;
- break;
- case MSG_ALLOW_FRAMES:
- mDroppingFrames = false;
- break;
- default:
- Log.e(TAG, "Unhandled message " + msg.what + " on GLThread.");
- break;
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Received exception on GL render thread: ", e);
+ mDeviceState.setError(CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
}
return true;
}
@@ -122,11 +130,13 @@ public class GLThreadManager {
*
* @param cameraId the camera id for this thread.
* @param facing direction the camera is facing.
+ * @param state {@link CameraDeviceState} to use for error handling.
*/
- public GLThreadManager(int cameraId, int facing) {
+ public GLThreadManager(int cameraId, int facing, CameraDeviceState state) {
mTextureRenderer = new SurfaceTextureRenderer(facing);
TAG = String.format("CameraDeviceGLThread-%d", cameraId);
mGLHandlerThread = new RequestHandlerThread(TAG, mGLHandlerCb);
+ mDeviceState = state;
}
/**
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index ffc55f1f40e6..a724b4142274 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -23,6 +23,10 @@ import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.impl.CaptureResultExtras;
import android.hardware.camera2.ICameraDeviceCallbacks;
+import android.hardware.camera2.params.StreamConfiguration;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.hardware.camera2.utils.ArrayUtils;
+import android.hardware.camera2.utils.CameraBinderDecorator;
import android.hardware.camera2.utils.LongParcelable;
import android.hardware.camera2.impl.CameraMetadataNative;
import android.hardware.camera2.utils.CameraRuntimeException;
@@ -35,6 +39,7 @@ import android.util.Size;
import android.view.Surface;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -56,11 +61,13 @@ public class LegacyCameraDevice implements AutoCloseable {
public static final String DEBUG_PROP = "HAL1ShimLogging";
private final String TAG;
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = Log.isLoggable(LegacyCameraDevice.DEBUG_PROP, Log.DEBUG);
private final int mCameraId;
+ private final CameraCharacteristics mStaticCharacteristics;
private final ICameraDeviceCallbacks mDeviceCallbacks;
private final CameraDeviceState mDeviceState = new CameraDeviceState();
private List<Surface> mConfiguredSurfaces;
+ private boolean mClosed = false;
private final ConditionVariable mIdle = new ConditionVariable(/*open*/true);
@@ -87,14 +94,15 @@ public class LegacyCameraDevice implements AutoCloseable {
private final CameraDeviceState.CameraDeviceStateListener mStateListener =
new CameraDeviceState.CameraDeviceStateListener() {
@Override
- public void onError(final int errorCode, RequestHolder holder) {
+ public void onError(final int errorCode, final RequestHolder holder) {
mIdle.open();
final CaptureResultExtras extras = getExtrasFromRequest(holder);
mResultHandler.post(new Runnable() {
@Override
public void run() {
if (DEBUG) {
- Log.d(TAG, "doing onError callback.");
+ Log.d(TAG, "doing onError callback for request " + holder.getRequestId() +
+ ", with error code " + errorCode);
}
try {
mDeviceCallbacks.onDeviceError(errorCode, extras);
@@ -135,14 +143,15 @@ public class LegacyCameraDevice implements AutoCloseable {
}
@Override
- public void onCaptureStarted(RequestHolder holder, final long timestamp) {
+ public void onCaptureStarted(final RequestHolder holder, final long timestamp) {
final CaptureResultExtras extras = getExtrasFromRequest(holder);
mResultHandler.post(new Runnable() {
@Override
public void run() {
if (DEBUG) {
- Log.d(TAG, "doing onCaptureStarted callback.");
+ Log.d(TAG, "doing onCaptureStarted callback for request " +
+ holder.getRequestId());
}
try {
mDeviceCallbacks.onCaptureStarted(extras, timestamp);
@@ -155,14 +164,15 @@ public class LegacyCameraDevice implements AutoCloseable {
}
@Override
- public void onCaptureResult(final CameraMetadataNative result, RequestHolder holder) {
+ public void onCaptureResult(final CameraMetadataNative result, final RequestHolder holder) {
final CaptureResultExtras extras = getExtrasFromRequest(holder);
mResultHandler.post(new Runnable() {
@Override
public void run() {
if (DEBUG) {
- Log.d(TAG, "doing onCaptureResult callback.");
+ Log.d(TAG, "doing onCaptureResult callback for request " +
+ holder.getRequestId());
}
try {
mDeviceCallbacks.onResultReceived(result, extras);
@@ -216,6 +226,7 @@ public class LegacyCameraDevice implements AutoCloseable {
mCallbackHandlerThread.start();
mCallbackHandler = new Handler(mCallbackHandlerThread.getLooper());
mDeviceState.setCameraDeviceCallbacks(mCallbackHandler, mStateListener);
+ mStaticCharacteristics = characteristics;
mRequestThreadManager =
new RequestThreadManager(cameraId, camera, characteristics, mDeviceState);
mRequestThreadManager.start();
@@ -239,21 +250,57 @@ public class LegacyCameraDevice implements AutoCloseable {
Log.e(TAG, "configureOutputs - null outputs are not allowed");
return BAD_VALUE;
}
+ StreamConfigurationMap streamConfigurations = mStaticCharacteristics.
+ get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+
+ // Validate surface size and format.
+ try {
+ Size s = getSurfaceSize(output);
+ int surfaceType = detectSurfaceType(output);
+ Size[] sizes = streamConfigurations.getOutputSizes(surfaceType);
+
+ if (sizes == null) {
+ // WAR: Override default format to IMPLEMENTATION_DEFINED for b/9487482
+ if ((surfaceType >= LegacyMetadataMapper.HAL_PIXEL_FORMAT_RGBA_8888 &&
+ surfaceType <= LegacyMetadataMapper.HAL_PIXEL_FORMAT_BGRA_8888)) {
+
+ // YUV_420_888 is always present in LEGACY for all IMPLEMENTATION_DEFINED
+ // output sizes, and is publicly visible in the API (i.e.
+ // {@code #getOutputSizes} works here).
+ sizes = streamConfigurations.getOutputSizes(ImageFormat.YUV_420_888);
+ } else if (surfaceType == LegacyMetadataMapper.HAL_PIXEL_FORMAT_BLOB) {
+ sizes = streamConfigurations.getOutputSizes(ImageFormat.JPEG);
+ }
+ }
+
+ if (!ArrayUtils.contains(sizes, s)) {
+ String reason = (sizes == null) ? "format is invalid." :
+ ("size not in valid set: " + Arrays.toString(sizes));
+ Log.e(TAG, String.format("Surface with size (w=%d, h=%d) and format 0x%x is"
+ + " not valid, %s", s.getWidth(), s.getHeight(), surfaceType,
+ reason));
+ return BAD_VALUE;
+ }
+ } catch (BufferQueueAbandonedException e) {
+ Log.e(TAG, "Surface bufferqueue is abandoned, cannot configure as output: ", e);
+ return BAD_VALUE;
+ }
+
}
}
- int error = mDeviceState.setConfiguring();
- if (error == NO_ERROR) {
+ boolean success = false;
+ if (mDeviceState.setConfiguring()) {
mRequestThreadManager.configure(outputs);
- error = mDeviceState.setIdle();
+ success = mDeviceState.setIdle();
}
- // TODO: May also want to check the surfaces more deeply (e.g. state, formats, sizes..)
- if (error == NO_ERROR) {
+ if (success) {
mConfiguredSurfaces = outputs != null ? new ArrayList<>(outputs) : null;
+ } else {
+ return CameraBinderDecorator.INVALID_OPERATION;
}
-
- return error;
+ return CameraBinderDecorator.NO_ERROR;
}
/**
@@ -342,6 +389,24 @@ public class LegacyCameraDevice implements AutoCloseable {
mIdle.block();
}
+ /**
+ * Flush any pending requests.
+ *
+ * @return the last frame number.
+ */
+ public long flush() {
+ long lastFrame = mRequestThreadManager.flush();
+ waitUntilIdle();
+ return lastFrame;
+ }
+
+ /**
+ * Return {@code true} if the device has been closed.
+ */
+ public boolean isClosed() {
+ return mClosed;
+ }
+
@Override
public void close() {
mRequestThreadManager.quit();
@@ -362,7 +427,7 @@ public class LegacyCameraDevice implements AutoCloseable {
mResultThread.getName(), mResultThread.getId()));
}
- // TODO: throw IllegalStateException in every method after close has been called
+ mClosed = true;
}
@Override
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index c36b63a474d9..907d2ae26f9a 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -17,6 +17,7 @@
package android.hardware.camera2.legacy;
import android.graphics.ImageFormat;
+import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
@@ -61,8 +62,10 @@ public class LegacyMetadataMapper {
private static final long NS_PER_MS = 1000000;
// from graphics.h
- private static final int HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22;
- private static final int HAL_PIXEL_FORMAT_BLOB = 0x21;
+ public static final int HAL_PIXEL_FORMAT_RGBA_8888 = PixelFormat.RGBA_8888;
+ public static final int HAL_PIXEL_FORMAT_BGRA_8888 = 0x5;
+ public static final int HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22;
+ public static final int HAL_PIXEL_FORMAT_BLOB = 0x21;
// for metadata
private static final float LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS = 0.0f;
@@ -1170,7 +1173,7 @@ public class LegacyMetadataMapper {
Rect activeArray = c.get(SENSOR_INFO_ACTIVE_ARRAY_SIZE);
MeteringRectangle[] activeRegions = new MeteringRectangle[] {
new MeteringRectangle(/*x*/0, /*y*/0, /*width*/activeArray.width() - 1,
- /*height*/activeArray.height() - 1,/*weight*/1)};
+ /*height*/activeArray.height() - 1,/*weight*/0)};
m.set(CaptureRequest.CONTROL_AE_REGIONS, activeRegions);
m.set(CaptureRequest.CONTROL_AWB_REGIONS, activeRegions);
m.set(CaptureRequest.CONTROL_AF_REGIONS, activeRegions);
@@ -1275,6 +1278,11 @@ public class LegacyMetadataMapper {
m.set(CaptureRequest.FLASH_MODE, FLASH_MODE_OFF);
/*
+ * noiseReduction.*
+ */
+ m.set(CaptureRequest.NOISE_REDUCTION_MODE, NOISE_REDUCTION_MODE_FAST);
+
+ /*
* lens.*
*/
diff --git a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
index 7c6475dde814..61f7b8b3d230 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
@@ -399,8 +399,9 @@ public class LegacyRequestMapper {
// jpeg.orientation
{
- int orientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
- params.setRotation(ParamsUtils.getOrDefault(request, JPEG_ORIENTATION, orientation));
+ Integer orientation = request.get(CaptureRequest.JPEG_ORIENTATION);
+ params.setRotation(ParamsUtils.getOrDefault(request, JPEG_ORIENTATION,
+ (orientation == null) ? 0 : orientation));
}
// jpeg.quality
@@ -496,6 +497,11 @@ public class LegacyRequestMapper {
}
}
+ if (meteringRectangleList.size() == 0) {
+ Log.w(TAG, "Only received metering rectangles with weight 0.");
+ return Arrays.asList(ParameterUtils.CAMERA_AREA_DEFAULT);
+ }
+
// Ignore any regions beyond our maximum supported count
int countMeteringAreas =
Math.min(maxNumMeteringAreas, meteringRectangleList.size());
@@ -642,6 +648,8 @@ public class LegacyRequestMapper {
return Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT;
case CONTROL_AWB_MODE_TWILIGHT:
return Camera.Parameters.WHITE_BALANCE_TWILIGHT;
+ case CONTROL_AWB_MODE_SHADE:
+ return Parameters.WHITE_BALANCE_SHADE;
default:
Log.w(TAG, "convertAwbModeToLegacy - unrecognized control.awbMode" + mode);
return Camera.Parameters.WHITE_BALANCE_AUTO;
diff --git a/core/java/android/hardware/camera2/legacy/RequestHolder.java b/core/java/android/hardware/camera2/legacy/RequestHolder.java
index 9f27093f62eb..69c140b5ef65 100644
--- a/core/java/android/hardware/camera2/legacy/RequestHolder.java
+++ b/core/java/android/hardware/camera2/legacy/RequestHolder.java
@@ -26,7 +26,9 @@ import java.util.Collection;
import static com.android.internal.util.Preconditions.*;
/**
- * Immutable container for a single capture request and associated information.
+ * Semi-immutable container for a single capture request and associated information,
+ * the only mutable characteristic of this container is whether or not is has been
+ * marked as "failed" using {@code #failRequest}.
*/
public class RequestHolder {
private static final String TAG = "RequestHolder";
@@ -36,8 +38,9 @@ public class RequestHolder {
private final int mRequestId;
private final int mSubsequeceId;
private final long mFrameNumber;
- private final boolean mHasJpegTargets;
- private final boolean mHasPreviewTargets;
+ private final int mNumJpegTargets;
+ private final int mNumPreviewTargets;
+ private volatile boolean mFailed = false;
/**
* Returns true if the given surface requires jpeg buffers.
@@ -71,36 +74,37 @@ public class RequestHolder {
}
/**
- * Returns true if any of the surfaces targeted by the contained request require jpeg buffers.
+ * Returns the number of surfaces targeted by the request that require jpeg buffers.
*/
- private static boolean requestContainsJpegTargets(CaptureRequest request) {
+ private static int numJpegTargets(CaptureRequest request) {
+ int count = 0;
for (Surface s : request.getTargets()) {
try {
if (jpegType(s)) {
- return true;
+ ++count;
}
} catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
Log.w(TAG, "Surface abandoned, skipping...", e);
}
}
- return false;
+ return count;
}
/**
- * Returns true if any of the surfaces targeted by the contained request require a
- * non-jpeg buffer type.
+ * Returns the number of surfaces targeted by the request that require non-jpeg buffers.
*/
- private static boolean requestContainsPreviewTargets(CaptureRequest request) {
+ private static int numPreviewTargets(CaptureRequest request) {
+ int count = 0;
for (Surface s : request.getTargets()) {
try {
if (previewType(s)) {
- return true;
+ ++count;
}
} catch (LegacyExceptionUtils.BufferQueueAbandonedException e) {
Log.w(TAG, "Surface abandoned, skipping...", e);
}
}
- return false;
+ return count;
}
/**
@@ -115,8 +119,8 @@ public class RequestHolder {
private final int mSubsequenceId;
private final CaptureRequest mRequest;
private final boolean mRepeating;
- private final boolean mHasJpegTargets;
- private final boolean mHasPreviewTargets;
+ private final int mNumJpegTargets;
+ private final int mNumPreviewTargets;
/**
* Construct a new {@link Builder} to generate {@link RequestHolder} objects.
@@ -134,8 +138,8 @@ public class RequestHolder {
mSubsequenceId = subsequenceId;
mRequest = request;
mRepeating = repeating;
- mHasJpegTargets = requestContainsJpegTargets(mRequest);
- mHasPreviewTargets = requestContainsPreviewTargets(mRequest);
+ mNumJpegTargets = numJpegTargets(mRequest);
+ mNumPreviewTargets = numPreviewTargets(mRequest);
}
/**
@@ -147,20 +151,20 @@ public class RequestHolder {
*/
public RequestHolder build(long frameNumber) {
return new RequestHolder(mRequestId, mSubsequenceId, mRequest, mRepeating, frameNumber,
- mHasJpegTargets, mHasPreviewTargets);
+ mNumJpegTargets, mNumPreviewTargets);
}
}
private RequestHolder(int requestId, int subsequenceId, CaptureRequest request,
- boolean repeating, long frameNumber, boolean hasJpegTargets,
- boolean hasPreviewTargets) {
+ boolean repeating, long frameNumber, int numJpegTargets,
+ int numPreviewTargets) {
mRepeating = repeating;
mRequest = request;
mRequestId = requestId;
mSubsequeceId = subsequenceId;
mFrameNumber = frameNumber;
- mHasJpegTargets = hasJpegTargets;
- mHasPreviewTargets = hasPreviewTargets;
+ mNumJpegTargets = numJpegTargets;
+ mNumPreviewTargets = numPreviewTargets;
}
/**
@@ -209,7 +213,7 @@ public class RequestHolder {
* Returns true if any of the surfaces targeted by the contained request require jpeg buffers.
*/
public boolean hasJpegTargets() {
- return mHasJpegTargets;
+ return mNumJpegTargets > 0;
}
/**
@@ -217,7 +221,36 @@ public class RequestHolder {
* non-jpeg buffer type.
*/
public boolean hasPreviewTargets(){
- return mHasPreviewTargets;
+ return mNumPreviewTargets > 0;
+ }
+
+ /**
+ * Return the number of jpeg-type surfaces targeted by this request.
+ */
+ public int numJpegTargets() {
+ return mNumJpegTargets;
+ }
+
+ /**
+ * Return the number of non-jpeg-type surfaces targeted by this request.
+ */
+ public int numPreviewTargets() {
+ return mNumPreviewTargets;
+ }
+
+ /**
+ * Mark this request as failed.
+ */
+ public void failRequest() {
+ Log.w(TAG, "Capture failed for request: " + getRequestId());
+ mFailed = true;
+ }
+
+ /**
+ * Return {@code true} if this request failed.
+ */
+ public boolean requestFailed() {
+ return mFailed;
}
}
diff --git a/core/java/android/hardware/camera2/legacy/RequestQueue.java b/core/java/android/hardware/camera2/legacy/RequestQueue.java
index 7820648e599f..7598f99d00e4 100644
--- a/core/java/android/hardware/camera2/legacy/RequestQueue.java
+++ b/core/java/android/hardware/camera2/legacy/RequestQueue.java
@@ -80,6 +80,7 @@ public class RequestQueue {
ret = (mCurrentRepeatingFrameNumber == INVALID_FRAME) ? INVALID_FRAME :
mCurrentRepeatingFrameNumber - 1;
mCurrentRepeatingFrameNumber = INVALID_FRAME;
+ Log.i(TAG, "Repeating capture request cancelled.");
} else {
Log.e(TAG, "cancel failed: no repeating request exists for request id: " + requestId);
}
@@ -87,6 +88,20 @@ public class RequestQueue {
}
/**
+ * Cancel a repeating request.
+ *
+ * @return the last frame to be returned from the HAL for the given repeating request, or
+ * {@code INVALID_FRAME} if none exists.
+ */
+ public synchronized long stopRepeating() {
+ if (mRepeatingRequest == null) {
+ Log.e(TAG, "cancel failed: no repeating request exists.");
+ return INVALID_FRAME;
+ }
+ return stopRepeating(mRepeatingRequest.getRequestId());
+ }
+
+ /**
* Add a the given burst to the queue.
*
* <p>If the burst is repeating, replace the current repeating burst.</p>
@@ -105,6 +120,7 @@ public class RequestQueue {
BurstHolder burst = new BurstHolder(requestId, repeating, requests);
long ret = INVALID_FRAME;
if (burst.isRepeating()) {
+ Log.i(TAG, "Repeating capture request set.");
if (mRepeatingRequest != null) {
ret = (mCurrentRepeatingFrameNumber == INVALID_FRAME) ? INVALID_FRAME :
mCurrentRepeatingFrameNumber - 1;
diff --git a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
index e6da670d0c56..788b6d8db16a 100644
--- a/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
+++ b/core/java/android/hardware/camera2/legacy/RequestThreadManager.java
@@ -20,6 +20,7 @@ import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.impl.CameraDeviceImpl;
import android.hardware.camera2.utils.LongParcelable;
import android.hardware.camera2.utils.SizeAreaComparator;
import android.hardware.camera2.impl.CameraMetadataNative;
@@ -33,7 +34,6 @@ import android.util.Pair;
import android.util.Size;
import android.view.Surface;
-import java.io.IOError;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@@ -98,6 +98,7 @@ public class RequestThreadManager {
private SurfaceTexture mDummyTexture;
private Surface mDummySurface;
+ private final Object mIdleLock = new Object();
private final FpsCounter mPrevCounter = new FpsCounter("Incoming Preview");
private final FpsCounter mRequestCounter = new FpsCounter("Incoming Requests");
@@ -173,6 +174,14 @@ public class RequestThreadManager {
}
}
+ private final Camera.ErrorCallback mErrorCallback = new Camera.ErrorCallback() {
+ @Override
+ public void onError(int i, Camera camera) {
+ Log.e(TAG, "Received error " + i + " from the Camera1 ErrorCallback");
+ mDeviceState.setError(CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ }
+ };
+
private final ConditionVariable mReceivedJpeg = new ConditionVariable(false);
private final Camera.PictureCallback mJpegCallback = new Camera.PictureCallback() {
@@ -284,10 +293,9 @@ public class RequestThreadManager {
startPreview();
}
- private void configureOutputs(Collection<Surface> outputs) throws IOException {
+ private void configureOutputs(Collection<Surface> outputs) {
if (DEBUG) {
String outputsStr = outputs == null ? "null" : (outputs.size() + " surfaces");
-
Log.d(TAG, "configureOutputs with " + outputsStr);
}
@@ -297,7 +305,11 @@ public class RequestThreadManager {
* using a different one; this also reduces the likelihood of getting into a deadlock
* when disconnecting from the old previous texture at a later time.
*/
- mCamera.setPreviewTexture(/*surfaceTexture*/null);
+ try {
+ mCamera.setPreviewTexture(/*surfaceTexture*/null);
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to clear prior SurfaceTexture, may cause GL deadlock: ", e);
+ }
if (mGLThreadManager != null) {
mGLThreadManager.waitUntilStarted();
@@ -402,7 +414,7 @@ public class RequestThreadManager {
// TODO: Detect and optimize single-output paths here to skip stream teeing.
if (mGLThreadManager == null) {
- mGLThreadManager = new GLThreadManager(mCameraId, facing);
+ mGLThreadManager = new GLThreadManager(mCameraId, facing, mDeviceState);
mGLThreadManager.start();
}
mGLThreadManager.waitUntilStarted();
@@ -568,26 +580,23 @@ public class RequestThreadManager {
case MSG_CONFIGURE_OUTPUTS:
ConfigureHolder config = (ConfigureHolder) msg.obj;
int sizes = config.surfaces != null ? config.surfaces.size() : 0;
- Log.i(TAG, "Configure outputs: " + sizes +
- " surfaces configured.");
+ Log.i(TAG, "Configure outputs: " + sizes + " surfaces configured.");
try {
boolean success = mCaptureCollector.waitForEmpty(JPEG_FRAME_TIMEOUT,
TimeUnit.MILLISECONDS);
if (!success) {
Log.e(TAG, "Timed out while queueing configure request.");
+ mCaptureCollector.failAll();
}
} catch (InterruptedException e) {
- // TODO: report error to CameraDevice
Log.e(TAG, "Interrupted while waiting for requests to complete.");
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
}
- try {
- configureOutputs(config.surfaces);
- } catch (IOException e) {
- // TODO: report error to CameraDevice
- throw new IOError(e);
- }
+ configureOutputs(config.surfaces);
config.condition.open();
if (DEBUG) {
long totalTime = SystemClock.elapsedRealtimeNanos() - startTime;
@@ -599,20 +608,38 @@ public class RequestThreadManager {
// Get the next burst from the request queue.
Pair<BurstHolder, Long> nextBurst = mRequestQueue.getNext();
+
if (nextBurst == null) {
+ // If there are no further requests queued, wait for any currently executing
+ // requests to complete, then switch to idle state.
try {
boolean success = mCaptureCollector.waitForEmpty(JPEG_FRAME_TIMEOUT,
TimeUnit.MILLISECONDS);
if (!success) {
- Log.e(TAG, "Timed out while waiting for empty.");
+ Log.e(TAG,
+ "Timed out while waiting for prior requests to complete.");
+ mCaptureCollector.failAll();
}
} catch (InterruptedException e) {
- // TODO: report error to CameraDevice
- Log.e(TAG, "Interrupted while waiting for requests to complete.");
+ Log.e(TAG, "Interrupted while waiting for requests to complete: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
}
- mDeviceState.setIdle();
- break;
- } else {
+
+ synchronized (mIdleLock) {
+ // Retry the the request queue.
+ nextBurst = mRequestQueue.getNext();
+
+ // If we still have no queued requests, go idle.
+ if (nextBurst == null) {
+ mDeviceState.setIdle();
+ break;
+ }
+ }
+ }
+
+ if (nextBurst != null) {
// Queue another capture if we did not get the last burst.
handler.sendEmptyMessage(MSG_SUBMIT_CAPTURE_REQUEST);
}
@@ -625,27 +652,39 @@ public class RequestThreadManager {
boolean paramsChanged = false;
- // Lazily process the rest of the request
+ // Only update parameters if the request has changed
if (mLastRequest == null || mLastRequest.captureRequest != request) {
// The intermediate buffer is sometimes null, but we always need
- // the camera1's configured preview size
+ // the Camera1 API configured preview size
Size previewSize = ParameterUtils.convertSize(mParams.getPreviewSize());
- LegacyRequest legacyRequest = new LegacyRequest(
- mCharacteristics, request, previewSize,
- mParams); // params are copied
+ LegacyRequest legacyRequest = new LegacyRequest(mCharacteristics,
+ request, previewSize, mParams); // params are copied
+
- mLastRequest = legacyRequest;
// Parameters are mutated as a side-effect
LegacyMetadataMapper.convertRequestMetadata(/*inout*/legacyRequest);
+ // If the parameters have changed, set them in the Camera1 API.
if (!mParams.same(legacyRequest.parameters)) {
- mParams = legacyRequest.parameters;
- mCamera.setParameters(mParams);
-
+ try {
+ mCamera.setParameters(legacyRequest.parameters);
+ } catch (RuntimeException e) {
+ // If setting the parameters failed, report a request error to
+ // the camera client, and skip any further work for this request
+ Log.e(TAG, "Exception while setting camera parameters: ", e);
+ holder.failRequest();
+ mDeviceState.setCaptureStart(holder, /*timestamp*/0,
+ CameraDeviceImpl.CameraDeviceCallbacks.
+ ERROR_CAMERA_REQUEST);
+ continue;
+ }
paramsChanged = true;
+ mParams = legacyRequest.parameters;
}
+
+ mLastRequest = legacyRequest;
}
try {
@@ -653,19 +692,27 @@ public class RequestThreadManager {
mLastRequest, JPEG_FRAME_TIMEOUT, TimeUnit.MILLISECONDS);
if (!success) {
+ // Report a request error if we timed out while queuing this.
Log.e(TAG, "Timed out while queueing capture request.");
+ holder.failRequest();
+ mDeviceState.setCaptureStart(holder, /*timestamp*/0,
+ CameraDeviceImpl.CameraDeviceCallbacks.
+ ERROR_CAMERA_REQUEST);
+ continue;
}
+
// Starting the preview needs to happen before enabling
// face detection or auto focus
if (holder.hasPreviewTargets()) {
doPreviewCapture(holder);
}
if (holder.hasJpegTargets()) {
- success = mCaptureCollector.
- waitForPreviewsEmpty(PREVIEW_FRAME_TIMEOUT *
- MAX_IN_FLIGHT_REQUESTS, TimeUnit.MILLISECONDS);
- if (!success) {
- Log.e(TAG, "Timed out waiting for prior requests to complete.");
+ while(!mCaptureCollector.waitForPreviewsEmpty(PREVIEW_FRAME_TIMEOUT,
+ TimeUnit.MILLISECONDS)) {
+ // Fail preview requests until the queue is empty.
+ Log.e(TAG, "Timed out while waiting for preview requests to " +
+ "complete.");
+ mCaptureCollector.failNextPreview();
}
mReceivedJpeg.close();
doJpegCapturePrepare(holder);
@@ -686,17 +733,21 @@ public class RequestThreadManager {
if (holder.hasJpegTargets()) {
doJpegCapture(holder);
if (!mReceivedJpeg.block(JPEG_FRAME_TIMEOUT)) {
- // TODO: report error to CameraDevice
Log.e(TAG, "Hit timeout for jpeg callback!");
+ mCaptureCollector.failNextJpeg();
}
}
} catch (IOException e) {
- // TODO: report error to CameraDevice
- throw new IOError(e);
+ Log.e(TAG, "Received device exception: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
} catch (InterruptedException e) {
- // TODO: report error to CameraDevice
- Log.e(TAG, "Interrupted during capture.", e);
+ Log.e(TAG, "Interrupted during capture: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
}
if (paramsChanged) {
@@ -717,10 +768,13 @@ public class RequestThreadManager {
if (!success) {
Log.e(TAG, "Timed out while waiting for request to complete.");
+ mCaptureCollector.failAll();
}
} catch (InterruptedException e) {
- // TODO: report error to CameraDevice
- Log.e(TAG, "Interrupted during request completition.", e);
+ Log.e(TAG, "Interrupted waiting for request completion: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
+ break;
}
CameraMetadataNative result = mMapper.cachedConvertResultMetadata(
@@ -736,7 +790,10 @@ public class RequestThreadManager {
// Update face-related results
mFaceDetectMapper.mapResultFaces(result, mLastRequest);
- mDeviceState.setCaptureResult(holder, result);
+ if (!holder.requestFailed()) {
+ mDeviceState.setCaptureResult(holder, result,
+ CameraDeviceState.NO_CAPTURE_ERROR);
+ }
}
if (DEBUG) {
long totalTime = SystemClock.elapsedRealtimeNanos() - startTime;
@@ -751,10 +808,12 @@ public class RequestThreadManager {
TimeUnit.MILLISECONDS);
if (!success) {
Log.e(TAG, "Timed out while queueing cleanup request.");
+ mCaptureCollector.failAll();
}
} catch (InterruptedException e) {
- // TODO: report error to CameraDevice
- Log.e(TAG, "Interrupted while waiting for requests to complete.");
+ Log.e(TAG, "Interrupted while waiting for requests to complete: ", e);
+ mDeviceState.setError(
+ CameraDeviceImpl.CameraDeviceCallbacks.ERROR_CAMERA_DEVICE);
}
if (mGLThreadManager != null) {
mGLThreadManager.quit();
@@ -792,6 +851,7 @@ public class RequestThreadManager {
mFaceDetectMapper = new LegacyFaceDetectMapper(mCamera, mCharacteristics);
mCaptureCollector = new CaptureCollector(MAX_IN_FLIGHT_REQUESTS, mDeviceState);
mRequestThread = new RequestHandlerThread(name, mRequestHandlerCb);
+ mCamera.setErrorCallback(mErrorCallback);
}
/**
@@ -802,11 +862,15 @@ public class RequestThreadManager {
}
/**
- * Flush the pending requests.
+ * Flush any pending requests.
+ *
+ * @return the last frame number.
*/
- public void flush() {
- // TODO: Implement flush.
- Log.e(TAG, "flush not yet implemented.");
+ public long flush() {
+ Log.i(TAG, "Flushing all pending requests.");
+ long lastFrame = mRequestQueue.stopRepeating();
+ mCaptureCollector.failAll();
+ return lastFrame;
}
/**
@@ -840,8 +904,11 @@ public class RequestThreadManager {
public int submitCaptureRequests(List<CaptureRequest> requests, boolean repeating,
/*out*/LongParcelable frameNumber) {
Handler handler = mRequestThread.waitAndGetHandler();
- int ret = mRequestQueue.submit(requests, repeating, frameNumber);
- handler.sendEmptyMessage(MSG_SUBMIT_CAPTURE_REQUEST);
+ int ret;
+ synchronized (mIdleLock) {
+ ret = mRequestQueue.submit(requests, repeating, frameNumber);
+ handler.sendEmptyMessage(MSG_SUBMIT_CAPTURE_REQUEST);
+ }
return ret;
}
@@ -856,7 +923,6 @@ public class RequestThreadManager {
return mRequestQueue.stopRepeating(requestId);
}
-
/**
* Configure with the current list of output Surfaces.
*
diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
index a35883c00070..c018c3e37cec 100644
--- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
+++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
@@ -652,7 +652,9 @@ public class SurfaceTextureRenderer {
// No preview request queued, drop frame.
if (captureHolder == null) {
- Log.w(TAG, "Dropping preview frame.");
+ if (DEBUG) {
+ Log.d(TAG, "Dropping preview frame.");
+ }
if (doTiming) {
endGlTiming();
}
diff --git a/core/java/android/hardware/camera2/utils/ArrayUtils.java b/core/java/android/hardware/camera2/utils/ArrayUtils.java
index ae970793a697..5a78bbd4b949 100644
--- a/core/java/android/hardware/camera2/utils/ArrayUtils.java
+++ b/core/java/android/hardware/camera2/utils/ArrayUtils.java
@@ -32,7 +32,7 @@ public class ArrayUtils {
/** Return the index of {@code needle} in the {@code array}, or else {@code -1} */
public static <T> int getArrayIndex(T[] array, T needle) {
- if (needle == null) {
+ if (array == null) {
return -1;
}
@@ -167,6 +167,17 @@ public class ArrayUtils {
return getArrayIndex(array, elem) != -1;
}
+ /**
+ * Returns true if the given {@code array} contains the given element.
+ *
+ * @param array {@code array} to check for {@code elem}
+ * @param elem {@code elem} to test for
+ * @return {@code true} if the given element is contained
+ */
+ public static <T> boolean contains(T[] array, T elem) {
+ return getArrayIndex(array, elem) != -1;
+ }
+
private ArrayUtils() {
throw new AssertionError();
}
diff --git a/core/java/android/hardware/input/KeyboardLayout.java b/core/java/android/hardware/input/KeyboardLayout.java
index 5402e75a42c7..ed51402bdac8 100644
--- a/core/java/android/hardware/input/KeyboardLayout.java
+++ b/core/java/android/hardware/input/KeyboardLayout.java
@@ -29,6 +29,7 @@ public final class KeyboardLayout implements Parcelable,
private final String mDescriptor;
private final String mLabel;
private final String mCollection;
+ private final int mPriority;
public static final Parcelable.Creator<KeyboardLayout> CREATOR =
new Parcelable.Creator<KeyboardLayout>() {
@@ -40,16 +41,18 @@ public final class KeyboardLayout implements Parcelable,
}
};
- public KeyboardLayout(String descriptor, String label, String collection) {
+ public KeyboardLayout(String descriptor, String label, String collection, int priority) {
mDescriptor = descriptor;
mLabel = label;
mCollection = collection;
+ mPriority = priority;
}
private KeyboardLayout(Parcel source) {
mDescriptor = source.readString();
mLabel = source.readString();
mCollection = source.readString();
+ mPriority = source.readInt();
}
/**
@@ -90,11 +93,17 @@ public final class KeyboardLayout implements Parcelable,
dest.writeString(mDescriptor);
dest.writeString(mLabel);
dest.writeString(mCollection);
+ dest.writeInt(mPriority);
}
@Override
public int compareTo(KeyboardLayout another) {
- int result = mLabel.compareToIgnoreCase(another.mLabel);
+ // Note that these arguments are intentionally flipped since you want higher priority
+ // keyboards to be listed before lower priority keyboards.
+ int result = Integer.compare(another.mPriority, mPriority);
+ if (result == 0) {
+ result = mLabel.compareToIgnoreCase(another.mLabel);
+ }
if (result == 0) {
result = mCollection.compareToIgnoreCase(another.mCollection);
}
@@ -108,4 +117,4 @@ public final class KeyboardLayout implements Parcelable,
}
return mLabel + " - " + mCollection;
}
-} \ No newline at end of file
+}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 7c69a7da145f..e3cbef5a1182 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1402,6 +1402,20 @@ public class ConnectivityManager {
return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
}
+ /** {@hide */
+ public static final void enforceTetherChangePermission(Context context) {
+ if (context.getResources().getStringArray(
+ com.android.internal.R.array.config_mobile_hotspot_provision_app).length == 2) {
+ // Have a provisioning app - must only let system apps (which check this app)
+ // turn on tethering
+ context.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CONNECTIVITY_INTERNAL, "ConnectivityService");
+ } else {
+ context.enforceCallingOrSelfPermission(
+ android.Manifest.permission.CHANGE_NETWORK_STATE, "ConnectivityService");
+ }
+ }
+
/**
* Get the set of tetherable, available interfaces. This list is limited by
* device configuration and current interface existence.
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 54d43d380a26..ea5dfd184f29 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -24,6 +24,8 @@ import android.util.SparseBooleanArray;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
+import libcore.util.EmptyArray;
+
import java.io.CharArrayWriter;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -169,6 +171,15 @@ public class NetworkStats implements Parcelable {
} else {
// Special case for use by NetworkStatsFactory to start out *really* empty.
this.capacity = 0;
+ this.iface = EmptyArray.STRING;
+ this.uid = EmptyArray.INT;
+ this.set = EmptyArray.INT;
+ this.tag = EmptyArray.INT;
+ this.rxBytes = EmptyArray.LONG;
+ this.rxPackets = EmptyArray.LONG;
+ this.txBytes = EmptyArray.LONG;
+ this.txPackets = EmptyArray.LONG;
+ this.operations = EmptyArray.LONG;
}
}
diff --git a/core/java/android/nfc/cardemulation/AidGroup.java b/core/java/android/nfc/cardemulation/AidGroup.java
index f440874af06e..4407c9deb911 100644
--- a/core/java/android/nfc/cardemulation/AidGroup.java
+++ b/core/java/android/nfc/cardemulation/AidGroup.java
@@ -15,10 +15,6 @@ import android.util.Log;
/**
* The AidGroup class represents a group of Application Identifiers (AIDs).
*
- * <p>An instance of this object can be used with
- * {@link CardEmulation#registerAidsForService(android.content.ComponentName, String, java.util.List)}
- * to tell the OS which AIDs are handled by your HCE- or SE-based service.
- *
* <p>The format of AIDs is defined in the ISO/IEC 7816-4 specification. This class
* requires the AIDs to be input as a hexadecimal string, with an even amount of
* hexadecimal characters, e.g. "F014811481".
@@ -60,7 +56,10 @@ public final class AidGroup implements Parcelable {
} else {
this.category = CardEmulation.CATEGORY_OTHER;
}
- this.aids = aids;
+ this.aids = new ArrayList<String>(aids.size());
+ for (String aid : aids) {
+ this.aids.add(aid.toUpperCase());
+ }
this.description = null;
}
@@ -144,7 +143,7 @@ public final class AidGroup implements Parcelable {
if (inGroup) {
String aid = parser.getAttributeValue(null, "value");
if (aid != null) {
- aids.add(aid);
+ aids.add(aid.toUpperCase());
}
} else {
Log.d(TAG, "Ignoring <aid> tag while not in group");
diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
index 38113751c85f..00b2ee3c619e 100644
--- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -311,7 +311,7 @@ public final class ApduServiceInfo implements Parcelable {
public String getCategoryForAid(String aid) {
ArrayList<AidGroup> groups = getAidGroups();
for (AidGroup group : groups) {
- if (group.aids.contains(aid)) {
+ if (group.aids.contains(aid.toUpperCase())) {
return group.category;
}
}
@@ -425,7 +425,7 @@ public final class ApduServiceInfo implements Parcelable {
public ApduServiceInfo createFromParcel(Parcel source) {
ResolveInfo info = ResolveInfo.CREATOR.createFromParcel(source);
String description = source.readString();
- boolean onHost = (source.readInt() != 0) ? true : false;
+ boolean onHost = source.readInt() != 0;
ArrayList<AidGroup> staticAidGroups = new ArrayList<AidGroup>();
int numStaticGroups = source.readInt();
if (numStaticGroups > 0) {
@@ -436,7 +436,7 @@ public final class ApduServiceInfo implements Parcelable {
if (numDynamicGroups > 0) {
source.readTypedList(dynamicAidGroups, AidGroup.CREATOR);
}
- boolean requiresUnlock = (source.readInt() != 0) ? true : false;
+ boolean requiresUnlock = source.readInt() != 0;
int bannerResource = source.readInt();
int uid = source.readInt();
return new ApduServiceInfo(info, onHost, description, staticAidGroups,
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index c25278f19d9b..2315c74a32b8 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -19,6 +19,7 @@ import android.annotation.SystemApi;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -122,7 +123,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from transferring files over
- * USB. This can only be set by device owners. The default value is <code>false</code>.
+ * USB. This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -177,8 +179,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from configuring Tethering
- * & portable hotspots. This can only be set by device owners. The default value is
- * <code>false</code>.
+ * & portable hotspots. This can only be set by device owners and profile owners on the
+ * primary user. The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -189,8 +191,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from factory resetting
- * from Settings. This can only be set by device owners. The default value is
- * <code>false</code>.
+ * from Settings. This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -201,7 +203,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from adding new users and
- * profiles. This can only be set by device owners. The default value is <code>false</code>.
+ * profiles. This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -223,7 +226,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from configuring cell
- * broadcasts. This can only be set by device owners. The default value is <code>false</code>.
+ * broadcasts. This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -234,7 +238,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from configuring mobile
- * networks. This can only be set by device owners. The default value is <code>false</code>.
+ * networks. This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -265,8 +270,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from mounting
- * physical external media. This can only be set by device owners. The default value is
- * <code>false</code>.
+ * physical external media. This can only be set by device owners and profile owners on the
+ * primary user. The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -277,8 +282,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from adjusting microphone
- * volume. If set, the microphone will be muted. This can only be set by device owners.
- * The default value is <code>false</code>.
+ * volume. If set, the microphone will be muted. This can only be set by device owners
+ * and profile owners on the primary user. The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -289,8 +294,8 @@ public class UserManager {
/**
* Specifies if a user is disallowed from adjusting the master
- * volume. If set, the master volume will be muted. This can only be set by device owners.
- * The default value is <code>false</code>.
+ * volume. If set, the master volume will be muted. This can only be set by device owners
+ * and profile owners on the primary user. The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -313,7 +318,7 @@ public class UserManager {
/**
* Specifies that the user is not allowed to send or receive
- * SMS messages. This can only be set by device owners. The default value is <code>false</code>.
+ * SMS messages. The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -332,7 +337,8 @@ public class UserManager {
* <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li>
* <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li>
*
- * <p>This can only be set by device owners. The default value is <code>false</code>.
+ * <p>This can only be set by device owners and profile owners on the primary user.
+ * The default value is <code>false</code>.
*
* <p/>Key for user restrictions.
* <p/>Type: Boolean
@@ -430,7 +436,8 @@ public class UserManager {
* @return whether the user making this call is a goat
*/
public boolean isUserAGoat() {
- return false;
+ return mContext.getPackageManager()
+ .isPackageAvailable("com.coffeestainstudios.goatsimulator");
}
/**
diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java
index 9cbedabd98df..882a3c83d7ac 100644
--- a/core/java/android/service/notification/ZenModeConfig.java
+++ b/core/java/android/service/notification/ZenModeConfig.java
@@ -61,6 +61,8 @@ public class ZenModeConfig implements Parcelable {
private static final int MINUTES_MS = 60 * SECONDS_MS;
private static final int ZERO_VALUE_MS = 20 * SECONDS_MS;
+ private static final boolean DEFAULT_ALLOW_EVENTS = true;
+
private static final int XML_VERSION = 1;
private static final String ZEN_TAG = "zen";
private static final String ZEN_ATT_VERSION = "version";
@@ -68,6 +70,7 @@ public class ZenModeConfig implements Parcelable {
private static final String ALLOW_ATT_CALLS = "calls";
private static final String ALLOW_ATT_MESSAGES = "messages";
private static final String ALLOW_ATT_FROM = "from";
+ private static final String ALLOW_ATT_EVENTS = "events";
private static final String SLEEP_TAG = "sleep";
private static final String SLEEP_ATT_MODE = "mode";
@@ -91,6 +94,7 @@ public class ZenModeConfig implements Parcelable {
public boolean allowCalls;
public boolean allowMessages;
+ public boolean allowEvents = DEFAULT_ALLOW_EVENTS;
public int allowFrom = SOURCE_ANYONE;
public String sleepMode;
@@ -108,6 +112,7 @@ public class ZenModeConfig implements Parcelable {
public ZenModeConfig(Parcel source) {
allowCalls = source.readInt() == 1;
allowMessages = source.readInt() == 1;
+ allowEvents = source.readInt() == 1;
if (source.readInt() == 1) {
sleepMode = source.readString();
}
@@ -134,6 +139,7 @@ public class ZenModeConfig implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(allowCalls ? 1 : 0);
dest.writeInt(allowMessages ? 1 : 0);
+ dest.writeInt(allowEvents ? 1 : 0);
if (sleepMode != null) {
dest.writeInt(1);
dest.writeString(sleepMode);
@@ -167,6 +173,7 @@ public class ZenModeConfig implements Parcelable {
.append("allowCalls=").append(allowCalls)
.append(",allowMessages=").append(allowMessages)
.append(",allowFrom=").append(sourceToString(allowFrom))
+ .append(",allowEvents=").append(allowEvents)
.append(",sleepMode=").append(sleepMode)
.append(",sleepStart=").append(sleepStartHour).append('.').append(sleepStartMinute)
.append(",sleepEnd=").append(sleepEndHour).append('.').append(sleepEndMinute)
@@ -200,6 +207,7 @@ public class ZenModeConfig implements Parcelable {
return other.allowCalls == allowCalls
&& other.allowMessages == allowMessages
&& other.allowFrom == allowFrom
+ && other.allowEvents == allowEvents
&& Objects.equals(other.sleepMode, sleepMode)
&& other.sleepStartHour == sleepStartHour
&& other.sleepStartMinute == sleepStartMinute
@@ -213,7 +221,7 @@ public class ZenModeConfig implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(allowCalls, allowMessages, allowFrom, sleepMode,
+ return Objects.hash(allowCalls, allowMessages, allowFrom, allowEvents, sleepMode,
sleepStartHour, sleepStartMinute, sleepEndHour, sleepEndMinute,
Arrays.hashCode(conditionComponents), Arrays.hashCode(conditionIds),
exitCondition, exitConditionComponent);
@@ -281,6 +289,7 @@ public class ZenModeConfig implements Parcelable {
if (ALLOW_TAG.equals(tag)) {
rt.allowCalls = safeBoolean(parser, ALLOW_ATT_CALLS, false);
rt.allowMessages = safeBoolean(parser, ALLOW_ATT_MESSAGES, false);
+ rt.allowEvents = safeBoolean(parser, ALLOW_ATT_EVENTS, DEFAULT_ALLOW_EVENTS);
rt.allowFrom = safeInt(parser, ALLOW_ATT_FROM, SOURCE_ANYONE);
if (rt.allowFrom < SOURCE_ANYONE || rt.allowFrom > MAX_SOURCE) {
throw new IndexOutOfBoundsException("bad source in config:" + rt.allowFrom);
@@ -323,6 +332,7 @@ public class ZenModeConfig implements Parcelable {
out.startTag(null, ALLOW_TAG);
out.attribute(null, ALLOW_ATT_CALLS, Boolean.toString(allowCalls));
out.attribute(null, ALLOW_ATT_MESSAGES, Boolean.toString(allowMessages));
+ out.attribute(null, ALLOW_ATT_EVENTS, Boolean.toString(allowEvents));
out.attribute(null, ALLOW_ATT_FROM, Integer.toString(allowFrom));
out.endTag(null, ALLOW_TAG);
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 8aa26895fe1d..ac7d539bb628 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -170,8 +170,7 @@ public class AlwaysOnHotwordDetector {
= SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION;
static final String TAG = "AlwaysOnHotwordDetector";
- // TODO: Set to false.
- static final boolean DBG = true;
+ static final boolean DBG = false;
private static final int STATUS_ERROR = SoundTrigger.STATUS_ERROR;
private static final int STATUS_OK = SoundTrigger.STATUS_OK;
@@ -575,7 +574,7 @@ public class AlwaysOnHotwordDetector {
int code = STATUS_ERROR;
try {
code = mModelManagementService.startRecognition(mVoiceInteractionService,
- mKeyphraseMetadata.id, mInternalCallback,
+ mKeyphraseMetadata.id, mLocale.toLanguageTag(), mInternalCallback,
new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
recognitionExtra, null /* additional data */));
} catch (RemoteException e) {
@@ -690,7 +689,7 @@ public class AlwaysOnHotwordDetector {
if (availability == STATE_NOT_READY
|| availability == STATE_KEYPHRASE_UNENROLLED
|| availability == STATE_KEYPHRASE_ENROLLED) {
- enrolled = internalGetIsEnrolled(mKeyphraseMetadata.id);
+ enrolled = internalGetIsEnrolled(mKeyphraseMetadata.id, mLocale);
if (!enrolled) {
availability = STATE_KEYPHRASE_UNENROLLED;
} else {
@@ -741,10 +740,10 @@ public class AlwaysOnHotwordDetector {
/**
* @return The corresponding {@link KeyphraseSoundModel} or null if none is found.
*/
- private boolean internalGetIsEnrolled(int keyphraseId) {
+ private boolean internalGetIsEnrolled(int keyphraseId, Locale locale) {
try {
return mModelManagementService.isEnrolledForKeyphrase(
- mVoiceInteractionService, keyphraseId);
+ mVoiceInteractionService, keyphraseId, locale.toLanguageTag());
} catch (RemoteException e) {
Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!", e);
}
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 9be220e89618..120c9e37b792 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -1216,17 +1216,12 @@ public class TextToSpeech {
*
* @param durationInMs The duration of the silence.
* @param queueMode {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}.
- * @param params Parameters for the request. Can be null.
- * Engine specific parameters may be passed in but the parameter keys
- * must be prefixed by the name of the engine they are intended for. For example
- * the keys "com.svox.pico_foo" and "com.svox.pico:bar" will be passed to the
- * engine named "com.svox.pico" if it is being used.
* @param utteranceId An unique identifier for this request.
*
* @return {@link #ERROR} or {@link #SUCCESS} of <b>queuing</b> the playSilence operation.
*/
public int playSilence(final long durationInMs, final int queueMode,
- final HashMap<String, String> params, final String utteranceId) {
+ final String utteranceId) {
return runAction(new Action<Integer>() {
@Override
public Integer run(ITextToSpeechService service) throws RemoteException {
@@ -1258,12 +1253,12 @@ public class TextToSpeech {
*
* @return {@link #ERROR} or {@link #SUCCESS} of <b>queuing</b> the playSilence operation.
* @deprecated As of API level 20, replaced by
- * {@link #playSilence(long, int, HashMap, String)}.
+ * {@link #playSilence(long, int, String)}.
*/
@Deprecated
public int playSilence(final long durationInMs, final int queueMode,
final HashMap<String, String> params) {
- return playSilence(durationInMs, queueMode, params,
+ return playSilence(durationInMs, queueMode,
params == null ? null : params.get(Engine.KEY_PARAM_UTTERANCE_ID));
}
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index d00a433ac65f..079467a9e529 100644
--- a/core/java/android/speech/tts/TextToSpeechService.java
+++ b/core/java/android/speech/tts/TextToSpeechService.java
@@ -317,7 +317,7 @@ public abstract class TextToSpeechService extends Service {
* @return A name of the default voice for a given locale.
*/
- protected String onGetDefaultVoiceNameFor(String lang, String country, String variant) {
+ public String onGetDefaultVoiceNameFor(String lang, String country, String variant) {
int localeStatus = onIsLanguageAvailable(lang, country, variant);
Locale iso3Locale = null;
switch (localeStatus) {
diff --git a/core/java/android/speech/tts/Voice.java b/core/java/android/speech/tts/Voice.java
index a1fa51d1901e..dcf598014fdb 100644
--- a/core/java/android/speech/tts/Voice.java
+++ b/core/java/android/speech/tts/Voice.java
@@ -91,9 +91,6 @@ public class Voice implements Parcelable {
Collections.addAll(this.mFeatures, in.readStringArray());
}
- /**
- * @hide
- */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mName);
@@ -104,17 +101,11 @@ public class Voice implements Parcelable {
dest.writeStringList(new ArrayList<String>(mFeatures));
}
- /**
- * @hide
- */
@Override
public int describeContents() {
return 0;
}
- /**
- * @hide
- */
public static final Parcelable.Creator<Voice> CREATOR = new Parcelable.Creator<Voice>() {
@Override
public Voice createFromParcel(Parcel in) {
diff --git a/core/java/android/transition/Fade.java b/core/java/android/transition/Fade.java
index 1f9d0932476f..e7857c03d7ab 100644
--- a/core/java/android/transition/Fade.java
+++ b/core/java/android/transition/Fade.java
@@ -145,12 +145,21 @@ public class Fade extends Visibility {
private final View mView;
private boolean mCanceled = false;
private float mPausedAlpha = -1;
+ private boolean mLayerTypeChanged = false;
public FadeAnimatorListener(View view) {
mView = view;
}
@Override
+ public void onAnimationStart(Animator animator) {
+ if (mView.hasOverlappingRendering() && mView.getLayerType() == View.LAYER_TYPE_NONE) {
+ mLayerTypeChanged = true;
+ mView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ }
+ }
+
+ @Override
public void onAnimationCancel(Animator animator) {
mCanceled = true;
if (mPausedAlpha >= 0) {
@@ -163,6 +172,9 @@ public class Fade extends Visibility {
if (!mCanceled) {
mView.setTransitionAlpha(1);
}
+ if (mLayerTypeChanged) {
+ mView.setLayerType(View.LAYER_TYPE_NONE, null);
+ }
}
@Override
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index b677888852da..6dede46df311 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -814,8 +814,8 @@ public abstract class Transition implements Cloneable {
}
}
if (mTargetIds.size() == 0 && mTargets.size() == 0 &&
- (mTargetTypes == null || mTargetTypes.isEmpty() &&
- (mTargetNames == null || mTargetNames.isEmpty()))) {
+ (mTargetTypes == null || mTargetTypes.isEmpty()) &&
+ (mTargetNames == null || mTargetNames.isEmpty())) {
return true;
}
if (mTargetIds.contains(targetId) || mTargets.contains(target)) {
@@ -1443,9 +1443,9 @@ public abstract class Transition implements Cloneable {
values.targetedTransitions.add(this);
capturePropagationValues(values);
if (start) {
- mStartValues.viewValues.put(view, values);
+ addViewValues(mStartValues, view, values);
} else {
- mEndValues.viewValues.put(view, values);
+ addViewValues(mEndValues, view, values);
}
}
} else {
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index d23e1154b723..904e33f0aca1 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -186,6 +186,18 @@ public abstract class HardwareRenderer {
}
}
+ public static boolean sTrimForeground = false;
+
+ /**
+ * Controls whether or not the hardware renderer should aggressively
+ * trim memory. Note that this must not be set for any process that
+ * uses WebView! This should be only used by system_process or similar
+ * that do not go into the background.
+ */
+ public static void enableForegroundTrimming() {
+ sTrimForeground = true;
+ }
+
/**
* Indicates whether hardware acceleration is available under any form for
* the view hierarchy.
@@ -339,8 +351,7 @@ public abstract class HardwareRenderer {
* @param attachInfo AttachInfo tied to the specified view.
* @param callbacks Callbacks invoked when drawing happens.
*/
- abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
- boolean isStartingWindow);
+ abstract void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks);
/**
* Creates a new hardware layer. A hardware layer built by calling this
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index 577415e9f7d8..1546877aee77 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -209,7 +209,7 @@ public abstract class LayoutInflater {
mFactory = original.mFactory;
mFactory2 = original.mFactory2;
mPrivateFactory = original.mPrivateFactory;
- mFilter = original.mFilter;
+ setFilter(original.mFilter);
}
/**
@@ -606,9 +606,9 @@ public abstract class LayoutInflater {
constructor.setAccessible(true);
final View view = constructor.newInstance(args);
if (view instanceof ViewStub) {
- // always use ourselves when inflating ViewStub later
+ // Use the same context when inflating ViewStub later.
final ViewStub viewStub = (ViewStub) view;
- viewStub.setLayoutInflater(this);
+ viewStub.setLayoutInflater(cloneInContext((Context) args[0]));
}
return view;
diff --git a/core/java/android/view/MenuInflater.java b/core/java/android/view/MenuInflater.java
index 71296fa61965..5811c17dbdb3 100644
--- a/core/java/android/view/MenuInflater.java
+++ b/core/java/android/view/MenuInflater.java
@@ -23,6 +23,7 @@ import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.util.AttributeSet;
@@ -74,7 +75,6 @@ public class MenuInflater {
*/
public MenuInflater(Context context) {
mContext = context;
- mRealOwner = context;
mActionViewConstructorArguments = new Object[] {context};
mActionProviderConstructorArguments = mActionViewConstructorArguments;
}
@@ -259,6 +259,23 @@ public class MenuInflater {
}
}
}
+
+ private Object getRealOwner() {
+ if (mRealOwner == null) {
+ mRealOwner = findRealOwner(mContext);
+ }
+ return mRealOwner;
+ }
+
+ private Object findRealOwner(Object owner) {
+ if (owner instanceof Activity) {
+ return owner;
+ }
+ if (owner instanceof ContextWrapper) {
+ return findRealOwner(((ContextWrapper) owner).getBaseContext());
+ }
+ return owner;
+ }
/**
* State for the current menu.
@@ -439,7 +456,7 @@ public class MenuInflater {
+ "be used within a restricted context");
}
item.setOnMenuItemClickListener(
- new InflatedOnMenuItemClickListener(mRealOwner, itemListenerMethodName));
+ new InflatedOnMenuItemClickListener(getRealOwner(), itemListenerMethodName));
}
if (item instanceof MenuItemImpl) {
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 3d1332c54018..5d2822d895ae 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -16,7 +16,6 @@
package android.view;
-import android.graphics.Color;
import com.android.internal.R;
import android.content.Context;
@@ -268,8 +267,7 @@ public class ThreadedRenderer extends HardwareRenderer {
view.mRecreateDisplayList = false;
}
- private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks,
- boolean isStartingWindow) {
+ private void updateRootDisplayList(View view, HardwareDrawCallbacks callbacks) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList");
updateViewTreeDisplayList(view);
@@ -281,12 +279,6 @@ public class ThreadedRenderer extends HardwareRenderer {
callbacks.onHardwarePreDraw(canvas);
canvas.insertReorderBarrier();
- if (isStartingWindow) {
- // Compensate for some situations in which a hw-accelerated surface
- // will not be filled with anything by default; this is equivalent
- // to the old behavior when the system process was not hw-accelerated
- canvas.drawColor(Color.BLACK);
- }
canvas.drawRenderNode(view.getDisplayList());
canvas.insertInorderBarrier();
@@ -306,8 +298,7 @@ public class ThreadedRenderer extends HardwareRenderer {
}
@Override
- void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks,
- boolean isStartingWindow) {
+ void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks) {
attachInfo.mIgnoreDirtyState = true;
long frameTimeNanos = mChoreographer.getFrameTimeNanos();
attachInfo.mDrawingTime = frameTimeNanos / TimeUtils.NANOS_PER_MS;
@@ -317,7 +308,7 @@ public class ThreadedRenderer extends HardwareRenderer {
recordDuration = System.nanoTime();
}
- updateRootDisplayList(view, callbacks, isStartingWindow);
+ updateRootDisplayList(view, callbacks);
if (mProfilingEnabled) {
recordDuration = System.nanoTime() - recordDuration;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ae6e4e78ed43..b1d3d450a7f8 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -711,10 +711,17 @@ public final class ViewRootImpl implements ViewParent,
// can be used by code on the system process to escape that and enable
// HW accelerated drawing. (This is basically for the lock screen.)
+ final boolean fakeHwAccelerated = (attrs.privateFlags &
+ WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED) != 0;
final boolean forceHwAccelerated = (attrs.privateFlags &
WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED) != 0;
- if (!HardwareRenderer.sRendererDisabled
+ if (fakeHwAccelerated) {
+ // This is exclusively for the preview windows the window manager
+ // shows for launching applications, so they will look more like
+ // the app being launched.
+ mAttachInfo.mHardwareAccelerationRequested = true;
+ } else if (!HardwareRenderer.sRendererDisabled
|| (HardwareRenderer.sSystemRendererDisabled && forceHwAccelerated)) {
if (mAttachInfo.mHardwareRenderer != null) {
mAttachInfo.mHardwareRenderer.destroy();
@@ -797,6 +804,9 @@ public final class ViewRootImpl implements ViewParent,
if (mAppVisible != visible) {
mAppVisible = visible;
scheduleTraversals();
+ if (!mAppVisible) {
+ WindowManagerGlobal.trimForeground();
+ }
}
}
@@ -2479,8 +2489,7 @@ public final class ViewRootImpl implements ViewParent,
dirty.setEmpty();
mBlockResizeBuffer = false;
- mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this,
- params.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING);
+ mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this);
} else {
// If we get here with a disabled & requested hardware renderer, something went
// wrong (an invalidate posted right before we destroyed the hardware surface
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 273ec9d08007..47ee52e25116 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1024,6 +1024,26 @@ public interface WindowManager extends ViewManager {
public int flags;
/**
+ * If the window has requested hardware acceleration, but this is not
+ * allowed in the process it is in, then still render it as if it is
+ * hardware accelerated. This is used for the starting preview windows
+ * in the system process, which don't need to have the overhead of
+ * hardware acceleration (they are just a static rendering), but should
+ * be rendered as such to match the actual window of the app even if it
+ * is hardware accelerated.
+ * Even if the window isn't hardware accelerated, still do its rendering
+ * as if it was.
+ * Like {@link #FLAG_HARDWARE_ACCELERATED} except for trusted system windows
+ * that need hardware acceleration (e.g. LockScreen), where hardware acceleration
+ * is generally disabled. This flag must be specified in addition to
+ * {@link #FLAG_HARDWARE_ACCELERATED} to enable hardware acceleration for system
+ * windows.
+ *
+ * @hide
+ */
+ public static final int PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED = 0x00000001;
+
+ /**
* In the system process, we globally do not use hardware acceleration
* because there are many threads doing UI there and they conflict.
* If certain parts of the UI that really do want to use hardware
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index c39ec9704415..08160c8976a1 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -375,6 +375,9 @@ public final class WindowManagerGlobal {
mDyingViews.remove(view);
}
}
+ if (HardwareRenderer.sTrimForeground && HardwareRenderer.isAvailable()) {
+ doTrimForeground();
+ }
}
private int findViewLocked(View view, boolean required) {
@@ -413,6 +416,35 @@ public final class WindowManagerGlobal {
}
HardwareRenderer.trimMemory(level);
+
+ if (HardwareRenderer.sTrimForeground) {
+ doTrimForeground();
+ }
+ }
+ }
+
+ public static void trimForeground() {
+ if (HardwareRenderer.sTrimForeground && HardwareRenderer.isAvailable()) {
+ WindowManagerGlobal wm = WindowManagerGlobal.getInstance();
+ wm.doTrimForeground();
+ }
+ }
+
+ private void doTrimForeground() {
+ boolean hasVisibleWindows = false;
+ synchronized (mLock) {
+ for (int i = mRoots.size() - 1; i >= 0; --i) {
+ if (mRoots.get(i).getHostVisibility() == View.VISIBLE
+ && mRoots.get(i).mAttachInfo.mHardwareRenderer != null) {
+ hasVisibleWindows = true;
+ } else {
+ mRoots.get(i).destroyHardwareResources();
+ }
+ }
+ }
+ if (!hasVisibleWindows) {
+ HardwareRenderer.trimMemory(
+ ComponentCallbacks2.TRIM_MEMORY_COMPLETE);
}
}
@@ -428,7 +460,7 @@ public final class WindowManagerGlobal {
for (int i = 0; i < count; i++) {
ViewRootImpl root = mRoots.get(i);
String name = getWindowName(root);
- pw.printf("\n\t%s", name);
+ pw.printf("\n\t%s (visibility=%d)", name, root.getHostVisibility());
HardwareRenderer renderer =
root.getView().mAttachInfo.mHardwareRenderer;
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index fec7550af66d..d458ee4846cf 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -930,7 +930,12 @@ public interface WindowManagerPolicy {
* A new window has been focused.
*/
public int focusChangedLw(WindowState lastFocus, WindowState newFocus);
-
+
+ /**
+ * Called when the device is waking up.
+ */
+ public void wakingUp();
+
/**
* Called when the device is going to sleep.
*
@@ -939,26 +944,25 @@ public interface WindowManagerPolicy {
*/
public void goingToSleep(int why);
- public interface ScreenOnListener {
- void onScreenOn();
- }
-
/**
- * Called when the device is waking up.
+ * Called when the device is about to turn on the screen to show content.
+ * When waking up, this method will be called once after the call to wakingUp().
+ * When dozing, the method will be called sometime after the call to goingToSleep() and
+ * may be called repeatedly in the case where the screen is pulsing on and off.
+ *
* Must call back on the listener to tell it when the higher-level system
* is ready for the screen to go on (i.e. the lock screen is shown).
*/
- public void wakingUp(ScreenOnListener screenOnListener);
+ public void screenTurningOn(ScreenOnListener screenOnListener);
- /**
- * Return whether the screen is about to turn on or is currently on.
- */
- public boolean isScreenOnEarly();
+ public interface ScreenOnListener {
+ void onScreenOn();
+ }
/**
- * Return whether the screen is fully turned on.
+ * Return whether the system is awake.
*/
- public boolean isScreenOnFully();
+ public boolean isAwake();
/**
* Tell the policy that the lid switch has changed state.
diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java
index ead757eb9a7d..a218e4dc0b92 100644
--- a/core/java/android/view/accessibility/AccessibilityCache.java
+++ b/core/java/android/view/accessibility/AccessibilityCache.java
@@ -63,22 +63,6 @@ final class AccessibilityCache {
}
}
- public void clearWindows() {
- synchronized (mLock) {
- final int windowCount = mWindowCache.size();
- for (int i = windowCount - 1; i >= 0; i--) {
- AccessibilityWindowInfo window = mWindowCache.valueAt(i);
- if (window != null) {
- if (DEBUG) {
- Log.i(LOG_TAG, "Removing window: " + window.getId());
- }
- window.recycle();
- mWindowCache.removeAt(i);
- }
- }
- }
- }
-
/**
* Notifies the cache that the something in the UI changed. As a result
* the cache will either refresh some nodes or evict some nodes.
@@ -115,8 +99,9 @@ final class AccessibilityCache {
clearSubTreeLocked(event.getWindowId(), event.getSourceNodeId());
} break;
- case AccessibilityEvent.TYPE_WINDOWS_CHANGED: {
- clearWindows();
+ case AccessibilityEvent.TYPE_WINDOWS_CHANGED:
+ case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: {
+ clear();
} break;
}
}
@@ -287,7 +272,7 @@ final class AccessibilityCache {
private void clearNodesForWindowLocked(int windowId) {
if (DEBUG) {
- Log.i(LOG_TAG, "clearWindowLocked(" + windowId + ")");
+ Log.i(LOG_TAG, "clearNodesForWindowLocked(" + windowId + ")");
}
LongSparseArray<AccessibilityNodeInfo> nodes = mNodeCache.get(windowId);
if (nodes == null) {
@@ -440,7 +425,7 @@ final class AccessibilityCache {
}
}
if (!childOfItsParent) {
- Log.e(LOG_TAG, "Invalid parent-child ralation between parent: "
+ Log.e(LOG_TAG, "Invalid parent-child relation between parent: "
+ nodeParent + " and child: " + node);
}
}
@@ -452,7 +437,7 @@ final class AccessibilityCache {
if (child != null) {
AccessibilityNodeInfo parent = nodes.get(child.getParentNodeId());
if (parent != node) {
- Log.e(LOG_TAG, "Invalid child-parent ralation between child: "
+ Log.e(LOG_TAG, "Invalid child-parent relation between child: "
+ node + " and parent: " + nodeParent);
}
}
diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java
index 0a8e4b9c2181..11d0f4a89361 100644
--- a/core/java/android/view/inputmethod/InputMethodInfo.java
+++ b/core/java/android/view/inputmethod/InputMethodInfo.java
@@ -27,6 +27,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -421,7 +422,7 @@ public final class InputMethodInfo implements Parcelable {
}
final Resources res = context.createPackageContext(getPackageName(), 0).getResources();
return res.getBoolean(getIsDefaultResourceId());
- } catch (NameNotFoundException e) {
+ } catch (NameNotFoundException | NotFoundException e) {
return false;
}
}
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index 033b99a22d51..6925756918c4 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -120,7 +120,7 @@ public class EdgeEffect {
final TypedArray a = context.obtainStyledAttributes(
com.android.internal.R.styleable.EdgeEffect);
final int themeColor = a.getColor(
- com.android.internal.R.styleable.EdgeEffect_colorPrimary, 0xff666666);
+ com.android.internal.R.styleable.EdgeEffect_colorEdgeEffect, 0xff666666);
a.recycle();
mPaint.setColor((themeColor & 0xffffff) | 0x33000000);
mPaint.setStyle(Paint.Style.FILL);
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 06b7a9308e34..068790553708 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -1205,7 +1205,6 @@ class FastScroller {
if (!hasSections || !mMatchDragPosition) {
return (float) firstVisibleItem / (totalItemCount - visibleItemCount);
}
-
// Ignore headers.
firstVisibleItem -= mHeaderCount;
if (firstVisibleItem < 0) {
@@ -1255,9 +1254,19 @@ class FastScroller {
// across the last item account for whatever space is remaining.
if (firstVisibleItem > 0 && firstVisibleItem + visibleItemCount == totalItemCount) {
final View lastChild = mList.getChildAt(visibleItemCount - 1);
- final float lastItemVisible = (float) (mList.getHeight() - mList.getPaddingBottom()
- - lastChild.getTop()) / lastChild.getHeight();
- result += (1 - result) * lastItemVisible;
+ final int bottomPadding = mList.getPaddingBottom();
+ final int maxSize;
+ final int currentVisibleSize;
+ if (mList.getClipToPadding()) {
+ maxSize = lastChild.getHeight();
+ currentVisibleSize = mList.getHeight() - bottomPadding - lastChild.getTop();
+ } else {
+ maxSize = lastChild.getHeight() + bottomPadding;
+ currentVisibleSize = mList.getHeight() - lastChild.getTop();
+ }
+ if (currentVisibleSize > 0 && maxSize > 0) {
+ result += (1 - result) * ((float) currentVisibleSize / maxSize );
+ }
}
return result;
diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java
index 046028233f63..56f126cbe447 100644
--- a/core/java/android/widget/RadialTimePickerView.java
+++ b/core/java/android/widget/RadialTimePickerView.java
@@ -557,7 +557,7 @@ public class RadialTimePickerView extends View implements View.OnTouchListener {
if (mIsOnInnerCircle && hour == 0) {
// Inner circle is 1 through 12.
hour = 12;
- } else if (hour != 0) {
+ } else if (!mIsOnInnerCircle && hour != 0) {
// Outer circle is 13 through 23 and 0.
hour += 12;
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 90e9c69913e9..7cb3c378ace0 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -1807,7 +1807,7 @@ public class RemoteViews implements Parcelable, Filter {
}
public String getPackage() {
- return mApplication.packageName;
+ return (mApplication != null) ? mApplication.packageName : null;
}
/**
@@ -2663,6 +2663,10 @@ public class RemoteViews implements Parcelable, Filter {
}
private static ApplicationInfo getApplicationInfo(String packageName, int userId) {
+ if (packageName == null) {
+ return null;
+ }
+
// Get the application for the passed in package and user.
Application application = ActivityThread.currentApplication();
if (application == null) {
diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
index 22ec4bead91e..5a1052411ddb 100644
--- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
+++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
@@ -33,32 +33,44 @@ interface IVoiceInteractionManagerService {
void finish(IBinder token);
/**
- * Lists the registered Sound model for keyphrase detection.
- * May be null if no matching sound models exist.
+ * Gets the registered Sound model for keyphrase detection for the current user.
+ * May be null if no matching sound model exists.
+ *
+ * @param keyphraseId The unique identifier for the keyphrase.
+ * @param bcp47Locale The BCP47 language tag for the keyphrase's locale.
*/
- SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId);
+ SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, in String bcp47Locale);
/**
- * Updates the given keyphrase sound model. Adds the model if it doesn't exist currently.
+ * Add/Update the given keyphrase sound model.
*/
int updateKeyphraseSoundModel(in SoundTrigger.KeyphraseSoundModel model);
/**
- * Deletes the given keyphrase sound model.
+ * Deletes the given keyphrase sound model for the current user.
+ *
+ * @param keyphraseId The unique identifier for the keyphrase.
+ * @param bcp47Locale The BCP47 language tag for the keyphrase's locale.
*/
- int deleteKeyphraseSoundModel(int keyphraseId);
+ int deleteKeyphraseSoundModel(int keyphraseId, in String bcp47Locale);
/**
- * Indicates if there's a keyphrase sound model available for the given keyphrase ID.
- */
- boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId);
- /**
* Gets the properties of the DSP hardware on this device, null if not present.
*/
SoundTrigger.ModuleProperties getDspModuleProperties(in IVoiceInteractionService service);
/**
+ * Indicates if there's a keyphrase sound model available for the given keyphrase ID.
+ * This performs the check for the current user.
+ *
+ * @param service The current VoiceInteractionService.
+ * @param keyphraseId The unique identifier for the keyphrase.
+ * @param bcp47Locale The BCP47 language tag for the keyphrase's locale.
+ */
+ boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId,
+ String bcp47Locale);
+ /**
* Starts a recognition for the given keyphrase.
*/
int startRecognition(in IVoiceInteractionService service, int keyphraseId,
- in IRecognitionStatusCallback callback,
+ in String bcp47Locale, in IRecognitionStatusCallback callback,
in SoundTrigger.RecognitionConfig recognitionConfig);
/**
* Stops a recognition for the given keyphrase.
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 107e8c66a584..22600de1283d 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -491,8 +491,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic
}
private boolean versionNumberAtLeastL(int versionNumber) {
- // TODO: remove "|| true" once the build code for L is fixed.
- return versionNumber >= Build.VERSION_CODES.L || true;
+ return versionNumber >= Build.VERSION_CODES.L;
}
private void setAlwaysButtonEnabled(boolean hasValidSelection, int checkedPos,
diff --git a/core/java/com/android/internal/app/WindowDecorActionBar.java b/core/java/com/android/internal/app/WindowDecorActionBar.java
index a8f7bb391412..2377c22b488d 100644
--- a/core/java/com/android/internal/app/WindowDecorActionBar.java
+++ b/core/java/com/android/internal/app/WindowDecorActionBar.java
@@ -866,14 +866,7 @@ public class WindowDecorActionBar extends ActionBar implements
mDecorToolbar.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE);
mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE);
- if (mTabScrollView != null && !mDecorToolbar.hasEmbeddedTabs() &&
- isCollapsed(mDecorToolbar.getViewGroup())) {
- mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE);
- }
- }
-
- private boolean isCollapsed(View view) {
- return view == null || view.getVisibility() == View.GONE || view.getMeasuredHeight() == 0;
+ // mTabScrollView's visibility is not affected by action mode.
}
public Context getThemedContext() {
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 8f8ce95f4efc..ac915d190d24 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -16,6 +16,7 @@
package com.android.internal.inputmethod;
+import android.app.AppOpsManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -637,6 +638,25 @@ public class InputMethodUtils {
}
/**
+ * Returns true if a package name belongs to a UID.
+ *
+ * <p>This is a simple wrapper of {@link AppOpsManager#checkPackage(int, String)}.</p>
+ * @param appOpsManager the {@link AppOpsManager} object to be used for the validation.
+ * @param uid the UID to be validated.
+ * @param packageName the package name.
+ * @return {@code true} if the package name belongs to the UID.
+ */
+ public static boolean checkIfPackageBelongsToUid(final AppOpsManager appOpsManager,
+ final int uid, final String packageName) {
+ try {
+ appOpsManager.checkPackage(uid, packageName);
+ return true;
+ } catch (SecurityException e) {
+ return false;
+ }
+ }
+
+ /**
* Utility class for putting and getting settings for InputMethod
* TODO: Move all putters and getters of settings to this class.
*/
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 40c9ed299498..4dde217460a2 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -458,7 +458,7 @@ public class ZygoteInit {
Log.v(TAG, "Preloading resource #" + Integer.toHexString(id));
}
if (id != 0) {
- if (mResources.getDrawable(id) == null) {
+ if (mResources.getDrawable(id, null) == null) {
throw new IllegalArgumentException(
"Unable to find preloaded drawable resource #0x"
+ Integer.toHexString(id)
diff --git a/core/java/com/android/internal/view/StandaloneActionMode.java b/core/java/com/android/internal/view/StandaloneActionMode.java
index fae7ea12fd83..d5d360243e01 100644
--- a/core/java/com/android/internal/view/StandaloneActionMode.java
+++ b/core/java/com/android/internal/view/StandaloneActionMode.java
@@ -46,7 +46,8 @@ public class StandaloneActionMode extends ActionMode implements MenuBuilder.Call
mContextView = view;
mCallback = callback;
- mMenu = new MenuBuilder(context).setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ mMenu = new MenuBuilder(view.getContext()).setDefaultShowAsAction(
+ MenuItem.SHOW_AS_ACTION_IF_ROOM);
mMenu.setCallback(this);
mFocusable = isFocusable;
}
@@ -126,7 +127,7 @@ public class StandaloneActionMode extends ActionMode implements MenuBuilder.Call
@Override
public MenuInflater getMenuInflater() {
- return new MenuInflater(mContext);
+ return new MenuInflater(mContextView.getContext());
}
public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
@@ -141,7 +142,7 @@ public class StandaloneActionMode extends ActionMode implements MenuBuilder.Call
return true;
}
- new MenuPopupHelper(mContext, subMenu).show();
+ new MenuPopupHelper(mContextView.getContext(), subMenu).show();
return true;
}
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index d24f32fafe59..847a47d72040 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -260,6 +260,11 @@ public class ActionBarContainer extends FrameLayout {
return view == null || view.getVisibility() == GONE || view.getMeasuredHeight() == 0;
}
+ private int getMeasuredHeightWithMargins(View view) {
+ final LayoutParams lp = (LayoutParams) view.getLayoutParams();
+ return view.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
+ }
+
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mActionBarView == null &&
@@ -271,26 +276,23 @@ public class ActionBarContainer extends FrameLayout {
if (mActionBarView == null) return;
- int nonTabMaxHeight = 0;
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
- if (child == mTabContainer) {
- continue;
- }
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- nonTabMaxHeight = Math.max(nonTabMaxHeight, isCollapsed(child) ? 0 :
- child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin);
- }
-
if (mTabContainer != null && mTabContainer.getVisibility() != GONE) {
- final int mode = MeasureSpec.getMode(heightMeasureSpec);
- if (mode == MeasureSpec.AT_MOST) {
- final int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
- setMeasuredDimension(getMeasuredWidth(),
- Math.min(nonTabMaxHeight + mTabContainer.getMeasuredHeight(),
- maxHeight));
+ int nonTabMaxHeight = 0;
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ if (child == mTabContainer) {
+ continue;
+ }
+ nonTabMaxHeight = Math.max(nonTabMaxHeight, isCollapsed(child) ? 0 :
+ getMeasuredHeightWithMargins(child));
}
+ final int mode = MeasureSpec.getMode(heightMeasureSpec);
+ final int maxHeight = mode == MeasureSpec.AT_MOST ?
+ MeasureSpec.getSize(heightMeasureSpec) : Integer.MAX_VALUE;
+ setMeasuredDimension(getMeasuredWidth(),
+ Math.min(nonTabMaxHeight + getMeasuredHeightWithMargins(mTabContainer),
+ maxHeight));
}
}
@@ -303,8 +305,10 @@ public class ActionBarContainer extends FrameLayout {
if (tabContainer != null && tabContainer.getVisibility() != GONE) {
final int containerHeight = getMeasuredHeight();
+ final LayoutParams lp = (LayoutParams) tabContainer.getLayoutParams();
final int tabHeight = tabContainer.getMeasuredHeight();
- tabContainer.layout(l, containerHeight - tabHeight, r, containerHeight);
+ tabContainer.layout(l, containerHeight - tabHeight - lp.bottomMargin, r,
+ containerHeight - lp.bottomMargin);
}
boolean needsInvalidate = false;
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index fb44e5876b6c..91e53307d997 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -1316,6 +1316,11 @@ public class ActionBarView extends AbsActionBarView implements DecorToolbar {
mHomeLayout.setUpIndicator(indicator);
}
+ @Override
+ public void setDefaultNavigationIcon(Drawable icon) {
+ mHomeLayout.setDefaultUpIndicator(icon);
+ }
+
public void setNavigationIcon(int resId) {
mHomeLayout.setUpIndicator(resId);
}
@@ -1380,6 +1385,7 @@ public class ActionBarView extends AbsActionBarView implements DecorToolbar {
private int mStartOffset;
private int mUpIndicatorRes;
private Drawable mDefaultUpIndicator;
+ private Drawable mUpIndicator;
private static final long DEFAULT_TRANSITION_DURATION = 150;
@@ -1409,13 +1415,30 @@ public class ActionBarView extends AbsActionBarView implements DecorToolbar {
}
public void setUpIndicator(Drawable d) {
- mUpView.setImageDrawable(d != null ? d : mDefaultUpIndicator);
+ mUpIndicator = d;
mUpIndicatorRes = 0;
+ updateUpIndicator();
+ }
+
+ public void setDefaultUpIndicator(Drawable d) {
+ mDefaultUpIndicator = d;
+ updateUpIndicator();
}
public void setUpIndicator(int resId) {
mUpIndicatorRes = resId;
- mUpView.setImageDrawable(resId != 0 ? getContext().getDrawable(resId) : null);
+ mUpIndicator = null;
+ updateUpIndicator();
+ }
+
+ private void updateUpIndicator() {
+ if (mUpIndicator != null) {
+ mUpView.setImageDrawable(mUpIndicator);
+ } else if (mUpIndicatorRes != 0) {
+ mUpView.setImageDrawable(getContext().getDrawable(mUpIndicatorRes));
+ } else {
+ mUpView.setImageDrawable(mDefaultUpIndicator);
+ }
}
@Override
@@ -1423,7 +1446,7 @@ public class ActionBarView extends AbsActionBarView implements DecorToolbar {
super.onConfigurationChanged(newConfig);
if (mUpIndicatorRes != 0) {
// Reload for config change
- setUpIndicator(mUpIndicatorRes);
+ updateUpIndicator();
}
}
diff --git a/core/java/com/android/internal/widget/DecorToolbar.java b/core/java/com/android/internal/widget/DecorToolbar.java
index fee30153d95e..f89f0b7d6ef7 100644
--- a/core/java/com/android/internal/widget/DecorToolbar.java
+++ b/core/java/com/android/internal/widget/DecorToolbar.java
@@ -90,6 +90,7 @@ public interface DecorToolbar {
void setNavigationContentDescription(CharSequence description);
void setNavigationContentDescription(int resId);
void setDefaultNavigationContentDescription(int defaultNavigationContentDescription);
+ void setDefaultNavigationIcon(Drawable icon);
void saveHierarchyState(SparseArray<Parcelable> toolbarStates);
void restoreHierarchyState(SparseArray<Parcelable> toolbarStates);
}
diff --git a/core/java/com/android/internal/widget/PreferenceImageView.java b/core/java/com/android/internal/widget/PreferenceImageView.java
new file mode 100644
index 000000000000..8730cdab258b
--- /dev/null
+++ b/core/java/com/android/internal/widget/PreferenceImageView.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+/**
+ * Extension of ImageView that correctly applies maxWidth and maxHeight.
+ */
+public class PreferenceImageView extends ImageView {
+
+ public PreferenceImageView(Context context) {
+ this(context, null);
+ }
+
+ public PreferenceImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public PreferenceImageView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ if (widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.UNSPECIFIED) {
+ final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ final int maxWidth = getMaxWidth();
+ if (maxWidth != Integer.MAX_VALUE
+ && (maxWidth < widthSize || widthMode == MeasureSpec.UNSPECIFIED)) {
+ widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
+ }
+ }
+
+ final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ if (heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.UNSPECIFIED) {
+ final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+ final int maxHeight = getMaxHeight();
+ if (maxHeight != Integer.MAX_VALUE
+ && (maxHeight < heightSize || heightMode == MeasureSpec.UNSPECIFIED)) {
+ heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
+ }
+ }
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+}
diff --git a/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java b/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java
index 63a4843fb0a4..324a6c998683 100644
--- a/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java
+++ b/core/java/com/android/internal/widget/ToolbarWidgetWrapper.java
@@ -84,6 +84,7 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
private int mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD;
private int mDefaultNavigationContentDescription = 0;
+ private Drawable mDefaultNavigationIcon;
public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) {
this(toolbar, style, R.string.action_bar_up_description);
@@ -96,11 +97,10 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
mTitle = toolbar.getTitle();
mSubtitle = toolbar.getSubtitle();
mTitleSet = mTitle != null;
-
+ final TypedArray a = toolbar.getContext().obtainStyledAttributes(null,
+ R.styleable.ActionBar, R.attr.actionBarStyle, 0);
+ mDefaultNavigationIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator);
if (style) {
- final TypedArray a = toolbar.getContext().obtainStyledAttributes(null,
- R.styleable.ActionBar, R.attr.actionBarStyle, 0);
-
final CharSequence title = a.getText(R.styleable.ActionBar_title);
if (!TextUtils.isEmpty(title)) {
setTitle(title);
@@ -120,12 +120,9 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
if (icon != null) {
setIcon(icon);
}
-
- final Drawable navIcon = a.getDrawable(R.styleable.ActionBar_homeAsUpIndicator);
- if (navIcon != null) {
- setNavigationIcon(navIcon);
+ if (mDefaultNavigationIcon != null) {
+ setNavigationIcon(mDefaultNavigationIcon);
}
-
setDisplayOptions(a.getInt(R.styleable.ActionBar_displayOptions, 0));
final int customNavId = a.getResourceId(
@@ -167,11 +164,10 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
if (popupTheme != 0) {
mToolbar.setPopupTheme(popupTheme);
}
-
- a.recycle();
} else {
mDisplayOpts = detectDisplayOptions();
}
+ a.recycle();
setDefaultNavigationContentDescription(defaultNavigationContentDescription);
mHomeDescription = mToolbar.getNavigationContentDescription();
@@ -204,6 +200,7 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
ActionBar.DISPLAY_USE_LOGO;
if (mToolbar.getNavigationIcon() != null) {
opts |= ActionBar.DISPLAY_HOME_AS_UP;
+ mDefaultNavigationIcon = mToolbar.getNavigationIcon();
}
return opts;
}
@@ -410,11 +407,9 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
if (changed != 0) {
if ((changed & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
if ((newOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
- mToolbar.setNavigationIcon(mNavIcon);
updateHomeAccessibility();
- } else {
- mToolbar.setNavigationIcon(null);
}
+ updateNavigationIcon();
}
if ((changed & AFFECTS_LOGO_MASK) != 0) {
@@ -578,7 +573,7 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
@Override
public void animateToVisibility(int visibility) {
if (visibility == View.GONE) {
- mToolbar.animate().translationY(mToolbar.getHeight()).alpha(0)
+ mToolbar.animate().alpha(0)
.setListener(new AnimatorListenerAdapter() {
private boolean mCanceled = false;
@Override
@@ -594,7 +589,7 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
}
});
} else if (visibility == View.VISIBLE) {
- mToolbar.animate().translationY(0).alpha(1)
+ mToolbar.animate().alpha(1)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
@@ -607,9 +602,7 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
@Override
public void setNavigationIcon(Drawable icon) {
mNavIcon = icon;
- if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
- mToolbar.setNavigationIcon(icon);
- }
+ updateNavigationIcon();
}
@Override
@@ -618,6 +611,22 @@ public class ToolbarWidgetWrapper implements DecorToolbar {
}
@Override
+ public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) {
+ if (mDefaultNavigationIcon != defaultNavigationIcon) {
+ mDefaultNavigationIcon = defaultNavigationIcon;
+ updateNavigationIcon();
+ }
+ }
+
+ private void updateNavigationIcon() {
+ if ((mDisplayOpts & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
+ mToolbar.setNavigationIcon(mNavIcon != null ? mNavIcon : mDefaultNavigationIcon);
+ } else {
+ mToolbar.setNavigationIcon(null);
+ }
+ }
+
+ @Override
public void setNavigationContentDescription(CharSequence description) {
mHomeDescription = description;
updateHomeAccessibility();
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 157310657c59..1f4105fdca98 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -905,6 +905,20 @@ char* AndroidRuntime::toSlashClassName(const char* className)
return result;
}
+/** Create a Java string from an ASCII or Latin-1 string */
+jstring AndroidRuntime::NewStringLatin1(JNIEnv* env, const char* bytes) {
+ if (!bytes) return NULL;
+ int length = strlen(bytes);
+ jchar* buffer = (jchar *)alloca(length * sizeof(jchar));
+ if (!buffer) return NULL;
+ jchar* chp = buffer;
+ for (int i = 0; i < length; i++) {
+ *chp++ = *bytes++;
+ }
+ return env->NewString(buffer, length);
+}
+
+
/*
* Start the Android runtime. This involves starting the virtual machine
* and calling the "static void main(String[] args)" method in the class
diff --git a/core/res/res/drawable-hdpi/spinner_textfield_activated_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/spinner_textfield_activated_mtrl_alpha.9.png
deleted file mode 100644
index 5e673955bc96..000000000000
--- a/core/res/res/drawable-hdpi/spinner_textfield_activated_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/spinner_textfield_default_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/spinner_textfield_default_mtrl_alpha.9.png
deleted file mode 100644
index 9c2ee13a0c1e..000000000000
--- a/core/res/res/drawable-hdpi/spinner_textfield_default_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_textfield_activated_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/spinner_textfield_activated_mtrl_alpha.9.png
deleted file mode 100644
index cb8f78a2636b..000000000000
--- a/core/res/res/drawable-mdpi/spinner_textfield_activated_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/spinner_textfield_default_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/spinner_textfield_default_mtrl_alpha.9.png
deleted file mode 100644
index 64d4c81eec33..000000000000
--- a/core/res/res/drawable-mdpi/spinner_textfield_default_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_textfield_activated_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/spinner_textfield_activated_mtrl_alpha.9.png
deleted file mode 100644
index 8e7862f8d836..000000000000
--- a/core/res/res/drawable-xhdpi/spinner_textfield_activated_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/spinner_textfield_default_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/spinner_textfield_default_mtrl_alpha.9.png
deleted file mode 100644
index 95cb83f035fa..000000000000
--- a/core/res/res/drawable-xhdpi/spinner_textfield_default_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/spinner_textfield_activated_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/spinner_textfield_activated_mtrl_alpha.9.png
deleted file mode 100644
index eb495c6505eb..000000000000
--- a/core/res/res/drawable-xxhdpi/spinner_textfield_activated_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/spinner_textfield_default_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/spinner_textfield_default_mtrl_alpha.9.png
deleted file mode 100644
index c2268afa89cb..000000000000
--- a/core/res/res/drawable-xxhdpi/spinner_textfield_default_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/spinner_textfield_activated_mtrl_alpha.9.png b/core/res/res/drawable-xxxhdpi/spinner_textfield_activated_mtrl_alpha.9.png
deleted file mode 100644
index fbcd7d4f29a6..000000000000
--- a/core/res/res/drawable-xxxhdpi/spinner_textfield_activated_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/spinner_textfield_default_mtrl_alpha.9.png b/core/res/res/drawable-xxxhdpi/spinner_textfield_default_mtrl_alpha.9.png
deleted file mode 100644
index ebc9bf7592e0..000000000000
--- a/core/res/res/drawable-xxxhdpi/spinner_textfield_default_mtrl_alpha.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/ic_ab_back_material.xml b/core/res/res/drawable/ic_ab_back_material.xml
index 72d798167154..e4bc6ccfbf07 100644
--- a/core/res/res/drawable/ic_ab_back_material.xml
+++ b/core/res/res/drawable/ic_ab_back_material.xml
@@ -21,6 +21,6 @@ Copyright (C) 2014 The Android Open Source Project
android:autoMirrored="true"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M20.000000,11.000000L7.800000,11.000000l5.600000,-5.600000L12.000000,4.000000l-8.000000,8.000000l8.000000,8.000000l1.400000,-1.400000L7.800000,13.000000L20.000000,13.000000L20.000000,11.000000z"
+ android:pathData="M20,11L7.8,11l5.6,-5.6L12,4l-8,8l8,8l1.4,-1.4L7.8,13L20,13L20,11z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_corp_icon_badge.xml b/core/res/res/drawable/ic_corp_icon_badge.xml
index 0b05bf5577a1..538dade1dd8b 100644
--- a/core/res/res/drawable/ic_corp_icon_badge.xml
+++ b/core/res/res/drawable/ic_corp_icon_badge.xml
@@ -19,27 +19,26 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportWidth="64.0"
android:viewportHeight="64.0">
<path
- android:pathData="M49.062000,50.000000m-14.000000,0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,28.000000 0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,-28.000000 0.000000"
- android:fillColor="#FF000000"/>
+ android:fillColor="#FF000000"
+ android:pathData="M49.062,50.0m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
+ android:fillAlpha="0.2"/>
<path
- android:pathData="M49.000000,49.500000m-14.000000,0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,28.000000 0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,-28.000000 0.000000"
- android:fillColor="#FF000000"/>
+ android:fillColor="#FF000000"
+ android:pathData="M49.0,49.5m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
+ android:fillAlpha="0.2"/>
<path
- android:pathData="M49.000000,49.000000m-14.000000,0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,28.000000 0.000000a14.000000,14.000000 0.000000,1.000000 1.000000,-28.000000 0.000000"
+ android:pathData="M49.0,49.0m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
android:fillColor="#FF5722"/>
<path
- android:pathData="M55.250000,44.264000l-2.254000,0.000000l0.000000,-1.531000l-1.531000,-1.531000l-4.638000,0.000000l-1.531000,1.531000l0.000000,1.531000l-2.294000,0.000000c-0.846000,0.000000 -1.523000,0.685000 -1.523000,1.531000l-0.008000,8.421000c0.000000,0.846000 0.685000,1.531000 1.531000,1.531000L55.250000,55.746994c0.846000,0.000000 1.531000,-0.685000 1.531000,-1.531000l0.000000,-8.421000C56.782001,44.948002 56.097000,44.264000 55.250000,44.264000zM51.465000,44.264000l-4.638000,0.000000l0.000000,-1.531000l4.638000,0.000000L51.465000,44.264000z"
+ android:pathData="M55.801,43.688l-2.837,-0.001l0.0,-1.137l-1.587,-1.588l-4.72,-0.001l-1.588,1.587l0.0,1.137l-2.867,-0.001c-0.94,0.0 -1.691,0.76 -1.691,1.699L40.5,48.654c0.0,0.94 0.76,1.7 1.699,1.7l5.255,0.001l0.0,-1.271l0.225,0.0l2.589,0.0l0.225,0.0l0.0,1.271l5.303,0.001c0.939,0.0 1.7,-0.76 1.7,-1.699l0.002,-3.269C57.5,44.449 56.74,43.689 55.801,43.688zM51.377,43.687l-4.72,-0.001l0.0,-1.137l4.72,0.001L51.377,43.687z"
android:fillColor="#FFFFFF"/>
<path
- android:pathData="M57.359001,45.373001c0.000000,-0.855000 -0.738000,-1.547000 -1.651000,-1.547000L42.535000,43.826000c-0.913000,0.000000 -1.643000,0.692000 -1.643000,1.547000l0.004000,3.232000c0.000000,0.911000 0.737000,1.648000 1.648000,1.648000l13.162000,0.000000c0.911000,0.000000 1.648000,-0.737000 1.648000,-1.648000L57.359001,45.373001z"
+ android:pathData="M50.494,52.012l-3.04,0.0l0.0,-0.901l-6.417,0.0l0.0,3.172c0.0,0.94 0.741,1.7 1.68,1.7l12.464,0.003c0.939,0.0 1.702,-0.76 1.703,-1.699l0.0,-3.176l-6.39,0.0L50.494,52.012z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M40.726,40.726 h16.13 v16.13 h-16.13z"
android:fillColor="#00000000"/>
<path
- android:pathData="M40.000000,49.000000l17.000000,0.000000l0.000000,2.000000l-17.000000,0.000000z"
- android:fillColor="#FF5722"/>
- <path
- android:pathData="M47.625000,48.951000l3.003000,0.000000l0.000000,3.002000l-3.003000,0.000000z"
- android:fillColor="#FF5722"/>
+ android:pathData="M46.657,42.55 h4.72 v1.137 h-4.72z"
+ android:fillColor="#00000000"/>
</vector>
diff --git a/core/res/res/drawable/ic_corp_statusbar_icon.xml b/core/res/res/drawable/ic_corp_statusbar_icon.xml
new file mode 100644
index 000000000000..e742c0b9bff2
--- /dev/null
+++ b/core/res/res/drawable/ic_corp_statusbar_icon.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M20.801,5.981L17.13,5.98l0.001,-1.471l-2.053,-2.055L8.969,2.453L6.915,4.506L6.914,5.977L3.203,5.976c-1.216,0.0 -2.189,0.983 -2.189,2.199L1.0,12.406c0.0,1.216 0.983,2.2 2.199,2.2L10.0,14.608l0.0,-1.644l0.291,0.0l3.351,0.0l0.291,0.0l0.0,1.645l6.863,0.002c1.216,0.0 2.2,-0.983 2.2,-2.199L23.0,8.181C23.0,6.965 22.017,5.981 20.801,5.981zM15.076,5.979L8.968,5.978l0.001,-1.471l6.108,0.001L15.076,5.979z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M13.911,16.646L9.978,16.646L9.978,15.48L1.673,15.48l0.0,4.105c0.0,1.216 0.959,2.2 2.175,2.2l16.13,0.004c1.216,0.0 2.203,-0.983 2.203,-2.199l0.0,-4.11l-8.27,0.0L13.910999,16.646z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:pathData="M23.657,6.55 h4.72 v1.137 h-4.72z"
+ android:fillColor="#00000000"/>
+</vector>
diff --git a/core/res/res/drawable/ic_dialog_alert_material.xml b/core/res/res/drawable/ic_dialog_alert_material.xml
index 3bb4d2c70d05..26daea742c0f 100644
--- a/core/res/res/drawable/ic_dialog_alert_material.xml
+++ b/core/res/res/drawable/ic_dialog_alert_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M1.000000,21.000000l22.000000,0.000000L12.000000,2.000000L1.000000,21.000000zM13.000000,18.000000l-2.000000,0.000000l0.000000,-2.000000l2.000000,0.000000L13.000000,18.000000zM13.000000,14.000000l-2.000000,0.000000l0.000000,-4.000000l2.000000,0.000000L13.000000,14.000000z"
+ android:pathData="M1,21l22,0L12,2L1,21zM13,18l-2,0l0,-2l2,0L13,18zM13,14l-2,0l0,-4l2,0L13,14z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_go_search_api_material.xml b/core/res/res/drawable/ic_go_search_api_material.xml
index 21c7249fa119..67ef281b1bb7 100644
--- a/core/res/res/drawable/ic_go_search_api_material.xml
+++ b/core/res/res/drawable/ic_go_search_api_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M10.000000,6.000000l-1.400000,1.400000 4.599999,4.600000 -4.599999,4.600000 1.400000,1.400000 6.000000,-6.000000z"
+ android:pathData="M10,6l-1.4,1.4 4.599999,4.6 -4.599999,4.6 1.4,1.4 6,-6z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_copy_material.xml b/core/res/res/drawable/ic_menu_copy_material.xml
index da3912bf5e5a..c03723b1fb33 100644
--- a/core/res/res/drawable/ic_menu_copy_material.xml
+++ b/core/res/res/drawable/ic_menu_copy_material.xml
@@ -21,6 +21,6 @@ Copyright (C) 2014 The Android Open Source Project
android:autoMirrored="true"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M16.000000,1.000000L4.000000,1.000000C2.900000,1.000000 2.000000,1.900000 2.000000,3.000000l0.000000,14.000000l2.000000,0.000000L4.000000,3.000000l12.000000,0.000000L16.000000,1.000000zM19.000000,5.000000L8.000000,5.000000C6.900000,5.000000 6.000000,5.900000 6.000000,7.000000l0.000000,14.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l11.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L21.000000,7.000000C21.000000,5.900000 20.100000,5.000000 19.000000,5.000000zM19.000000,21.000000L8.000000,21.000000L8.000000,7.000000l11.000000,0.000000L19.000000,21.000000z"
+ android:pathData="M16,1L4,1C2.9,1 2,1.9 2,3l0,14l2,0L4,3l12,0L16,1zM19,5L8,5C6.9,5 6,5.9 6,7l0,14c0,1.1 0.9,2 2,2l11,0c1.1,0 2,-0.9 2,-2L21,7C21,5.9 20.1,5 19,5zM19,21L8,21L8,7l11,0L19,21z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_cut_material.xml b/core/res/res/drawable/ic_menu_cut_material.xml
index 54db72adcb0e..aec66856e85d 100644
--- a/core/res/res/drawable/ic_menu_cut_material.xml
+++ b/core/res/res/drawable/ic_menu_cut_material.xml
@@ -21,6 +21,6 @@ Copyright (C) 2014 The Android Open Source Project
android:autoMirrored="true"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M10.000000,6.000000c0.000000,-2.200000 -1.800000,-4.000000 -4.000000,-4.000000S2.000000,3.800000 2.000000,6.000000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000c0.600000,0.000000 1.100000,-0.100000 1.600000,-0.400000L10.000000,12.000000l-2.400000,2.400000C7.100000,14.100000 6.600000,14.000000 6.000000,14.000000c-2.200000,0.000000 -4.000000,1.800000 -4.000000,4.000000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000s4.000000,-1.800000 4.000000,-4.000000c0.000000,-0.600000 -0.100000,-1.100000 -0.400000,-1.600000L12.000000,14.000000l7.000000,7.000000l4.000000,0.000000L9.600000,7.600000C9.900000,7.100000 10.000000,6.600000 10.000000,6.000000zM6.000000,8.000000C4.900000,8.000000 4.000000,7.100000 4.000000,6.000000s0.900000,-2.000000 2.000000,-2.000000c1.100000,0.000000 2.000000,0.900000 2.000000,2.000000S7.100000,8.000000 6.000000,8.000000zM6.000000,20.000000c-1.100000,0.000000 -2.000000,-0.900000 -2.000000,-2.000000s0.900000,-2.000000 2.000000,-2.000000c1.100000,0.000000 2.000000,0.900000 2.000000,2.000000S7.100000,20.000000 6.000000,20.000000zM12.000000,11.500000c0.300000,0.000000 0.500000,0.200000 0.500000,0.500000c0.000000,0.300000 -0.200000,0.500000 -0.500000,0.500000c-0.300000,0.000000 -0.500000,-0.200000 -0.500000,-0.500000C11.500000,11.700000 11.700000,11.500000 12.000000,11.500000zM23.000000,3.000000l-4.000000,0.000000l-6.000000,6.000000l2.000000,2.000000L23.000000,3.000000z"
+ android:pathData="M10,6c0,-2.2 -1.8,-4 -4,-4S2,3.8 2,6c0,2.2 1.8,4 4,4c0.6,0 1.1,-0.1 1.6,-0.4L10,12l-2.4,2.4C7.1,14.1 6.6,14 6,14c-2.2,0 -4,1.8 -4,4c0,2.2 1.8,4 4,4s4,-1.8 4,-4c0,-0.6 -0.1,-1.1 -0.4,-1.6L12,14l7,7l4,0L9.6,7.6C9.9,7.1 10,6.6 10,6zM6,8C4.9,8 4,7.1 4,6s0.9,-2 2,-2c1.1,0 2,0.9 2,2S7.1,8 6,8zM6,20c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2c1.1,0 2,0.9 2,2S7.1,20 6,20zM12,11.5c0.3,0 0.5,0.2 0.5,0.5c0,0.3 -0.2,0.5 -0.5,0.5c-0.3,0 -0.5,-0.2 -0.5,-0.5C11.5,11.7 11.7,11.5 12,11.5zM23,3l-4,0l-6,6l2,2L23,3z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_moreoverflow_material.xml b/core/res/res/drawable/ic_menu_moreoverflow_material.xml
index c1285700394c..502ad6910a32 100644
--- a/core/res/res/drawable/ic_menu_moreoverflow_material.xml
+++ b/core/res/res/drawable/ic_menu_moreoverflow_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M12.000000,8.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000s-0.900000,-2.000000 -2.000000,-2.000000c-1.100000,0.000000 -2.000000,0.900000 -2.000000,2.000000S10.900000,8.000000 12.000000,8.000000zM12.000000,10.000000c-1.100000,0.000000 -2.000000,0.900000 -2.000000,2.000000s0.900000,2.000000 2.000000,2.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000S13.100000,10.000000 12.000000,10.000000zM12.000000,16.000000c-1.100000,0.000000 -2.000000,0.900000 -2.000000,2.000000s0.900000,2.000000 2.000000,2.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000S13.100000,16.000000 12.000000,16.000000z"
+ android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2c-1.1,0 -2,0.9 -2,2S10.9,8 12,8zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2c1.1,0 2,-0.9 2,-2S13.1,10 12,10zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2c1.1,0 2,-0.9 2,-2S13.1,16 12,16z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_paste_material.xml b/core/res/res/drawable/ic_menu_paste_material.xml
index 5f847cb2f908..ee2426741e62 100644
--- a/core/res/res/drawable/ic_menu_paste_material.xml
+++ b/core/res/res/drawable/ic_menu_paste_material.xml
@@ -21,6 +21,6 @@ Copyright (C) 2014 The Android Open Source Project
android:autoMirrored="true"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M19.000000,2.000000l-4.200000,0.000000c-0.400000,-1.200000 -1.500000,-2.000000 -2.800000,-2.000000c-1.300000,0.000000 -2.400000,0.800000 -2.800000,2.000000L5.000000,2.000000C3.900000,2.000000 3.000000,2.900000 3.000000,4.000000l0.000000,16.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000l14.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L21.000000,4.000000C21.000000,2.900000 20.100000,2.000000 19.000000,2.000000zM12.000000,2.000000c0.600000,0.000000 1.000000,0.400000 1.000000,1.000000s-0.400000,1.000000 -1.000000,1.000000c-0.600000,0.000000 -1.000000,-0.400000 -1.000000,-1.000000S11.400000,2.000000 12.000000,2.000000zM19.000000,20.000000L5.000000,20.000000L5.000000,4.000000l2.000000,0.000000l0.000000,3.000000l10.000000,0.000000L17.000000,4.000000l2.000000,0.000000L19.000000,20.000000z"
+ android:pathData="M19,2l-4.2,0c-0.4,-1.2 -1.5,-2 -2.8,-2c-1.3,0 -2.4,0.8 -2.8,2L5,2C3.9,2 3,2.9 3,4l0,16c0,1.1 0.9,2 2,2l14,0c1.1,0 2,-0.9 2,-2L21,4C21,2.9 20.1,2 19,2zM12,2c0.6,0 1,0.4 1,1s-0.4,1 -1,1c-0.6,0 -1,-0.4 -1,-1S11.4,2 12,2zM19,20L5,20L5,4l2,0l0,3l10,0L17,4l2,0L19,20z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_selectall_material.xml b/core/res/res/drawable/ic_menu_selectall_material.xml
index 11e63fde6247..fd05c72542db 100644
--- a/core/res/res/drawable/ic_menu_selectall_material.xml
+++ b/core/res/res/drawable/ic_menu_selectall_material.xml
@@ -21,6 +21,6 @@ Copyright (C) 2014 The Android Open Source Project
android:autoMirrored="true"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M3.000000,5.000000l2.000000,0.000000L5.000000,3.000000C3.900000,3.000000 3.000000,3.900000 3.000000,5.000000zM3.000000,13.000000l2.000000,0.000000l0.000000,-2.000000L3.000000,11.000000L3.000000,13.000000zM7.000000,21.000000l2.000000,0.000000l0.000000,-2.000000L7.000000,19.000000L7.000000,21.000000zM3.000000,9.000000l2.000000,0.000000L5.000000,7.000000L3.000000,7.000000L3.000000,9.000000zM13.000000,3.000000l-2.000000,0.000000l0.000000,2.000000l2.000000,0.000000L13.000000,3.000000zM19.000000,3.000000l0.000000,2.000000l2.000000,0.000000C21.000000,3.900000 20.100000,3.000000 19.000000,3.000000zM5.000000,21.000000l0.000000,-2.000000L3.000000,19.000000C3.000000,20.100000 3.900000,21.000000 5.000000,21.000000zM3.000000,17.000000l2.000000,0.000000l0.000000,-2.000000L3.000000,15.000000L3.000000,17.000000zM9.000000,3.000000L7.000000,3.000000l0.000000,2.000000l2.000000,0.000000L9.000000,3.000000zM11.000000,21.000000l2.000000,0.000000l0.000000,-2.000000l-2.000000,0.000000L11.000000,21.000000zM19.000000,13.000000l2.000000,0.000000l0.000000,-2.000000l-2.000000,0.000000L19.000000,13.000000zM19.000000,21.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000l-2.000000,0.000000L19.000000,21.000000zM19.000000,9.000000l2.000000,0.000000L21.000000,7.000000l-2.000000,0.000000L19.000000,9.000000zM19.000000,17.000000l2.000000,0.000000l0.000000,-2.000000l-2.000000,0.000000L19.000000,17.000000zM15.000000,21.000000l2.000000,0.000000l0.000000,-2.000000l-2.000000,0.000000L15.000000,21.000000zM15.000000,5.000000l2.000000,0.000000L17.000000,3.000000l-2.000000,0.000000L15.000000,5.000000zM7.000000,17.000000l10.000000,0.000000L17.000000,7.000000L7.000000,7.000000L7.000000,17.000000zM9.000000,9.000000l6.000000,0.000000l0.000000,6.000000L9.000000,15.000000L9.000000,9.000000z"
+ android:pathData="M3,5l2,0L5,3C3.9,3 3,3.9 3,5zM3,13l2,0l0,-2L3,11L3,13zM7,21l2,0l0,-2L7,19L7,21zM3,9l2,0L5,7L3,7L3,9zM13,3l-2,0l0,2l2,0L13,3zM19,3l0,2l2,0C21,3.9 20.1,3 19,3zM5,21l0,-2L3,19C3,20.1 3.9,21 5,21zM3,17l2,0l0,-2L3,15L3,17zM9,3L7,3l0,2l2,0L9,3zM11,21l2,0l0,-2l-2,0L11,21zM19,13l2,0l0,-2l-2,0L19,13zM19,21c1.1,0 2,-0.9 2,-2l-2,0L19,21zM19,9l2,0L21,7l-2,0L19,9zM19,17l2,0l0,-2l-2,0L19,17zM15,21l2,0l0,-2l-2,0L15,21zM15,5l2,0L17,3l-2,0L15,5zM7,17l10,0L17,7L7,7L7,17zM9,9l6,0l0,6L9,15L9,9z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_menu_share_material.xml b/core/res/res/drawable/ic_menu_share_material.xml
index b7c238f4bc98..6c351c9d502e 100644
--- a/core/res/res/drawable/ic_menu_share_material.xml
+++ b/core/res/res/drawable/ic_menu_share_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M18.000000,16.100000c-0.800000,0.000000 -1.500000,0.300000 -2.000000,0.800000l-7.100000,-4.200000C9.000000,12.500000 9.000000,12.200000 9.000000,12.000000s0.000000,-0.500000 -0.100000,-0.700000L16.000000,7.200000C16.500000,7.700000 17.200001,8.000000 18.000000,8.000000c1.700000,0.000000 3.000000,-1.300000 3.000000,-3.000000s-1.300000,-3.000000 -3.000000,-3.000000s-3.000000,1.300000 -3.000000,3.000000c0.000000,0.200000 0.000000,0.500000 0.100000,0.700000L8.000000,9.800000C7.500000,9.300000 6.800000,9.000000 6.000000,9.000000c-1.700000,0.000000 -2.900000,1.200000 -2.900000,2.900000s1.300000,3.000000 3.000000,3.000000c0.800000,0.000000 1.500000,-0.300000 2.000000,-0.800000l7.100000,4.200000c-0.100000,0.300000 -0.100000,0.500000 -0.100000,0.700000c0.000000,1.600000 1.300000,2.900000 2.900000,2.900000s2.900000,-1.300000 2.900000,-2.900000S19.600000,16.100000 18.000000,16.100000z"
+ android:pathData="M18,16.1c-0.8,0 -1.5,0.3 -2,0.8l-7.1,-4.2C9,12.5 9,12.2 9,12s0,-0.5 -0.1,-0.7L16,7.2C16.5,7.7 17.200001,8 18,8c1.7,0 3,-1.3 3,-3s-1.3,-3 -3,-3s-3,1.3 -3,3c0,0.2 0,0.5 0.1,0.7L8,9.8C7.5,9.3 6.8,9 6,9c-1.7,0 -2.9,1.2 -2.9,2.9s1.3,3 3,3c0.8,0 1.5,-0.3 2,-0.8l7.1,4.2c-0.1,0.3 -0.1,0.5 -0.1,0.7c0,1.6 1.3,2.9 2.9,2.9s2.9,-1.3 2.9,-2.9S19.6,16.1 18,16.1z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_search_api_material.xml b/core/res/res/drawable/ic_search_api_material.xml
index ac1aae3461b0..70367bd66795 100644
--- a/core/res/res/drawable/ic_search_api_material.xml
+++ b/core/res/res/drawable/ic_search_api_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M15.500000,14.000000l-0.800000,0.000000l-0.300000,-0.300000c1.000000,-1.100000 1.600000,-2.600000 1.600000,-4.200000C16.000000,5.900000 13.100000,3.000000 9.500000,3.000000C5.900000,3.000000 3.000000,5.900000 3.000000,9.500000S5.900000,16.000000 9.500000,16.000000c1.600000,0.000000 3.100000,-0.600000 4.200000,-1.600000l0.300000,0.300000l0.000000,0.800000l5.000000,5.000000l1.500000,-1.500000L15.500000,14.000000zM9.500000,14.000000C7.000000,14.000000 5.000000,12.000000 5.000000,9.500000S7.000000,5.000000 9.500000,5.000000C12.000000,5.000000 14.000000,7.000000 14.000000,9.500000S12.000000,14.000000 9.500000,14.000000z"
+ android:pathData="M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/ic_voice_search_api_material.xml b/core/res/res/drawable/ic_voice_search_api_material.xml
index 8c1e803988d7..a02621820b62 100644
--- a/core/res/res/drawable/ic_voice_search_api_material.xml
+++ b/core/res/res/drawable/ic_voice_search_api_material.xml
@@ -20,6 +20,6 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
- android:pathData="M12.000000,14.000000c1.700000,0.000000 3.000000,-1.300000 3.000000,-3.000000l0.000000,-6.000000c0.000000,-1.700000 -1.300000,-3.000000 -3.000000,-3.000000c-1.700000,0.000000 -3.000000,1.300000 -3.000000,3.000000l0.000000,6.000000C9.000000,12.700000 10.300000,14.000000 12.000000,14.000000zM17.299999,11.000000c0.000000,3.000000 -2.500000,5.100000 -5.300000,5.100000c-2.800000,0.000000 -5.300000,-2.100000 -5.300000,-5.100000L5.000000,11.000000c0.000000,3.400000 2.700000,6.200000 6.000000,6.700000L11.000000,21.000000l2.000000,0.000000l0.000000,-3.300000c3.300000,-0.500000 6.000000,-3.300000 6.000000,-6.700000L17.299999,11.000001z"
+ android:pathData="M12,14c1.7,0 3,-1.3 3,-3l0,-6c0,-1.7 -1.3,-3 -3,-3c-1.7,0 -3,1.3 -3,3l0,6C9,12.7 10.3,14 12,14zM17.299999,11c0,3 -2.5,5.1 -5.3,5.1c-2.8,0 -5.3,-2.1 -5.3,-5.1L5,11c0,3.4 2.7,6.2 6,6.7L11,21l2,0l0,-3.3c3.3,-0.5 6,-3.3 6,-6.7L17.299999,11.000001z"
android:fillColor="@color/white"/>
</vector>
diff --git a/core/res/res/drawable/spinner_textfield_background_material.xml b/core/res/res/drawable/spinner_textfield_background_material.xml
index 5bdff4a59140..2732d53d50f3 100644
--- a/core/res/res/drawable/spinner_textfield_background_material.xml
+++ b/core/res/res/drawable/spinner_textfield_background_material.xml
@@ -17,17 +17,29 @@
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:inset="@dimen/control_inset_material">
<selector android:autoMirrored="true">
- <item android:state_checked="true">
- <nine-patch android:src="@drawable/spinner_textfield_activated_mtrl_alpha"
- android:tint="?attr/colorControlActivated" />
- </item>
- <item android:state_pressed="true">
- <nine-patch android:src="@drawable/spinner_textfield_activated_mtrl_alpha"
- android:tint="?attr/colorControlActivated" />
+ <item android:state_checked="false" android:state_pressed="false">
+ <layer-list android:paddingMode="stack">
+ <item>
+ <nine-patch android:src="@drawable/textfield_default_mtrl_alpha"
+ android:tint="?attr/colorControlNormal" />
+ </item>
+ <item>
+ <nine-patch android:src="@drawable/spinner_mtrl_am_alpha"
+ android:tint="?attr/colorControlNormal" />
+ </item>
+ </layer-list>
</item>
<item>
- <nine-patch android:src="@drawable/spinner_textfield_default_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
+ <layer-list android:paddingMode="stack">
+ <item>
+ <nine-patch android:src="@drawable/textfield_activated_mtrl_alpha"
+ android:tint="?attr/colorControlActivated" />
+ </item>
+ <item>
+ <nine-patch android:src="@drawable/spinner_mtrl_am_alpha"
+ android:tint="?attr/colorControlActivated" />
+ </item>
+ </layer-list>
</item>
</selector>
</inset>
diff --git a/core/res/res/drawable/stat_notify_disabled_data.xml b/core/res/res/drawable/stat_notify_disabled_data.xml
index 9089d0879e2e..4f6ea7f57d36 100644
--- a/core/res/res/drawable/stat_notify_disabled_data.xml
+++ b/core/res/res/drawable/stat_notify_disabled_data.xml
@@ -20,5 +20,5 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="48.0">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M26.000000,4.100000l0.000000,6.100000c6.800000,1.000000 12.000000,6.800000 12.000000,13.800000c0.000000,1.800000 -0.400000,3.500000 -1.000000,5.100000l5.200000,3.100000c1.100000,-2.500000 1.800000,-5.200000 1.800000,-8.100000C44.000000,13.600000 36.099998,5.100000 26.000000,4.100000zM24.000000,38.000000c-7.700000,0.000000 -14.000000,-6.300000 -14.000000,-14.000000c0.000000,-7.100000 5.200000,-12.900000 12.000000,-13.800000L22.000000,4.100000C11.900000,5.100000 4.000000,13.600000 4.000000,24.000000c0.000000,11.000000 8.900000,20.000000 20.000000,20.000000c6.600000,0.000000 12.500000,-3.200000 16.100000,-8.200000l-5.200000,-3.100000C32.299999,36.000000 28.400000,38.000000 24.000000,38.000000z"/>
+ android:pathData="M26,4.1l0,6.1c6.8,1 12,6.8 12,13.8c0,1.8 -0.4,3.5 -1,5.1l5.2,3.1c1.1,-2.5 1.8,-5.2 1.8,-8.1C44,13.6 36.099998,5.1 26,4.1zM24,38c-7.7,0 -14,-6.3 -14,-14c0,-7.1 5.2,-12.9 12,-13.8L22,4.1C11.9,5.1 4,13.6 4,24c0,11 8.9,20 20,20c6.6,0 12.5,-3.2 16.1,-8.2l-5.2,-3.1C32.299999,36 28.4,38 24,38z"/>
</vector>
diff --git a/core/res/res/drawable/stat_notify_wifi_in_range.xml b/core/res/res/drawable/stat_notify_wifi_in_range.xml
index 9a5407d785c5..a271ca5224c7 100644
--- a/core/res/res/drawable/stat_notify_wifi_in_range.xml
+++ b/core/res/res/drawable/stat_notify_wifi_in_range.xml
@@ -20,8 +20,8 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="24.0">
<path
android:fillColor="#4DFFFFFF"
- android:pathData="M19.100000,14.000000l-3.400000,0.000000l0.000000,-1.500000c0.000000,-1.800000 0.800000,-2.800000 1.500000,-3.400000C18.100000,8.300000 19.200001,8.000000 20.600000,8.000000c1.200000,0.000000 2.300000,0.300000 3.100000,0.800000l1.900000,-2.300000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.500000,-8.100000L19.100000,14.000000z"/>
+ android:pathData="M19.1,14l-3.4,0l0,-1.5c0,-1.8 0.8,-2.8 1.5,-3.4C18.1,8.3 19.200001,8 20.6,8c1.2,0 2.3,0.3 3.1,0.8l1.9,-2.3C25.1,6.1 20.299999,2.1 13,2.1S0.9,6.1 0.4,6.5L13,22l0,0l0,0l0,0l0,0l6.5,-8.1L19.1,14z"/>
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M19.500000,17.799999c0.000000,-0.800000 0.100000,-1.300000 0.200000,-1.600000c0.200000,-0.300000 0.500000,-0.700000 1.100000,-1.200000c0.400000,-0.400000 0.700000,-0.800000 1.000000,-1.100000s0.400000,-0.800000 0.400000,-1.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.400000,-1.200000c-0.300000,-0.300000 -0.700000,-0.400000 -1.200000,-0.400000c-0.400000,0.000000 -0.800000,0.100000 -1.100000,0.300000c-0.300000,0.200000 -0.400000,0.600000 -0.400000,1.100000l-1.900000,0.000000c0.000000,-1.000000 0.300000,-1.700000 1.000000,-2.200000c0.600000,-0.500000 1.500000,-0.800000 2.500000,-0.800000c1.100000,0.000000 2.000000,0.300000 2.600000,0.800000c0.600000,0.500000 0.900000,1.300000 0.900000,2.300000c0.000000,0.700000 -0.200000,1.300000 -0.600000,1.800000c-0.400000,0.600000 -0.900000,1.100000 -1.500000,1.600000c-0.300000,0.300000 -0.500000,0.500000 -0.600000,0.700000c-0.100000,0.200000 -0.100000,0.600000 -0.100000,1.000000L19.500000,17.700001zM21.400000,21.000000l-1.900000,0.000000l0.000000,-1.800000l1.900000,0.000000L21.400000,21.000000z"/>
+ android:pathData="M19.5,17.799999c0,-0.8 0.1,-1.3 0.2,-1.6c0.2,-0.3 0.5,-0.7 1.1,-1.2c0.4,-0.4 0.7,-0.8 1,-1.1s0.4,-0.8 0.4,-1.2c0,-0.5 -0.1,-0.9 -0.4,-1.2c-0.3,-0.3 -0.7,-0.4 -1.2,-0.4c-0.4,0 -0.8,0.1 -1.1,0.3c-0.3,0.2 -0.4,0.6 -0.4,1.1l-1.9,0c0,-1 0.3,-1.7 1,-2.2c0.6,-0.5 1.5,-0.8 2.5,-0.8c1.1,0 2,0.3 2.6,0.8c0.6,0.5 0.9,1.3 0.9,2.3c0,0.7 -0.2,1.3 -0.6,1.8c-0.4,0.6 -0.9,1.1 -1.5,1.6c-0.3,0.3 -0.5,0.5 -0.6,0.7c-0.1,0.2 -0.1,0.6 -0.1,1L19.5,17.700001zM21.4,21l-1.9,0l0,-1.8l1.9,0L21.4,21z"/>
</vector>
diff --git a/core/res/res/drawable/stat_sys_tether_wifi.xml b/core/res/res/drawable/stat_sys_tether_wifi.xml
index 4396962a2996..23dc849f2163 100644
--- a/core/res/res/drawable/stat_sys_tether_wifi.xml
+++ b/core/res/res/drawable/stat_sys_tether_wifi.xml
@@ -21,5 +21,5 @@ Copyright (C) 2014 The Android Open Source Project
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M24.000000,22.000000c-2.200000,0.000000 -4.000000,1.800000 -4.000000,4.000000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000C28.000000,23.799999 26.200001,22.000000 24.000000,22.000000zM36.000000,26.000000c0.000000,-6.600000 -5.400000,-12.000000 -12.000000,-12.000000c-6.600000,0.000000 -12.000000,5.400000 -12.000000,12.000000c0.000000,4.400000 2.400000,8.300000 6.000000,10.400000l2.000000,-3.500000c-2.400000,-1.400000 -4.000000,-3.900000 -4.000000,-6.900000c0.000000,-4.400000 3.600000,-8.000000 8.000000,-8.000000s8.000000,3.600000 8.000000,8.000000c0.000000,3.000000 -1.600000,5.500000 -4.000000,6.900000l2.000000,3.500000C33.599998,34.299999 36.000000,30.400000 36.000000,26.000000zM24.000000,6.000000C13.000000,6.000000 4.000000,15.000000 4.000000,26.000000c0.000000,7.400000 4.000000,13.800000 10.000000,17.299999l2.000000,-3.500000c-4.800000,-2.800000 -8.000000,-7.900000 -8.000000,-13.800000c0.000000,-8.800000 7.200000,-16.000000 16.000000,-16.000000s16.000000,7.200000 16.000000,16.000000c0.000000,5.900000 -3.200000,11.100000 -8.000000,13.800000l2.000000,3.500000c6.000000,-3.500000 10.000000,-9.900000 10.000000,-17.299999C44.000000,15.000000 35.000000,6.000000 24.000000,6.000000z"/>
+ android:pathData="M24,22c-2.2,0 -4,1.8 -4,4c0,2.2 1.8,4 4,4c2.2,0 4,-1.8 4,-4C28,23.799999 26.200001,22 24,22zM36,26c0,-6.6 -5.4,-12 -12,-12c-6.6,0 -12,5.4 -12,12c0,4.4 2.4,8.3 6,10.4l2,-3.5c-2.4,-1.4 -4,-3.9 -4,-6.9c0,-4.4 3.6,-8 8,-8s8,3.6 8,8c0,3 -1.6,5.5 -4,6.9l2,3.5C33.599998,34.299999 36,30.4 36,26zM24,6C13,6 4,15 4,26c0,7.4 4,13.8 10,17.299999l2,-3.5c-4.8,-2.8 -8,-7.9 -8,-13.8c0,-8.8 7.2,-16 16,-16s16,7.2 16,16c0,5.9 -3.2,11.1 -8,13.8l2,3.5c6,-3.5 10,-9.9 10,-17.299999C44,15 35,6 24,6z"/>
</vector>
diff --git a/core/res/res/layout/preference_material.xml b/core/res/res/layout/preference_material.xml
index 39c979c5bc05..bf0fda94838e 100644
--- a/core/res/res/layout/preference_material.xml
+++ b/core/res/res/layout/preference_material.xml
@@ -30,7 +30,7 @@
<LinearLayout
android:id="@+id/icon_frame"
android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:layout_marginStart="-4dp"
android:minWidth="60dp"
android:gravity="start|center_vertical"
@@ -38,11 +38,10 @@
android:paddingEnd="12dp"
android:paddingTop="4dp"
android:paddingBottom="4dp">
- <ImageView
+ <com.android.internal.widget.PreferenceImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:adjustViewBounds="true"
android:maxWidth="48dp"
android:maxHeight="48dp" />
</LinearLayout>
diff --git a/core/res/res/layout/screen.xml b/core/res/res/layout/screen.xml
index 902a797fdadc..403ffd63debb 100644
--- a/core/res/res/layout/screen.xml
+++ b/core/res/res/layout/screen.xml
@@ -30,7 +30,8 @@ This is the basic layout for a screen, with all of its features enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
<!-- Title bar -->
<RelativeLayout android:id="@android:id/title_container"
diff --git a/core/res/res/layout/screen_custom_title.xml b/core/res/res/layout/screen_custom_title.xml
index b385bed36234..a3312dcf7867 100644
--- a/core/res/res/layout/screen_custom_title.xml
+++ b/core/res/res/layout/screen_custom_title.xml
@@ -26,7 +26,8 @@ This is a custom layout for a screen.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
<FrameLayout android:id="@android:id/title_container"
android:layout_width="match_parent"
diff --git a/core/res/res/layout/screen_progress.xml b/core/res/res/layout/screen_progress.xml
index 1f04d35758e7..e70f2ec0a372 100644
--- a/core/res/res/layout/screen_progress.xml
+++ b/core/res/res/layout/screen_progress.xml
@@ -31,7 +31,8 @@ This is the basic layout for a screen, with all of its features enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
<RelativeLayout android:id="@android:id/title_container"
style="?android:attr/windowTitleBackgroundStyle"
diff --git a/core/res/res/layout/screen_simple.xml b/core/res/res/layout/screen_simple.xml
index c1914e7964b9..6111348acd08 100644
--- a/core/res/res/layout/screen_simple.xml
+++ b/core/res/res/layout/screen_simple.xml
@@ -30,7 +30,8 @@ enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
diff --git a/core/res/res/layout/screen_simple_overlay_action_mode.xml b/core/res/res/layout/screen_simple_overlay_action_mode.xml
index c790d10c529e..52b893b316d4 100644
--- a/core/res/res/layout/screen_simple_overlay_action_mode.xml
+++ b/core/res/res/layout/screen_simple_overlay_action_mode.xml
@@ -35,5 +35,6 @@ enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
</FrameLayout>
diff --git a/core/res/res/layout/screen_title.xml b/core/res/res/layout/screen_title.xml
index f5134f9faba7..409e9c6ec2b3 100644
--- a/core/res/res/layout/screen_title.xml
+++ b/core/res/res/layout/screen_title.xml
@@ -27,7 +27,8 @@ enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="?android:attr/windowTitleSize"
diff --git a/core/res/res/layout/screen_title_icons.xml b/core/res/res/layout/screen_title_icons.xml
index b866e57f9347..f145429b4702 100644
--- a/core/res/res/layout/screen_title_icons.xml
+++ b/core/res/res/layout/screen_title_icons.xml
@@ -28,7 +28,8 @@ This is the basic layout for a screen, with all of its features enabled.
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:theme="?attr/actionBarTheme"/>
<RelativeLayout android:id="@android:id/title_container"
style="?android:attr/windowTitleBackgroundStyle"
android:layout_width="match_parent"
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 05746b646a10..1467ded3920e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -277,9 +277,9 @@
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"የወጪ ጥሪዎች አቅጣጫ ቀይር"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"በወጪ ጥሪ ጊዜ ጥሪውን ወደተለየ ቁጥር ከማዞር ወይም ጥሪውን በአጠቃላይ ከመተው አማራጭ ጋር እየተደወለለት ያለውን ቁጥር እንዲያይ ያስችለዋል።"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"የፅሁፍ መልዕክቶችን ተቀበል (ኤስ.ኤም.ኤስ.)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"መተግበሪያው የኤስ.ኤም.ኤስ. መልእክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልእክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"መተግበሪያው የኤስ.ኤም.ኤስ. መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልዕክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"የፅሁፍ መልዕክቶችን ተቀበል (ኤም.ኤም.ኤስ.)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"መተግበሪያው የኤም.ኤም.ኤስ. መልእክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልእክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"መተግበሪያው የኤም.ኤም.ኤስ. መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልዕክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"የአደጋ ጊዜ ስርጭቶችን ተቀበል"</string>
<string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"ድንገተኛ የስርጭት መልዕክቶችን ለመቀበል እና ለማስኬድ ለመተግበሪያው ይፈቅዳሉ፡፡ ይሄ ፍቃድ ለስርዓት መተግበሪዎች ብቻ ነው የሚገኘው፡፡"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"የህዋስ ስርጭት መልዕክቶችን አንብብ"</string>
@@ -296,8 +296,8 @@
<string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"በስልክዎ ወይም ሲም ካርድዎ ላይ ኤስ ኤም ኤስ መልዕክቶችን ለመፃፍ ለመተግበሪያው ይፈቅዳሉ። መልዕክቶችዎን ተንኮል አዘል መተግበሪያዎች ሊሰርዙ ይችላሉ።"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"የፅሁፍ መልዕክቶችን ተቀበል (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"መተግበሪያው የWAP መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ፈቃድ የተላኩልዎን መልዕክቶች ለእርስዎ ሳያሳይዎ የመቆጣጠር ወይም የመሰረዝ ብቃትን ያጠቃልላል።"</string>
- <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"የብሉቱዝ መልእክቶችን ተቀበል (ኤምኤፒ)"</string>
- <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"መተግበሪያው የብሉቱዝ ኤምኤፒ መልእክቶችን እንዲቀበልና እንዲያካሂድ ይፈቅድለታል። ይህ ማለት መተግበሪያው ወደመሳሪያዎ የተላኩ መልእክቶችን ለእርስዎ ሳያሳይ ሊከታተል ወይም ሊሰረዝ ይችላል ማለት ነው።"</string>
+ <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"የብሉቱዝ መልዕክቶችን ተቀበል (ኤምኤፒ)"</string>
+ <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"መተግበሪያው የብሉቱዝ ኤምኤፒ መልዕክቶችን እንዲቀበልና እንዲያካሂድ ይፈቅድለታል። ይህ ማለት መተግበሪያው ወደመሳሪያዎ የተላኩ መልዕክቶችን ለእርስዎ ሳያሳይ ሊከታተል ወይም ሊሰረዝ ይችላል ማለት ነው።"</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"አሂድ መተግበሪያዎችን ሰርስረው ያውጡ"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"መተግበሪያው በአሁኑ ጊዜና በቅርቡ እየተካሄዱ ስላሉ ተግባሮችን መረጃ ሰርስሮ እንዲያወጣ ይፈቅድለታል። ይህ መተግበሪያው በመሳሪያው ላይ የትኛዎቹ መተግበሪያዎች ጥቅም ላይ ስለመዋላቸው መረጃ እንዲያገኝ ሊፈቅድለት ይችላል።"</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"አንድ ተግባር ከቅርብ ጊዜዎች ይጀምራል"</string>
@@ -483,27 +483,27 @@
<string name="permlab_writeContacts" msgid="5107492086416793544">"ዕውቂያዎችዎን ያስተካክሉ"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"መተግበሪያው በጡባዊ ቱኮህ ስለተከማቹ የዕውቂያዎችህ ውሂብ በሙሉ፤ ጥሪ ያደረግክበትን፣ ኢሜይል የላክበትን ወይም ከተወሰኑ እውቂያዎች ጋር በሌላ መንገድ የተገናኘህበትን ድግምግሞሽ ጨምሮ፣ እንዲያስተካክል ይፈቅድለታል። ይህ ፈቃድ መተግበሪያዎች የእውቂያ ውሂብ እንዲሰርዙ ይፈቅድላቸዋል።"</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"መተግበሪያው በስልክዎ ስለተከማቹ የዕውቂያዎችዎ ውሂብ በሙሉ፤ ጥሪ ያደረጉበትን፣ ኢሜይል የላኩበትን ወይም ከተወሰኑ እውቂያዎች ጋር በሌላ መንገድ የተገናኙበትን ድግምግሞሽ ጨምሮ፣ እንዲያስተካክል ይፈቅድለታል። ይህ ፈቃድ መተግበሪያዎች የእውቂያ ውሂብ እንዲሰርዙ ይፈቅድላቸዋል።"</string>
- <string name="permlab_readCallLog" msgid="3478133184624102739">"የጥሪ ምዝግብ ማስታወሻን አንብብ"</string>
+ <string name="permlab_readCallLog" msgid="3478133184624102739">"የጥሪ ምዝግብ ማስታወሻን ያንብቡ"</string>
<string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"መተግበሪያው ስለገቢና ወጪ ጥሪዎች ያለ ውሂብን ጨምሮ የጡባዊ ተኮህን የጥሪ ምዝግብ ማስታወሻ እንዲያነብ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው የጥሪ ምዝግብ ማስታወሻ ውሂብህን እንዲያስቀምጥ የሚፈቅድለት ሲሆን ተንኮል አዘል መተግበሪያዎች ሳታውቀው የጥሪ ምዝግብ ማስታወሻ ውሂብህን ሊያጋሩት ይችላሉ።"</string>
<string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"መተግበሪያው ስለገቢና ወጪ ጥሪዎች ያለ ውሂብን ጨምሮ የስልክህን የጥሪ ምዝግብ ማስታወሻ እንዲያነብ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው የጥሪ ምዝግብ ማስታወሻ ውሂብህን እንዲያስቀምጥ የሚፈቅድለት ሲሆን ተንኮል አዘል መተግበሪያዎች ሳታውቀው የጥሪ ምዝግብ ማስታወሻ ውሂብህን ሊያጋሩት ይችላሉ።"</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"የጥሪ ምዝግብ ማስታወሻን ፃፍ"</string>
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የጡባዊተኮህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string>
- <string name="permlab_readProfile" msgid="4701889852612716678">"የራስህን የእውቂያ ካርድ አንብብ"</string>
+ <string name="permlab_readProfile" msgid="4701889852612716678">"የራስዎን የዕውቂያ ካርድ ያንብቡ"</string>
<string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"መተግበሪያው ልክ እንደ ስምዎ እና የእውቂያ መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲያነብ ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቁዎ እና የመገለጫ መረጃዎን ለሌሎች ሊልክ ይችላል።"</string>
- <string name="permlab_writeProfile" msgid="907793628777397643">"የራስህን የዕውቂያ ካርድ አስተካክል"</string>
+ <string name="permlab_writeProfile" msgid="907793628777397643">"የራስዎን የዕውቂያ ካርድ ያስተካክሉ"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተግበሪያው ልክ እንደ ስምዎ እና የእውቂያ መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲቀይር ወይም እንዲያክልባቸው ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቅዎ እና የመገለጫ መረጃዎን ለሌሎች ሊልክ ይችላል።"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"የሰውነት መመርመሪያዎች (እንደ የልብ ምት መቆጣጠሪያዎች)"</string>
<string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"መተግበሪያው እርስዎ በሰውነትዎ ውስጥ እየተካሄዱ ያሉ እንደ የልብ ምት የመሳሰሉ ነገሮችን ለመለካት የሚጠቀሙበትን ውሂብ ከመመርመሪያዎቹ ላይ እንዲደርስ ይፈቅድለታል።"</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"የአንተን ማህበራዊ የውይይት ክፍሎች አንብብ"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"የእርስዎን ማህበራዊ የውይይት ክፍሎች ያንብቡ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"መተግበሪያው የአንተንና የጓኞችህን ማህበራዊ ዝማኔዎችን እንዲደርስባቸው እና እንዲያመሳስላቸው ይፈቅድለታል። መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተግበሪያው ሚስጥራዊነትን ከግምት ሳያስገባ በማህበራዊ አውታረ መረቦች በአንተ እና በጓደኞችህ መካከል የሚደረጉ ግንኙነቶችን እንዲያነብ ይፈቅድለታል። ማስታወሻ፦ ይህ ፈቃድ ለሁሉም ማህበራዊ አውታር መረቦች ላይ ላይፈጸም ይችላል።"</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ወደ የአንተ ማህበራዊ የውይይት ክፍሎች ጻፍ"</string>
- <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"መተግበሪያው ከጓኞችህን ማህበራዊ ዝማኔዎችን እንዲያሳይ ይፈቅድለታል። መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተግበሪያው ከጓደኛ የመጡ የሚመስሉ መልእክቶችን እንዲያዘጋጅ ይፈቅድለታል። ማስታወሻ፦ ይህ ፈቃድ በሁሉም ማህበራዊ አውታረ መረቦች ላይ ላይፈጸም ይችላል።"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ወደ የእርስዎ ማህበራዊ የውይይት ክፍሎች ይጻፉ"</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"መተግበሪያው ከጓኞችህን ማህበራዊ ዝማኔዎችን እንዲያሳይ ይፈቅድለታል። መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተግበሪያው ከጓደኛ የመጡ የሚመስሉ መልዕክቶችን እንዲያዘጋጅ ይፈቅድለታል። ማስታወሻ፦ ይህ ፈቃድ በሁሉም ማህበራዊ አውታረ መረቦች ላይ ላይፈጸም ይችላል።"</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"የቀን መቁጠሪያ ክስተቶች ተጨማሪ ሚስጥራዊ መረጃ አንብብ"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"መተግበሪያው የጓደኞችን ወይም የስራ ባልደረቦችን ጨምሮ ሁሉንም በጡባዊ ቱኮህ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶች እንዲያነብ ይፈቅድለታል። ይህ መተግበሪያው የቀን መቁጠሪያ ውሂብህን ሚስጥራዊቱን ከግምት ሳያስገባ እንዲያጋራ ወይም እንዲያስቀምጥ ሊፈቅድለት ይችላል።"</string>
<string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"መተግበሪያው የጓደኞችን ወይም የስራ ባልደረቦችን ጨምሮ ሁሉንም በስልክዎ ላይ የተከማቹ የቀን መቁጠሪያ ክስተቶች እንዲያነብ ይፈቅድለታል። ይህ መተግበሪያው የቀን መቁጠሪያ ውሂብዎን ሚስጥራዊነቱን ከግምት ሳያስገባ እንዲያጋራ ወይም እንዲያስቀምጥ ሊፈቅድለት ይችላል።"</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"የቀን መቁጠሪያ ክስተቶችን ቀይር ወይም አክል እና ለእንግዶች ከባለቤቱ ዕውቅና ውጪ ላክ።"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"መተግበሪያው የጓደኞችህን እና የስራ ባልደረቦችህን ጨምሮ በጡባዊ ተኮህ ላይ ልታስተካክላቸው የምትችላቸውን ክስተቶች እንዲያክል፣ እንዲያስወግድ፣ እንዲለውጥ ይፈቅድለታል። ይህ መተግበሪያው ከቀን መቁጠሪያ ባለቤቶች የመጡ የሚመስሉ መልእክቶችን እንዲልክ ወይም ያለባለቤቱ እውቀት ክስተቶችን እንዲያስተካክል ሊፈቅድለት ይችላል።"</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"መተግበሪያው የጓደኞችህን እና የስራ ባልደረቦችህን ጨምሮ በጡባዊ ተኮህ ላይ ልታስተካክላቸው የምትችላቸውን ክስተቶች እንዲያክል፣ እንዲያስወግድ፣ እንዲለውጥ ይፈቅድለታል። ይህ መተግበሪያው ከቀን መቁጠሪያ ባለቤቶች የመጡ የሚመስሉ መልዕክቶችን እንዲልክ ወይም ያለባለቤቱ እውቀት ክስተቶችን እንዲያስተካክል ሊፈቅድለት ይችላል።"</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"መተግበሪያው የጓደኞችዎን እና የስራ ባልደረቦችዎን ጨምሮ በስልክዎ ላይ ሊያስተካክሏቸው የሚችሏቸውን ክስተቶች እንዲያክል፣ እንዲያስወግድ፣ እንዲለውጥ ይፈቅድለታል። ይህ መተግበሪያው ከቀን መቁጠሪያ ባለቤቶች የመጡ የሚመስሉ መልዕክቶችን እንዲልክ ወይም ያለባለቤቱ እውቀት ክስተቶችን እንዲያስተካክል ሊፈቅድለት ይችላል።"</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"ለሙከራ ጊዜያዊ ሥፍራ ፍጠር።"</string>
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"ለሙከራ የጊዜያዊ የመነሻ ምንጮችን ይፍጠሩ ወይም አዲስ የአካባቢ አቅራቢ ይጫኑ። ይህ መተግበሪያው አካባቢውን እና/ወይም እንደ GPS ወይም የአካባቢ አቅራቢዎች ባሉ ሌላ የመነሻ ምንጮች የተመለሱ ሁኔታዎችን ችላ እንዲል ይፈቅድለታል።"</string>
@@ -680,7 +680,7 @@
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"መተግበሪያው በስልኩ ላይ ያለውን የብሉቱዝ ውቅር እንዲያይ እና ከተጣመሩ መሳሪያዎች ጋር ግንኙነቶችን እንዲያደርግና እንዲቀበል ይፈቅድለታል።"</string>
<string name="permlab_nfc" msgid="4423351274757876953">"ቅርብ የግኑኙነትመስክ (NFC) ተቆጣጠር"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"ከቅርብ ግኑኙነት መስክ (NFC) መለያዎች፣ ካርዶች እና አንባቢ ጋር ለማገናኘት ለመተግበሪያው ይፈቅዳሉ።"</string>
- <string name="permlab_disableKeyguard" msgid="3598496301486439258">"የማያ ገጽህን መቆለፊያ አሰናክል"</string>
+ <string name="permlab_disableKeyguard" msgid="3598496301486439258">"የማያ ገጽዎን መቆለፊያ ያሰናክሉ"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"መተግበሪያው መቆለፊያውና ማንኛውም የተጎዳኘ የይለፍ ቃል ደህንነት እንዲያሰናክል ይፈቅድለታል። ለምሳሌ ስልኩ ገቢ የስልክ ጥሪ በሚቀበልበት ጊዜ መቆለፊያውን ያሰናክልና ከዚያም ጥሪው ሲጠናቀቅ መቆለፊያውን በድጋሚ ያነቃዋል።"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"የሥምሪያ ቅንብሮች አንብብ"</string>
<string name="permdesc_readSyncSettings" msgid="2706745674569678644">"መተግበሪያው የአንድ መለያ የማመሳሰል ቅንብሮችን እንዲያነብ ይፈቅድለታል። ለምሳሌ ይህ የሰዎች መተግበሪያ ከመለያ ጋር መመሳሰሉን አለመመሳሰሉን ሊወስን ይችላል።"</string>
@@ -1021,12 +1021,12 @@
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"መተግበሪያው ስልክህ ላይ የተከማቹ የአሳሹን ታሪክ ወይም ዕልባቶችን እንዲቀይር ይፈቅድለታል። ይህ መተግበሪያው የአሳሽ ውሂብ እንዲያጠፋ ወይም እንዲያስተካክል ሊፈቅድለት ይችላል። ማስታወሻ፦ ይህ ፈቃድ በሶስተኛ ወገን አሳሾች ወይም በሌላ የድር አሳሽነት አቅም ባላቸው መተግበሪያዎች ላይፈጸም ይችላል።"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"ማንቂያ አስቀምጥ"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"በተጫነው የማንቂያ ሰዓት መተግበሪያ ውስጥ ማንቅያን ለማደራጀት ለመተግበሪያው ይፈቅዳሉ፡፡አንዳንድ የማንቂያ ሰዓት መተግበሪያዎች ይሄንን ባህሪ ላይፈፅሙ ይችላሉ፡፡"</string>
- <string name="permlab_writeVoicemail" msgid="7309899891683938100">"የድምጽ መልእክቶችን ይጻፉ"</string>
- <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"መተግበሪያው ከድምጽ መልእክት የገቢ መልእክት ሳጥንዎ ውስጥ መልእክቶችን እንዲያስተካክልና እንዲያስወግድ ይፈቅዳል።"</string>
+ <string name="permlab_writeVoicemail" msgid="7309899891683938100">"የድምጽ መልዕክቶችን ይጻፉ"</string>
+ <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"መተግበሪያው ከድምጽ መልዕክት የገቢ መልዕክት ሳጥንዎ ውስጥ መልዕክቶችን እንዲያስተካክልና እንዲያስወግድ ይፈቅዳል።"</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"የድምፅ መልዕክት አክል"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"ወደ ድምፅ መልዕክት የገቢ መልዕክትህ መልዕክቶች ለማከል ለመተግበሪያው ይፈቅዳሉ።"</string>
- <string name="permlab_readVoicemail" msgid="8415201752589140137">"የድምጽ መልእክት አንብብ"</string>
- <string name="permdesc_readVoicemail" msgid="8926534735321616550">"መተግበሪያዎ የድምጽ መልእክቶችን እንዲያነብ ይፈቅዳል።"</string>
+ <string name="permlab_readVoicemail" msgid="8415201752589140137">"የድምጽ መልዕክት አንብብ"</string>
+ <string name="permdesc_readVoicemail" msgid="8926534735321616550">"መተግበሪያዎ የድምጽ መልዕክቶችን እንዲያነብ ይፈቅዳል።"</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"የአሳሽ ገፀ ሥፍራ ፍቃዶችን ቀይር"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"የአሳሹን የጂኦ-አካባቢ ፍቃዶችን እንዲለውጥ ለመተግበሪያው ይፈቅዳል፡፡ተንኮል አዘል መተግበሪያዎች የመላኪያ አከባቢን መረጃ ወደ አጠራጣሪ የድር ጣቢያዎች ለመፍቀድ ይሄንን ሊጠቀሙበት ይችላሉ፡፡"</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"ፓኬጆችን አረጋግጥ"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4f906ffaba4f..59eef7441b57 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1203,8 +1203,7 @@
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"Comparteix amb %1$s"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"Selecciona una aplicació d\'inici"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Utilitza-ho de manera predeterminada per a aquesta acció."</string>
- <!-- no translation found for use_a_different_app (8134926230585710243) -->
- <skip />
+ <string name="use_a_different_app" msgid="8134926230585710243">"Fes servir una altra aplicació"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"Esborra els paràmetres predeterminats a Configuració del sistema &gt; Aplicacions &gt; Baixades."</string>
<string name="chooseActivity" msgid="7486876147751803333">"Tria una acció"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"Tria una aplicació per al dispositiu USB"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 85a8d8083459..448e072579ea 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1768,7 +1768,7 @@
<string name="lock_to_app_title" msgid="1682643873107812874">"از پین کردن صفحه استفاده شود؟"</string>
<string name="lock_to_app_description" msgid="9076084599283282800">"پین کردن صفحه، نمایشگر را در یک نمای واحد قفل می‌کند.\n\nبرای خروج، کلیدهای بازگشت و برنامه‌های اخیر را همزمان لمس کنید و نگه دارید."</string>
<string name="lock_to_app_description_accessible" msgid="2132076937479670601">"پین کردن صفحه، نمایشگر را در یک نمای واحد قفل می‌کند.\n\nبرای خروج، کلید برنامه‌های اخیر را لمس کنید و نگه دارید."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"نه، سپاسگزارم"</string>
+ <string name="lock_to_app_negative" msgid="2259143719362732728">"خیر، سپاسگزارم"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"شروع"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"صفحه پین شد"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"پین صفحه برداشته شد"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 3faaf0cf478c..2e3dd46e937d 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -353,11 +353,11 @@
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"सभी ऐप्स की लॉन्‍चिंग की निगरानी करें और उसे नियंत्रित करें"</string>
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"ऐप्स को यह निगरानी और नियंत्रित करने देता है कि सिस्टम कैसे गतिविधियां लॉन्च करता है. दुर्भावनापूर्ण ऐप्स सिस्टम को पूरी तरह से जोखिम में डाल सकते हैं. इस अनुमति की आवश्यकता केवल विकास के लिए है, सामान्य उपयोग के लिए कभी नहीं."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"पैकेज निकाले गए प्रसारण भेजें"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"ऐप्स को कोई ऐसी सूचना प्रसारित करने देता है जिसे किसी ऐप्स पैकेज ने निकाल दिया गया हो. दुर्भावनापूर्ण ऐप्स इसका उपयोग चल रहे अन्य ऐप्स को समाप्त करने के लिए कर सकते हैं."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"ऐप्स को कोई ऐसी नोटिफिकेशन प्रसारित करने देता है जिसे किसी ऐप्स पैकेज ने निकाल दिया गया हो. दुर्भावनापूर्ण ऐप्स इसका उपयोग चल रहे अन्य ऐप्स को समाप्त करने के लिए कर सकते हैं."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-प्राप्त प्रसार भेजें"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ऐप्स को वह सूचना प्रसारित करने देता है जो SMS संदेश ने प्राप्त की है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली इनकमिंग संदेश गढ़ने के लिए कर सकते हैं."</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"ऐप्स को वह नोटिफिकेशन प्रसारित करने देता है जो SMS संदेश ने प्राप्त की है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली इनकमिंग संदेश गढ़ने के लिए कर सकते हैं."</string>
<string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-प्राप्त प्रसारण भेजें"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ऐप्स को वह सूचना प्रसारित करने देता है जो WAP PUSH संदेश को प्राप्त हुआ है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली MMS संदेश प्राप्त करने या किसी वेबपृष्ठ की सामग्री को दुर्भावनापूर्ण दूसरे रूप से चुपचाप प्रतिस्थापित करने के लिए कर सकते हैं."</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"ऐप्स को वह नोटिफिकेशन प्रसारित करने देता है जो WAP PUSH संदेश को प्राप्त हुआ है. दुर्भावनापूर्ण ऐप्स इसका उपयोग नकली MMS संदेश प्राप्त करने या किसी वेबपृष्ठ की सामग्री को दुर्भावनापूर्ण दूसरे रूप से चुपचाप प्रतिस्थापित करने के लिए कर सकते हैं."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"चल रही प्रक्रियाओं की संख्‍या सीमित करें"</string>
<string name="permdesc_setProcessLimit" msgid="7318061314040879542">"ऐप्स को चलाई जाने वाली अधिकतम प्रक्रियाओं को नियंत्रित करने देता है. सामान्य ऐप्स के लिए कभी आवश्यक नहीं होती."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"पृष्ठभूमि ऐप्स को बलपूर्वक बंद करें"</string>
@@ -728,8 +728,8 @@
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ऐप्स को यह संशोधित करने देता है कि ऐप्स की तुलना में नेटवर्क उपयोग का मूल्यांकन कैसे किया जाता है. सामान्‍य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"सूचनाओं तक पहुंचें"</string>
<string name="permdesc_accessNotifications" msgid="458457742683431387">"ऐप्स को सूचनाओं को प्राप्त करने, जांच करने, और साफ़ करने देता है, जिनमें अन्य ऐप्स के द्वारा पोस्ट की गई सूचनाएं भी शामिल हैं."</string>
- <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"सूचना श्रवणकर्ता सेवा से जुड़ें"</string>
- <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को सूचना श्रवणकर्ता सेवा के शीर्ष स्तरीय इंटरफ़ेस से जुड़ने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होनी चाहिए."</string>
+ <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"नोटिफिकेशन श्रवणकर्ता सेवा से जुड़ें"</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"धारक को नोटिफिकेशन श्रवणकर्ता सेवा के शीर्ष स्तरीय इंटरफ़ेस से जुड़ने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होनी चाहिए."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"किसी स्थिति प्रदाता सेवा से आबद्ध हों"</string>
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"धारक को किसी स्थिति प्रदाता सेवा के शीर्ष-स्तर के इंटरफ़ेस से आबद्ध होने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए."</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"भावी सेवा से आबद्ध करें"</string>
@@ -1248,13 +1248,13 @@
<string name="volume_call" msgid="3941680041282788711">"कॉल के दौरान वॉल्‍यूम"</string>
<string name="volume_bluetooth_call" msgid="2002891926351151534">"ब्लूटूथ कॉल के दौरान वॉल्‍यूम"</string>
<string name="volume_alarm" msgid="1985191616042689100">"अलार्म आवाज़"</string>
- <string name="volume_notification" msgid="2422265656744276715">"सूचना वॉल्‍यूम"</string>
+ <string name="volume_notification" msgid="2422265656744276715">"नोटिफिकेशन वॉल्‍यूम"</string>
<string name="volume_unknown" msgid="1400219669770445902">"आवाज़"</string>
<string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ब्लूटूथ वॉल्‍यूम"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"रिंगटोन वॉल्‍यूम"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"कॉल वॉल्‍यूम"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"मीडिया वॉल्‍यूम"</string>
- <string name="volume_icon_description_notification" msgid="7044986546477282274">"सूचना वॉल्‍यूम"</string>
+ <string name="volume_icon_description_notification" msgid="7044986546477282274">"नोटिफिकेशन वॉल्‍यूम"</string>
<string name="ringtone_default" msgid="3789758980357696936">"डिफ़ॉल्‍ट रिंगटोन"</string>
<string name="ringtone_default_with_actual" msgid="8129563480895990372">"डिफ़ॉल्‍ट रिंगटोन (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
<string name="ringtone_silent" msgid="7937634392408977062">"कोई नहीं"</string>
@@ -1431,7 +1431,7 @@
<string name="accessibility_binding_label" msgid="4148120742096474641">"सरल उपयोग"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"वॉलपेपर"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"वॉलपेपर बदलें"</string>
- <string name="notification_listener_binding_label" msgid="2014162835481906429">"सूचना श्रवणकर्ता"</string>
+ <string name="notification_listener_binding_label" msgid="2014162835481906429">"नोटिफिकेशन श्रवणकर्ता"</string>
<string name="condition_provider_service_binding_label" msgid="1321343352906524564">"स्थिति प्रदाता"</string>
<string name="vpn_title" msgid="19615213552042827">"VPN सक्रिय"</string>
<string name="vpn_title_long" msgid="6400714798049252294">"VPN को <xliff:g id="APP">%s</xliff:g> द्वारा सक्रिय किया गया है"</string>
@@ -1768,7 +1768,7 @@
<string name="lock_to_app_title" msgid="1682643873107812874">"स्‍क्रीन पिन करने का उपयोग करें?"</string>
<string name="lock_to_app_description" msgid="9076084599283282800">"स्‍क्रीन को पिन करने से प्रदर्शन एकल दृश्‍य में लॉक हो जाता है.\n\nबाहर निकलने के लिए, वापस और हाल ही के एक साथ दबाकर रखें."</string>
<string name="lock_to_app_description_accessible" msgid="2132076937479670601">"स्‍क्रीन को पिन करने से प्रदर्शन एकल दृश्‍य में लॉक हो जाता है.\n\nबाहर निकलने के लिए, हाल ही के दबाकर रखें."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"नहीं, धन्यवाद"</string>
+ <string name="lock_to_app_negative" msgid="2259143719362732728">"रहने दें"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"प्रारंभ करें"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्‍क्रीन पिन की गई"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्‍क्रीन अनपिन की गई"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index d63be7072538..64d1f9e0b06e 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1203,7 +1203,7 @@
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"Տարածել ըստ %1$s"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"Ընտրեք հիմնական հավելվածը"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Օգտագործել լռելյայն այս գործողության համար:"</string>
- <string name="use_a_different_app" msgid="8134926230585710243">"Օգտագործել այլ ծրագիր"</string>
+ <string name="use_a_different_app" msgid="8134926230585710243">"Օգտագործել այլ հավելված"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"Մաքրել լռելյայնը Համակարգի կարգավորումներ &gt; Ծրագրեր &gt;Ներբեռնված էջից:"</string>
<string name="chooseActivity" msgid="7486876147751803333">"Ընտրել գործողություն"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"Ընտրեք հավելված USB սարքի համար"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index a8c8f1c211bf..f1691ef5ec80 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -211,7 +211,7 @@
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"שינוי הגדרות האודיו."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"השפעה על הסוללה"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"שימוש בתכונות שיכולות לרוקן את הסוללה במהירות."</string>
- <string name="permgrouplab_calendar" msgid="5863508437783683902">"לוח שנה"</string>
+ <string name="permgrouplab_calendar" msgid="5863508437783683902">"יומן"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"גישה ישירה ללוח השנה ולאירועים."</string>
<string name="permgrouplab_dictionary" msgid="4148597128843641379">"קריאת מילון משתמש"</string>
<string name="permgroupdesc_dictionary" msgid="7921166355964764490">"קריאת מילים במילון משתמש."</string>
@@ -500,11 +500,11 @@
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"כתיבה בזרם החברתי שלך"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"מאפשר לאפליקציה להציג עדכונים חברתיים מהחברים שלך. היזהר בעת שיתוף מידע -- הדבר מאפשר לאפליקציה ליצור הודעות שעשויות להיראות כאילו שנשלחו מחבר. שים לב: ייתכן אישור זה לא נאכף בכל הרשתות החברתיות."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"קריאת אירועי יומן וגם מידע סודי"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"מאפשר לאפליקציה לקרוא את כל אירועי לוח השנה המאוחסנים בטאבלט, כולל אלה של חברים ועמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשתף או לשמור את נתוני לוח השנה שלך, ללא התחשבות בסודיות או ברגישות."</string>
- <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"מאפשר לאפליקציה לקרוא את כל אירועי לוח השנה המאוחסנים בטלפון, כולל אלה של חברים ועמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשתף או לשמור את נתוני לוח השנה שלך, ללא התחשבות בסודיות או ברגישות."</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"מאפשר לאפליקציה לקרוא את כל אירועי היומן המאוחסנים בטאבלט, כולל אלה של חברים ועמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשתף או לשמור את נתוני היומן שלך, ללא התחשבות בסודיות או ברגישות."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"מאפשר לאפליקציה לקרוא את כל אירועי היומן המאוחסנים בטלפון, כולל אלה של חברים ועמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשתף או לשמור את נתוני היומן שלך, ללא התחשבות בסודיות או ברגישות."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"הוספה ושינוי של אירועי יומן ושליחת דוא\"ל לאורחים ללא ידיעת הבעלים"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"מאפשר לאפליקציה להוסיף, להסיר ולשנות אירועים שאתה יכול לשנות בטאבלט, כולל אלה של חברים או עמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשלוח הודעות הנראות כאילו שנשלחו מבעלי לוח שנה או לשנות אירועים ללא ידיעת הבעלים."</string>
- <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"מאפשר לאפליקציה להוסיף, להסיר ולשנות אירועים שאתה יכול לשנות בטלפון, כולל אלה של חברים או עמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשלוח הודעות הנראות כאילו שנשלחו מבעלי לוח שנה או לשנות אירועים ללא ידיעת הבעלים."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"מאפשר לאפליקציה להוסיף, להסיר ולשנות אירועים שאתה יכול לשנות בטאבלט, כולל אלה של חברים או עמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשלוח הודעות הנראות כאילו שנשלחו מבעלי יומן או לשנות אירועים ללא ידיעת הבעלים."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"מאפשר לאפליקציה להוסיף, להסיר ולשנות אירועים שאתה יכול לשנות בטלפון, כולל אלה של חברים או עמיתים לעבודה. הדבר עשוי להתיר לאפליקציה לשלוח הודעות הנראות כאילו שנשלחו מבעלי יומן או לשנות אירועים ללא ידיעת הבעלים."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"צור מקורות מיקום מדומים לצורך בדיקה"</string>
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"‏צור מקורות מיקום מדומים לבדיקה, או התקן ספק מיקום חדש. פעולה זו מאפשרת לאפליקציה לעקוף את המיקום ו/או הסטטוס המוחזרים על ידי מקורות מיקום אחרים כמו GPS או ספקי מיקום."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"גישה לפקודות ספק מיקום נוספות"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 8b13e83c61ce..a67eeb96c893 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -397,8 +397,8 @@
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"Ļauj īpašniekam izveidot savienojumu ar drukāšanas pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"izveidot savienojumu ar drukas spolētāja pakalpojumu"</string>
<string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Ļauj īpašniekam izveidot savienojumu ar drukas spolētāja pakalpojuma augšējā līmeņa saskarni. Parastajām lietotnēm tas nekad nav nepieciešams."</string>
- <string name="permlab_bindNfcService" msgid="2752731300419410724">"Saistīt ar TDLS pakalpojumu"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ļauj īpašniekam saistīt lietojumprogrammas, kas emulē TDLS kartes. Parastajām lietotnēm šī atļauja nav nepieciešama."</string>
+ <string name="permlab_bindNfcService" msgid="2752731300419410724">"Saistīt ar NFC pakalpojumu"</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Ļauj īpašniekam saistīt lietojumprogrammas, kas emulē NFC kartes. Parastajām lietotnēm šī atļauja nav nepieciešama."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"saistīt ar īsziņu pakalpojumu"</string>
<string name="permdesc_bindTextService" msgid="8151968910973998670">"Ļauj īpašniekam veikt saistīšanu ar īsziņu pakalpojuma augstākā līmeņa saskarni (piem., SpellCheckerService). Parastajām lietotnēm tas nekad nav nepieciešams."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"saistīt ar VPN pakalpojumu"</string>
diff --git a/core/res/res/values-mcc204-mnc04/config.xml b/core/res/res/values-mcc204-mnc04/config.xml
index 7a483421a975..b89a31143961 100644
--- a/core/res/res/values-mcc204-mnc04/config.xml
+++ b/core/res/res/values-mcc204-mnc04/config.xml
@@ -25,4 +25,9 @@
-->
<integer name="config_mobile_mtu">1358</integer>
+ <!-- service number convert map in roaming network. -->
+ <!-- [dialstring],[replacement][,optional gid] -->
+ <string-array translatable="false" name="dial_string_replace">
+ <item>"*611:+19085594899,BAE0000000000000"</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values-mcc238-mnc06/config.xml b/core/res/res/values-mcc238-mnc06/config.xml
new file mode 100644
index 000000000000..afc0cc4011a0
--- /dev/null
+++ b/core/res/res/values-mcc238-mnc06/config.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- SIM does not save, but the voice mail number to be changed. -->
+ <bool name="editable_voicemailnumber">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc150/config.xml b/core/res/res/values-mcc310-mnc150/config.xml
index f1936f43bd02..3f9330d9a760 100644
--- a/core/res/res/values-mcc310-mnc150/config.xml
+++ b/core/res/res/values-mcc310-mnc150/config.xml
@@ -33,4 +33,8 @@
<item>315</item>
<item>316</item>
</string-array>
+ <string-array translatable="false" name="config_twoDigitNumberPattern">
+ <item>"0"</item>
+ <item>"00"</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml
index b863aae58ce8..1cc8d4f9e2cb 100644
--- a/core/res/res/values-mcc310-mnc410/config.xml
+++ b/core/res/res/values-mcc310-mnc410/config.xml
@@ -45,4 +45,7 @@
<item>"0"</item>
<item>"00"</item>
</string-array>
+ <!-- Flag indicating whether radio is to be restarted on the error of
+ PDP_FAIL_REGULAR_DEACTIVATION/0x24 -->
+ <bool name="config_restart_radio_on_pdp_fail_regular_deactivation">true</bool>
</resources>
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index cf19235909dc..d01d9f8042fe 100644
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -44,4 +44,8 @@
<bool name="config_carrier_volte_vt_available">false</bool>
<bool name="config_auto_attach_data_on_creation">false</bool>
+ <!-- service number convert map in roaming network. -->
+ <string-array translatable="false" name="dial_string_replace">
+ <item>"*611:+19085594899,"</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 36465c913dee..746eb4fd796f 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1071,7 +1071,7 @@
</plurals>
<plurals name="num_hours_ago">
<item quantity="one" msgid="9150797944610821849">"godzinę temu"</item>
- <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> godzin temu"</item>
+ <item quantity="other" msgid="2467273239587587569">"<xliff:g id="COUNT">%d</xliff:g> godz. temu"</item>
</plurals>
<plurals name="last_num_days">
<item quantity="other" msgid="3069992808164318268">"Ostatnie (<xliff:g id="COUNT">%d</xliff:g>) dni"</item>
@@ -1199,8 +1199,8 @@
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otwórz w aplikacji %1$s"</string>
<string name="whichEditApplication" msgid="144727838241402655">"Edytuj w aplikacji"</string>
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edytuj w aplikacji %1$s"</string>
- <string name="whichSendApplication" msgid="6902512414057341668">"Udostępnij w aplikacji"</string>
- <string name="whichSendApplicationNamed" msgid="2799370240005424391">"Udostępnij w aplikacji %1$s"</string>
+ <string name="whichSendApplication" msgid="6902512414057341668">"Udostępnij przez"</string>
+ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"Udostępnij przez %1$s"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"Wybierz aplikację ekranu głównego"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Domyślne dla tej czynności"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Użyj innej aplikacji"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 83131388d909..8bdad2dd5b15 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -170,9 +170,9 @@
<string name="shutdown_confirm" product="default" msgid="649792175242821353">"O seu telefone será desligado."</string>
<string name="shutdown_confirm_question" msgid="2906544768881136183">"Deseja desligar?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"Reiniciar no modo de segurança"</string>
- <string name="reboot_safemode_confirm" msgid="55293944502784668">"Deseja reiniciar no modo de segurança? Isso desativará todos os aplicativos de terceiros instalados. Eles serão restaurados quando você reiniciar novamente."</string>
+ <string name="reboot_safemode_confirm" msgid="55293944502784668">"Deseja reiniciar no modo de segurança? Isso desativará todos os apps de terceiros instalados. Eles serão restaurados quando você reiniciar novamente."</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"Recente"</string>
- <string name="no_recent_tasks" msgid="8794906658732193473">"Nenhum aplicativo recente"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Nenhum app recente"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"Opções do tablet"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string>
@@ -191,7 +191,7 @@
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"&gt;999"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo de segurança"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
- <string name="user_owner_label" msgid="6465364741001216388">"Aplicativos pessoais"</string>
+ <string name="user_owner_label" msgid="6465364741001216388">"Apps pessoais"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"Trabalho"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"Serviços que geram gastos"</string>
<string name="permgroupdesc_costMoney" msgid="3293301903409869495">"Faça coisas que podem custar dinheiro."</string>
@@ -229,8 +229,8 @@
<string name="permgroupdesc_camera" msgid="2933667372289567714">"Acesso direto à câmera para captura de imagens ou vídeo."</string>
<string name="permgrouplab_screenlock" msgid="8275500173330718168">"Tela de bloqueio"</string>
<string name="permgroupdesc_screenlock" msgid="7067497128925499401">"Capacidade de afetar o comportamento da tela de bloqueio no dispositivo."</string>
- <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Informações sobre seus aplicativos"</string>
- <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Capacidade de afetar o comportamento de outros aplicativos no dispositivo."</string>
+ <string name="permgrouplab_appInfo" msgid="8028789762634147725">"Informações sobre seus apps"</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"Capacidade de afetar o comportamento de outros apps no dispositivo."</string>
<string name="permgrouplab_wallpaper" msgid="3850280158041175998">"Plano de fundo"</string>
<string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"Alterar as configurações de plano de fundo do dispositivo."</string>
<string name="permgrouplab_systemClock" msgid="406535759236612992">"Relógio"</string>
@@ -248,9 +248,9 @@
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"Ferramentas do sistema"</string>
<string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Acesso de nível inferior e controle do sistema."</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Ferramentas de desenvolvimento"</string>
- <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Recursos necessários apenas para desenvolvedores de aplicativos."</string>
- <string name="permgrouplab_display" msgid="4279909676036402636">"Interface de outro aplicativo"</string>
- <string name="permgroupdesc_display" msgid="6051002031933013714">"Afetar a interface do usuário de outros aplicativos."</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Recursos necessários apenas para desenvolvedores de apps."</string>
+ <string name="permgrouplab_display" msgid="4279909676036402636">"Interface de outro app"</string>
+ <string name="permgroupdesc_display" msgid="6051002031933013714">"Afetar a interface do usuário de outros apps."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Armazenamento"</string>
<string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"Acessa o armazenamento USB."</string>
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"Acessar o cartão SD."</string>
@@ -261,457 +261,457 @@
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Ativar Explorar por toque"</string>
<string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"Itens tocados serão falados em voz alta e a tela poderá ser explorada por meio de gestos."</string>
<string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Ativar acessibilidade na Web aprimorada"</string>
- <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts podem ser instalados para tornar o conteúdo do aplicativo mais acessível."</string>
+ <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Scripts podem ser instalados para tornar o conteúdo do app mais acessível."</string>
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Observar o texto digitado"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Inclui dados pessoais, como números de cartão de crédito e senhas."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"desativar ou modificar a barra de status"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que o aplicativo desative a barra de status ou adicione e remova ícones do sistema."</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Permite que o app desative a barra de status ou adicione e remova ícones do sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"barra de status"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"Permite que o aplicativo seja a barra de status."</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Permite que o app seja a barra de status."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"expandir/recolher barra de status"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Permite que o aplicativo expanda ou recolha a barra de status."</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Permite que o app expanda ou recolha a barra de status."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"instalar atalhos"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Permite que um aplicativo adicione atalhos da tela inicial sem a intervenção do usuário."</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Permite que um app adicione atalhos da tela inicial sem a intervenção do usuário."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"desinstalar atalhos"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que o aplicativo remova atalhos da tela inicial sem a intervenção do usuário."</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permite que o app remova atalhos da tela inicial sem a intervenção do usuário."</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"redirecionar as chamadas efetuadas"</string>
- <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que o aplicativo veja o número discado ao realizar uma chamada, com a opção de redirecionar a chamada para outro número ou abortá-la."</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Permite que o app veja o número discado ao realizar uma chamada, com a opção de redirecionar a chamada para outro número ou abortá-la."</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"receber mensagens de texto (SMS)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que o aplicativo receba e processe mensagens SMS. Isso significa que o aplicativo pode monitorar ou excluir mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"Permite que o app receba e processe mensagens SMS. Isso significa que o app pode monitorar ou excluir mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"receber mensagens de texto (MMS)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que o aplicativo receba e processe mensagens MMS. Isso significa que o aplicativo pode monitorar ou excluir as mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que o app receba e processe mensagens MMS. Isso significa que o app pode monitorar ou excluir as mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"receber transmissões de emergência"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Permite que o aplicativo receba e processe mensagens de transmissão de emergência. Esta permissão só está disponível para aplicativos do sistema."</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Permite que o app receba e processe mensagens de transmissão de emergência. Esta permissão só está disponível para apps do sistema."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ler mensagens de difusão celular"</string>
- <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite que o aplicativo leia mensagens de difusão celular recebidas por seu dispositivo. Alertas de difusão celular são recebidos em alguns locais para avisar você de situações de emergência. Aplicativos maliciosos podem interferir no desempenho ou funcionamento de seu dispositivo quando uma difusão celular de emergência é recebida."</string>
+ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite que o app leia mensagens de difusão celular recebidas por seu dispositivo. Alertas de difusão celular são recebidos em alguns locais para avisar você de situações de emergência. Apps maliciosos podem interferir no desempenho ou funcionamento de seu dispositivo quando uma difusão celular de emergência é recebida."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"enviar mensagens SMS"</string>
- <string name="permdesc_sendSms" msgid="7094729298204937667">"Permite que o aplicativo envie mensagens SMS. Isso pode resultar em cobranças inesperadas. Aplicativos maliciosos podem gerar custos através do envio de mensagens sem sua confirmação."</string>
+ <string name="permdesc_sendSms" msgid="7094729298204937667">"Permite que o app envie mensagens SMS. Isso pode resultar em cobranças inesperadas. Apps maliciosos podem gerar custos através do envio de mensagens sem sua confirmação."</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"enviar eventos de resposta por mensagem"</string>
- <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Permite que o aplicativo envie solicitações a outros aplicativos de mensagens para processar eventos de resposta por mensagem para chamadas recebidas."</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"Permite que o app envie solicitações a outros apps de mensagens para processar eventos de resposta por mensagem para chamadas recebidas."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"ler suas mensagens de texto (SMS ou MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que o aplicativo leia mensagens SMS armazenadas no tablet ou cartão SIM. Isso permite que o aplicativo leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que o aplicativo leia mensagens SMS armazenadas no telefone ou cartão SIM. Isso permite que o aplicativo leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Permite que o app leia mensagens SMS armazenadas no tablet ou cartão SIM. Isso permite que o app leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Permite que o app leia mensagens SMS armazenadas no telefone ou cartão SIM. Isso permite que o app leia todas as mensagens SMS, independentemente de seu conteúdo ou confidencialidade."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"editar suas mensagens de texto (SMS ou MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que o aplicativo grave mensagens SMS armazenadas em seu tablet ou cartão SIM. Aplicativos maliciosos pode excluir suas mensagens."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que o aplicativo grave mensagens SMS armazenadas no telefone ou cartão SIM. Aplicativos maliciosos podem excluir suas mensagens."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"Permite que o app grave mensagens SMS armazenadas em seu tablet ou cartão SIM. Apps maliciosos pode excluir suas mensagens."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"Permite que o app grave mensagens SMS armazenadas no telefone ou cartão SIM. Apps maliciosos podem excluir suas mensagens."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"receber mensagens de texto (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que o aplicativo receba e processe mensagens WAP. Esta permissão inclui a capacidade de monitorar ou excluir mensagens enviadas para você sem mostrá-las para você."</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Permite que o app receba e processe mensagens WAP. Esta permissão inclui a capacidade de monitorar ou excluir mensagens enviadas para você sem mostrá-las para você."</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"receber mensagens por Bluetooth (MAP)"</string>
- <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Permite que o aplicativo receba e processe mensagens Bluetooth MAP. Isso significa que o aplicativo pode monitorar ou excluir as mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"recuperar aplicativos em execução"</string>
- <string name="permdesc_getTasks" msgid="7454215995847658102">"Permite que o aplicativo obtenha informações sobre tarefas em execução atuais e recentes. Pode permitir que o aplicativo descubra informações sobre os aplicativos usados ​​no dispositivo."</string>
+ <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Permite que o app receba e processe mensagens Bluetooth MAP. Isso significa que o app pode monitorar ou excluir as mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"recuperar apps em execução"</string>
+ <string name="permdesc_getTasks" msgid="7454215995847658102">"Permite que o app obtenha informações sobre tarefas em execução atuais e recentes. Pode permitir que o app descubra informações sobre os apps usados ​​no dispositivo."</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"iniciar uma tarefa a partir de recentes"</string>
<string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"Permite que o app use um objeto ActivityManager.RecentTaskInfo para iniciar uma tarefa extinta que foi retornada de ActivityManager.getRecentTaskList()."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"interagir entre os usuários"</string>
- <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Permite que o aplicativo execute ações entre os diversos usuários do aparelho. Aplicativos mal-intencionados podem usar isto para violar a proteção entre os usuários."</string>
+ <string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Permite que o app execute ações entre os diversos usuários do aparelho. Apps mal-intencionados podem usar isto para violar a proteção entre os usuários."</string>
<string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"permissão total para interagir entre os usuários"</string>
<string name="permdesc_interactAcrossUsersFull" msgid="376841368395502366">"Permite todas as interações possíveis entre os usuários."</string>
<string name="permlab_manageUsers" msgid="1676150911672282428">"gerenciar usuários"</string>
- <string name="permdesc_manageUsers" msgid="8409306667645355638">"Permite que os aplicativos gerenciem os usuários do dispositivo, incluindo a consulta, a criação e a exclusão de usuários."</string>
- <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recuperar detalhes dos aplicativos em execução"</string>
- <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite que o aplicativo recupere informações detalhadas sobre tarefas executadas atual e recentemente. Aplicativos maliciosos podem descobrir informações privadas sobre outros aplicativos."</string>
- <string name="permlab_reorderTasks" msgid="2018575526934422779">"reordenar os aplicativos em execução"</string>
- <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Permite que o aplicativo mova tarefas para o primeiro plano e o plano de fundo, sem sua intervenção."</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"parar os aplicativos em execução"</string>
- <string name="permdesc_removeTasks" msgid="1394714352062635493">"Permite que um aplicativo remova tarefas e elimine seus aplicativos. Aplicativos maliciosos podem interferir no comportamento de outros aplicativos."</string>
+ <string name="permdesc_manageUsers" msgid="8409306667645355638">"Permite que os apps gerenciem os usuários do dispositivo, incluindo a consulta, a criação e a exclusão de usuários."</string>
+ <string name="permlab_getDetailedTasks" msgid="6229468674753529501">"recuperar detalhes dos apps em execução"</string>
+ <string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Permite que o app recupere informações detalhadas sobre tarefas executadas atual e recentemente. Apps maliciosos podem descobrir informações privadas sobre outros apps."</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"reordenar os apps em execução"</string>
+ <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Permite que o app mova tarefas para o primeiro plano e o plano de fundo, sem sua intervenção."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"parar os apps em execução"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Permite que um app remova tarefas e elimine seus apps. Apps maliciosos podem interferir no comportamento de outros apps."</string>
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"gerenciar pilhas de atividades"</string>
- <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Permite que o aplicativo adicione, remova e modifique as pilhas de atividades nas quais outros aplicativos são executados. Aplicativos mal-intencionados podem comprometer o funcionamento de outros aplicativos."</string>
+ <string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Permite que o app adicione, remova e modifique as pilhas de atividades nas quais outros apps são executados. Apps mal-intencionados podem comprometer o funcionamento de outros apps."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"iniciar qualquer atividade"</string>
- <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Permite que o aplicativo inicie qualquer atividade, independentemente da permissão ou do estado exportado."</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Permite que o app inicie qualquer atividade, independentemente da permissão ou do estado exportado."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"definir a compatibilidade de tela"</string>
- <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Permite que o aplicativo controle o modo de compatibilidade de tela de outros aplicativos. Aplicativos maliciosos podem interromper o comportamento de outros aplicativos."</string>
- <string name="permlab_setDebugApp" msgid="3022107198686584052">"ativar depuração do aplicativo"</string>
- <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Permite que o aplicativo ative a depuração para outro aplicativo. Aplicativos maliciosos podem usar esse recurso para cancelar outros aplicativos."</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Permite que o app controle o modo de compatibilidade de tela de outros apps. Apps maliciosos podem interromper o comportamento de outros apps."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"ativar depuração do app"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Permite que o app ative a depuração para outro app. Apps maliciosos podem usar esse recurso para cancelar outros apps."</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"alterar configurações de exibição do sistema"</string>
- <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Permite que o aplicativo altere a configuração atual, como o local ou o tamanho da fonte."</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Permite que o app altere a configuração atual, como o local ou o tamanho da fonte."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"ativar o modo carro"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Permite que o aplicativo ative o modo Carro."</string>
- <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"fechar outros aplicativos"</string>
- <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que o aplicativo encerre processos em segundo plano de outros aplicativos. Pode ser que outros aplicativos parem de funcionar."</string>
- <string name="permlab_forceStopPackages" msgid="2329627428832067700">"força o interrompimento de outros aplicativos"</string>
- <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Permite que o aplicativo force o interrompimento de outros aplicativos."</string>
- <string name="permlab_forceBack" msgid="652935204072584616">"forçar encerramento do aplicativo"</string>
- <string name="permdesc_forceBack" msgid="3892295830419513623">"Permite que o aplicativo force o encerramento de qualquer atividade que está em primeiro plano e volte. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Permite que o app ative o modo Carro."</string>
+ <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"fechar outros apps"</string>
+ <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Permite que o app encerre processos em segundo plano de outros apps. Pode ser que outros apps parem de funcionar."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"força o interrompimento de outros apps"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Permite que o app force o interrompimento de outros apps."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"forçar encerramento do app"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Permite que o app force o encerramento de qualquer atividade que está em primeiro plano e volte. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_dump" msgid="1681799862438954752">"recuperar o estado interno do sistema"</string>
- <string name="permdesc_dump" msgid="1778299088692290329">"Permite que o aplicativo recupere o estado interno do sistema. Aplicativos maliciosos podem obter uma grande variedade de informações privadas e seguras que eles normalmente não precisariam."</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Permite que o app recupere o estado interno do sistema. Apps maliciosos podem obter uma grande variedade de informações privadas e seguras que eles normalmente não precisariam."</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"recuperar conteúdo da tela"</string>
- <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Permite que o aplicativo recupere o conteúdo da janela ativa. Aplicativos maliciosos podem recuperar o conteúdo da janela inteira e examinar todo o texto, exceto as senhas."</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Permite que o app recupere o conteúdo da janela ativa. Apps maliciosos podem recuperar o conteúdo da janela inteira e examinar todo o texto, exceto as senhas."</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"ativar temporariamente a acessibilidade"</string>
- <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Permite que um aplicativo ative temporariamente a acessibilidade no dispositivo. Aplicativos maliciosos podem ativar a acessibilidade sem o consentimento do usuário."</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Permite que um app ative temporariamente a acessibilidade no dispositivo. Apps maliciosos podem ativar a acessibilidade sem o consentimento do usuário."</string>
<string name="permlab_retrieveWindowToken" msgid="7154762602367758602">"recuperar token da janela"</string>
- <string name="permdesc_retrieveWindowToken" msgid="668173747687795074">"Permite que o aplicativo recupere o token da janela. Aplicativos maliciosos podem realizar interações não autorizadas com a janela do aplicativo em nome do sistema."</string>
+ <string name="permdesc_retrieveWindowToken" msgid="668173747687795074">"Permite que o app recupere o token da janela. Apps maliciosos podem realizar interações não autorizadas com a janela do app em nome do sistema."</string>
<string name="permlab_frameStats" msgid="7056374987314361639">"recuperar estatísticas de quadros"</string>
- <string name="permdesc_frameStats" msgid="4758001089491284919">"Permite que o aplicativo colete estatísticas de quadros. Aplicativos maliciosos podem observar as estatísticas de quadros de janelas de outros aplicativos."</string>
+ <string name="permdesc_frameStats" msgid="4758001089491284919">"Permite que o app colete estatísticas de quadros. Apps maliciosos podem observar as estatísticas de quadros de janelas de outros apps."</string>
<string name="permlab_filter_events" msgid="8675535648807427389">"filtrar eventos"</string>
- <string name="permdesc_filter_events" msgid="8006236315888347680">"Permite que o aplicativo registre um filtro de entrada que filtra o fluxo de todos os eventos do usuário antes que sejam enviados. Aplicativos mal-intencionados podem controlar a interface do sistema sem a intervenção do usuário."</string>
+ <string name="permdesc_filter_events" msgid="8006236315888347680">"Permite que o app registre um filtro de entrada que filtra o fluxo de todos os eventos do usuário antes que sejam enviados. Apps mal-intencionados podem controlar a interface do sistema sem a intervenção do usuário."</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"desligamento parcial"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"Coloca o gerenciador de atividades em um estado de desligamento. Não executa o desligamento completo."</string>
- <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar trocas de aplicativo"</string>
- <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impede que o usuário alterne para outro aplicativo."</string>
- <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"obter informações do aplicativo atual"</string>
- <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Permite ao titular recuperar informações particulares sobre o aplicativo atual em primeiro plano na tela."</string>
- <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorar e controlar todos os aplicativos que estão sendo iniciados"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que o aplicativo monitore e controle a forma como o sistema inicia atividades. Aplicativos maliciosos podem comprometer completamente o sistema. Esta permissão só é necessária para o desenvolvimento, nunca para o uso normal."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"evitar trocas de app"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Impede que o usuário alterne para outro app."</string>
+ <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"obter informações do app atual"</string>
+ <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Permite ao titular recuperar informações particulares sobre o app atual em primeiro plano na tela."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"monitorar e controlar todos os apps que estão sendo iniciados"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Permite que o app monitore e controle a forma como o sistema inicia atividades. Apps maliciosos podem comprometer completamente o sistema. Esta permissão só é necessária para o desenvolvimento, nunca para o uso normal."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"enviar transmissão removida do pacote"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Permite que o aplicativo envie uma notificação quando um pacote do aplicativo for removido. Aplicativos maliciosos podem usar esse recurso para matar qualquer outro aplicativo em execução."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Permite que o app envie uma notificação quando um pacote do app for removido. Apps maliciosos podem usar esse recurso para matar qualquer outro app em execução."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"enviar transmissão SMS recebida"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que o aplicativo transmita uma notificação quando uma mensagem SMS foi recebida. Aplicativos maliciosos podem usar esse recurso para forjar mensagens SMS recebidas."</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Permite que o app transmita uma notificação quando uma mensagem SMS foi recebida. Apps maliciosos podem usar esse recurso para forjar mensagens SMS recebidas."</string>
<string name="permlab_broadcastWapPush" msgid="3145347413028582371">"enviar transmissão WAP-PUSH recebida"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que o aplicativo transmita uma notificação quando uma mensagem WAP PUSH for recebida. Aplicativos maliciosos podem usar esse recurso para forjar o recebimento de mensagens MMS ou substituir o conteúdo de qualquer página da web com variantes maliciosas."</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Permite que o app transmita uma notificação quando uma mensagem WAP PUSH for recebida. Apps maliciosos podem usar esse recurso para forjar o recebimento de mensagens MMS ou substituir o conteúdo de qualquer página da web com variantes maliciosas."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"limitar número de processos em execução"</string>
- <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite que o aplicativo controle o máximo de processos que serão executados. Nunca é necessário para aplicativos normais."</string>
- <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forçar encerramento de aplicativos em segundo plano"</string>
- <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Permite que o aplicativo controle se as atividades são sempre encerrados ao serem enviados para o plano de fundo. Nunca é necessário para aplicativos normais."</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Permite que o app controle o máximo de processos que serão executados. Nunca é necessário para apps normais."</string>
+ <string name="permlab_setAlwaysFinish" msgid="550958507798796965">"forçar encerramento de apps em segundo plano"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Permite que o app controle se as atividades são sempre encerrados ao serem enviados para o plano de fundo. Nunca é necessário para apps normais."</string>
<string name="permlab_batteryStats" msgid="2789610673514103364">"acessar estatísticas da bateria"</string>
- <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que o aplicativo leia os dados de uso da bateria de baixo nível atuais. Pode fornecer ao aplicativo informações detalhadas sobre os aplicativos usados por você."</string>
+ <string name="permdesc_batteryStats" msgid="5897346582882915114">"Permite que o app leia os dados de uso da bateria de baixo nível atuais. Pode fornecer ao app informações detalhadas sobre os apps usados por você."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"modificar estatísticas da bateria"</string>
- <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que o aplicativo modifique as estatísticas coletadas da bateria. Não deve ser usado em aplicativos normais."</string>
- <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estatísticas de operações de aplicativos"</string>
- <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que o aplicativo recupere as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
- <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de operações de aplicativos"</string>
- <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que o aplicativo modifique as estatísticas de operações de aplicativos. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_updateBatteryStats" msgid="6862817857178025002">"Permite que o app modifique as estatísticas coletadas da bateria. Não deve ser usado em apps normais."</string>
+ <string name="permlab_getAppOpsStats" msgid="1508779687436585744">"recuperar estatísticas de operações de apps"</string>
+ <string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"Permite que o app recupere as estatísticas de operações de apps. Não deve ser usado em apps normais."</string>
+ <string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"modificar estatísticas de operações de apps"</string>
+ <string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Permite que o app modifique as estatísticas de operações de apps. Não deve ser usado em apps normais."</string>
<string name="permlab_backup" msgid="470013022865453920">"controlar backup e restauração do sistema"</string>
- <string name="permdesc_backup" msgid="6912230525140589891">"Permite que o aplicativo controle o backup do sistema e restaure mecanismos. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Permite que o app controle o backup do sistema e restaure mecanismos. Não deve ser usado em apps normais."</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"confirmar um backup completo ou uma operação de restauração"</string>
- <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Permite que o aplicativo lance a interface de usuário de confirmação de backup completo. Não deve ser usado por qualquer aplicativo."</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Permite que o app lance a interface de usuário de confirmação de backup completo. Não deve ser usado por qualquer app."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"exibir janelas não autorizadas"</string>
- <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Permite que o aplicativo crie janelas destinadas ao uso ​​pela interface interna do sistema. Não deve ser usado em aplicativos normais."</string>
- <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"sobrepor outros aplicativos"</string>
- <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Permite que o aplicativo se sobreponha visualmente a outros aplicativos ou a partes da interface do usuário. Podem interferir com o uso da interface de qualquer aplicativo ou alterar o que você acha que está vendo em outros aplicativos."</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Permite que o app crie janelas destinadas ao uso ​​pela interface interna do sistema. Não deve ser usado em apps normais."</string>
+ <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"sobrepor outros apps"</string>
+ <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Permite que o app se sobreponha visualmente a outros apps ou a partes da interface do usuário. Podem interferir com o uso da interface de qualquer app ou alterar o que você acha que está vendo em outros apps."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"modificar velocidade de animação global"</string>
- <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Permite que o aplicativo altere a velocidade de animação global (animação mais rápida ou mais lenta) a qualquer momento."</string>
- <string name="permlab_manageAppTokens" msgid="1286505717050121370">"gerenciar tokens do aplicativo"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Permite que o aplicativo crie e gerencie seus próprios tokens, ignorando seus pedidos Z normais. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Permite que o app altere a velocidade de animação global (animação mais rápida ou mais lenta) a qualquer momento."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"gerenciar tokens do app"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Permite que o app crie e gerencie seus próprios tokens, ignorando seus pedidos Z normais. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"congelar tela"</string>
- <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Permite que o aplicativo congele temporariamente a tela para uma transição de tela inteira."</string>
+ <string name="permdesc_freezeScreen" msgid="8558923789222670064">"Permite que o app congele temporariamente a tela para uma transição de tela inteira."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"pressionar as teclas e os botões de controle"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Permite que o aplicativo exiba seus próprios eventos de entrada (teclas pressionadas, etc.) para outros aplicativos. Aplicativos maliciosos podem usar isso para tomar conta do tablet."</string>
- <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Permite que o aplicativo entregue seus próprios eventos de entrada (teclas pressionadas, etc,) para outros aplicativos. Aplicativos maliciosos podem usar esse recurso para assumir o controle do telefone."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Permite que o app exiba seus próprios eventos de entrada (teclas pressionadas, etc.) para outros apps. Apps maliciosos podem usar isso para tomar conta do tablet."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Permite que o app entregue seus próprios eventos de entrada (teclas pressionadas, etc,) para outros apps. Apps maliciosos podem usar esse recurso para assumir o controle do telefone."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"registrar o que você digita e as ações que realiza"</string>
- <string name="permdesc_readInputState" msgid="8387754901688728043">"Permite que o aplicativo veja as teclas pressionadas mesmo quando você estiver interagindo com outro aplicativo, como ao digitar uma senha. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Permite que o app veja as teclas pressionadas mesmo quando você estiver interagindo com outro app, como ao digitar uma senha. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"vincular a um método de entrada"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite que o proprietário utilize a interface de nível superior de um método de entrada. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Permite que o proprietário utilize a interface de nível superior de um método de entrada. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"usar um serviço de acessibilidade"</string>
- <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o proprietário use a interface de nível superior de um serviço de acessibilidade. Nunca deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite que o proprietário use a interface de nível superior de um serviço de acessibilidade. Nunca deve ser necessário para apps comuns."</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"associar a um serviço de impressão"</string>
- <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite que o proprietário use a interface de nível superior de um serviço de impressão. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite que o proprietário use a interface de nível superior de um serviço de impressão. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"associar a um serviço de spooler de impressão"</string>
- <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite que o proprietário use a interface de nível superior de um serviço de spooler de impressão. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite que o proprietário use a interface de nível superior de um serviço de spooler de impressão. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindNfcService" msgid="2752731300419410724">"associar ao serviço NFC"</string>
- <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite ao proprietário associar a aplicativos que emulam cartões NFC. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite ao proprietário associar a apps que emulam cartões NFC. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"sujeitar-se a um serviço de texto"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite que o proprietário utilize interface de nível superior de um serviço de texto (por exemplo, SpellCheckerService). Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"Permite que o proprietário utilize interface de nível superior de um serviço de texto (por exemplo, SpellCheckerService). Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"se ligam a um serviço de VPN"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permite que seu proprietário sujeite a interface de alto nível de um serviço de VPN. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Permite que seu proprietário sujeite a interface de alto nível de um serviço de VPN. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"sujeitar-se a um plano de fundo"</string>
- <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permite que o proprietário utilize interface de nível superior de um plano de fundo. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Permite que o proprietário utilize interface de nível superior de um plano de fundo. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"associar a um interagente de voz"</string>
- <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permite que o proprietário use a interface de nível superior de um serviço de interação de voz. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Permite que o proprietário use a interface de nível superior de um serviço de interação de voz. Não deve ser necessário para apps comuns."</string>
<string name="permlab_manageVoiceKeyphrases" msgid="1252285102392793548">"gerenciar frases-chave de voz"</string>
- <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"Permite ao titular gerenciar as frases-chave para detecção de hotword por voz. Isso nunca será necessário para aplicativos normais."</string>
+ <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"Permite ao titular gerenciar as frases-chave para detecção de hotword por voz. Isso nunca será necessário para apps normais."</string>
<string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"usar uma tela remota"</string>
- <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite que o proprietário use a interface de nível superior de uma tela remota. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Permite que o proprietário use a interface de nível superior de uma tela remota. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"sujeitar-se a um serviço de widget"</string>
- <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite que o proprietário utilize a interface de nível superior de um serviço de widget. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Permite que o proprietário utilize a interface de nível superior de um serviço de widget. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interagir com o administrador de um dispositivo"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite que o proprietário envie tentativas ao administrador de um aparelho. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Permite que o proprietário envie tentativas ao administrador de um aparelho. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_bindTvInput" msgid="5601264742478168987">"associar a uma entrada de TV"</string>
- <string name="permdesc_bindTvInput" msgid="2371008331852001924">"Permite que o proprietário use a interface de nível superior de uma entrada de TV. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindTvInput" msgid="2371008331852001924">"Permite que o proprietário use a interface de nível superior de uma entrada de TV. Não deve ser necessário para apps comuns."</string>
<string name="permlab_modifyParentalControls" msgid="4611318225997592242">"modificar os controles para os pais"</string>
<string name="permdesc_modifyParentalControls" msgid="7438482894162282039">"Permite ao titular modificar os dados de controles para os pais no sistema. Não deve ser necessário para apps comuns."</string>
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"adicionar ou remover um administrador do dispositivo"</string>
- <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Permite que o proprietário adicione ou remova administradores do dispositivo ativos. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Permite que o proprietário adicione ou remova administradores do dispositivo ativos. Não deve ser necessário para apps comuns."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"alterar orientação da tela"</string>
- <string name="permdesc_setOrientation" msgid="3046126619316671476">"Permite que o aplicativo gire a tela a qualquer momento. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Permite que o app gire a tela a qualquer momento. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"alterar velocidade do ponteiro"</string>
- <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Permite que o aplicativo altere a velocidade do cursos do mouse ou trackpad a qualquer momento. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Permite que o app altere a velocidade do cursos do mouse ou trackpad a qualquer momento. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"alterar layout do teclado"</string>
- <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Permite que o aplicativo altere o layout do teclado. Não será necessário para aplicativos normais."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"enviar sinais para aplicativos Linux"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Permite que o aplicativo solicite o envio do sinal fornecido a todos os processos persistentes."</string>
- <string name="permlab_persistentActivity" msgid="8841113627955563938">"sempre executar o aplicativo"</string>
- <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que o aplicativo torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros aplicativos, deixando o tablet mais lento."</string>
- <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que o aplicativo torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros aplicativos, deixando o telefone mais lento."</string>
- <string name="permlab_deletePackages" msgid="184385129537705938">"excluir aplicativos"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"Permite que o aplicativo exclua pacotes Android. Aplicativos maliciosos podem usar esse recurso para excluir aplicativos importantes."</string>
- <string name="permlab_clearAppUserData" msgid="274109191845842756">"excluir dados de outros aplicativos"</string>
- <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Permite que o aplicativo limpe os dados do usuário."</string>
- <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"excluir caches de outros aplicativos"</string>
- <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Permite que o aplicativo exclua arquivos armazenados em cache."</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"medir o espaço de armazenamento do aplicativo"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite que o aplicativo recupere o código, os dados e os tamanhos de cache"</string>
- <string name="permlab_installPackages" msgid="2199128482820306924">"instalar aplicativos diretamente"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"Permite que o aplicativo instale pacotes novos ou atualizados do Android. Aplicativos maliciosos podem usar esse recurso para adicionar novos aplicativos com permissões arbitrariamente poderosas."</string>
- <string name="permlab_clearAppCache" msgid="7487279391723526815">"excluir todos os dados do cache do aplicativo"</string>
- <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Permite que o aplicativo libere o armazenamento do tablet excluindo arquivos nos diretórios de cache de outros aplicativos. Isso pode fazer com que outros aplicativos iniciem mais lentamente, pois precisam recuperar seus dados."</string>
- <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Permite que o aplicativo libere o armazenamento do telefone excluindo arquivos nos diretórios de cache de outros aplicativos. Isso pode fazer com que outros aplicativos iniciem mais lentamente, pois precisam recuperar seus dados."</string>
- <string name="permlab_movePackage" msgid="3289890271645921411">"mover recursos de aplicativos"</string>
- <string name="permdesc_movePackage" msgid="319562217778244524">"Permite que o aplicativo mova recursos de aplicativos da mídia interna para mídia externa e vice-versa."</string>
+ <string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Permite que o app altere o layout do teclado. Não será necessário para apps normais."</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"enviar sinais para apps Linux"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Permite que o app solicite o envio do sinal fornecido a todos os processos persistentes."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"sempre executar o app"</string>
+ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o tablet mais lento."</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permite que o app torne partes de si mesmo persistentes na memória. Pode limitar a memória disponível para outros apps, deixando o telefone mais lento."</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"excluir apps"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Permite que o app exclua pacotes Android. Apps maliciosos podem usar esse recurso para excluir apps importantes."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"excluir dados de outros apps"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Permite que o app limpe os dados do usuário."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"excluir caches de outros apps"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Permite que o app exclua arquivos armazenados em cache."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"medir o espaço de armazenamento do app"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permite que o app recupere o código, os dados e os tamanhos de cache"</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"instalar apps diretamente"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Permite que o app instale pacotes novos ou atualizados do Android. Apps maliciosos podem usar esse recurso para adicionar novos apps com permissões arbitrariamente poderosas."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"excluir todos os dados do cache do app"</string>
+ <string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Permite que o app libere o armazenamento do tablet excluindo arquivos nos diretórios de cache de outros apps. Isso pode fazer com que outros apps iniciem mais lentamente, pois precisam recuperar seus dados."</string>
+ <string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Permite que o app libere o armazenamento do telefone excluindo arquivos nos diretórios de cache de outros apps. Isso pode fazer com que outros apps iniciem mais lentamente, pois precisam recuperar seus dados."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"mover recursos de apps"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Permite que o app mova recursos de apps da mídia interna para mídia externa e vice-versa."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"ler dados de registro de informações confidenciais"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Permite que o aplicativo leia os diversos arquivos de registro do sistema. Isso permite que ele descubra informações gerais sobre o que você está fazendo com o tablet, inclusive informações pessoais ou particulares."</string>
- <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Permite que o aplicativo leia os diversos arquivos de registro do sistema. Isso permite que ele descubra informações gerais sobre o que você está fazendo com o telefone, inclusive possíveis informações pessoais ou privadas."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Permite que o app leia os diversos arquivos de registro do sistema. Isso permite que ele descubra informações gerais sobre o que você está fazendo com o tablet, inclusive informações pessoais ou particulares."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Permite que o app leia os diversos arquivos de registro do sistema. Isso permite que ele descubra informações gerais sobre o que você está fazendo com o telefone, inclusive possíveis informações pessoais ou privadas."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"usar qualquer decodificador de mídia para reprodução"</string>
- <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Permite que o aplicativo use qualquer decodificador de mídia instalado para reprodução."</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Permite que o app use qualquer decodificador de mídia instalado para reprodução."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"gerenciar credenciais confiáveis"</string>
- <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Permite que o aplicativo instale e desinstale certificados CA como credenciais confiáveis."</string>
- <string name="permlab_bindJobService" msgid="3637568367978271086">"executar as operações programadas do aplicativo em segundo plano"</string>
- <string name="permdesc_bindJobService" msgid="3473288460524119838">"Esta permissão permite ao sistema Android executar o aplicativo em segundo plano quando solicitado."</string>
+ <string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Permite que o app instale e desinstale certificados CA como credenciais confiáveis."</string>
+ <string name="permlab_bindJobService" msgid="3637568367978271086">"executar as operações programadas do app em segundo plano"</string>
+ <string name="permdesc_bindJobService" msgid="3473288460524119838">"Esta permissão permite ao sistema Android executar o app em segundo plano quando solicitado."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"ler/gravar em recursos pertencentes ao diag"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"Permite que um aplicativo leia e grave em qualquer recurso que pertença ao grupo de diagnósticos, por exemplo, arquivos in/dev. Isso pode afetar a estabilidade e a segurança do sistema. Esse recurso deve ser usado APENAS para diagnósticos específicos do hardware realizados pelo fabricante ou pela operadora."</string>
- <string name="permlab_changeComponentState" msgid="6335576775711095931">"ativar ou desativar os componentes do aplicativo"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Permite que o aplicativo ative ou desative um componente de outro aplicativo. Aplicativos maliciosos podem usar esse recurso para desativar recursos importantes do tablet. Tenha cuidado com essa permissão, pois é possível fazer com que os componentes do aplicativo fiquem inutilizáveis, inconsistentes ou instáveis."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Permite que o aplicativo altere se um componente de outro aplicativo está ativado ou não. Aplicativos maliciosos podem usar esse recurso para desativar recursos importantes do telefone. Deve-se tomar cuidado com essa permissão, uma vez que isso pode deixar os componentes do aplicativo inutilizáveis, inconsistentes ou instáveis."</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Permite que um app leia e grave em qualquer recurso que pertença ao grupo de diagnósticos, por exemplo, arquivos in/dev. Isso pode afetar a estabilidade e a segurança do sistema. Esse recurso deve ser usado APENAS para diagnósticos específicos do hardware realizados pelo fabricante ou pela operadora."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"ativar ou desativar os componentes do app"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Permite que o app ative ou desative um componente de outro app. Apps maliciosos podem usar esse recurso para desativar recursos importantes do tablet. Tenha cuidado com essa permissão, pois é possível fazer com que os componentes do app fiquem inutilizáveis, inconsistentes ou instáveis."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Permite que o app altere se um componente de outro app está ativado ou não. Apps maliciosos podem usar esse recurso para desativar recursos importantes do telefone. Deve-se tomar cuidado com essa permissão, uma vez que isso pode deixar os componentes do app inutilizáveis, inconsistentes ou instáveis."</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"conceder ou revogar permissões"</string>
- <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Permite que um aplicativo conceda ou revogue permissões específicas para ele ou outros aplicativos. Aplicativos maliciosos podem usar isso para acessar recursos aos quais você não concedeu permissão."</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"definir aplicativos preferidos"</string>
- <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Permite que o aplicativo modifique seus aplicativos preferidos. Aplicativos maliciosos podem alterar os aplicativos que são executados, falsificando seus aplicativos existentes para coletar seus dados particulares."</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Permite que um app conceda ou revogue permissões específicas para ele ou outros apps. Apps maliciosos podem usar isso para acessar recursos aos quais você não concedeu permissão."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"definir apps preferidos"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Permite que o app modifique seus apps preferidos. Apps maliciosos podem alterar os apps que são executados, falsificando seus apps existentes para coletar seus dados particulares."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modificar configurações do sistema"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"Permite que o aplicativo modifique os dados das configurações do sistema. Aplicativos maliciosos podem corromper a configuração de seu sistema."</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Permite que o app modifique os dados das configurações do sistema. Apps maliciosos podem corromper a configuração de seu sistema."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"modificar configurações do sistema de segurança"</string>
- <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Permite que o aplicativo modifique dados das configurações seguras do sistema. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Permite que o app modifique dados das configurações seguras do sistema. Não deve ser usado em apps normais."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"modificar o mapa de serviços do Google"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"Permite que o aplicativo modifique o mapa de serviços do Google. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Permite que o app modifique o mapa de serviços do Google. Não deve ser usado em apps normais."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"executar na inicialização"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Permite que o aplicativo inicie-se logo que o sistema concluir a inicialização. Isso pode tornar a inicialização do tablet mais lenta e permitir que o aplicativo deixe o telefone mais lento por estar sempre em execução."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Permite que o aplicativo inicie-se logo que o sistema concluir a inicialização. Isso pode tornar a inicialização do telefone mais lenta e permitir que o aplicativo deixe o telefone mais lento por estar sempre em execução."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Permite que o app inicie-se logo que o sistema concluir a inicialização. Isso pode tornar a inicialização do tablet mais lenta e permitir que o app deixe o telefone mais lento por estar sempre em execução."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Permite que o app inicie-se logo que o sistema concluir a inicialização. Isso pode tornar a inicialização do telefone mais lenta e permitir que o app deixe o telefone mais lento por estar sempre em execução."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"enviar transmissão persistente"</string>
- <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Permite que o aplicativo envie transmissões fixas, que permaneçam depois que a transmissão terminar. O uso excessivo pode desacelerar ou desestabilizar o tablet, fazendo com que ele utilize muita memória."</string>
- <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Permite que o aplicativo envie transmissões fixas, que permanecem depois que a transmissão termina. O uso excessivo pode deixar o telefone lento ou instável, fazendo com que ele use muita memória."</string>
+ <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Permite que o app envie transmissões fixas, que permaneçam depois que a transmissão terminar. O uso excessivo pode desacelerar ou desestabilizar o tablet, fazendo com que ele utilize muita memória."</string>
+ <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Permite que o app envie transmissões fixas, que permanecem depois que a transmissão termina. O uso excessivo pode deixar o telefone lento ou instável, fazendo com que ele use muita memória."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"ler seus contatos"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Permite que o aplicativo leia dados dos contatos armazenados no tablet, incluindo a frequência com que você chamou, enviou e-mails ou se comunicou de qualquer outra forma com indivíduos específicos. Esta permissão autoriza o aplicativo a salvar seus dados de contato, e aplicativos maliciosos podem compartilhar esses dados de contato sem seu conhecimento."</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Permite que o aplicativo leia dados dos contatos armazenados no telefone, incluindo a frequência com que você chamou, enviou e-mails ou se comunicou de qualquer outra forma com indivíduos específicos. Esta permissão autoriza o aplicativo a salvar seus dados de contato, e aplicativos maliciosos podem compartilhar esses dados de contato sem seu conhecimento."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Permite que o app leia dados dos contatos armazenados no tablet, incluindo a frequência com que você chamou, enviou e-mails ou se comunicou de qualquer outra forma com indivíduos específicos. Esta permissão autoriza o app a salvar seus dados de contato, e apps maliciosos podem compartilhar esses dados de contato sem seu conhecimento."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Permite que o app leia dados dos contatos armazenados no telefone, incluindo a frequência com que você chamou, enviou e-mails ou se comunicou de qualquer outra forma com indivíduos específicos. Esta permissão autoriza o app a salvar seus dados de contato, e apps maliciosos podem compartilhar esses dados de contato sem seu conhecimento."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"modificar seus contatos"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Permite que o aplicativo modifique os dados sobre os contatos armazenados no tablet, incluindo a frequência com que você fez chamadas, enviou e-mails ou se comunicou de outras formas com contatos específicos. Esta permissão autoriza o aplicativo a excluir dados de contatos."</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Permite que o aplicativo modifique os dados dos contatos armazenados no telefone, incluindo a frequência com que você fez chamadas, enviou e-mails ou se comunicou de outras formas com contatos específicos. Esta permissão autoriza o aplicativo a excluir dados de contatos."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Permite que o app modifique os dados sobre os contatos armazenados no tablet, incluindo a frequência com que você fez chamadas, enviou e-mails ou se comunicou de outras formas com contatos específicos. Esta permissão autoriza o app a excluir dados de contatos."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Permite que o app modifique os dados dos contatos armazenados no telefone, incluindo a frequência com que você fez chamadas, enviou e-mails ou se comunicou de outras formas com contatos específicos. Esta permissão autoriza o app a excluir dados de contatos."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"ler registro de chamadas"</string>
- <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Permite que o aplicativo leia o histórico de chamadas do tablet, incluindo dados de chamadas recebidas e realizadas. Esta permissão autoriza o aplicativo a salvar os dados de seu histórico de chamadas, e aplicativos maliciosos podem compartilhar esses dados do histórico de chamadas sem seu conhecimento."</string>
- <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Permite que o aplicativo leia o histórico de chamadas do telefone, incluindo dados de chamadas recebidas e realizadas. Esta permissão autoriza o aplicativo a salvar os dados de seu histórico de chamadas, e aplicativos maliciosos podem compartilhar os dados de seu histórico de chamadas sem seu conhecimento."</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Permite que o app leia o histórico de chamadas do tablet, incluindo dados de chamadas recebidas e realizadas. Esta permissão autoriza o app a salvar os dados de seu histórico de chamadas, e apps maliciosos podem compartilhar esses dados do histórico de chamadas sem seu conhecimento."</string>
+ <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Permite que o app leia o histórico de chamadas do telefone, incluindo dados de chamadas recebidas e realizadas. Esta permissão autoriza o app a salvar os dados de seu histórico de chamadas, e apps maliciosos podem compartilhar os dados de seu histórico de chamadas sem seu conhecimento."</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"salvar no registo de chamadas"</string>
- <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Permite que o aplicativo modifique o registro de chamadas de seu tablet, incluindo dados sobre chamadas recebidas e efetuadas. Aplicativos maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
- <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Permite que o aplicativo modifique o registro de chamadas de seu telefone, incluindo dados sobre chamadas recebidas e efetuadas. Aplicativos maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
+ <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Permite que o app modifique o registro de chamadas de seu tablet, incluindo dados sobre chamadas recebidas e efetuadas. Apps maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
+ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Permite que o app modifique o registro de chamadas de seu telefone, incluindo dados sobre chamadas recebidas e efetuadas. Apps maliciosos podem usar esta permissão para apagar ou modificar seu registro de chamadas."</string>
<string name="permlab_readProfile" msgid="4701889852612716678">"ler próprio cartão de contato"</string>
- <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Permite que o aplicativo leia informações de perfil pessoal armazenadas no dispositivo, como seu nome e dados de contato. Isso significa que o aplicativo poderá identificá-lo e enviar suas informações de perfil para terceiros."</string>
+ <string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"Permite que o app leia informações de perfil pessoal armazenadas no dispositivo, como seu nome e dados de contato. Isso significa que o app poderá identificá-lo e enviar suas informações de perfil para terceiros."</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"mod. próprio cartão contato"</string>
- <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que o aplicativo altere ou adicione informações pessoais de perfil armazenadas em seu dispositivo, como seu nome e informações de contato. Isso significa que o aplicativo pode identificá-lo e enviar as informações de seus perfil para terceiros."</string>
+ <string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que o app altere ou adicione informações pessoais de perfil armazenadas em seu dispositivo, como seu nome e informações de contato. Isso significa que o app pode identificá-lo e enviar as informações de seus perfil para terceiros."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensores corporais"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite que o aplicativo acesse dados de sensores usados para medir o que acontece em seu corpo, como seus batimentos cardíacos."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite que o app acesse dados de sensores usados para medir o que acontece em seu corpo, como seus batimentos cardíacos."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ler suas transmissões sociais"</string>
- <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que o aplicativo acesse e sincronize suas atualizações sociais e as de seus amigos. Tenha cuidado ao compartilhar informações: isto permite que o aplicativo leia as mensagens trocadas por você e seus amigos em redes sociais, independentemente de sua confidencialidade. Obsservaç: pode não ser aplicável a todas as redes sociais."</string>
+ <string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que o app acesse e sincronize suas atualizações sociais e as de seus amigos. Tenha cuidado ao compartilhar informações: isto permite que o app leia as mensagens trocadas por você e seus amigos em redes sociais, independentemente de sua confidencialidade. Obsservaç: pode não ser aplicável a todas as redes sociais."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escrever p/ suas transm. soc."</string>
- <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Permite que o aplicativo exiba atualizações sociais de seus amigos. Tenha cuidado ao compartilhar informações: isto permite que o aplicativo produza mensagens aparentemente enviadas por amigos. Observação: pode não ser aplicável a todas as redes sociais."</string>
+ <string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"Permite que o app exiba atualizações sociais de seus amigos. Tenha cuidado ao compartilhar informações: isto permite que o app produza mensagens aparentemente enviadas por amigos. Observação: pode não ser aplicável a todas as redes sociais."</string>
<string name="permlab_readCalendar" msgid="5972727560257612398">"ler compromissos e informações confidenciais"</string>
- <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Permite que o aplicativo leia todos os eventos do calendário armazenados no tablet, incluindo os de amigos ou colegas de trabalho. Pode permitir que o aplicativo compartilhe ou salve os dados do calendário, independentemente de sua confidencialidade."</string>
- <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Permite que o aplicativo leia todos os eventos do calendário armazenados no telefone, incluindo os de amigos ou colegas de trabalho. Pode permitir que o aplicativo compartilhe ou salve os dados do calendário, independentemente de sua confidencialidade."</string>
+ <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Permite que o app leia todos os eventos do calendário armazenados no tablet, incluindo os de amigos ou colegas de trabalho. Pode permitir que o app compartilhe ou salve os dados do calendário, independentemente de sua confidencialidade."</string>
+ <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Permite que o app leia todos os eventos do calendário armazenados no telefone, incluindo os de amigos ou colegas de trabalho. Pode permitir que o app compartilhe ou salve os dados do calendário, independentemente de sua confidencialidade."</string>
<string name="permlab_writeCalendar" msgid="8438874755193825647">"adicionar ou modificar compromissos e enviar e-mail para os convidados sem o conhecimento dos donos"</string>
- <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Permite que o aplicativo adicione, remova e altere eventos que você pode modificar em seu tablet, incluindo os de amigos e colegas de trabalho. Isso pode permitir que o aplicativo envie mensagens que parecem ser de autoria do proprietário do calendário, ou modifique eventos sem conhecimento do proprietário."</string>
- <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Permite que o aplicativo adicione, remova e altere eventos que você pode modificar em seu telefone, incluindo os de amigos e colegas de trabalho. Isso pode permitir que o aplicativo envie mensagens que parecem ser de autoria do proprietário do calendário, ou modifique eventos sem conhecimento do proprietário."</string>
+ <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Permite que o app adicione, remova e altere eventos que você pode modificar em seu tablet, incluindo os de amigos e colegas de trabalho. Isso pode permitir que o app envie mensagens que parecem ser de autoria do proprietário do calendário, ou modifique eventos sem conhecimento do proprietário."</string>
+ <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Permite que o app adicione, remova e altere eventos que você pode modificar em seu telefone, incluindo os de amigos e colegas de trabalho. Isso pode permitir que o app envie mensagens que parecem ser de autoria do proprietário do calendário, ou modifique eventos sem conhecimento do proprietário."</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"fontes de locais fictícios para teste"</string>
- <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Criar fontes de localização simuladas para testar ou instalar um novo provedor de localização. Isso permite que o aplicativo substitua a localização e/ou o status retornado por outras fontes de localização, como o GPS ou provedores de localização."</string>
+ <string name="permdesc_accessMockLocation" msgid="5808711039482051824">"Criar fontes de localização simuladas para testar ou instalar um novo provedor de localização. Isso permite que o app substitua a localização e/ou o status retornado por outras fontes de localização, como o GPS ou provedores de localização."</string>
<string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"acessar comandos extras do provedor de localização"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que o aplicativo acesse comandos do provedor não relacionados à localização. Isso pode permitir que o aplicativo interfira no funcionamento do GPS ou de outras fontes de localização."</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Permite que o app acesse comandos do provedor não relacionados à localização. Isso pode permitir que o app interfira no funcionamento do GPS ou de outras fontes de localização."</string>
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"autorização para instalar um provedor de localização"</string>
- <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Criar fontes de localização simuladas para testar ou instalar um novo provedor de localização. Isso permite que o aplicativo substitua a localização e/ou o status retornado por outras fontes de localização, como o GPS ou provedores de localização."</string>
+ <string name="permdesc_installLocationProvider" msgid="9066146120470591509">"Criar fontes de localização simuladas para testar ou instalar um novo provedor de localização. Isso permite que o app substitua a localização e/ou o status retornado por outras fontes de localização, como o GPS ou provedores de localização."</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"localização precisa (GPS e com base na rede)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Permite que o aplicativo acesse sua localização exata por meio do sistema de posicionamento global (GPS) ou de fontes de localização da rede, como torres de celulares e redes Wi-Fi. Esses serviços de localização devem estar ativados e disponíveis para que sejam usados pelo aplicativo. O aplicativo pode usar esta permissão para determinar onde você está, além de consumir mais bateria."</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Permite que o app acesse sua localização exata por meio do sistema de posicionamento global (GPS) ou de fontes de localização da rede, como torres de celulares e redes Wi-Fi. Esses serviços de localização devem estar ativados e disponíveis para que sejam usados pelo app. O app pode usar esta permissão para determinar onde você está, além de consumir mais bateria."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"localização aproximada (com base na rede)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Permite que o aplicativo acesse sua localização aproximada por meio do sistema de posicionamento global (GPS) ou de fontes de localização da rede, como torres de celulares e redes Wi-Fi. Esses serviços de localização devem estar ativados e disponíveis para que sejam usados pelo aplicativo. O aplicativo pode usar esta permissão para determinar aproximadamente onde você está."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Permite que o app acesse sua localização aproximada por meio do sistema de posicionamento global (GPS) ou de fontes de localização da rede, como torres de celulares e redes Wi-Fi. Esses serviços de localização devem estar ativados e disponíveis para que sejam usados pelo app. O app pode usar esta permissão para determinar aproximadamente onde você está."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"acessar SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite que o aplicativo use recursos com baixos níveis de SurfaceFlinger."</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Permite que o app use recursos com baixos níveis de SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"ler o buffer do frame"</string>
- <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite que o aplicativo leia o conteúdo do buffer de frame."</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Permite que o app leia o conteúdo do buffer de frame."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"acessar InputFlinger"</string>
- <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que o aplicativo use recursos com baixos níveis de InputFinger."</string>
+ <string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Permite que o app use recursos com baixos níveis de InputFinger."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"configurar monitores Wi-Fi"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que o aplicativo configure e conecte a monitores Wi-Fi."</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Permite que o app configure e conecte a monitores Wi-Fi."</string>
<string name="permlab_controlWifiDisplay" msgid="393641276723695496">"controlar monitores Wi-Fi"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Permite que o aplicativo controle recursos de baixo nível de monitores Wi-Fi."</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Permite que o app controle recursos de baixo nível de monitores Wi-Fi."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"capturar saída de áudio"</string>
- <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Permite que o aplicativo capture e redirecione a saída de áudio."</string>
+ <string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"Permite que o app capture e redirecione a saída de áudio."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"Detecção de hotwords"</string>
<string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"Permite que o dispositivo capture áudio para a detecção de hotwords. A captura pode acontecer em segundo plano, mas não impede outras capturas de áudio (como por uma câmera de vídeo)."</string>
<string name="permlab_modifyAudioRouting" msgid="7738060354490807723">"Roteamento de áudio"</string>
<string name="permdesc_modifyAudioRouting" msgid="7205731074267199735">"Permite que o app controle diretamente o roteamento de áudio e substitua as decisões relacionadas a políticas de áudio."</string>
<string name="permlab_captureVideoOutput" msgid="2246828773589094023">"capturar saída de vídeo"</string>
- <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Permite que o aplicativo capture e redirecione a saída de vídeo."</string>
+ <string name="permdesc_captureVideoOutput" msgid="359481658034149860">"Permite que o app capture e redirecione a saída de vídeo."</string>
<string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"capturar saída de vídeo segura"</string>
- <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Permite que o aplicativo capture e redirecione a saída de vídeo segura."</string>
+ <string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"Permite que o app capture e redirecione a saída de vídeo segura."</string>
<string name="permlab_mediaContentControl" msgid="8749790560720562511">"controlar reprodução de mídia e acessar metadados"</string>
- <string name="permdesc_mediaContentControl" msgid="1637478200272062">"Permite que o aplicativo controle a reprodução de mídia e acesse as informações da mídia (título, autor, etc.)."</string>
+ <string name="permdesc_mediaContentControl" msgid="1637478200272062">"Permite que o app controle a reprodução de mídia e acesse as informações da mídia (título, autor, etc.)."</string>
<string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"alterar as suas configurações de áudio"</string>
- <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que o aplicativo modifique configurações de áudio globais como volume e alto-falantes de saída."</string>
+ <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Permite que o app modifique configurações de áudio globais como volume e alto-falantes de saída."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"gravar áudio"</string>
- <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que o aplicativo grave áudio com o microfone. Esta permissão autoriza o aplicativo a gravar áudio a qualquer momento, sem sua confirmação."</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que o app grave áudio com o microfone. Esta permissão autoriza o app a gravar áudio a qualquer momento, sem sua confirmação."</string>
<string name="permlab_sim_communication" msgid="1180265879464893029">"comunicação com sim"</string>
- <string name="permdesc_sim_communication" msgid="5725159654279639498">"Permite que o aplicativo envie comandos ao SIM. Muito perigoso."</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"Permite que o app envie comandos ao SIM. Muito perigoso."</string>
<string name="permlab_camera" msgid="3616391919559751192">"tirar fotos e gravar vídeos"</string>
- <string name="permdesc_camera" msgid="8497216524735535009">"Permite que o aplicativo tire fotos e filme vídeos com a câmera. Esta permissão autoriza o aplicativo a usar a câmera a qualquer momento sem sua confirmação."</string>
+ <string name="permdesc_camera" msgid="8497216524735535009">"Permite que o app tire fotos e filme vídeos com a câmera. Esta permissão autoriza o app a usar a câmera a qualquer momento sem sua confirmação."</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"desativar a transmissão do LED indicador quando a câmera estiver em uso"</string>
- <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite que um aplicativo do sistema pré-instalado desative o LED indicador de uso da câmera."</string>
+ <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite que um app do sistema pré-instalado desative o LED indicador de uso da câmera."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desativar permanentemente o tablet"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"desativar permanentemente o telefone"</string>
- <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que o aplicativo desative todo o tablet permanentemente. Isso é muito perigoso."</string>
- <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Permite que o aplicativo desative todo o telefone permanentemente. Isso é muito perigoso."</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que o app desative todo o tablet permanentemente. Isso é muito perigoso."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Permite que o app desative todo o telefone permanentemente. Isso é muito perigoso."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"forçar a reinicialização do tablet"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"forçar reinicialização do telefone"</string>
- <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Permite que o aplicativo force a reinicialização do tablet."</string>
- <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Permite que o aplicativo force a reinicialização do telefone."</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Permite que o app force a reinicialização do tablet."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Permite que o app force a reinicialização do telefone."</string>
<string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"acess sist. arquiv armaz. USB"</string>
<string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"acessar sistema de arquivos do cartão SD"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Permite que o aplicativo monte e desmonte sistemas de arquivos para armazenamento removível."</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Permite que o app monte e desmonte sistemas de arquivos para armazenamento removível."</string>
<string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"apagar armazenamento USB"</string>
<string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"apagar cartão SD"</string>
- <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Permite que o aplicativo formate o armazenamento removível."</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Permite que o app formate o armazenamento removível."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"obter informações sobre o armazenamento interno"</string>
- <string name="permdesc_asec_access" msgid="3094563844593878548">"Permite que o aplicativo obtenha informações sobre armazenamento interno."</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Permite que o app obtenha informações sobre armazenamento interno."</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"criar armazenamento interno"</string>
- <string name="permdesc_asec_create" msgid="4558869273585856876">"Permite que o aplicativo crie um armazenamento interno."</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Permite que o app crie um armazenamento interno."</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"destruir armazenamento interno"</string>
- <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Permite que o aplicativo destrua o armazenamento interno."</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Permite que o app destrua o armazenamento interno."</string>
<string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"conectar/desconectar armazenamento interno"</string>
- <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Permite que o aplicativo conecte/desconecte o armazenamento interno."</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Permite que o app conecte/desconecte o armazenamento interno."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"renomear armazenamento interno"</string>
- <string name="permdesc_asec_rename" msgid="1794757588472127675">"Permite que o aplicativo renomeie o armazenamento interno."</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Permite que o app renomeie o armazenamento interno."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"controlar vibração"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"Permite que o aplicativo controle a vibração."</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Permite que o app controle a vibração."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"controlar lanterna"</string>
- <string name="permdesc_flashlight" msgid="6522284794568368310">"Permite que o aplicativo controle a lanterna."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"gerenciar preferências e permissões de aplicativos USB"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"Permite que o aplicativo gerencie as preferências e as permissões de aplicativos USB."</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Permite que o app controle a lanterna."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"gerenciar preferências e permissões de apps USB"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Permite que o app gerencie as preferências e as permissões de apps USB."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"implementar protocolo MTP"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Permite acesso ao driver MTP do núcleo para implementar o protocolo USB MTP."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"testar hardware"</string>
- <string name="permdesc_hardware_test" msgid="6597964191208016605">"Permite que o aplicativo controle diversos periféricos para teste do hardware."</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Permite que o app controle diversos periféricos para teste do hardware."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ligar diretamente para números de telefone"</string>
- <string name="permdesc_callPhone" msgid="3740797576113760827">"Permite que o aplicativo ligue para números de telefone sem sua intervenção. Isso pode resultar em cobranças ou chamadas inesperadas. Esta opção não permite que o aplicativo ligue para números de emergência. Aplicativos maliciosos podem gerar custos com chamadas feitas sem sua confirmação."</string>
+ <string name="permdesc_callPhone" msgid="3740797576113760827">"Permite que o app ligue para números de telefone sem sua intervenção. Isso pode resultar em cobranças ou chamadas inesperadas. Esta opção não permite que o app ligue para números de emergência. Apps maliciosos podem gerar custos com chamadas feitas sem sua confirmação."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"ligar diretamente para quaisquer números de telefone"</string>
- <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Permite que o aplicativo chame qualquer número de telefone, incluindo números de emergência, sem sua intervenção. Aplicativos maliciosos podem fazer chamadas desnecessárias e ilegais para os serviços de emergência."</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Permite que o app chame qualquer número de telefone, incluindo números de emergência, sem sua intervenção. Apps maliciosos podem fazer chamadas desnecessárias e ilegais para os serviços de emergência."</string>
<string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"iniciar a configuração do tablet CDMA diretamente"</string>
<string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"iniciar a configuração do telefone CDMA diretamente"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Permite que o aplicativo inicie o provisionamento CDMA. Aplicativos maliciosos podem iniciar o provisionamento CDMA de maneira desnecessária."</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Permite que o app inicie o provisionamento CDMA. Apps maliciosos podem iniciar o provisionamento CDMA de maneira desnecessária."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"controlar as notificações de atualização do local"</string>
- <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Permite que o aplicativo ative/desative as notificações de atualização de local do rádio. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Permite que o app ative/desative as notificações de atualização de local do rádio. Não deve ser usado em apps normais."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"acessar propriedades de verificação"</string>
- <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Concede ao aplicativo acesso de leitura/gravação às propriedades enviadas pelo serviço de check-in. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Concede ao app acesso de leitura/gravação às propriedades enviadas pelo serviço de check-in. Não deve ser usado em apps normais."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"escolher widgets"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"Permite que o aplicativo informe ao sistema quais widgets podem ser usados ​​por qualquer aplicativo. Um aplicativo com essa permissão podem conceder acesso a dados pessoais para outros aplicativos. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Permite que o app informe ao sistema quais widgets podem ser usados ​​por qualquer app. Um app com essa permissão podem conceder acesso a dados pessoais para outros apps. Não deve ser usado em apps normais."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"modificar estado do telefone"</string>
- <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Permite que o aplicativo controle os recursos de telefone do dispositivo. Um aplicativo com essa permissão pode alternar entre redes, ligar e desligar o rádio do telefone e assim por diante, sem nunca notificá-lo."</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Permite que o app controle os recursos de telefone do dispositivo. Um app com essa permissão pode alternar entre redes, ligar e desligar o rádio do telefone e assim por diante, sem nunca notificá-lo."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"ler status e identidade do telefone"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que o aplicativo acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o aplicativo a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que o app acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o app a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string>
<string name="permlab_readPrecisePhoneState" msgid="5476483020282007597">"ler estados precisos do telefone"</string>
- <string name="permdesc_readPrecisePhoneState" msgid="6648009074263855418">"Permite que o aplicativo acesse estados precisos do telefone. Permite que o aplicativo determine o status real da chamada, se uma chamada está ativa em segundo plano, falhas em chamadas, o status preciso da conexão de dados e falhas na conexão de dados."</string>
+ <string name="permdesc_readPrecisePhoneState" msgid="6648009074263855418">"Permite que o app acesse estados precisos do telefone. Permite que o app determine o status real da chamada, se uma chamada está ativa em segundo plano, falhas em chamadas, o status preciso da conexão de dados e falhas na conexão de dados."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir modo de inatividade do tablet"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"impedir modo de inatividade do telefone"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o aplicativo impeça o tablet de entrar no modo de inatividade."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o aplicativo impeça o telefone de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Permite que o app impeça o tablet de entrar no modo de inatividade."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Permite que o app impeça o telefone de entrar no modo de inatividade."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"transmitir infravermelhos"</string>
- <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Permite que o aplicativo use o transmissor infravermelho do tablet."</string>
- <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"Permite que o aplicativo use o transmissor infravermelho do telefone."</string>
+ <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Permite que o app use o transmissor infravermelho do tablet."</string>
+ <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"Permite que o app use o transmissor infravermelho do telefone."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"ligar ou desligar o tablet"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ligar ou desligar o telefone"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Permite que o aplicativo ative ou desative o tablet."</string>
- <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Permite que o aplicativo ative ou desative o telefone."</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Permite que o app ative ou desative o tablet."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Permite que o app ative ou desative o telefone."</string>
<string name="permlab_userActivity" msgid="1677844893921729548">"tempo limite de exibição"</string>
<string name="permdesc_userActivity" msgid="651746160252248024">"Permite que o app redefina o tempo limite de exibição."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"executar no modo de teste de fábrica"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Executa como um teste do fabricante de nível inferior, permitindo o acesso completo ao hardware do tablet. Disponível apenas quando um tablet está em execução no modo de teste do fabricante."</string>
<string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Executa como um teste do fabricante de nível inferior, permitindo o acesso completo ao hardware do telefone. Disponível apenas quando um telefone está em execução no modo de teste do fabricante."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"definir plano de fundo"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Permite que o aplicativo defina o plano de fundo do sistema."</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Permite que o app defina o plano de fundo do sistema."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ajustar tamanho do plano de fundo"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Permite que o aplicativo defina as dicas de tamanho do plano de fundo do sistema."</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Permite que o app defina as dicas de tamanho do plano de fundo do sistema."</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"redefinir o sistema para os padrões de fábrica"</string>
- <string name="permdesc_masterClear" msgid="3665380492633910226">"Permite que o aplicativo redefina completamente o sistema para as configurações de fábrica, apagando todos os dados, as configuração e os aplicativos instalados."</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Permite que o app redefina completamente o sistema para as configurações de fábrica, apagando todos os dados, as configuração e os apps instalados."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"definir hora"</string>
- <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Permite que o aplicativo altere a hora do relógio do tablet."</string>
- <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Permite que o aplicativo altere a hora do relógio do telefone."</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Permite que o app altere a hora do relógio do tablet."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Permite que o app altere a hora do relógio do telefone."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"definir fuso horário"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Permite que o aplicativo altere o fuso horário do tablet."</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Permite que o aplicativo altera o fuso horário do telefone."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Permite que o app altere o fuso horário do tablet."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Permite que o app altera o fuso horário do telefone."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"agir como AccountManagerService"</string>
- <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Permite que o aplicativo faça chamadas para AccountAuthenticators."</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Permite que o app faça chamadas para AccountAuthenticators."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"encontrar contas no dispositivo"</string>
- <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Permite que o aplicativo obtenha a lista de contas conhecidas pelo tablet. Isso pode incluir todas as contas criadas pelos aplicativos instalados."</string>
- <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Permite que o aplicativo obtenha a lista de contas conhecidas pelo telefone. Isso pode incluir todas as contas criadas pelos aplicativos instalados."</string>
+ <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Permite que o app obtenha a lista de contas conhecidas pelo tablet. Isso pode incluir todas as contas criadas pelos apps instalados."</string>
+ <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Permite que o app obtenha a lista de contas conhecidas pelo telefone. Isso pode incluir todas as contas criadas pelos apps instalados."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"criar contas e definir senhas"</string>
- <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Permite que o aplicativo use os recursos do autenticador de conta do AccountManager, incluindo a criação de contas e a obtenção e definição de senhas."</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Permite que o app use os recursos do autenticador de conta do AccountManager, incluindo a criação de contas e a obtenção e definição de senhas."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"adicionar ou remover contas"</string>
- <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Permite que um aplicativo execute operações como adição e remoção de contas e exclusão de senhas."</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Permite que um app execute operações como adição e remoção de contas e exclusão de senhas."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"usar contas no dispositivo"</string>
- <string name="permdesc_useCredentials" msgid="7984227147403346422">"Permite que o aplicativo solicite tokens de autenticação."</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Permite que o app solicite tokens de autenticação."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"ver conexões de rede"</string>
- <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Permite que o aplicativo acesse informações sobre conexões de rede, como as redes existentes e conectadas."</string>
+ <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Permite que o app acesse informações sobre conexões de rede, como as redes existentes e conectadas."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"acesso total à rede"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Permite que o aplicativo crie soquetes de rede e utilize protocolos de rede personalizados. O navegador e outros aplicativos fornecem meios de enviar dados para a Internet, e por isso esta permissão não é necessária para enviar os dados."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Permite que o app crie soquetes de rede e utilize protocolos de rede personalizados. O navegador e outros apps fornecem meios de enviar dados para a Internet, e por isso esta permissão não é necessária para enviar os dados."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"alterar/interceptar as configurações de rede e tráfego"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Permite que o aplicativo altere configurações de rede e intercepte e inspecione todo o tráfego de rede, por exemplo, para alterar o proxy e a porta de qualquer APN. Aplicativos maliciosos podem monitorar, redirecionar ou modificar os pacotes de rede sem seu conhecimento."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Permite que o app altere configurações de rede e intercepte e inspecione todo o tráfego de rede, por exemplo, para alterar o proxy e a porta de qualquer APN. Apps maliciosos podem monitorar, redirecionar ou modificar os pacotes de rede sem seu conhecimento."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"alterar conectividade da rede"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Permite que o aplicativo altere o estado de conectividade de rede."</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Permite que o app altere o estado de conectividade de rede."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"alterar conectividade vinculada"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permite que o aplicativo altere o estado de conectividade de rede conectada."</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Permite que o app altere o estado de conectividade de rede conectada."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"alterar configuração de uso dos dados de segundo plano"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Permite que o aplicativo altere as configurações de uso de dados de segundo plano."</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Permite que o app altere as configurações de uso de dados de segundo plano."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"ver conexões Wi-Fi"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Permite que o aplicativo acesse informações sobre redes Wi-Fi, como a ativação do Wi-Fi e o nome dos dispositivos Wi-Fi conectados."</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Permite que o app acesse informações sobre redes Wi-Fi, como a ativação do Wi-Fi e o nome dos dispositivos Wi-Fi conectados."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"conectar e desconectar do Wi-Fi"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Permite que o aplicativo conecte e desconecte dos pontos de acesso Wi-Fi e faça alterações nas configurações do dispositivo para redes Wi-Fi."</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Permite que o app conecte e desconecte dos pontos de acesso Wi-Fi e faça alterações nas configurações do dispositivo para redes Wi-Fi."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"permitir recebimento de multicast Wi-Fi"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Permite que o aplicativo receba pacotes enviados para todos os dispositivos em uma rede Wi-Fi usando endereços de difusão seletiva, e não apenas o tablet. Consome mais energia do que o modo não multicast."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Permite que o aplicativo receba pacotes enviados para todos os dispositivos em uma rede Wi-Fi usando endereços de difusão seletiva, e não apenas o telefone. Consome mais energia do que o modo não multicast."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Permite que o app receba pacotes enviados para todos os dispositivos em uma rede Wi-Fi usando endereços de difusão seletiva, e não apenas o tablet. Consome mais energia do que o modo não multicast."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Permite que o app receba pacotes enviados para todos os dispositivos em uma rede Wi-Fi usando endereços de difusão seletiva, e não apenas o telefone. Consome mais energia do que o modo não multicast."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acessar configurações de Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que um aplicativo configure o tablet Bluetooth local, descubra dispositivos remotos e emparelhe com eles."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que um aplicativo configure o telefone Bluetooth local, descubra e emparelhe com dispositivos remotos."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir pareamento via Bluetooth pelo aplicativo"</string>
- <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string>
- <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que um app configure o tablet Bluetooth local, descubra dispositivos remotos e emparelhe com eles."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que um app configure o telefone Bluetooth local, descubra e emparelhe com dispositivos remotos."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir pareamento via Bluetooth pelo app"</string>
+ <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que o app faça pareamento com dispositivos remotos sem interação com o usuário."</string>
+ <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que o app faça pareamento com dispositivos remotos sem interação com o usuário."</string>
<string name="permlab_bluetoothMap" msgid="6372198338939197349">"acessar dados de Bluetooth MAP"</string>
<string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"Permite que o app acesse os dados de Bluetooth MAP."</string>
<string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"Permite que o app acesse os dados de Bluetooth MAP."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectar e desconectar do WiMAX"</string>
- <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que o aplicativo determine se o WiMAX está ativado e acesse informações sobre as redes WiMAX conectadas."</string>
+ <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que o app determine se o WiMAX está ativado e acesse informações sobre as redes WiMAX conectadas."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string>
- <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que o aplicativo conecte e desconecte o tablet de redes WiMAX."</string>
- <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que o aplicativo conecte e desconecte o telefone de redes WiMAX."</string>
+ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Permite que o app conecte e desconecte o tablet de redes WiMAX."</string>
+ <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Permite que o app conecte e desconecte o telefone de redes WiMAX."</string>
<string name="permlab_scoreNetworks" msgid="6445777779383587181">"avaliar redes"</string>
- <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite que o aplicativo classifique as redes e influencie a escolha de redes pelo tablet."</string>
- <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite que o aplicativo classifique as redes e influencie a escolha de redes pelo smartphone."</string>
+ <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"Permite que o app classifique as redes e influencie a escolha de redes pelo tablet."</string>
+ <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"Permite que o app classifique as redes e influencie a escolha de redes pelo smartphone."</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"parear com dispositivos Bluetooth"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que o aplicativo acesse a configuração do Bluetooth no tablet, além de fazer e aceitar conexões com dispositivos pareados."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que o aplicativo acesse a configuração do Bluetooth no telefone, além de fazer e aceitar conexões com dispositivos pareados."</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Permite que o app acesse a configuração do Bluetooth no tablet, além de fazer e aceitar conexões com dispositivos pareados."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Permite que o app acesse a configuração do Bluetooth no telefone, além de fazer e aceitar conexões com dispositivos pareados."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"controlar a comunicação a curta distância"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"Permite que o aplicativo se comunique com leitores, cartões e etiqueta NFC (Comunicação a curta distância)."</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"Permite que o app se comunique com leitores, cartões e etiqueta NFC (Comunicação a curta distância)."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"desativar o bloqueio de tela"</string>
- <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que o aplicativo desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma chamada e o reativa quando a chamada é finalizada."</string>
+ <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Permite que o app desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma chamada e o reativa quando a chamada é finalizada."</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ler as configurações de sincronização"</string>
- <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o aplicativo leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o aplicativo People está sincronizado com uma conta."</string>
+ <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Permite que o app leia as configurações de sincronização de uma conta. Por exemplo, pode determinar se o app People está sincronizado com uma conta."</string>
<string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ativar e desativar sincronização"</string>
- <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Permite que o aplicativo modifique as configurações de sincronização de uma conta. Por exemplo, pode ser usado para ativar a sincronização do aplicativo People com uma conta."</string>
+ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Permite que o app modifique as configurações de sincronização de uma conta. Por exemplo, pode ser usado para ativar a sincronização do app People com uma conta."</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"ler estatísticas de sincronização"</string>
- <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Permite que um aplicativo acesse as estatísticas de sincronização de uma conta, incluindo a história dos eventos de sincronização e a quantidade de dados sincronizados."</string>
+ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Permite que um app acesse as estatísticas de sincronização de uma conta, incluindo a história dos eventos de sincronização e a quantidade de dados sincronizados."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ler feeds inscritos"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite que o aplicativo obtenha detalhes sobre os feeds sincronizados no momento."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite que o app obtenha detalhes sobre os feeds sincronizados no momento."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"gravar feeds inscritos"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Permite que o aplicativo modifique seus feeds sincronizados no momento. Aplicativos maliciosos podem alterar seus feeds sincronizados."</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Permite que o app modifique seus feeds sincronizados no momento. Apps maliciosos podem alterar seus feeds sincronizados."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"ler termos adicionados ao dicionário"</string>
- <string name="permdesc_readDictionary" msgid="659614600338904243">"Permite que o aplicativo leia palavras, nomes e frases armazenados pelo usuário no dicionário do usuário."</string>
+ <string name="permdesc_readDictionary" msgid="659614600338904243">"Permite que o app leia palavras, nomes e frases armazenados pelo usuário no dicionário do usuário."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"adicionar palavras ao dicionário do usuário"</string>
- <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que o aplicativo grave novas palavras no dicionário do usuário."</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que o app grave novas palavras no dicionário do usuário."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"ler conteúdo do armaz. USB"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ler conteúdo do cartão SD"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Perm. que app leia cartão SD."</string>
- <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Permite que o aplicativo leia o conteúdo do cartão SD."</string>
+ <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Permite que o app leia o conteúdo do cartão SD."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar ou excluir conteúdo do armazenamento USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou excluir o conteúdo do cartão SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permite gravar no armaz. USB."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que o aplicativo grave em seu cartão SD."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que o app grave em seu cartão SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/excluir conteúdos de armazenamento de mídia internos"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Permite que o aplicativo modifique o conteúdo da mídia de armazenamento interno."</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Permite que o app modifique o conteúdo da mídia de armazenamento interno."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"gerenciar armaz. de documentos"</string>
- <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Permitir que o aplicativo gerencie o armazenamento de documentos."</string>
+ <string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Permitir que o app gerencie o armazenamento de documentos."</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"acessar arm. ext. dos usuários"</string>
- <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Permite que o aplicativo acesse o armazenamento externo para todos os usuários."</string>
+ <string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Permite que o app acesse o armazenamento externo para todos os usuários."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"acessar o sistema de arquivos de cache"</string>
- <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite que o aplicativo leia e grave o sistema de arquivos cache."</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite que o app leia e grave o sistema de arquivos cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"fazer/receber chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que o app faça e receba chamadas SIP."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir com chamada na tela"</string>
@@ -721,29 +721,29 @@
<string name="permlab_control_incall_experience" msgid="9061024437607777619">"fornecer uma experiência de usuário em chamada"</string>
<string name="permdesc_control_incall_experience" msgid="915159066039828124">"Permite ao app fornecer uma experiência de usuário em chamada."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ler histórico de uso da rede"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que o aplicativo leia o histórico de uso da rede para redes e aplicativos específicos."</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Permite que o app leia o histórico de uso da rede para redes e apps específicos."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"gerenciar a política de rede"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que o aplicativo gerencie políticas de rede e definia regras específicas para o aplicativo."</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Permite que o app gerencie políticas de rede e definia regras específicas para o app."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"modificar contagem de uso da rede"</string>
- <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que o aplicativo modifique como o uso da rede é contabilizado em relação aos aplicativos. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Permite que o app modifique como o uso da rede é contabilizado em relação aos apps. Não deve ser usado em apps normais."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"acessar notificações"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que o aplicativo recupere, examine e limpe notificações, inclusive as postadas por outros aplicativos."</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Permite que o app recupere, examine e limpe notificações, inclusive as postadas por outros apps."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"sujeitar a um serviço ouvinte de notificações"</string>
- <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite que o proprietário sujeite a interface de nível superior a um serviço ouvinte de notificações. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Permite que o proprietário sujeite a interface de nível superior a um serviço ouvinte de notificações. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"associar a um serviço provedor de condições"</string>
- <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite que o proprietário use a interface de nível superior de um serviço provedor de condições. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Permite que o proprietário use a interface de nível superior de um serviço provedor de condições. Não deve ser necessário para apps comuns."</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"conectar-se a um serviço de sonho"</string>
- <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite que o sistema autorizado se conecte à interface de nível superior de um serviço de sonho. Não deve ser necessário para aplicativos comuns."</string>
- <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar o aplicativo de configuração fornecido pela operadora"</string>
- <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite que o proprietário invoque o aplicativo de configuração fornecido pela operadora. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Permite que o sistema autorizado se conecte à interface de nível superior de um serviço de sonho. Não deve ser necessário para apps comuns."</string>
+ <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"invocar o app de configuração fornecido pela operadora"</string>
+ <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Permite que o proprietário invoque o app de configuração fornecido pela operadora. Não deve ser necessário para apps comuns."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"detectar observações nas condições da rede"</string>
- <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que o aplicativo detecte observações nas condições da rede. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Permite que o app detecte observações nas condições da rede. Não deve ser necessário para apps comuns."</string>
<string name="permlab_setInputCalibration" msgid="4902620118878467615">"alterar calibragem do dispositivo de entrada"</string>
- <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite que o aplicativo modifique os parâmetros de calibragem da tela sensível ao toque. Não deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Permite que o app modifique os parâmetros de calibragem da tela sensível ao toque. Não deve ser necessário para apps normais."</string>
<string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"acessar certificados de DRM"</string>
- <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que o aplicativo provisione e use certificados de DRM. Não deve ser necessário para aplicativos comuns."</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Permite que o app provisione e use certificados de DRM. Não deve ser necessário para apps comuns."</string>
<string name="permlab_handoverStatus" msgid="1159132046126626731">"Receber status de transferência do Android Beam"</string>
- <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que este aplicativo receba informações sobre as atuais transferências do Android Beam"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Permite que este app receba informações sobre as atuais transferências do Android Beam"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"remover certificados de DRM"</string>
<string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Permite que um app remova certificados de DRM. Não deve ser necessário para apps comuns."</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"Definir regras para senha"</string>
@@ -763,7 +763,7 @@
<string name="policylab_expirePassword" msgid="885279151847254056">"Definir val. da senha de bloqueio"</string>
<string name="policydesc_expirePassword" msgid="1729725226314691591">"Controle a frequência com que a senha da tela de bloqueio deve ser alterada."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"Definir criptografia de armazenamento"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exija que os dados armazenados do aplicativo sejam criptografados."</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exija que os dados armazenados do app sejam criptografados."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Desativar câmeras"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Impeça o uso de todas as câmeras do dispositivo."</string>
<string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Desat. recursos ao bloq. tecl."</string>
@@ -881,7 +881,7 @@
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Página inicial"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Comercial"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Outros"</string>
- <string name="quick_contacts_not_available" msgid="746098007828579688">"Nenhum aplicativo encontrado para visualizar este contato."</string>
+ <string name="quick_contacts_not_available" msgid="746098007828579688">"Nenhum app encontrado para visualizar este contato."</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Insira o código PIN"</string>
<string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Insira o PUK e o novo código PIN"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"Código PUK"</string>
@@ -1015,28 +1015,28 @@
<string name="autofill_area" msgid="3547409050889952423">"Área"</string>
<string name="autofill_emirate" msgid="2893880978835698818">"Emirado"</string>
<string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ler seu histórico e seus favoritos da web"</string>
- <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Permite que o aplicativo leia o histórico de todos os URLs acessados no navegador e todos os favoritos do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros aplicativos com capacidade de navegação na web."</string>
+ <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Permite que o app leia o histórico de todos os URLs acessados no navegador e todos os favoritos do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros apps com capacidade de navegação na web."</string>
<string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"gravar seu histórico e seus favoritos da web"</string>
- <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Permite que o aplicativo modifique o histórico ou os favoritos do navegador armazenados no tablet. Pode permitir que o aplicativo apague ou modifique os dados do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros aplicativos com capacidade de navegação na web."</string>
- <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Permite que o aplicativo modifique o histórico ou os favoritos do navegador armazenados no telefone. Pode permitir que o aplicativo apague ou modifique os dados do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros aplicativos com capacidade de navegação na web."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Permite que o app modifique o histórico ou os favoritos do navegador armazenados no tablet. Pode permitir que o app apague ou modifique os dados do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros apps com capacidade de navegação na web."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Permite que o app modifique o histórico ou os favoritos do navegador armazenados no telefone. Pode permitir que o app apague ou modifique os dados do navegador. Observação: pode não ser aplicável a navegadores de terceiros e outros apps com capacidade de navegação na web."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"definir um alarme"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"Permite que o aplicativo defina um alarme em um aplicativo despertador instalado. Alguns aplicativos despertador podem não implementar este recurso."</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Permite que o app defina um alarme em um app despertador instalado. Alguns apps despertador podem não implementar este recurso."</string>
<string name="permlab_writeVoicemail" msgid="7309899891683938100">"gravar correio de voz"</string>
<string name="permdesc_writeVoicemail" msgid="6592572839715924830">"Permite que o app modifique e remova mensagens da caixa de entrada do correio de voz."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"adicionar correio de voz"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Permite que o aplicativo adicione mensagens a sua caixa de entrada do correio de voz."</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Permite que o app adicione mensagens a sua caixa de entrada do correio de voz."</string>
<string name="permlab_readVoicemail" msgid="8415201752589140137">"ler correio de voz"</string>
<string name="permdesc_readVoicemail" msgid="8926534735321616550">"Permite que o app leia seus correios de voz."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Modifique as permissões de geolocalização de seu navegador"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Permite que o aplicativo modifique as permissões de geolocalização do navegador. Aplicativos maliciosos podem usar isso para permitir o envio de informações locais para sites arbitrários."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Permite que o app modifique as permissões de geolocalização do navegador. Apps maliciosos podem usar isso para permitir o envio de informações locais para sites arbitrários."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"verificar pacotes"</string>
- <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Permite que o aplicativo verifique se um pacote pode ser instalado."</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Permite que o app verifique se um pacote pode ser instalado."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"vincular a um verificador de pacote"</string>
- <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Permite que o titular solicite verificadores de pacote. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Permite que o titular solicite verificadores de pacote. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_serialPort" msgid="546083327654631076">"acessar portas seriais"</string>
<string name="permdesc_serialPort" msgid="2991639985224598193">"Permite que o detentor tenha acesso a portas seriais usando a API SerialManager."</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"acessar fornec. de conteúdo externamente"</string>
- <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Permite que o proprietário tenha acesso a fornecedores de conteúdo a partir da camada. Nunca deve ser necessário para aplicativos normais."</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Permite que o proprietário tenha acesso a fornecedores de conteúdo a partir da camada. Nunca deve ser necessário para apps normais."</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"impedir atualiz. autom. do dispositivo"</string>
<string name="permdesc_updateLock" msgid="1655625832166778492">"Permite que o proprietário forneça informações ao sistema sobre quando seria um bom momento para uma reinicialização não interativa para atualizar o dispositivo."</string>
<string name="save_password_message" msgid="767344687139195790">"Deseja que o navegador lembre desta senha?"</string>
@@ -1184,7 +1184,7 @@
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Pouco espaço de armazenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema podem não funcionar"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> está em execução"</string>
- <string name="app_running_notification_text" msgid="4653586947747330058">"Toque para mais informações ou para parar o aplicativo."</string>
+ <string name="app_running_notification_text" msgid="4653586947747330058">"Toque para mais informações ou para parar o app."</string>
<string name="ok" msgid="5970060430562524910">"OK"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
<string name="yes" msgid="5362982303337969312">"OK"</string>
@@ -1201,45 +1201,45 @@
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"Compartilhar com"</string>
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"Compartilhar com %1$s"</string>
- <string name="whichHomeApplication" msgid="4616420172727326782">"Selecione um aplicativo de tela inicial"</string>
+ <string name="whichHomeApplication" msgid="4616420172727326782">"Selecione um app de tela inicial"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Usar como padrão para esta ação."</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Usar um app diferente"</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Padrão claro em Configurações do sistema &gt; Aplicativos &gt; Baixado."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Padrão claro em Configurações do sistema &gt; Apps &gt; Baixado."</string>
<string name="chooseActivity" msgid="7486876147751803333">"Escolher uma ação"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"Selecione um aplicativo para o dispositivo USB"</string>
- <string name="noApplications" msgid="2991814273936504689">"Nenhum aplicativo pode realizar esta ação."</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"Selecione um app para o dispositivo USB"</string>
+ <string name="noApplications" msgid="2991814273936504689">"Nenhum app pode realizar esta ação."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
<string name="aerr_application" msgid="932628488013092776">"O <xliff:g id="APPLICATION">%1$s</xliff:g> parou."</string>
<string name="aerr_process" msgid="4507058997035697579">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> parou."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string>
<string name="anr_activity_process" msgid="5776209883299089767">"A atividade <xliff:g id="ACTIVITY">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-la?"</string>
- <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> não está respondendo. Deseja encerrar o aplicativo?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> não está respondendo. Deseja encerrar o app?"</string>
<string name="anr_process" msgid="6513209874880517125">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> não está respondendo.\n\nDeseja fechá-lo?"</string>
<string name="force_close" msgid="8346072094521265605">"OK"</string>
<string name="report" msgid="4060218260984795706">"Informar"</string>
<string name="wait" msgid="7147118217226317732">"Aguardar"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"A página não responde.\n\nDeseja fechá-la?"</string>
- <string name="launch_warning_title" msgid="1547997780506713581">"Aplicativo redirecionado"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"App redirecionado"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> não está em execução."</string>
<string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> foi iniciado."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"Escala"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"Mostrar sempre"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Reativar isso em Configurações do sistema &gt; Aplicativos &gt; Transferidos."</string>
- <string name="smv_application" msgid="3307209192155442829">"O aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g>, processo <xliff:g id="PROCESS">%2$s</xliff:g>, violou a política StrictMode imposta automaticamente."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Reativar isso em Configurações do sistema &gt; Apps &gt; Transferidos."</string>
+ <string name="smv_application" msgid="3307209192155442829">"O app <xliff:g id="APPLICATION">%1$s</xliff:g>, processo <xliff:g id="PROCESS">%2$s</xliff:g>, violou a política StrictMode imposta automaticamente."</string>
<string name="smv_process" msgid="5120397012047462446">"O processo <xliff:g id="PROCESS">%1$s</xliff:g> violou a política StrictMode imposta automaticamente."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"O Android está sendo atualizado..."</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando aplicativo <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicativos."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Toque para alternar para o aplicativo"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre aplicativos?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro aplicativo já está em execução e deve ser interrompido antes que você inicie um novo aplicativo."</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Toque para alternar para o app"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre apps?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro app já está em execução e deve ser interrompido antes que você inicie um novo app."</string>
<string name="old_app_action" msgid="493129172238566282">"Voltar para <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo aplicativo."</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo app."</string>
<string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Parar o aplicativo antigo sem salvar."</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Parar o app antigo sem salvar."</string>
<string name="sendText" msgid="5209874571959469142">"Escolha uma ação para o texto"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Volume da campainha"</string>
<string name="volume_music" msgid="5421651157138628171">"Volume da mídia"</string>
@@ -1291,7 +1291,7 @@
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"O telefone desconectará temporariamente da rede Wi-Fi enquanto estiver conectado a <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
<string name="select_character" msgid="3365550120617701745">"Inserir caractere"</string>
<string name="sms_control_title" msgid="7296612781128917719">"Enviando mensagens SMS"</string>
- <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envia uma grande quantidade de mensagens SMS. Deseja permitir que este aplicativo continue enviando mensagens?"</string>
+ <string name="sms_control_message" msgid="3867899169651496433">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; envia uma grande quantidade de mensagens SMS. Deseja permitir que este app continue enviando mensagens?"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"Permitir"</string>
<string name="sms_control_no" msgid="625438561395534982">"Negar"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; deseja enviar uma mensagem para &lt;b&gt;<xliff:g id="DEST_ADDRESS">%2$s</xliff:g>&lt;/b&gt;."</string>
@@ -1300,7 +1300,7 @@
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"Enviar"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Cancelar"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Lembrar minha escolha"</string>
- <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"P/ alterar: Configurações &gt; Aplicativos"</string>
+ <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"P/ alterar: Configurações &gt; Apps"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Sempre permitir"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Nunca permitir"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"Cartão SIM removido"</string>
@@ -1334,7 +1334,7 @@
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Desativar o armazenamento USB"</string>
<string name="usb_storage_stop_error_message" msgid="1970374898263063836">"Ocorreu um problema ao desativar o armazenamento USB. Verifique se você desconectou o host USB e tente novamente."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Ativar o armazenamento USB"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Se você ativar o armazenamento USB, alguns aplicativos que estão em uso serão interrompidos e poderão ficar indisponíveis até você desativar o armazenamento USB."</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Se você ativar o armazenamento USB, alguns apps que estão em uso serão interrompidos e poderão ficar indisponíveis até você desativar o armazenamento USB."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"Falha na operação do USB"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Conectado como um dispositivo de mídia"</string>
@@ -1383,29 +1383,29 @@
<string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Cartão SD removido. Insira um novo."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Nenhum atividade correspondente foi encontrada."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"atualizar estatísticas de uso do componente"</string>
- <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Permite que o aplicativo modifique as estatísticas de uso coletadas do componente. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Permite que o app modifique as estatísticas de uso coletadas do componente. Não deve ser usado em apps normais."</string>
<string name="permlab_copyProtectedData" msgid="4341036311211406692">"copiar conteúdo"</string>
- <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Permite que o aplicativo invoque serviços contêiner padrão para copiar conteúdo. Não deve ser usado em aplicativos normais."</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Permite que o app invoque serviços contêiner padrão para copiar conteúdo. Não deve ser usado em apps normais."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Rotear saída de mídia"</string>
- <string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que um aplicativo faça o roteamento de saída de mídia para outros dispositivos externos."</string>
+ <string name="permdesc_route_media_output" msgid="4932818749547244346">"Permite que um app faça o roteamento de saída de mídia para outros dispositivos externos."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Acessar o armazenamento seguro do bloqueio de teclado"</string>
- <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite que o aplicativo acesse o armazenamento seguro do bloqueio de teclado."</string>
+ <string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"Permite que o app acesse o armazenamento seguro do bloqueio de teclado."</string>
<string name="permlab_control_keyguard" msgid="172195184207828387">"Controlar a exibição e ocultação do bloqueio de tela"</string>
- <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Permite que o aplicativo controle o bloqueio de teclado."</string>
+ <string name="permdesc_control_keyguard" msgid="3043732290518629061">"Permite que o app controle o bloqueio de teclado."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Detectar alterações no estado de confiança."</string>
- <string name="permdesc_trust_listener" msgid="8233895334214716864">"Permite que o aplicativo detecte alterações no estado de confiança."</string>
+ <string name="permdesc_trust_listener" msgid="8233895334214716864">"Permite que o app detecte alterações no estado de confiança."</string>
<string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Fornecer um agente de confiança."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Permite que um aplicativo forneça um agente de confiança."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Permite que um app forneça um agente de confiança."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Abrir o menu de configurações do agente de confiança."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Permite que um aplicativo inicie uma atividade que altera o comportamento do agente de confiança."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Permite que um app inicie uma atividade que altera o comportamento do agente de confiança."</string>
<string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Associar a um serviço de agente de confiança"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permite que o aplicativo se associe a um serviço de agente de confiança."</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permite que o app se associe a um serviço de agente de confiança."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interagir com o sistema de atualizações e recuperação"</string>
- <string name="permdesc_recovery" msgid="8511774533266359571">"Permite que um aplicativo interaja com o sistema de recuperação e as atualizações do sistema."</string>
+ <string name="permdesc_recovery" msgid="8511774533266359571">"Permite que um app interaja com o sistema de recuperação e as atualizações do sistema."</string>
<string name="permlab_manageMediaProjection" msgid="1120495449419929218">"Gerenciar sessões de projeção de mídia"</string>
- <string name="permdesc_manageMediaProjection" msgid="8053759147529492856">"Permite que um app gerencie sessões de projeção de mídia. As sessões podem fornecer aos apps a capacidade de capturar conteúdo de tela e de áudio. Isso nunca deve ser necessário em aplicativos normais."</string>
+ <string name="permdesc_manageMediaProjection" msgid="8053759147529492856">"Permite que um app gerencie sessões de projeção de mídia. As sessões podem fornecer aos apps a capacidade de capturar conteúdo de tela e de áudio. Isso nunca deve ser necessário em apps normais."</string>
<string name="permlab_readInstallSessions" msgid="6165432407628065939">"Ler sessões de instalação"</string>
- <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"Permite que um aplicativo leia sessões de instalação. Isso permite que ele veja detalhes sobre as instalações de pacote ativas."</string>
+ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"Permite que um app leia sessões de instalação. Isso permite que ele veja detalhes sobre as instalações de pacote ativas."</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"Toque duas vezes para controlar o zoom"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"Não foi possível adicionar widget."</string>
<string name="ime_action_go" msgid="8320845651737369027">"Ir"</string>
@@ -1417,7 +1417,7 @@
<string name="ime_action_default" msgid="2840921885558045721">"Executar"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Discar número\nusando <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Criar contato \nusando <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"O aplicativo a seguir ou outros aplicativos solicitam permissão para acessar sua conta, agora e no futuro."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"O app a seguir ou outros apps solicitam permissão para acessar sua conta, agora e no futuro."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Deseja permitir essa solicitação?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"Solicitação de acesso"</string>
<string name="allow" msgid="7225948811296386551">"Permitir"</string>
@@ -1513,7 +1513,7 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Alteração do modo"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Selecione um aplicativo"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Selecione um app"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Não foi possível iniciar o <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Compartilhar com"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
@@ -1644,7 +1644,7 @@
<string name="owner_name" msgid="2716755460376028154">"Proprietário"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
<string name="error_message_change_not_allowed" msgid="1347282344200417578">"Esta alteração não é permitida pelo administrador"</string>
- <string name="app_not_found" msgid="3429141853498927379">"Nenhum aplicativo encontrado para executar a ação"</string>
+ <string name="app_not_found" msgid="3429141853498927379">"Nenhum app encontrado para executar a ação"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
<string name="mediasize_iso_a1" msgid="3333060421529791786">"ISO A1"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 12c66619788c..48d4920baa17 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -300,8 +300,8 @@
<string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Permite aplicației să primească și să proceseze mesaje MAP prin Bluetooth. Aceasta înseamnă că aplicația ar putea monitoriza sau șterge mesajele trimise pe dispozitiv fără a le afișa."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"preluare aplicaţii care rulează"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"Permite aplicaţiei să preia informaţiile despre activităţile care rulează în prezent şi care au rulat recent. În acest fel, aplicaţia poate descoperi informaţii despre aplicaţiile care sunt utilizate pe dispozitiv."</string>
- <string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"start a task from recents"</string>
- <string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"Allows the app to use an ActivityManager.RecentTaskInfo object to launch a defunct task that was returned from ActivityManager.getRecentTaskList()."</string>
+ <string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"începeți o sarcină din activități recente"</string>
+ <string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"Permite aplicației să utilizeze obiectul ActivityManager.RecentTaskInfo pentru a lansa o sarcină eșuată, readusă din ActivityManager.getRecentTaskList()."</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"interacţiune între utilizatori"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"Permite aplicaţiei să efectueze acţiuni pentru diferiţi utilizatori pe dispozitiv. Aplicaţiile rău intenţionate pot utiliza această permisiune pentru a încălca protecţia între utilizatori."</string>
<string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"licenţă completă pentru interacţiune între utilizatori"</string>
@@ -1766,8 +1766,8 @@
<string name="lock_to_app_toast_accessible" msgid="3340628918851844044">"Pentru a anula fixarea acestui ecran, atingeți și țineți apăsat pe Recente."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ecranul este fixat. Anularea fixării nu este permisă de organizația dvs."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Utilizați fixarea ecranului?"</string>
- <string name="lock_to_app_description" msgid="9076084599283282800">"Fixarea ecranului îl blochează pe acesta într-un display unic.\n\nPentru a ieși, atingeți și țineți apăsat pe Înapoi și Recente în același timp."</string>
- <string name="lock_to_app_description_accessible" msgid="2132076937479670601">"Fixarea ecranului îl blochează pe acesta într-un display unic.\n\nPentru a ieși, atingeți și țineți apăsat Recente."</string>
+ <string name="lock_to_app_description" msgid="9076084599283282800">"Dacă fixați ecranul, rămâne o singură vizualizare.\n\nPentru a ieși, atingeți și țineți apăsat pe Înapoi și Recente în același timp."</string>
+ <string name="lock_to_app_description_accessible" msgid="2132076937479670601">"Dacă fixați ecranul, rămâne o singură vizualizare.\n\nPentru a ieși, atingeți și țineți apăsat pe Recente."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NU, MULȚUMESC"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"PORNIȚI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ecran fixat"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 3a0e500af3b8..d2cee989c237 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1213,9 +1213,9 @@
<string name="aerr_process" msgid="4507058997035697579">"Kwa bahati mbaya, mchakato wa <xliff:g id="PROCESS">%1$s</xliff:g> umekoma."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> haifanyi kazi.\n\nUnataka kuifunga?"</string>
- <string name="anr_activity_process" msgid="5776209883299089767">"Shughuli <xliff:g id="ACTIVITY">%1$s</xliff:g> haijibu. \n\n Unataka kuifunga?"</string>
- <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> haijibu. Unataka kufunga?"</string>
- <string name="anr_process" msgid="6513209874880517125">"Mchakato <xliff:g id="PROCESS">%1$s</xliff:g> haijibu. \n\n Unataka kuifunga?"</string>
+ <string name="anr_activity_process" msgid="5776209883299089767">"Shughuli ya <xliff:g id="ACTIVITY">%1$s</xliff:g> haifanyi kazi.\n\nJe, ungependa kuifunga?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> haifanyi kazi. Je, ungependa kuifunga?"</string>
+ <string name="anr_process" msgid="6513209874880517125">"Mchakato wa <xliff:g id="PROCESS">%1$s</xliff:g> haufanyi kazi. \n\nJe, ungependa kuifunga?"</string>
<string name="force_close" msgid="8346072094521265605">"Sawa"</string>
<string name="report" msgid="4060218260984795706">"Ripoti"</string>
<string name="wait" msgid="7147118217226317732">"Subiri"</string>
diff --git a/core/res/res/values-sw600dp/dimens_material.xml b/core/res/res/values-sw600dp/dimens_material.xml
index e0aac38ca73c..2547b7afdba0 100644
--- a/core/res/res/values-sw600dp/dimens_material.xml
+++ b/core/res/res/values-sw600dp/dimens_material.xml
@@ -16,9 +16,9 @@
<resources>
<!-- Use the default title sizes on tablets. -->
- <dimen name="text_size_title_material_toolbar">@dimen/text_size_title_material</dimen>
+ <dimen name="text_size_title_material_toolbar">20dp</dimen>
<!-- Use the default subtitle sizes on tablets. -->
- <dimen name="text_size_subtitle_material_toolbar">@dimen/text_size_subhead_material</dimen>
+ <dimen name="text_size_subtitle_material_toolbar">16dp</dimen>
<!-- Default height of an action bar. -->
<dimen name="action_bar_default_height_material">64dp</dimen>
<!-- Default padding of an action bar. -->
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 600e1736c5e5..f2ab08ac3cd1 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1447,7 +1447,7 @@
<string name="submit" msgid="1602335572089911941">"சமர்ப்பி"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"கார் பயன்முறை இயக்கப்பட்டது"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"கார் பயன்முறையிலிருந்து வெளியேற தொடவும்."</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"இணைப்பு முறை அல்லது செயலில் உள்ள ஹாட்ஸ்பாட்"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"டெதெரிங்/ஹாட்ஸ்பாட் இயங்குகிறது"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"அமைக்க, தொடவும்."</string>
<string name="back_button_label" msgid="2300470004503343439">"முந்தையது"</string>
<string name="next_button_label" msgid="1080555104677992408">"அடுத்து"</string>
@@ -1603,7 +1603,7 @@
<string name="kg_wrong_password" msgid="2333281762128113157">"தவறான கடவுச்சொல்"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"தவறான பின்"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
- <string name="kg_pattern_instructions" msgid="398978611683075868">"உங்கள் வடிவத்தை வரையவும்"</string>
+ <string name="kg_pattern_instructions" msgid="398978611683075868">"வடிவத்தை வரையவும்"</string>
<string name="kg_sim_pin_instructions" msgid="2319508550934557331">"சிம் பின்னை உள்ளிடவும்"</string>
<string name="kg_pin_instructions" msgid="2377242233495111557">"பின்னை உள்ளிடுக"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"கடவுச்சொல்லை உள்ளிடவும்"</string>
@@ -1776,7 +1776,7 @@
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"அகற்றும் முன் திறத்தல் வடிவத்தைக் கேள்"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"அகற்றும் முன் கடவுச்சொல்லைக் கேள்"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"பேட்டரியின் ஆயுட்காலத்தை அதிகரிக்க, பேட்டரி சேமிப்பான் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வுறுவதையும் பெரும்பாலான பின்புலத் தரவையும் வரம்பிடுகிறது. ஒத்திசைவைச் சார்ந்திருக்கும் மின்னஞ்சல், மெசேஜ், மேலும் பிற பயன்பாடுகளைத் திறக்கும் வரை, அவை புதுப்பிக்கப்படாமல் இருக்கலாம்.\n\nசாதனம் சார்ஜ் ஆகும் போது, பேட்டரி சேமிப்பான் தானாகவே முடக்கப்படும்."</string>
- <string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>இல் செயல்படாத நேரம் முடியும் வரை"</string>
+ <string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> முடியும் வரை"</string>
<plurals name="zen_mode_duration_minutes">
<item quantity="one" msgid="9040808414992812341">"ஒரு நிமிடம்"</item>
<item quantity="other" msgid="6924190729213550991">"%d நிமிடங்கள்"</item>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 64638ba3f334..2f17e75fa3d6 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1203,8 +1203,7 @@
<string name="whichSendApplicationNamed" msgid="2799370240005424391">"‏%1$s کے ساتھ اشتراک کریں"</string>
<string name="whichHomeApplication" msgid="4616420172727326782">"ایک ہوم ایپ منتخب کریں"</string>
<string name="alwaysUse" msgid="4583018368000610438">"اس کارروائی کیلئے بطور ڈیفالٹ استعمال کریں۔"</string>
- <!-- no translation found for use_a_different_app (8134926230585710243) -->
- <skip />
+ <string name="use_a_different_app" msgid="8134926230585710243">"ایک مختلف ایپ استعمال کریں"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"‏سسٹم ترتیبات &gt; ایپس &gt; ڈاؤن لوڈ کردہ میں ڈیفالٹ صاف کریں۔"</string>
<string name="chooseActivity" msgid="7486876147751803333">"ایک کارروائی منتخب کریں"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"‏USB آلہ کیلئے ایک ایپ منتخب کریں"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 9549df19ac9b..ac17cc72be9b 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1131,7 +1131,7 @@
<item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> 天后"</item>
</plurals>
<string name="preposition_for_date" msgid="9093949757757445117">"日期:<xliff:g id="DATE">%s</xliff:g>"</string>
- <string name="preposition_for_time" msgid="5506831244263083793">"时间:<xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"年份:<xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"天"</string>
<string name="days" msgid="4774547661021344602">"天"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 85c1072c18d7..90217e57a786 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1020,6 +1020,9 @@
<!-- The color applied to framework switch thumbs in their normal state. -->
<attr name="colorSwitchThumbNormal" format="color" />
+ <!-- The color applied to the edge effect on scrolling containers. -->
+ <attr name="colorEdgeEffect" format="color" />
+
<!-- =================== -->
<!-- Lighting properties -->
<!-- =================== -->
@@ -7435,7 +7438,7 @@
<!-- Used as a filter array on the theme to pull out only the EdgeEffect-relevant bits. -->
<declare-styleable name="EdgeEffect">
- <attr name="colorPrimary" />
+ <attr name="colorEdgeEffect" />
</declare-styleable>
<!-- Use <code>tv-input</code> as the root tag of the XML resource that describes a
diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml
index 939cbf14d42c..5773b943abf0 100644
--- a/core/res/res/values/colors_material.xml
+++ b/core/res/res/values/colors_material.xml
@@ -16,11 +16,21 @@
<!-- Colors specific to Material themes. -->
<resources>
- <color name="background_material_dark">#ff212121</color>
- <color name="background_material_light">#fffafafa</color>
+ <color name="background_material_dark">#ff303030</color>
+ <color name="background_material_light">#ffeeeeee</color>
+ <color name="background_floating_material_dark">#ff424242</color>
+ <color name="background_floating_material_light">#ffeeeeee</color>
+
+ <color name="primary_material_dark">#ff212121</color>
+ <color name="primary_material_light">#ffbdbdbd</color>
+ <color name="primary_dark_material_dark">#ff000000</color>
+ <color name="primary_dark_material_light">#ff757575</color>
- <color name="ripple_material_light">#40000000</color>
<color name="ripple_material_dark">#40ffffff</color>
+ <color name="ripple_material_light">#40000000</color>
+
+ <color name="accent_material_light">@color/material_deep_teal_500</color>
+ <color name="accent_material_dark">@color/material_deep_teal_200</color>
<color name="button_material_dark">#ff5a595b</color>
<color name="button_material_light">#ffd6d7d7</color>
@@ -73,8 +83,6 @@
<color name="material_deep_teal_200">#ff80cbc4</color>
<color name="material_deep_teal_500">#ff009688</color>
- <color name="material_blue_grey_50">#ffeceff1</color>
- <color name="material_blue_grey_100">#ffcfd8dc</color>
<color name="material_blue_grey_800">#ff37474f</color>
<color name="material_blue_grey_900">#ff263238</color>
<color name="material_blue_grey_950">#ff21272b</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index e95d7357a759..a153273f0195 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -355,9 +355,9 @@
<!-- Integer parameters of the wifi to cellular handover feature
wifi should not stick to bad networks -->
- <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-60</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-82</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_5GHz">-72</integer>
- <integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_5GHz">-82</integer>
+ <integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_5GHz">-60</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz">-87</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_24GHz">-77</integer>
<integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_24GHz">-65</integer>
@@ -1791,6 +1791,7 @@
<item>SUPL_PORT=7275</item>
<item>NTP_SERVER=north-america.pool.ntp.org</item>
<item>SUPL_VER=0x20000</item>
+ <item>SUPL_MODE=0x01</item>
</string-array>
<!-- If there is no preload VM number in the sim card, carriers such as
@@ -1810,4 +1811,16 @@
<!-- Sprint need a 70 ms delay for 3way call -->
<integer name="config_cdma_3waycall_flash_delay">0</integer>
+
+ <!--SIM does not save, but the voice mail number to be changed. -->
+ <bool name="editable_voicemailnumber">false</bool>
+
+ <!-- service number convert map in roaming network. -->
+ <!-- [dialstring],[replacement][,optional gid] -->
+ <string-array translatable="false" name="dial_string_replace">
+ </string-array>
+
+ <!-- Flag indicating whether radio is to be restarted on the error of
+ PDP_FAIL_REGULAR_DEACTIVATION/0x24 -->
+ <bool name="config_restart_radio_on_pdp_fail_regular_deactivation">false</bool>
</resources>
diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml
index 2b49ba25208c..9836757b9f50 100644
--- a/core/res/res/values/dimens_material.xml
+++ b/core/res/res/values/dimens_material.xml
@@ -42,11 +42,11 @@
<dimen name="text_size_headline_material">24sp</dimen>
<dimen name="text_size_title_material">20sp</dimen>
<dimen name="text_size_subhead_material">16sp</dimen>
- <dimen name="text_size_title_material_toolbar">@dimen/text_size_title_material</dimen>
- <dimen name="text_size_subtitle_material_toolbar">@dimen/text_size_subhead_material</dimen>
+ <dimen name="text_size_title_material_toolbar">20dp</dimen>
+ <dimen name="text_size_subtitle_material_toolbar">16dp</dimen>
<dimen name="text_size_menu_material">16sp</dimen>
- <dimen name="text_size_body_2_material">16sp</dimen>
- <dimen name="text_size_body_1_material">16sp</dimen>
+ <dimen name="text_size_body_2_material">14sp</dimen>
+ <dimen name="text_size_body_1_material">14sp</dimen>
<dimen name="text_size_caption_material">12sp</dimen>
<dimen name="text_size_button_material">14sp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 4bc1ff37414b..a794b626f631 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2101,485 +2101,486 @@
<!-- ===============================================================
Resources added in version 21 of the platform
=============================================================== -->
- <eat-comment />
-
- <public type="attr" name="fastScrollStyle" />
- <public type="attr" name="windowContentTransitions" />
- <public type="attr" name="windowContentTransitionManager" />
- <public type="attr" name="translationZ" />
- <public type="attr" name="tintMode" />
- <public type="attr" name="controlX1" />
- <public type="attr" name="controlY1" />
- <public type="attr" name="controlX2" />
- <public type="attr" name="controlY2" />
- <public type="attr" name="transitionName" />
- <public type="attr" name="transitionGroup" />
- <public type="attr" name="viewportWidth" />
- <public type="attr" name="viewportHeight" />
- <public type="attr" name="fillColor" />
- <public type="attr" name="pathData" />
- <public type="attr" name="strokeColor" />
- <public type="attr" name="strokeWidth" />
- <public type="attr" name="trimPathStart" />
- <public type="attr" name="trimPathEnd" />
- <public type="attr" name="trimPathOffset" />
- <public type="attr" name="strokeLineCap" />
- <public type="attr" name="strokeLineJoin" />
- <public type="attr" name="strokeMiterLimit" />
- <public type="attr" name="colorControlNormal" id="0x1010429"/>
- <public type="attr" name="colorControlActivated" />
- <public type="attr" name="colorButtonNormal" />
- <public type="attr" name="colorControlHighlight" />
- <public type="attr" name="persistableMode" />
- <public type="attr" name="titleTextAppearance" />
- <public type="attr" name="subtitleTextAppearance" />
- <public type="attr" name="slideEdge" />
- <public type="attr" name="actionBarTheme" />
- <public type="attr" name="textAppearanceListItemSecondary" />
- <public type="attr" name="colorPrimary" />
- <public type="attr" name="colorPrimaryDark" />
- <public type="attr" name="colorAccent" />
- <public type="attr" name="nestedScrollingEnabled" />
- <public type="attr" name="windowEnterTransition" />
- <public type="attr" name="windowExitTransition" />
- <public type="attr" name="windowSharedElementEnterTransition" />
- <public type="attr" name="windowSharedElementExitTransition" />
- <public type="attr" name="windowAllowReturnTransitionOverlap" />
- <public type="attr" name="windowAllowEnterTransitionOverlap" />
- <public type="attr" name="sessionService" />
- <public type="attr" name="stackViewStyle" />
- <public type="attr" name="switchStyle" />
- <public type="attr" name="elevation" />
- <public type="attr" name="excludeId" />
- <public type="attr" name="excludeClass" />
- <public type="attr" name="hideOnContentScroll" />
- <public type="attr" name="actionOverflowMenuStyle" />
- <public type="attr" name="documentLaunchMode" />
- <public type="attr" name="maxRecents" />
- <public type="attr" name="autoRemoveFromRecents" />
- <public type="attr" name="stateListAnimator" />
- <public type="attr" name="toId" />
- <public type="attr" name="fromId" />
- <public type="attr" name="reversible" />
- <public type="attr" name="splitTrack" />
- <public type="attr" name="targetName" />
- <public type="attr" name="excludeName" />
- <public type="attr" name="matchOrder" />
- <public type="attr" name="windowDrawsSystemBarBackgrounds" />
- <public type="attr" name="statusBarColor"/>
- <public type="attr" name="navigationBarColor"/>
- <public type="attr" name="contentInsetStart" />
- <public type="attr" name="contentInsetEnd" />
- <public type="attr" name="contentInsetLeft" />
- <public type="attr" name="contentInsetRight" />
- <public type="attr" name="paddingMode" />
- <public type="attr" name="layout_rowWeight" />
- <public type="attr" name="layout_columnWeight" />
- <public type="attr" name="translateX" />
- <public type="attr" name="translateY" />
- <public type="attr" name="selectableItemBackgroundBorderless" />
- <public type="attr" name="elegantTextHeight" />
- <public type="attr" name="searchKeyphraseId" />
- <public type="attr" name="searchKeyphrase" />
- <public type="attr" name="searchKeyphraseSupportedLocales" />
- <public type="attr" name="windowTransitionBackgroundFadeDuration" />
- <public type="attr" name="overlapAnchor" />
- <public type="attr" name="progressTint" />
- <public type="attr" name="progressTintMode" />
- <public type="attr" name="progressBackgroundTint" />
- <public type="attr" name="progressBackgroundTintMode" />
- <public type="attr" name="secondaryProgressTint" />
- <public type="attr" name="secondaryProgressTintMode" />
- <public type="attr" name="indeterminateTint" />
- <public type="attr" name="indeterminateTintMode" />
- <public type="attr" name="backgroundTint" />
- <public type="attr" name="backgroundTintMode" />
- <public type="attr" name="foregroundTint" />
- <public type="attr" name="foregroundTintMode" />
- <public type="attr" name="buttonTint" />
- <public type="attr" name="buttonTintMode" />
- <public type="attr" name="thumbTint" />
- <public type="attr" name="thumbTintMode" />
- <public type="attr" name="fullBackupOnly" />
- <public type="attr" name="propertyXName" />
- <public type="attr" name="propertyYName" />
- <public type="attr" name="relinquishTaskIdentity" />
- <public type="attr" name="tileModeX" />
- <public type="attr" name="tileModeY" />
- <public type="attr" name="actionModeShareDrawable" />
- <public type="attr" name="actionModeFindDrawable" />
- <public type="attr" name="actionModeWebSearchDrawable" />
- <public type="attr" name="transitionVisibilityMode" />
- <public type="attr" name="minimumHorizontalAngle" />
- <public type="attr" name="minimumVerticalAngle" />
- <public type="attr" name="maximumAngle" />
- <public type="attr" name="searchViewStyle" />
- <public type="attr" name="closeIcon" />
- <public type="attr" name="goIcon" />
- <public type="attr" name="searchIcon" />
- <public type="attr" name="voiceIcon" />
- <public type="attr" name="commitIcon" />
- <public type="attr" name="suggestionRowLayout" />
- <public type="attr" name="queryBackground" />
- <public type="attr" name="submitBackground" />
- <public type="attr" name="buttonBarPositiveButtonStyle" />
- <public type="attr" name="buttonBarNeutralButtonStyle" />
- <public type="attr" name="buttonBarNegativeButtonStyle" />
- <public type="attr" name="popupElevation" />
- <public type="attr" name="actionBarPopupTheme" />
- <public type="attr" name="multiArch" />
- <public type="attr" name="touchscreenBlocksFocus" />
- <public type="attr" name="windowElevation" />
- <public type="attr" name="launchTaskBehindTargetAnimation" />
- <public type="attr" name="launchTaskBehindSourceAnimation" />
- <public type="attr" name="restrictionType" />
- <public type="attr" name="dayOfWeekBackground" />
- <public type="attr" name="dayOfWeekTextAppearance" />
- <public type="attr" name="headerMonthTextAppearance" />
- <public type="attr" name="headerDayOfMonthTextAppearance" />
- <public type="attr" name="headerYearTextAppearance" />
- <public type="attr" name="yearListItemTextAppearance" />
- <public type="attr" name="yearListSelectorColor" />
- <public type="attr" name="calendarTextColor" />
- <public type="attr" name="recognitionService" />
- <public type="attr" name="timePickerStyle" />
- <public type="attr" name="timePickerDialogTheme" />
- <public type="attr" name="headerTimeTextAppearance" />
- <public type="attr" name="headerAmPmTextAppearance" />
- <public type="attr" name="numbersTextColor" />
- <public type="attr" name="numbersBackgroundColor" />
- <public type="attr" name="numbersSelectorColor" />
- <public type="attr" name="amPmTextColor" />
- <public type="attr" name="amPmBackgroundColor" />
- <public type="attr" name="searchKeyphraseRecognitionFlags" />
- <public type="attr" name="checkMarkTint" />
- <public type="attr" name="checkMarkTintMode" />
- <public type="attr" name="popupTheme" />
- <public type="attr" name="toolbarStyle" />
- <public type="attr" name="windowClipToOutline" />
- <public type="attr" name="datePickerDialogTheme" />
- <public type="attr" name="showText" />
- <public type="attr" name="windowReturnTransition" />
- <public type="attr" name="windowReenterTransition" />
- <public type="attr" name="windowSharedElementReturnTransition" />
- <public type="attr" name="windowSharedElementReenterTransition" />
- <public type="attr" name="resumeWhilePausing" />
- <public type="attr" name="datePickerMode"/>
- <public type="attr" name="timePickerMode"/>
- <public type="attr" name="inset" />
- <public type="attr" name="letterSpacing" />
- <public type="attr" name="fontFeatureSettings" />
- <public type="attr" name="outlineProvider" />
- <public type="attr" name="contentAgeHint" />
- <public type="attr" name="country" />
- <public type="attr" name="windowSharedElementsUseOverlay" />
- <public type="attr" name="reparent" />
- <public type="attr" name="reparentWithOverlay" />
- <public type="attr" name="ambientShadowAlpha" />
- <public type="attr" name="spotShadowAlpha" />
- <public type="attr" name="navigationIcon" />
- <public type="attr" name="navigationContentDescription" />
- <public type="attr" name="fragmentExitTransition" />
- <public type="attr" name="fragmentEnterTransition" />
- <public type="attr" name="fragmentSharedElementEnterTransition" />
- <public type="attr" name="fragmentReturnTransition" />
- <public type="attr" name="fragmentSharedElementReturnTransition" />
- <public type="attr" name="fragmentReenterTransition" />
- <public type="attr" name="fragmentAllowEnterTransitionOverlap" />
- <public type="attr" name="fragmentAllowReturnTransitionOverlap" />
- <public type="attr" name="patternPathData" />
- <public type="attr" name="strokeAlpha" />
- <public type="attr" name="fillAlpha" />
- <public type="attr" name="windowActivityTransitions" />
-
- <public type="id" name="mask" />
- <public type="id" name="statusBarBackground" />
- <public type="id" name="navigationBarBackground" />
-
- <public type="style" name="Widget.FastScroll" />
- <public type="style" name="Widget.StackView" />
- <public type="style" name="Widget.Toolbar" />
- <public type="style" name="Widget.Toolbar.Button.Navigation" />
-
- <public type="style" name="Widget.DeviceDefault.FastScroll" />
- <public type="style" name="Widget.DeviceDefault.StackView" />
- <public type="style" name="Widget.DeviceDefault.Light.FastScroll" />
- <public type="style" name="Widget.DeviceDefault.Light.StackView" />
-
- <public type="style" name="TextAppearance.Material" />
- <public type="style" name="TextAppearance.Material.Button" />
- <public type="style" name="TextAppearance.Material.Body2" />
- <public type="style" name="TextAppearance.Material.Body1" />
- <public type="style" name="TextAppearance.Material.Caption" />
- <public type="style" name="TextAppearance.Material.DialogWindowTitle" />
- <public type="style" name="TextAppearance.Material.Display4" />
- <public type="style" name="TextAppearance.Material.Display3" />
- <public type="style" name="TextAppearance.Material.Display2" />
- <public type="style" name="TextAppearance.Material.Display1" />
- <public type="style" name="TextAppearance.Material.Headline" />
- <public type="style" name="TextAppearance.Material.Inverse" />
- <public type="style" name="TextAppearance.Material.Large" />
- <public type="style" name="TextAppearance.Material.Large.Inverse" />
- <public type="style" name="TextAppearance.Material.Medium" />
- <public type="style" name="TextAppearance.Material.Medium.Inverse" />
- <public type="style" name="TextAppearance.Material.Menu" />
- <public type="style" name="TextAppearance.Material.Notification" />
- <public type="style" name="TextAppearance.Material.Notification.Emphasis" />
- <public type="style" name="TextAppearance.Material.Notification.Info" />
- <public type="style" name="TextAppearance.Material.Notification.Line2" />
- <public type="style" name="TextAppearance.Material.Notification.Time" />
- <public type="style" name="TextAppearance.Material.Notification.Title" />
- <public type="style" name="TextAppearance.Material.SearchResult.Subtitle" />
- <public type="style" name="TextAppearance.Material.SearchResult.Title" />
- <public type="style" name="TextAppearance.Material.Small" />
- <public type="style" name="TextAppearance.Material.Small.Inverse" />
- <public type="style" name="TextAppearance.Material.Subhead" />
- <public type="style" name="TextAppearance.Material.Title" />
- <public type="style" name="TextAppearance.Material.WindowTitle" />
-
- <public type="style" name="TextAppearance.Material.Widget" />
- <public type="style" name="TextAppearance.Material.Widget.ActionBar.Menu" />
- <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle" />
- <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title" />
- <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title.Inverse" />
- <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle" />
- <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse" />
- <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title" />
- <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title.Inverse" />
- <public type="style" name="TextAppearance.Material.Widget.Button" />
- <public type="style" name="TextAppearance.Material.Widget.DropDownHint" />
- <public type="style" name="TextAppearance.Material.Widget.DropDownItem" />
- <public type="style" name="TextAppearance.Material.Widget.EditText" />
- <public type="style" name="TextAppearance.Material.Widget.IconMenu.Item" />
- <public type="style" name="TextAppearance.Material.Widget.PopupMenu" />
- <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Large" />
- <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Small" />
- <public type="style" name="TextAppearance.Material.Widget.TabWidget" />
- <public type="style" name="TextAppearance.Material.Widget.TextView" />
- <public type="style" name="TextAppearance.Material.Widget.TextView.PopupMenu" />
- <public type="style" name="TextAppearance.Material.Widget.TextView.SpinnerItem" />
- <public type="style" name="TextAppearance.Material.Widget.Toolbar.Subtitle" />
- <public type="style" name="TextAppearance.Material.Widget.Toolbar.Title" />
-
- <public type="style" name="Theme.DeviceDefault.Settings" />
-
- <public type="style" name="Theme.Material" />
- <public type="style" name="Theme.Material.Dialog" />
- <public type="style" name="Theme.Material.Dialog.Alert" />
- <public type="style" name="Theme.Material.Dialog.MinWidth" />
- <public type="style" name="Theme.Material.Dialog.NoActionBar" />
- <public type="style" name="Theme.Material.Dialog.NoActionBar.MinWidth" />
- <public type="style" name="Theme.Material.Dialog.Presentation" />
- <public type="style" name="Theme.Material.DialogWhenLarge" />
- <public type="style" name="Theme.Material.DialogWhenLarge.NoActionBar" />
- <public type="style" name="Theme.Material.InputMethod" />
- <public type="style" name="Theme.Material.NoActionBar" />
- <public type="style" name="Theme.Material.NoActionBar.Fullscreen" />
- <public type="style" name="Theme.Material.NoActionBar.Overscan" />
- <public type="style" name="Theme.Material.NoActionBar.TranslucentDecor" />
- <public type="style" name="Theme.Material.Panel" />
- <public type="style" name="Theme.Material.Settings" />
- <public type="style" name="Theme.Material.Voice" />
- <public type="style" name="Theme.Material.Wallpaper" />
- <public type="style" name="Theme.Material.Wallpaper.NoTitleBar" />
-
- <public type="style" name="Theme.Material.Light" />
- <public type="style" name="Theme.Material.Light.DarkActionBar" />
- <public type="style" name="Theme.Material.Light.Dialog" />
- <public type="style" name="Theme.Material.Light.Dialog.Alert" />
- <public type="style" name="Theme.Material.Light.Dialog.MinWidth" />
- <public type="style" name="Theme.Material.Light.Dialog.NoActionBar" />
- <public type="style" name="Theme.Material.Light.Dialog.NoActionBar.MinWidth" />
- <public type="style" name="Theme.Material.Light.Dialog.Presentation" />
- <public type="style" name="Theme.Material.Light.DialogWhenLarge" />
- <public type="style" name="Theme.Material.Light.DialogWhenLarge.NoActionBar" />
- <public type="style" name="Theme.Material.Light.NoActionBar" />
- <public type="style" name="Theme.Material.Light.NoActionBar.Fullscreen" />
- <public type="style" name="Theme.Material.Light.NoActionBar.Overscan" />
- <public type="style" name="Theme.Material.Light.NoActionBar.TranslucentDecor" />
- <public type="style" name="Theme.Material.Light.Panel" />
- <public type="style" name="Theme.Material.Light.Voice" />
-
- <public type="style" name="ThemeOverlay" />
- <public type="style" name="ThemeOverlay.Material" />
- <public type="style" name="ThemeOverlay.Material.ActionBar" />
- <public type="style" name="ThemeOverlay.Material.Light" />
- <public type="style" name="ThemeOverlay.Material.Dark" />
- <public type="style" name="ThemeOverlay.Material.Dark.ActionBar" />
-
- <public type="style" name="Widget.Material" />
- <public type="style" name="Widget.Material.ActionBar" />
- <public type="style" name="Widget.Material.ActionBar.Solid" />
- <public type="style" name="Widget.Material.ActionBar.TabBar" />
- <public type="style" name="Widget.Material.ActionBar.TabText" />
- <public type="style" name="Widget.Material.ActionBar.TabView" />
- <public type="style" name="Widget.Material.ActionButton" />
- <public type="style" name="Widget.Material.ActionButton.CloseMode" />
- <public type="style" name="Widget.Material.ActionButton.Overflow" />
- <public type="style" name="Widget.Material.ActionMode" />
- <public type="style" name="Widget.Material.AutoCompleteTextView" />
- <public type="style" name="Widget.Material.Button" />
- <public type="style" name="Widget.Material.Button.Borderless" />
- <public type="style" name="Widget.Material.Button.Borderless.Colored" />
- <public type="style" name="Widget.Material.Button.Borderless.Small" />
- <public type="style" name="Widget.Material.Button.Inset" />
- <public type="style" name="Widget.Material.Button.Small" />
- <public type="style" name="Widget.Material.Button.Toggle" />
- <public type="style" name="Widget.Material.ButtonBar" />
- <public type="style" name="Widget.Material.ButtonBar.AlertDialog" />
- <public type="style" name="Widget.Material.CalendarView" />
- <public type="style" name="Widget.Material.CheckedTextView" />
- <public type="style" name="Widget.Material.CompoundButton.CheckBox" />
- <public type="style" name="Widget.Material.CompoundButton.RadioButton" />
- <public type="style" name="Widget.Material.CompoundButton.Star" />
- <public type="style" name="Widget.Material.DatePicker" />
- <public type="style" name="Widget.Material.DropDownItem" />
- <public type="style" name="Widget.Material.DropDownItem.Spinner" />
- <public type="style" name="Widget.Material.EditText" />
- <public type="style" name="Widget.Material.ExpandableListView" />
- <public type="style" name="Widget.Material.FastScroll" />
- <public type="style" name="Widget.Material.GridView" />
- <public type="style" name="Widget.Material.HorizontalScrollView" />
- <public type="style" name="Widget.Material.ImageButton" />
- <public type="style" name="Widget.Material.ListPopupWindow" />
- <public type="style" name="Widget.Material.ListView" />
- <public type="style" name="Widget.Material.ListView.DropDown" />
- <public type="style" name="Widget.Material.MediaRouteButton" />
- <public type="style" name="Widget.Material.PopupMenu" />
- <public type="style" name="Widget.Material.PopupMenu.Overflow" />
- <public type="style" name="Widget.Material.PopupWindow" />
- <public type="style" name="Widget.Material.ProgressBar" />
- <public type="style" name="Widget.Material.ProgressBar.Horizontal" />
- <public type="style" name="Widget.Material.ProgressBar.Large" />
- <public type="style" name="Widget.Material.ProgressBar.Small" />
- <public type="style" name="Widget.Material.ProgressBar.Small.Title" />
- <public type="style" name="Widget.Material.RatingBar" />
- <public type="style" name="Widget.Material.RatingBar.Indicator" />
- <public type="style" name="Widget.Material.RatingBar.Small" />
- <public type="style" name="Widget.Material.ScrollView" />
- <public type="style" name="Widget.Material.SearchView" />
- <public type="style" name="Widget.Material.SeekBar" />
- <public type="style" name="Widget.Material.SegmentedButton" />
- <public type="style" name="Widget.Material.StackView" />
- <public type="style" name="Widget.Material.Spinner" />
- <public type="style" name="Widget.Material.Spinner.Underlined" />
- <public type="style" name="Widget.Material.Tab" />
- <public type="style" name="Widget.Material.TabWidget" />
- <public type="style" name="Widget.Material.TextView" />
- <public type="style" name="Widget.Material.TextView.SpinnerItem" />
- <public type="style" name="Widget.Material.TimePicker" />
- <public type="style" name="Widget.Material.Toolbar" />
- <public type="style" name="Widget.Material.Toolbar.Button.Navigation" />
- <public type="style" name="Widget.Material.WebTextView" />
- <public type="style" name="Widget.Material.WebView" />
-
- <public type="style" name="Widget.Material.Light" />
- <public type="style" name="Widget.Material.Light.ActionBar" />
- <public type="style" name="Widget.Material.Light.ActionBar.Solid" />
- <public type="style" name="Widget.Material.Light.ActionBar.TabBar" />
- <public type="style" name="Widget.Material.Light.ActionBar.TabText" />
- <public type="style" name="Widget.Material.Light.ActionBar.TabView" />
- <public type="style" name="Widget.Material.Light.ActionButton" />
- <public type="style" name="Widget.Material.Light.ActionButton.CloseMode" />
- <public type="style" name="Widget.Material.Light.ActionButton.Overflow" />
- <public type="style" name="Widget.Material.Light.ActionMode" />
- <public type="style" name="Widget.Material.Light.AutoCompleteTextView" />
- <public type="style" name="Widget.Material.Light.Button" />
- <public type="style" name="Widget.Material.Light.Button.Borderless" />
- <public type="style" name="Widget.Material.Light.Button.Borderless.Colored" />
- <public type="style" name="Widget.Material.Light.Button.Borderless.Small" />
- <public type="style" name="Widget.Material.Light.Button.Inset" />
- <public type="style" name="Widget.Material.Light.Button.Small" />
- <public type="style" name="Widget.Material.Light.Button.Toggle" />
- <public type="style" name="Widget.Material.Light.ButtonBar" />
- <public type="style" name="Widget.Material.Light.ButtonBar.AlertDialog" />
- <public type="style" name="Widget.Material.Light.CalendarView" />
- <public type="style" name="Widget.Material.Light.CheckedTextView" />
- <public type="style" name="Widget.Material.Light.CompoundButton.CheckBox" />
- <public type="style" name="Widget.Material.Light.CompoundButton.RadioButton" />
- <public type="style" name="Widget.Material.Light.CompoundButton.Star" />
- <public type="style" name="Widget.Material.Light.DatePicker" />
- <public type="style" name="Widget.Material.Light.DropDownItem" />
- <public type="style" name="Widget.Material.Light.DropDownItem.Spinner" />
- <public type="style" name="Widget.Material.Light.EditText" />
- <public type="style" name="Widget.Material.Light.ExpandableListView" />
- <public type="style" name="Widget.Material.Light.FastScroll" />
- <public type="style" name="Widget.Material.Light.GridView" />
- <public type="style" name="Widget.Material.Light.HorizontalScrollView" />
- <public type="style" name="Widget.Material.Light.ImageButton" />
- <public type="style" name="Widget.Material.Light.ListPopupWindow" />
- <public type="style" name="Widget.Material.Light.ListView" />
- <public type="style" name="Widget.Material.Light.ListView.DropDown" />
- <public type="style" name="Widget.Material.Light.MediaRouteButton" />
- <public type="style" name="Widget.Material.Light.PopupMenu" />
- <public type="style" name="Widget.Material.Light.PopupMenu.Overflow" />
- <public type="style" name="Widget.Material.Light.PopupWindow" />
- <public type="style" name="Widget.Material.Light.ProgressBar" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Horizontal" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Inverse" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Large" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Large.Inverse" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Small" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Small.Inverse" />
- <public type="style" name="Widget.Material.Light.ProgressBar.Small.Title" />
- <public type="style" name="Widget.Material.Light.RatingBar" />
- <public type="style" name="Widget.Material.Light.RatingBar.Indicator" />
- <public type="style" name="Widget.Material.Light.RatingBar.Small" />
- <public type="style" name="Widget.Material.Light.ScrollView" />
- <public type="style" name="Widget.Material.Light.SearchView" />
- <public type="style" name="Widget.Material.Light.SeekBar" />
- <public type="style" name="Widget.Material.Light.SegmentedButton" />
- <public type="style" name="Widget.Material.Light.StackView" />
- <public type="style" name="Widget.Material.Light.Spinner" />
- <public type="style" name="Widget.Material.Light.Spinner.Underlined" />
- <public type="style" name="Widget.Material.Light.Tab" />
- <public type="style" name="Widget.Material.Light.TabWidget" />
- <public type="style" name="Widget.Material.Light.TextView" />
- <public type="style" name="Widget.Material.Light.TextView.SpinnerItem" />
- <public type="style" name="Widget.Material.Light.TimePicker" />
- <public type="style" name="Widget.Material.Light.WebTextView" />
- <public type="style" name="Widget.Material.Light.WebView" />
-
- <!-- @hide This really shouldn't be public; clients using it should use @* to ref it. -->
- <public type="style" name="Theme.Leanback.FormWizard"/>
-
- <public type="string" name="config_webSettingsDefaultTextEncoding" />
-
- <public type="array" name="config_keySystemUuidMapping" />
-
- <!-- An interpolator which accelerates fast but decelerates slowly. -->
- <public type="interpolator" name="fast_out_slow_in" />
- <!-- An interpolator which starts with a peak non-zero velocity and decelerates slowly. -->
- <public type="interpolator" name="linear_out_slow_in" />
- <!-- An interpolator which accelerates fast and keeps accelerating until the end. -->
- <public type="interpolator" name="fast_out_linear_in" />
-
- <!-- Used for Activity Transitions, this transition indicates that no Transition
- should be used. -->
- <public type="transition" name="no_transition" id="0x010f0000"/>
- <!-- A transition that moves and resizes a view -->
- <public type="transition" name="move"/>
- <!-- A transition that fades views in and out. -->
- <public type="transition" name="fade"/>
- <!-- A transition that moves views in or out of the scene to or from the edges when
- a view visibility changes. -->
- <public type="transition" name="explode"/>
- <!-- A transition that moves views in or out of the scene to or from the bottom edge when
- a view visibility changes. -->
- <public type="transition" name="slide_bottom"/>
- <!-- A transition that moves views in or out of the scene to or from the top edge when
- a view visibility changes. -->
- <public type="transition" name="slide_top"/>
- <!-- A transition that moves views in or out of the scene to or from the right edge when
- a view visibility changes. -->
- <public type="transition" name="slide_right"/>
- <!-- A transition that moves views in or out of the scene to or from the left edge when
- a view visibility changes. -->
- <public type="transition" name="slide_left"/>
-
- <!-- WebView error page for when the load fails. @hide @SystemApi -->
- <public type="raw" name="loaderror" id="0x01100000"/>
- <!-- WebView error page for when domain lookup fails. @hide @SystemApi -->
- <public type="raw" name="nodomain"/>
+ <eat-comment />
+
+ <public type="attr" name="fastScrollStyle" id="0x010103f7" />
+ <public type="attr" name="windowContentTransitions" id="0x010103f8" />
+ <public type="attr" name="windowContentTransitionManager" id="0x010103f9" />
+ <public type="attr" name="translationZ" id="0x010103fa" />
+ <public type="attr" name="tintMode" id="0x010103fb" />
+ <public type="attr" name="controlX1" id="0x010103fc" />
+ <public type="attr" name="controlY1" id="0x010103fd" />
+ <public type="attr" name="controlX2" id="0x010103fe" />
+ <public type="attr" name="controlY2" id="0x010103ff" />
+ <public type="attr" name="transitionName" id="0x01010400" />
+ <public type="attr" name="transitionGroup" id="0x01010401" />
+ <public type="attr" name="viewportWidth" id="0x01010402" />
+ <public type="attr" name="viewportHeight" id="0x01010403" />
+ <public type="attr" name="fillColor" id="0x01010404" />
+ <public type="attr" name="pathData" id="0x01010405" />
+ <public type="attr" name="strokeColor" id="0x01010406" />
+ <public type="attr" name="strokeWidth" id="0x01010407" />
+ <public type="attr" name="trimPathStart" id="0x01010408" />
+ <public type="attr" name="trimPathEnd" id="0x01010409" />
+ <public type="attr" name="trimPathOffset" id="0x0101040a" />
+ <public type="attr" name="strokeLineCap" id="0x0101040b" />
+ <public type="attr" name="strokeLineJoin" id="0x0101040c" />
+ <public type="attr" name="strokeMiterLimit" id="0x0101040d" />
+ <public type="attr" name="colorControlNormal" id="0x01010429" />
+ <public type="attr" name="colorControlActivated" id="0x0101042a" />
+ <public type="attr" name="colorButtonNormal" id="0x0101042b" />
+ <public type="attr" name="colorControlHighlight" id="0x0101042c" />
+ <public type="attr" name="persistableMode" id="0x0101042d" />
+ <public type="attr" name="titleTextAppearance" id="0x0101042e" />
+ <public type="attr" name="subtitleTextAppearance" id="0x0101042f" />
+ <public type="attr" name="slideEdge" id="0x01010430" />
+ <public type="attr" name="actionBarTheme" id="0x01010431" />
+ <public type="attr" name="textAppearanceListItemSecondary" id="0x01010432" />
+ <public type="attr" name="colorPrimary" id="0x01010433" />
+ <public type="attr" name="colorPrimaryDark" id="0x01010434" />
+ <public type="attr" name="colorAccent" id="0x01010435" />
+ <public type="attr" name="nestedScrollingEnabled" id="0x01010436" />
+ <public type="attr" name="windowEnterTransition" id="0x01010437" />
+ <public type="attr" name="windowExitTransition" id="0x01010438" />
+ <public type="attr" name="windowSharedElementEnterTransition" id="0x01010439" />
+ <public type="attr" name="windowSharedElementExitTransition" id="0x0101043a" />
+ <public type="attr" name="windowAllowReturnTransitionOverlap" id="0x0101043b" />
+ <public type="attr" name="windowAllowEnterTransitionOverlap" id="0x0101043c" />
+ <public type="attr" name="sessionService" id="0x0101043d" />
+ <public type="attr" name="stackViewStyle" id="0x0101043e" />
+ <public type="attr" name="switchStyle" id="0x0101043f" />
+ <public type="attr" name="elevation" id="0x01010440" />
+ <public type="attr" name="excludeId" id="0x01010441" />
+ <public type="attr" name="excludeClass" id="0x01010442" />
+ <public type="attr" name="hideOnContentScroll" id="0x01010443" />
+ <public type="attr" name="actionOverflowMenuStyle" id="0x01010444" />
+ <public type="attr" name="documentLaunchMode" id="0x01010445" />
+ <public type="attr" name="maxRecents" id="0x01010446" />
+ <public type="attr" name="autoRemoveFromRecents" id="0x01010447" />
+ <public type="attr" name="stateListAnimator" id="0x01010448" />
+ <public type="attr" name="toId" id="0x01010449" />
+ <public type="attr" name="fromId" id="0x0101044a" />
+ <public type="attr" name="reversible" id="0x0101044b" />
+ <public type="attr" name="splitTrack" id="0x0101044c" />
+ <public type="attr" name="targetName" id="0x0101044d" />
+ <public type="attr" name="excludeName" id="0x0101044e" />
+ <public type="attr" name="matchOrder" id="0x0101044f" />
+ <public type="attr" name="windowDrawsSystemBarBackgrounds" id="0x01010450" />
+ <public type="attr" name="statusBarColor" id="0x01010451" />
+ <public type="attr" name="navigationBarColor" id="0x01010452" />
+ <public type="attr" name="contentInsetStart" id="0x01010453" />
+ <public type="attr" name="contentInsetEnd" id="0x01010454" />
+ <public type="attr" name="contentInsetLeft" id="0x01010455" />
+ <public type="attr" name="contentInsetRight" id="0x01010456" />
+ <public type="attr" name="paddingMode" id="0x01010457" />
+ <public type="attr" name="layout_rowWeight" id="0x01010458" />
+ <public type="attr" name="layout_columnWeight" id="0x01010459" />
+ <public type="attr" name="translateX" id="0x0101045a" />
+ <public type="attr" name="translateY" id="0x0101045b" />
+ <public type="attr" name="selectableItemBackgroundBorderless" id="0x0101045c" />
+ <public type="attr" name="elegantTextHeight" id="0x0101045d" />
+ <public type="attr" name="searchKeyphraseId" id="0x0101045e" />
+ <public type="attr" name="searchKeyphrase" id="0x0101045f" />
+ <public type="attr" name="searchKeyphraseSupportedLocales" id="0x01010460" />
+ <public type="attr" name="windowTransitionBackgroundFadeDuration" id="0x01010461" />
+ <public type="attr" name="overlapAnchor" id="0x01010462" />
+ <public type="attr" name="progressTint" id="0x01010463" />
+ <public type="attr" name="progressTintMode" id="0x01010464" />
+ <public type="attr" name="progressBackgroundTint" id="0x01010465" />
+ <public type="attr" name="progressBackgroundTintMode" id="0x01010466" />
+ <public type="attr" name="secondaryProgressTint" id="0x01010467" />
+ <public type="attr" name="secondaryProgressTintMode" id="0x01010468" />
+ <public type="attr" name="indeterminateTint" id="0x01010469" />
+ <public type="attr" name="indeterminateTintMode" id="0x0101046a" />
+ <public type="attr" name="backgroundTint" id="0x0101046b" />
+ <public type="attr" name="backgroundTintMode" id="0x0101046c" />
+ <public type="attr" name="foregroundTint" id="0x0101046d" />
+ <public type="attr" name="foregroundTintMode" id="0x0101046e" />
+ <public type="attr" name="buttonTint" id="0x0101046f" />
+ <public type="attr" name="buttonTintMode" id="0x01010470" />
+ <public type="attr" name="thumbTint" id="0x01010471" />
+ <public type="attr" name="thumbTintMode" id="0x01010472" />
+ <public type="attr" name="fullBackupOnly" id="0x01010473" />
+ <public type="attr" name="propertyXName" id="0x01010474" />
+ <public type="attr" name="propertyYName" id="0x01010475" />
+ <public type="attr" name="relinquishTaskIdentity" id="0x01010476" />
+ <public type="attr" name="tileModeX" id="0x01010477" />
+ <public type="attr" name="tileModeY" id="0x01010478" />
+ <public type="attr" name="actionModeShareDrawable" id="0x01010479" />
+ <public type="attr" name="actionModeFindDrawable" id="0x0101047a" />
+ <public type="attr" name="actionModeWebSearchDrawable" id="0x0101047b" />
+ <public type="attr" name="transitionVisibilityMode" id="0x0101047c" />
+ <public type="attr" name="minimumHorizontalAngle" id="0x0101047d" />
+ <public type="attr" name="minimumVerticalAngle" id="0x0101047e" />
+ <public type="attr" name="maximumAngle" id="0x0101047f" />
+ <public type="attr" name="searchViewStyle" id="0x01010480" />
+ <public type="attr" name="closeIcon" id="0x01010481" />
+ <public type="attr" name="goIcon" id="0x01010482" />
+ <public type="attr" name="searchIcon" id="0x01010483" />
+ <public type="attr" name="voiceIcon" id="0x01010484" />
+ <public type="attr" name="commitIcon" id="0x01010485" />
+ <public type="attr" name="suggestionRowLayout" id="0x01010486" />
+ <public type="attr" name="queryBackground" id="0x01010487" />
+ <public type="attr" name="submitBackground" id="0x01010488" />
+ <public type="attr" name="buttonBarPositiveButtonStyle" id="0x01010489" />
+ <public type="attr" name="buttonBarNeutralButtonStyle" id="0x0101048a" />
+ <public type="attr" name="buttonBarNegativeButtonStyle" id="0x0101048b" />
+ <public type="attr" name="popupElevation" id="0x0101048c" />
+ <public type="attr" name="actionBarPopupTheme" id="0x0101048d" />
+ <public type="attr" name="multiArch" id="0x0101048e" />
+ <public type="attr" name="touchscreenBlocksFocus" id="0x0101048f" />
+ <public type="attr" name="windowElevation" id="0x01010490" />
+ <public type="attr" name="launchTaskBehindTargetAnimation" id="0x01010491" />
+ <public type="attr" name="launchTaskBehindSourceAnimation" id="0x01010492" />
+ <public type="attr" name="restrictionType" id="0x01010493" />
+ <public type="attr" name="dayOfWeekBackground" id="0x01010494" />
+ <public type="attr" name="dayOfWeekTextAppearance" id="0x01010495" />
+ <public type="attr" name="headerMonthTextAppearance" id="0x01010496" />
+ <public type="attr" name="headerDayOfMonthTextAppearance" id="0x01010497" />
+ <public type="attr" name="headerYearTextAppearance" id="0x01010498" />
+ <public type="attr" name="yearListItemTextAppearance" id="0x01010499" />
+ <public type="attr" name="yearListSelectorColor" id="0x0101049a" />
+ <public type="attr" name="calendarTextColor" id="0x0101049b" />
+ <public type="attr" name="recognitionService" id="0x0101049c" />
+ <public type="attr" name="timePickerStyle" id="0x0101049d" />
+ <public type="attr" name="timePickerDialogTheme" id="0x0101049e" />
+ <public type="attr" name="headerTimeTextAppearance" id="0x0101049f" />
+ <public type="attr" name="headerAmPmTextAppearance" id="0x010104a0" />
+ <public type="attr" name="numbersTextColor" id="0x010104a1" />
+ <public type="attr" name="numbersBackgroundColor" id="0x010104a2" />
+ <public type="attr" name="numbersSelectorColor" id="0x010104a3" />
+ <public type="attr" name="amPmTextColor" id="0x010104a4" />
+ <public type="attr" name="amPmBackgroundColor" id="0x010104a5" />
+ <public type="attr" name="searchKeyphraseRecognitionFlags" id="0x010104a6" />
+ <public type="attr" name="checkMarkTint" id="0x010104a7" />
+ <public type="attr" name="checkMarkTintMode" id="0x010104a8" />
+ <public type="attr" name="popupTheme" id="0x010104a9" />
+ <public type="attr" name="toolbarStyle" id="0x010104aa" />
+ <public type="attr" name="windowClipToOutline" id="0x010104ab" />
+ <public type="attr" name="datePickerDialogTheme" id="0x010104ac" />
+ <public type="attr" name="showText" id="0x010104ad" />
+ <public type="attr" name="windowReturnTransition" id="0x010104ae" />
+ <public type="attr" name="windowReenterTransition" id="0x010104af" />
+ <public type="attr" name="windowSharedElementReturnTransition" id="0x010104b0" />
+ <public type="attr" name="windowSharedElementReenterTransition" id="0x010104b1" />
+ <public type="attr" name="resumeWhilePausing" id="0x010104b2" />
+ <public type="attr" name="datePickerMode" id="0x010104b3" />
+ <public type="attr" name="timePickerMode" id="0x010104b4" />
+ <public type="attr" name="inset" id="0x010104b5" />
+ <public type="attr" name="letterSpacing" id="0x010104b6" />
+ <public type="attr" name="fontFeatureSettings" id="0x010104b7" />
+ <public type="attr" name="outlineProvider" id="0x010104b8" />
+ <public type="attr" name="contentAgeHint" id="0x010104b9" />
+ <public type="attr" name="country" id="0x010104ba" />
+ <public type="attr" name="windowSharedElementsUseOverlay" id="0x010104bb" />
+ <public type="attr" name="reparent" id="0x010104bc" />
+ <public type="attr" name="reparentWithOverlay" id="0x010104bd" />
+ <public type="attr" name="ambientShadowAlpha" id="0x010104be" />
+ <public type="attr" name="spotShadowAlpha" id="0x010104bf" />
+ <public type="attr" name="navigationIcon" id="0x010104c0" />
+ <public type="attr" name="navigationContentDescription" id="0x010104c1" />
+ <public type="attr" name="fragmentExitTransition" id="0x010104c2" />
+ <public type="attr" name="fragmentEnterTransition" id="0x010104c3" />
+ <public type="attr" name="fragmentSharedElementEnterTransition" id="0x010104c4" />
+ <public type="attr" name="fragmentReturnTransition" id="0x010104c5" />
+ <public type="attr" name="fragmentSharedElementReturnTransition" id="0x010104c6" />
+ <public type="attr" name="fragmentReenterTransition" id="0x010104c7" />
+ <public type="attr" name="fragmentAllowEnterTransitionOverlap" id="0x010104c8" />
+ <public type="attr" name="fragmentAllowReturnTransitionOverlap" id="0x010104c9" />
+ <public type="attr" name="patternPathData" id="0x010104ca" />
+ <public type="attr" name="strokeAlpha" id="0x010104cb" />
+ <public type="attr" name="fillAlpha" id="0x010104cc" />
+ <public type="attr" name="windowActivityTransitions" id="0x010104cd" />
+ <public type="attr" name="colorEdgeEffect" id="0x010104ce" />
+
+ <public type="id" name="mask" id="0x0102002e" />
+ <public type="id" name="statusBarBackground" id="0x0102002f" />
+ <public type="id" name="navigationBarBackground" id="0x01020030" />
+
+ <public type="style" name="Widget.FastScroll" id="0x010301e5" />
+ <public type="style" name="Widget.StackView" id="0x010301e6" />
+ <public type="style" name="Widget.Toolbar" id="0x010301e7" />
+ <public type="style" name="Widget.Toolbar.Button.Navigation" id="0x010301e8" />
+
+ <public type="style" name="Widget.DeviceDefault.FastScroll" id="0x010301e9" />
+ <public type="style" name="Widget.DeviceDefault.StackView" id="0x010301ea" />
+ <public type="style" name="Widget.DeviceDefault.Light.FastScroll" id="0x010301eb" />
+ <public type="style" name="Widget.DeviceDefault.Light.StackView" id="0x010301ec" />
+
+ <public type="style" name="TextAppearance.Material" id="0x010301ed" />
+ <public type="style" name="TextAppearance.Material.Button" id="0x010301ee" />
+ <public type="style" name="TextAppearance.Material.Body2" id="0x010301ef" />
+ <public type="style" name="TextAppearance.Material.Body1" id="0x010301f0" />
+ <public type="style" name="TextAppearance.Material.Caption" id="0x010301f1" />
+ <public type="style" name="TextAppearance.Material.DialogWindowTitle" id="0x010301f2" />
+ <public type="style" name="TextAppearance.Material.Display4" id="0x010301f3" />
+ <public type="style" name="TextAppearance.Material.Display3" id="0x010301f4" />
+ <public type="style" name="TextAppearance.Material.Display2" id="0x010301f5" />
+ <public type="style" name="TextAppearance.Material.Display1" id="0x010301f6" />
+ <public type="style" name="TextAppearance.Material.Headline" id="0x010301f7" />
+ <public type="style" name="TextAppearance.Material.Inverse" id="0x010301f8" />
+ <public type="style" name="TextAppearance.Material.Large" id="0x010301f9" />
+ <public type="style" name="TextAppearance.Material.Large.Inverse" id="0x010301fa" />
+ <public type="style" name="TextAppearance.Material.Medium" id="0x010301fb" />
+ <public type="style" name="TextAppearance.Material.Medium.Inverse" id="0x010301fc" />
+ <public type="style" name="TextAppearance.Material.Menu" id="0x010301fd" />
+ <public type="style" name="TextAppearance.Material.Notification" id="0x010301fe" />
+ <public type="style" name="TextAppearance.Material.Notification.Emphasis" id="0x010301ff" />
+ <public type="style" name="TextAppearance.Material.Notification.Info" id="0x01030200" />
+ <public type="style" name="TextAppearance.Material.Notification.Line2" id="0x01030201" />
+ <public type="style" name="TextAppearance.Material.Notification.Time" id="0x01030202" />
+ <public type="style" name="TextAppearance.Material.Notification.Title" id="0x01030203" />
+ <public type="style" name="TextAppearance.Material.SearchResult.Subtitle" id="0x01030204" />
+ <public type="style" name="TextAppearance.Material.SearchResult.Title" id="0x01030205" />
+ <public type="style" name="TextAppearance.Material.Small" id="0x01030206" />
+ <public type="style" name="TextAppearance.Material.Small.Inverse" id="0x01030207" />
+ <public type="style" name="TextAppearance.Material.Subhead" id="0x01030208" />
+ <public type="style" name="TextAppearance.Material.Title" id="0x01030209" />
+ <public type="style" name="TextAppearance.Material.WindowTitle" id="0x0103020a" />
+
+ <public type="style" name="TextAppearance.Material.Widget" id="0x0103020b" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionBar.Menu" id="0x0103020c" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle" id="0x0103020d" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse" id="0x0103020e" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title" id="0x0103020f" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionBar.Title.Inverse" id="0x01030210" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle" id="0x01030211" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse" id="0x01030212" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title" id="0x01030213" />
+ <public type="style" name="TextAppearance.Material.Widget.ActionMode.Title.Inverse" id="0x01030214" />
+ <public type="style" name="TextAppearance.Material.Widget.Button" id="0x01030215" />
+ <public type="style" name="TextAppearance.Material.Widget.DropDownHint" id="0x01030216" />
+ <public type="style" name="TextAppearance.Material.Widget.DropDownItem" id="0x01030217" />
+ <public type="style" name="TextAppearance.Material.Widget.EditText" id="0x01030218" />
+ <public type="style" name="TextAppearance.Material.Widget.IconMenu.Item" id="0x01030219" />
+ <public type="style" name="TextAppearance.Material.Widget.PopupMenu" id="0x0103021a" />
+ <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Large" id="0x0103021b" />
+ <public type="style" name="TextAppearance.Material.Widget.PopupMenu.Small" id="0x0103021c" />
+ <public type="style" name="TextAppearance.Material.Widget.TabWidget" id="0x0103021d" />
+ <public type="style" name="TextAppearance.Material.Widget.TextView" id="0x0103021e" />
+ <public type="style" name="TextAppearance.Material.Widget.TextView.PopupMenu" id="0x0103021f" />
+ <public type="style" name="TextAppearance.Material.Widget.TextView.SpinnerItem" id="0x01030220" />
+ <public type="style" name="TextAppearance.Material.Widget.Toolbar.Subtitle" id="0x01030221" />
+ <public type="style" name="TextAppearance.Material.Widget.Toolbar.Title" id="0x01030222" />
+
+ <public type="style" name="Theme.DeviceDefault.Settings" id="0x01030223" />
+
+ <public type="style" name="Theme.Material" id="0x01030224" />
+ <public type="style" name="Theme.Material.Dialog" id="0x01030225" />
+ <public type="style" name="Theme.Material.Dialog.Alert" id="0x01030226" />
+ <public type="style" name="Theme.Material.Dialog.MinWidth" id="0x01030227" />
+ <public type="style" name="Theme.Material.Dialog.NoActionBar" id="0x01030228" />
+ <public type="style" name="Theme.Material.Dialog.NoActionBar.MinWidth" id="0x01030229" />
+ <public type="style" name="Theme.Material.Dialog.Presentation" id="0x0103022a" />
+ <public type="style" name="Theme.Material.DialogWhenLarge" id="0x0103022b" />
+ <public type="style" name="Theme.Material.DialogWhenLarge.NoActionBar" id="0x0103022c" />
+ <public type="style" name="Theme.Material.InputMethod" id="0x0103022d" />
+ <public type="style" name="Theme.Material.NoActionBar" id="0x0103022e" />
+ <public type="style" name="Theme.Material.NoActionBar.Fullscreen" id="0x0103022f" />
+ <public type="style" name="Theme.Material.NoActionBar.Overscan" id="0x01030230" />
+ <public type="style" name="Theme.Material.NoActionBar.TranslucentDecor" id="0x01030231" />
+ <public type="style" name="Theme.Material.Panel" id="0x01030232" />
+ <public type="style" name="Theme.Material.Settings" id="0x01030233" />
+ <public type="style" name="Theme.Material.Voice" id="0x01030234" />
+ <public type="style" name="Theme.Material.Wallpaper" id="0x01030235" />
+ <public type="style" name="Theme.Material.Wallpaper.NoTitleBar" id="0x01030236" />
+
+ <public type="style" name="Theme.Material.Light" id="0x01030237" />
+ <public type="style" name="Theme.Material.Light.DarkActionBar" id="0x01030238" />
+ <public type="style" name="Theme.Material.Light.Dialog" id="0x01030239" />
+ <public type="style" name="Theme.Material.Light.Dialog.Alert" id="0x0103023a" />
+ <public type="style" name="Theme.Material.Light.Dialog.MinWidth" id="0x0103023b" />
+ <public type="style" name="Theme.Material.Light.Dialog.NoActionBar" id="0x0103023c" />
+ <public type="style" name="Theme.Material.Light.Dialog.NoActionBar.MinWidth" id="0x0103023d" />
+ <public type="style" name="Theme.Material.Light.Dialog.Presentation" id="0x0103023e" />
+ <public type="style" name="Theme.Material.Light.DialogWhenLarge" id="0x0103023f" />
+ <public type="style" name="Theme.Material.Light.DialogWhenLarge.NoActionBar" id="0x01030240" />
+ <public type="style" name="Theme.Material.Light.NoActionBar" id="0x01030241" />
+ <public type="style" name="Theme.Material.Light.NoActionBar.Fullscreen" id="0x01030242" />
+ <public type="style" name="Theme.Material.Light.NoActionBar.Overscan" id="0x01030243" />
+ <public type="style" name="Theme.Material.Light.NoActionBar.TranslucentDecor" id="0x01030244" />
+ <public type="style" name="Theme.Material.Light.Panel" id="0x01030245" />
+ <public type="style" name="Theme.Material.Light.Voice" id="0x01030246" />
+
+ <public type="style" name="ThemeOverlay" id="0x01030247" />
+ <public type="style" name="ThemeOverlay.Material" id="0x01030248" />
+ <public type="style" name="ThemeOverlay.Material.ActionBar" id="0x01030249" />
+ <public type="style" name="ThemeOverlay.Material.Light" id="0x0103024a" />
+ <public type="style" name="ThemeOverlay.Material.Dark" id="0x0103024b" />
+ <public type="style" name="ThemeOverlay.Material.Dark.ActionBar" id="0x0103024c" />
+
+ <public type="style" name="Widget.Material" id="0x0103024d" />
+ <public type="style" name="Widget.Material.ActionBar" id="0x0103024e" />
+ <public type="style" name="Widget.Material.ActionBar.Solid" id="0x0103024f" />
+ <public type="style" name="Widget.Material.ActionBar.TabBar" id="0x01030250" />
+ <public type="style" name="Widget.Material.ActionBar.TabText" id="0x01030251" />
+ <public type="style" name="Widget.Material.ActionBar.TabView" id="0x01030252" />
+ <public type="style" name="Widget.Material.ActionButton" id="0x01030253" />
+ <public type="style" name="Widget.Material.ActionButton.CloseMode" id="0x01030254" />
+ <public type="style" name="Widget.Material.ActionButton.Overflow" id="0x01030255" />
+ <public type="style" name="Widget.Material.ActionMode" id="0x01030256" />
+ <public type="style" name="Widget.Material.AutoCompleteTextView" id="0x01030257" />
+ <public type="style" name="Widget.Material.Button" id="0x01030258" />
+ <public type="style" name="Widget.Material.Button.Borderless" id="0x01030259" />
+ <public type="style" name="Widget.Material.Button.Borderless.Colored" id="0x0103025a" />
+ <public type="style" name="Widget.Material.Button.Borderless.Small" id="0x0103025b" />
+ <public type="style" name="Widget.Material.Button.Inset" id="0x0103025c" />
+ <public type="style" name="Widget.Material.Button.Small" id="0x0103025d" />
+ <public type="style" name="Widget.Material.Button.Toggle" id="0x0103025e" />
+ <public type="style" name="Widget.Material.ButtonBar" id="0x0103025f" />
+ <public type="style" name="Widget.Material.ButtonBar.AlertDialog" id="0x01030260" />
+ <public type="style" name="Widget.Material.CalendarView" id="0x01030261" />
+ <public type="style" name="Widget.Material.CheckedTextView" id="0x01030262" />
+ <public type="style" name="Widget.Material.CompoundButton.CheckBox" id="0x01030263" />
+ <public type="style" name="Widget.Material.CompoundButton.RadioButton" id="0x01030264" />
+ <public type="style" name="Widget.Material.CompoundButton.Star" id="0x01030265" />
+ <public type="style" name="Widget.Material.DatePicker" id="0x01030266" />
+ <public type="style" name="Widget.Material.DropDownItem" id="0x01030267" />
+ <public type="style" name="Widget.Material.DropDownItem.Spinner" id="0x01030268" />
+ <public type="style" name="Widget.Material.EditText" id="0x01030269" />
+ <public type="style" name="Widget.Material.ExpandableListView" id="0x0103026a" />
+ <public type="style" name="Widget.Material.FastScroll" id="0x0103026b" />
+ <public type="style" name="Widget.Material.GridView" id="0x0103026c" />
+ <public type="style" name="Widget.Material.HorizontalScrollView" id="0x0103026d" />
+ <public type="style" name="Widget.Material.ImageButton" id="0x0103026e" />
+ <public type="style" name="Widget.Material.ListPopupWindow" id="0x0103026f" />
+ <public type="style" name="Widget.Material.ListView" id="0x01030270" />
+ <public type="style" name="Widget.Material.ListView.DropDown" id="0x01030271" />
+ <public type="style" name="Widget.Material.MediaRouteButton" id="0x01030272" />
+ <public type="style" name="Widget.Material.PopupMenu" id="0x01030273" />
+ <public type="style" name="Widget.Material.PopupMenu.Overflow" id="0x01030274" />
+ <public type="style" name="Widget.Material.PopupWindow" id="0x01030275" />
+ <public type="style" name="Widget.Material.ProgressBar" id="0x01030276" />
+ <public type="style" name="Widget.Material.ProgressBar.Horizontal" id="0x01030277" />
+ <public type="style" name="Widget.Material.ProgressBar.Large" id="0x01030278" />
+ <public type="style" name="Widget.Material.ProgressBar.Small" id="0x01030279" />
+ <public type="style" name="Widget.Material.ProgressBar.Small.Title" id="0x0103027a" />
+ <public type="style" name="Widget.Material.RatingBar" id="0x0103027b" />
+ <public type="style" name="Widget.Material.RatingBar.Indicator" id="0x0103027c" />
+ <public type="style" name="Widget.Material.RatingBar.Small" id="0x0103027d" />
+ <public type="style" name="Widget.Material.ScrollView" id="0x0103027e" />
+ <public type="style" name="Widget.Material.SearchView" id="0x0103027f" />
+ <public type="style" name="Widget.Material.SeekBar" id="0x01030280" />
+ <public type="style" name="Widget.Material.SegmentedButton" id="0x01030281" />
+ <public type="style" name="Widget.Material.StackView" id="0x01030282" />
+ <public type="style" name="Widget.Material.Spinner" id="0x01030283" />
+ <public type="style" name="Widget.Material.Spinner.Underlined" id="0x01030284" />
+ <public type="style" name="Widget.Material.Tab" id="0x01030285" />
+ <public type="style" name="Widget.Material.TabWidget" id="0x01030286" />
+ <public type="style" name="Widget.Material.TextView" id="0x01030287" />
+ <public type="style" name="Widget.Material.TextView.SpinnerItem" id="0x01030288" />
+ <public type="style" name="Widget.Material.TimePicker" id="0x01030289" />
+ <public type="style" name="Widget.Material.Toolbar" id="0x0103028a" />
+ <public type="style" name="Widget.Material.Toolbar.Button.Navigation" id="0x0103028b" />
+ <public type="style" name="Widget.Material.WebTextView" id="0x0103028c" />
+ <public type="style" name="Widget.Material.WebView" id="0x0103028d" />
+
+ <public type="style" name="Widget.Material.Light" id="0x0103028e" />
+ <public type="style" name="Widget.Material.Light.ActionBar" id="0x0103028f" />
+ <public type="style" name="Widget.Material.Light.ActionBar.Solid" id="0x01030290" />
+ <public type="style" name="Widget.Material.Light.ActionBar.TabBar" id="0x01030291" />
+ <public type="style" name="Widget.Material.Light.ActionBar.TabText" id="0x01030292" />
+ <public type="style" name="Widget.Material.Light.ActionBar.TabView" id="0x01030293" />
+ <public type="style" name="Widget.Material.Light.ActionButton" id="0x01030294" />
+ <public type="style" name="Widget.Material.Light.ActionButton.CloseMode" id="0x01030295" />
+ <public type="style" name="Widget.Material.Light.ActionButton.Overflow" id="0x01030296" />
+ <public type="style" name="Widget.Material.Light.ActionMode" id="0x01030297" />
+ <public type="style" name="Widget.Material.Light.AutoCompleteTextView" id="0x01030298" />
+ <public type="style" name="Widget.Material.Light.Button" id="0x01030299" />
+ <public type="style" name="Widget.Material.Light.Button.Borderless" id="0x0103029a" />
+ <public type="style" name="Widget.Material.Light.Button.Borderless.Colored" id="0x0103029b" />
+ <public type="style" name="Widget.Material.Light.Button.Borderless.Small" id="0x0103029c" />
+ <public type="style" name="Widget.Material.Light.Button.Inset" id="0x0103029d" />
+ <public type="style" name="Widget.Material.Light.Button.Small" id="0x0103029e" />
+ <public type="style" name="Widget.Material.Light.Button.Toggle" id="0x0103029f" />
+ <public type="style" name="Widget.Material.Light.ButtonBar" id="0x010302a0" />
+ <public type="style" name="Widget.Material.Light.ButtonBar.AlertDialog" id="0x010302a1" />
+ <public type="style" name="Widget.Material.Light.CalendarView" id="0x010302a2" />
+ <public type="style" name="Widget.Material.Light.CheckedTextView" id="0x010302a3" />
+ <public type="style" name="Widget.Material.Light.CompoundButton.CheckBox" id="0x010302a4" />
+ <public type="style" name="Widget.Material.Light.CompoundButton.RadioButton" id="0x010302a5" />
+ <public type="style" name="Widget.Material.Light.CompoundButton.Star" id="0x010302a6" />
+ <public type="style" name="Widget.Material.Light.DatePicker" id="0x010302a7" />
+ <public type="style" name="Widget.Material.Light.DropDownItem" id="0x010302a8" />
+ <public type="style" name="Widget.Material.Light.DropDownItem.Spinner" id="0x010302a9" />
+ <public type="style" name="Widget.Material.Light.EditText" id="0x010302aa" />
+ <public type="style" name="Widget.Material.Light.ExpandableListView" id="0x010302ab" />
+ <public type="style" name="Widget.Material.Light.FastScroll" id="0x010302ac" />
+ <public type="style" name="Widget.Material.Light.GridView" id="0x010302ad" />
+ <public type="style" name="Widget.Material.Light.HorizontalScrollView" id="0x010302ae" />
+ <public type="style" name="Widget.Material.Light.ImageButton" id="0x010302af" />
+ <public type="style" name="Widget.Material.Light.ListPopupWindow" id="0x010302b0" />
+ <public type="style" name="Widget.Material.Light.ListView" id="0x010302b1" />
+ <public type="style" name="Widget.Material.Light.ListView.DropDown" id="0x010302b2" />
+ <public type="style" name="Widget.Material.Light.MediaRouteButton" id="0x010302b3" />
+ <public type="style" name="Widget.Material.Light.PopupMenu" id="0x010302b4" />
+ <public type="style" name="Widget.Material.Light.PopupMenu.Overflow" id="0x010302b5" />
+ <public type="style" name="Widget.Material.Light.PopupWindow" id="0x010302b6" />
+ <public type="style" name="Widget.Material.Light.ProgressBar" id="0x010302b7" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Horizontal" id="0x010302b8" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Inverse" id="0x010302b9" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Large" id="0x010302ba" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Large.Inverse" id="0x010302bb" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Small" id="0x010302bc" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Small.Inverse" id="0x010302bd" />
+ <public type="style" name="Widget.Material.Light.ProgressBar.Small.Title" id="0x010302be" />
+ <public type="style" name="Widget.Material.Light.RatingBar" id="0x010302bf" />
+ <public type="style" name="Widget.Material.Light.RatingBar.Indicator" id="0x010302c0" />
+ <public type="style" name="Widget.Material.Light.RatingBar.Small" id="0x010302c1" />
+ <public type="style" name="Widget.Material.Light.ScrollView" id="0x010302c2" />
+ <public type="style" name="Widget.Material.Light.SearchView" id="0x010302c3" />
+ <public type="style" name="Widget.Material.Light.SeekBar" id="0x010302c4" />
+ <public type="style" name="Widget.Material.Light.SegmentedButton" id="0x010302c5" />
+ <public type="style" name="Widget.Material.Light.StackView" id="0x010302c6" />
+ <public type="style" name="Widget.Material.Light.Spinner" id="0x010302c7" />
+ <public type="style" name="Widget.Material.Light.Spinner.Underlined" id="0x010302c8" />
+ <public type="style" name="Widget.Material.Light.Tab" id="0x010302c9" />
+ <public type="style" name="Widget.Material.Light.TabWidget" id="0x010302ca" />
+ <public type="style" name="Widget.Material.Light.TextView" id="0x010302cb" />
+ <public type="style" name="Widget.Material.Light.TextView.SpinnerItem" id="0x010302cc" />
+ <public type="style" name="Widget.Material.Light.TimePicker" id="0x010302cd" />
+ <public type="style" name="Widget.Material.Light.WebTextView" id="0x010302ce" />
+ <public type="style" name="Widget.Material.Light.WebView" id="0x010302cf" />
+
+ <!-- @hide This really shouldn't be public; clients using it should use @* to ref it. -->
+ <public type="style" name="Theme.Leanback.FormWizard" id="0x010302d0" />
+
+ <public type="string" name="config_webSettingsDefaultTextEncoding" id="0x01040018" />
+
+ <public type="array" name="config_keySystemUuidMapping" id="0x01070005" />
+
+ <!-- An interpolator which accelerates fast but decelerates slowly. -->
+ <public type="interpolator" name="fast_out_slow_in" id="0x010c000d" />
+ <!-- An interpolator which starts with a peak non-zero velocity and decelerates slowly. -->
+ <public type="interpolator" name="linear_out_slow_in" id="0x010c000e" />
+ <!-- An interpolator which accelerates fast and keeps accelerating until the end. -->
+ <public type="interpolator" name="fast_out_linear_in" id="0x010c000f" />
+
+ <!-- Used for Activity Transitions, this transition indicates that no Transition
+ should be used. -->
+ <public type="transition" name="no_transition" id="0x010f0000" />
+ <!-- A transition that moves and resizes a view -->
+ <public type="transition" name="move" id="0x010f0001" />
+ <!-- A transition that fades views in and out. -->
+ <public type="transition" name="fade" id="0x010f0002" />
+ <!-- A transition that moves views in or out of the scene to or from the edges when
+ a view visibility changes. -->
+ <public type="transition" name="explode" id="0x010f0003" />
+ <!-- A transition that moves views in or out of the scene to or from the bottom edge when
+ a view visibility changes. -->
+ <public type="transition" name="slide_bottom" id="0x010f0004" />
+ <!-- A transition that moves views in or out of the scene to or from the top edge when
+ a view visibility changes. -->
+ <public type="transition" name="slide_top" id="0x010f0005" />
+ <!-- A transition that moves views in or out of the scene to or from the right edge when
+ a view visibility changes. -->
+ <public type="transition" name="slide_right" id="0x010f0006" />
+ <!-- A transition that moves views in or out of the scene to or from the left edge when
+ a view visibility changes. -->
+ <public type="transition" name="slide_left" id="0x010f0007" />
+
+ <!-- WebView error page for when the load fails. @hide @SystemApi -->
+ <public type="raw" name="loaderror" id="0x01100000" />
+ <!-- WebView error page for when domain lookup fails. @hide @SystemApi -->
+ <public type="raw" name="nodomain" id="0x01100001" />
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 9d77309beb4c..3a3847ed1871 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -322,6 +322,7 @@
<java-symbol type="integer" name="config_wifi_framework_wifi_score_bad_link_speed_5" />
<java-symbol type="integer" name="config_wifi_framework_wifi_score_good_link_speed_24" />
<java-symbol type="integer" name="config_wifi_framework_wifi_score_good_link_speed_5" />
+ <java-symbol type="bool" name="editable_voicemailnumber" />
<java-symbol type="bool" name="config_wifi_framework_cellular_handover_enable_user_triggered_adjustment" />
<java-symbol type="integer" name="config_wifi_framework_associated_full_scan_tx_packet_threshold" />
@@ -1192,6 +1193,7 @@
<java-symbol type="drawable" name="ic_corp_badge" />
<java-symbol type="drawable" name="ic_corp_icon_badge" />
<java-symbol type="drawable" name="ic_corp_icon" />
+ <java-symbol type="drawable" name="ic_corp_statusbar_icon" />
<java-symbol type="drawable" name="emulator_circular_window_overlay" />
<java-symbol type="drawable" name="sim_light_blue" />
@@ -2063,4 +2065,6 @@
<java-symbol type="integer" name="config_cdma_3waycall_flash_delay"/>
<java-symbol type="attr" name="windowBackgroundFallback" />
<java-symbol type="id" name="textSpacerNoButtons" />
+ <java-symbol type="array" name="dial_string_replace" />
+ <java-symbol type="bool" name="config_restart_radio_on_pdp_fail_regular_deactivation" />
</resources>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 05776592d512..3a268a3264e5 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -59,6 +59,7 @@ please see themes_device_defaults.xml.
<item name="colorControlNormal">@color/legacy_control_normal</item>
<item name="colorControlHighlight">@color/legacy_button_pressed</item>
<item name="colorButtonNormal">@color/legacy_button_normal</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
<item name="disabledAlpha">0.5</item>
<item name="backgroundDimAmount">0.6</item>
diff --git a/core/res/res/values/themes_holo.xml b/core/res/res/values/themes_holo.xml
index 14853b88cb25..208db977af4e 100644
--- a/core/res/res/values/themes_holo.xml
+++ b/core/res/res/values/themes_holo.xml
@@ -81,6 +81,7 @@ please see themes_device_defaults.xml.
<item name="colorControlNormal">@color/holo_control_normal</item>
<item name="colorControlHighlight">@color/holo_button_pressed</item>
<item name="colorButtonNormal">@color/holo_button_normal</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
<!-- Text styles -->
<item name="textAppearance">@style/TextAppearance.Holo</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index a984cfa41957..7b0efd925dd2 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -316,6 +316,8 @@ please see themes_device_defaults.xml.
<item name="actionBarStyle">@style/Widget.Material.ActionBar.Solid</item>
<item name="actionBarSize">@dimen/action_bar_default_height_material</item>
<item name="actionModePopupWindowStyle">@style/Widget.Material.PopupWindow.ActionMode</item>
+ <item name="actionMenuTextAppearance">@style/TextAppearance.Material.Widget.ActionBar.Menu</item>
+ <item name="actionMenuTextColor">?attr/textColorPrimary</item>
<item name="actionBarWidgetTheme">@null</item>
<item name="actionBarPopupTheme">@null</item>
<item name="actionBarTheme">@style/ThemeOverlay.Material.ActionBar</item>
@@ -370,9 +372,10 @@ please see themes_device_defaults.xml.
<item name="fastScrollOverlayPosition">aboveThumb</item>
<!-- Color palette -->
- <item name="colorPrimaryDark">@color/material_blue_grey_900</item>
- <item name="colorPrimary">@color/material_blue_grey_800</item>
- <item name="colorAccent">@color/material_deep_teal_200</item>
+ <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
+ <item name="colorPrimary">@color/primary_material_dark</item>
+ <item name="colorAccent">@color/accent_material_dark</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
<item name="colorControlNormal">?attr/textColorSecondary</item>
<item name="colorControlActivated">?attr/colorAccent</item>
@@ -713,9 +716,9 @@ please see themes_device_defaults.xml.
<item name="fastScrollOverlayPosition">aboveThumb</item>
<!-- Color palette -->
- <item name="colorPrimaryDark">@color/material_blue_grey_100</item>
- <item name="colorPrimary">@color/material_blue_grey_50</item>
- <item name="colorAccent">@color/material_deep_teal_500</item>
+ <item name="colorPrimaryDark">@color/primary_dark_material_light</item>
+ <item name="colorPrimary">@color/primary_material_light</item>
+ <item name="colorAccent">@color/accent_material_light</item>
<item name="colorControlNormal">?attr/textColorSecondary</item>
<item name="colorControlActivated">?attr/colorAccent</item>
@@ -733,8 +736,8 @@ please see themes_device_defaults.xml.
<item name="actionBarTheme">@style/ThemeOverlay.Material.Dark.ActionBar</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.Material.Light</item>
- <item name="colorPrimaryDark">@color/material_blue_grey_900</item>
- <item name="colorPrimary">@color/material_blue_grey_800</item>
+ <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
+ <item name="colorPrimary">@color/primary_material_dark</item>
</style>
<style name="ThemeOverlay" />
@@ -976,6 +979,7 @@ please see themes_device_defaults.xml.
<item name="listViewStyle">@style/Widget.Material.ListView</item>
<item name="windowAnimationStyle">@style/Animation.DropDownUp</item>
<item name="background">@null</item>
+ <item name="windowElevation">@dimen/floating_window_z</item>
</style>
<style name="Theme.Material.Light.CompactMenu">
@@ -984,12 +988,15 @@ please see themes_device_defaults.xml.
<item name="listViewStyle">@style/Widget.Material.Light.ListView</item>
<item name="windowAnimationStyle">@style/Animation.DropDownUp</item>
<item name="background">@null</item>
+ <item name="windowElevation">@dimen/floating_window_z</item>
</style>
<!-- Dialog themes for Material -->
<eat-comment />
<style name="Theme.Material.BaseDialog">
+ <item name="colorBackground">@color/background_floating_material_dark</item>
+
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Material</item>
<item name="windowBackground">@drawable/dialog_background_material</item>
@@ -1104,6 +1111,8 @@ please see themes_device_defaults.xml.
<!-- Light material dialog themes -->
<style name="Theme.Material.Light.BaseDialog">
+ <item name="colorBackground">@color/background_floating_material_light</item>
+
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Material.Light</item>
<item name="windowBackground">@drawable/dialog_background_material</item>
diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java
index 633196433d49..9ee4e2073dc7 100644
--- a/core/tests/coretests/src/android/net/NetworkStatsTest.java
+++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java
@@ -310,6 +310,16 @@ public class NetworkStatsTest extends TestCase {
assertEquals(128L + 512L, clone.getTotalBytes());
}
+ public void testAddWhenEmpty() throws Exception {
+ final NetworkStats red = new NetworkStats(TEST_START, -1);
+ final NetworkStats blue = new NetworkStats(TEST_START, 5)
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, 128L, 8L, 0L, 2L, 20L)
+ .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, 512L, 32L, 0L, 0L, 0L);
+
+ // We're mostly checking that we don't crash
+ red.combineAllValues(blue);
+ }
+
private static void assertValues(NetworkStats stats, int index, String iface, int uid, int set,
int tag, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) {
final NetworkStats.Entry entry = stats.getValues(index, null);
diff --git a/data/keyboards/Vendor_0a5c_Product_8502.kl b/data/keyboards/Vendor_0a5c_Product_8502.kl
deleted file mode 100644
index 2f07328e3d2d..000000000000
--- a/data/keyboards/Vendor_0a5c_Product_8502.kl
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2013 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.
-
-# Rhodi
-
-key 304 BUTTON_A
-key 305 BUTTON_B
-key 307 BUTTON_X
-key 308 BUTTON_Y
-key 310 BUTTON_L1
-key 311 BUTTON_R1
-key 316 BUTTON_MODE
-key 317 BUTTON_THUMBL
-key 318 BUTTON_THUMBR
-
-key 158 BACK
-key 172 HOME
-
-axis 0x00 X
-axis 0x01 Y
-axis 0x02 Z
-axis 0x05 RZ
-axis 0x09 RTRIGGER
-axis 0x0a LTRIGGER
-axis 0x10 HAT_X
-axis 0x11 HAT_Y
-
-led 0x00 CONTROLLER_1
-led 0x01 CONTROLLER_2
-led 0x02 CONTROLLER_3
-led 0x03 CONTROLLER_4
diff --git a/data/sounds/AudioPackage10.mk b/data/sounds/AudioPackage10.mk
index 68a87f2965b9..5a5eea612c4d 100644
--- a/data/sounds/AudioPackage10.mk
+++ b/data/sounds/AudioPackage10.mk
@@ -23,7 +23,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/AudioPackage11.mk b/data/sounds/AudioPackage11.mk
index f19ed3005197..0f85b33e8940 100644
--- a/data/sounds/AudioPackage11.mk
+++ b/data/sounds/AudioPackage11.mk
@@ -23,7 +23,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery_48k.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/AudioPackage12.mk b/data/sounds/AudioPackage12.mk
index c13689d14954..42513324d3d0 100644
--- a/data/sounds/AudioPackage12.mk
+++ b/data/sounds/AudioPackage12.mk
@@ -12,8 +12,8 @@ ALARM_FILES := Argon Carbon Helium Krypton Neon Oxygen Osmium Platinum
NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Titan Tethys
RINGTONE_FILES := Callisto Dione Ganymede Luna Oberon Phobos Sedna Titania Triton Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_click camera_focus Dock Undock Lock Unlock Trusted
-MATERIAL_EFFECT_FILES := VideoRecord LowBattery WirelessChargingStarted
+ camera_focus Dock Undock Lock Unlock Trusted
+MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingStarted
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
$(LOCAL_PATH)/alarms/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
diff --git a/data/sounds/AudioPackage12_48.mk b/data/sounds/AudioPackage12_48.mk
index 6d86baf03d1d..70e68d3d5202 100644
--- a/data/sounds/AudioPackage12_48.mk
+++ b/data/sounds/AudioPackage12_48.mk
@@ -12,8 +12,8 @@ ALARM_FILES := Argon Carbon Helium Krypton Neon Oxygen Osmium Platinum
NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Titan Tethys
RINGTONE_FILES := Callisto Dione Ganymede Luna Oberon Phobos Sedna Titania Triton Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_click Lock Unlock Trusted
-MATERIAL_EFFECT_FILES := VideoRecord LowBattery WirelessChargingStarted
+ Lock Unlock Trusted
+MATERIAL_EFFECT_FILES := camera_click VideoRecord LowBattery WirelessChargingStarted
# Alarms not yet available in 48 kHz
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
@@ -34,4 +34,4 @@ PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \ No newline at end of file
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg
diff --git a/data/sounds/AudioPackage13.mk b/data/sounds/AudioPackage13.mk
index 9bbfa7ff1a8f..cec7280aa878 100644
--- a/data/sounds/AudioPackage13.mk
+++ b/data/sounds/AudioPackage13.mk
@@ -13,8 +13,8 @@ NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Tit
RINGTONE_FILES := Atria Callisto Dione Ganymede Luna Oberon Phobos Pyxis Sedna Titania Triton \
Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_click camera_focus Dock Undock Lock Unlock Trusted
-MATERIAL_EFFECT_FILES := VideoRecord WirelessChargingStarted LowBattery
+ camera_focus Dock Undock Lock Unlock Trusted
+MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
$(LOCAL_PATH)/alarms/material/ogg/$(fn).ogg:system/media/audio/alarms/$(fn).ogg)
diff --git a/data/sounds/AudioPackage13_48.mk b/data/sounds/AudioPackage13_48.mk
index b90cd00a916f..d1b17c800ef7 100644
--- a/data/sounds/AudioPackage13_48.mk
+++ b/data/sounds/AudioPackage13_48.mk
@@ -13,8 +13,8 @@ NOTIFICATION_FILES := Ariel Ceres Carme Elara Europa Iapetus Io Rhea Salacia Tit
RINGTONE_FILES := Atria Callisto Dione Ganymede Luna Oberon Phobos Pyxis Sedna Titania Triton \
Umbriel
EFFECT_FILES := Effect_Tick KeypressReturn KeypressInvalid KeypressDelete KeypressSpacebar KeypressStandard \
- camera_click Lock Unlock Trusted
-MATERIAL_EFFECT_FILES := VideoRecord WirelessChargingStarted LowBattery
+ Lock Unlock Trusted
+MATERIAL_EFFECT_FILES := camera_click VideoRecord WirelessChargingStarted LowBattery
PRODUCT_COPY_FILES += $(foreach fn,$(ALARM_FILES),\
$(LOCAL_PATH)/alarms/material/ogg/$(fn)_48k.ogg:system/media/audio/alarms/$(fn).ogg)
@@ -34,4 +34,4 @@ PRODUCT_COPY_FILES += $(foreach fn,$(MATERIAL_EFFECT_FILES),\
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
- $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \ No newline at end of file
+ $(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg
diff --git a/data/sounds/AudioPackage6.mk b/data/sounds/AudioPackage6.mk
index 89b5f1ba96f4..c843fdc4e976 100644
--- a/data/sounds/AudioPackage6.mk
+++ b/data/sounds/AudioPackage6.mk
@@ -19,7 +19,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/AudioPackage7.mk b/data/sounds/AudioPackage7.mk
index 065fb8438685..ce82651bc876 100644
--- a/data/sounds/AudioPackage7.mk
+++ b/data/sounds/AudioPackage7.mk
@@ -21,7 +21,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/AudioPackage7alt.mk b/data/sounds/AudioPackage7alt.mk
index 9c35a2ee2cdb..db468f316538 100644
--- a/data/sounds/AudioPackage7alt.mk
+++ b/data/sounds/AudioPackage7alt.mk
@@ -21,7 +21,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
$(LOCAL_PATH)/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg \
diff --git a/data/sounds/AudioPackage8.mk b/data/sounds/AudioPackage8.mk
index 070381d0124c..4112c18c099e 100644
--- a/data/sounds/AudioPackage8.mk
+++ b/data/sounds/AudioPackage8.mk
@@ -23,7 +23,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/AudioPackage9.mk b/data/sounds/AudioPackage9.mk
index 0673811a744e..1b430c01ddcd 100644
--- a/data/sounds/AudioPackage9.mk
+++ b/data/sounds/AudioPackage9.mk
@@ -23,7 +23,7 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \
$(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \
$(LOCAL_PATH)/effects/material/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \
- $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
+ $(LOCAL_PATH)/effects/material/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \
$(LOCAL_PATH)/effects/ogg/camera_focus.ogg:system/media/audio/ui/camera_focus.ogg \
$(LOCAL_PATH)/effects/material/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg \
$(LOCAL_PATH)/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg \
diff --git a/data/sounds/effects/material/ogg/camera_click.ogg b/data/sounds/effects/material/ogg/camera_click.ogg
new file mode 100644
index 000000000000..2528ef65230b
--- /dev/null
+++ b/data/sounds/effects/material/ogg/camera_click.ogg
Binary files differ
diff --git a/data/sounds/effects/material/ogg/camera_click_48k.ogg b/data/sounds/effects/material/ogg/camera_click_48k.ogg
new file mode 100644
index 000000000000..01f3a05ba81c
--- /dev/null
+++ b/data/sounds/effects/material/ogg/camera_click_48k.ogg
Binary files differ
diff --git a/docs/html/google/play/billing/index.jd b/docs/html/google/play/billing/index.jd
index e1326d75e41a..bdbf5c7155b1 100644
--- a/docs/html/google/play/billing/index.jd
+++ b/docs/html/google/play/billing/index.jd
@@ -14,6 +14,7 @@ and features, and more. You can use In-app Billing to sell products as</p>
<div class="sidebox">
<h2><strong>New in In-App Billing</strong></h2>
<ul>
+ <li><strong>IAB v2 shutdown</strong>&mdash;In-app Billing v2 API is deprecated and will be shut down in January 2015. If your app is still using In-app Billing v2, please migrate to the v3 API as soon as possible.</li>
<li><strong>Seasonal subscriptions</strong>&mdash;You can now set up a
recurring <a href="billing_subscriptions.html#user-billing">seasonal
subscription</a> that starts and ends on the same date each year (for
@@ -41,7 +42,7 @@ and features, and more. You can use In-app Billing to sell products as</p>
<ul>
<li>Standard in-app products (one-time billing), or</li>
-<li>Subscriptions, (recurring, automated billing)</li>
+<li>Subscriptions (recurring, automated billing)</li>
</ul>
<p>When you use the in-app billing service to sell an item,
diff --git a/docs/html/google/play/billing/v2/api.jd b/docs/html/google/play/billing/v2/api.jd
index 9501555d0a06..36a901770745 100644
--- a/docs/html/google/play/billing/v2/api.jd
+++ b/docs/html/google/play/billing/v2/api.jd
@@ -2,7 +2,28 @@ page.title=In-app Billing Version 2
excludeFromSuggestions=true
@jd:body
-<div style="background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">In-app Billing Version 2 is superseded. Please <a href="{@docRoot}google/play/billing/billing_overview.html#migration">migrate to Version 3</a> at your earliest convenience.</div>
+<p class="caution" style=
+"background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">
+ The <strong>In-app Billing Version 2 API</strong> has been deprecated in
+ favor of the Version 3 API. If your app is using In-app Billing, please
+ <strong>make sure that it is using the Version 3 API</strong>. If your app is
+ still using the Version 2 API, you must <strong>migrate to the Version 3 API
+ as soon as possible</strong>.<br>
+ <br>
+ We plan to turn off the In-app Billing Version 2 service on <strong>January
+ 27, 2015</strong>, after which time users will <strong>no longer be able to
+ purchase in-app items and subscriptions through the Version 2 API</strong>.
+ We strongly encourage and recommend you migrate your apps to use Version 3
+ API by November 2014, to provide ample time for users to update their apps to
+ the new version.<br>
+ <br>
+ For more information, please see the <a href=
+ "http://support.google.com/googleplay/android-developer/answer/6090268">Help Center
+ article</a>. For common questions about transitioning your implementation to
+ In-app Billing Version 3, please see <a href=
+ "{@docRoot}google/play/billing/billing_overview.html#migration">Migration
+ Considerations</a>.
+</p>
<div id="qv-wrapper" style="margin-top:0;">
<div id="qv">
diff --git a/docs/html/google/play/billing/v2/billing_integrate.jd b/docs/html/google/play/billing/v2/billing_integrate.jd
index 5eb17d55c73a..c26427170239 100644
--- a/docs/html/google/play/billing/v2/billing_integrate.jd
+++ b/docs/html/google/play/billing/v2/billing_integrate.jd
@@ -2,7 +2,28 @@ page.title=Implementing In-app Billing <span style="font-size:16px;">(IAB Versio
excludeFromSuggestions=true
@jd:body
-<div style="background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">In-app Billing Version 2 is superseded. Please <a href="{@docRoot}google/play/billing/billing_overview.html#migration">migrate to Version 3</a> at your earliest convenience.</div>
+<p class="caution" style=
+"background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">
+ The <strong>In-app Billing Version 2 API</strong> has been deprecated in
+ favor of the Version 3 API. If your app is using In-app Billing, please
+ <strong>make sure that it is using the Version 3 API</strong>. If your app is
+ still using the Version 2 API, you must <strong>migrate to the Version 3 API
+ as soon as possible</strong>.<br>
+ <br>
+ We plan to turn off the In-app Billing Version 2 service on <strong>January
+ 27, 2015</strong>, after which time users will <strong>no longer be able to
+ purchase in-app items and subscriptions through the Version 2 API</strong>.
+ We strongly encourage and recommend you migrate your apps to use Version 3
+ API by November 2014, to provide ample time for users to update their apps to
+ the new version.<br>
+ <br>
+ For more information, please see the <a href=
+ "http://support.google.com/googleplay/android-developer/answer/6090268">Help Center
+ article</a>. For common questions about transitioning your implementation to
+ In-app Billing Version 3, please see <a href=
+ "{@docRoot}google/play/billing/billing_overview.html#migration">Migration
+ Considerations</a>.
+</p>
<div id="qv-wrapper" style="margin-top:0;">
<div id="qv">
<h2>In this document</h2>
diff --git a/docs/html/google/play/billing/v2/billing_reference.jd b/docs/html/google/play/billing/v2/billing_reference.jd
index 4587dee6db97..32e00cf29f1d 100644
--- a/docs/html/google/play/billing/v2/billing_reference.jd
+++ b/docs/html/google/play/billing/v2/billing_reference.jd
@@ -2,7 +2,28 @@ page.title=In-app Billing Reference <span style="font-size:16px;">(IAB Version 2
excludeFromSuggestions=true
@jd:body
-<div style="background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">In-app Billing Version 2 is superseded. Please <a href="{@docRoot}google/play/billing/billing_overview.html#migration">migrate to Version 3</a> at your earliest convenience.</div>
+<p class="caution" style=
+"background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">
+ The <strong>In-app Billing Version 2 API</strong> has been deprecated in
+ favor of the Version 3 API. If your app is using In-app Billing, please
+ <strong>make sure that it is using the Version 3 API</strong>. If your app is
+ still using the Version 2 API, you must <strong>migrate to the Version 3 API
+ as soon as possible</strong>.<br>
+ <br>
+ We plan to turn off the In-app Billing Version 2 service on <strong>January
+ 27, 2015</strong>, after which time users will <strong>no longer be able to
+ purchase in-app items and subscriptions through the Version 2 API</strong>.
+ We strongly encourage and recommend you migrate your apps to use Version 3
+ API by November 2014, to provide ample time for users to update their apps to
+ the new version.<br>
+ <br>
+ For more information, please see the <a href=
+ "http://support.google.com/googleplay/android-developer/answer/6090268">Help Center
+ article</a>. For common questions about transitioning your implementation to
+ In-app Billing Version 3, please see <a href=
+ "{@docRoot}google/play/billing/billing_overview.html#migration">Migration
+ Considerations</a>.
+</p>
<div id="qv-wrapper" style="margin-top:0;">
<div id="qv">
<h2>In this document</h2>
diff --git a/docs/html/google/play/billing/v2/billing_subscriptions.jd b/docs/html/google/play/billing/v2/billing_subscriptions.jd
index f8051a91fa1b..01e39acb9e87 100644
--- a/docs/html/google/play/billing/v2/billing_subscriptions.jd
+++ b/docs/html/google/play/billing/v2/billing_subscriptions.jd
@@ -2,7 +2,28 @@ page.title=Implementing Subscriptions <span style="font-size:16px;">(IAB Versio
excludeFromSuggestions=true
@jd:body
-<div style="background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">In-app Billing Version 2 is superseded. Please <a href="{@docRoot}google/play/billing/billing_overview.html#migration">migrate to Version 3</a> at your earliest convenience.</div>
+<p class="caution" style=
+"background-color:#fffdeb;width:100%;margin-bottom:1em;padding:.5em;">
+ The <strong>In-app Billing Version 2 API</strong> has been deprecated in
+ favor of the Version 3 API. If your app is using In-app Billing, please
+ <strong>make sure that it is using the Version 3 API</strong>. If your app is
+ still using the Version 2 API, you must <strong>migrate to the Version 3 API
+ as soon as possible</strong>.<br>
+ <br>
+ We plan to turn off the In-app Billing Version 2 service on <strong>January
+ 27, 2015</strong>, after which time users will <strong>no longer be able to
+ purchase in-app items and subscriptions through the Version 2 API</strong>.
+ We strongly encourage and recommend you migrate your apps to use Version 3
+ API by November 2014, to provide ample time for users to update their apps to
+ the new version.<br>
+ <br>
+ For more information, please see the <a href=
+ "http://support.google.com/googleplay/android-developer/answer/6090268">Help Center
+ article</a>. For common questions about transitioning your implementation to
+ In-app Billing Version 3, please see <a href=
+ "{@docRoot}google/play/billing/billing_overview.html#migration">Migration
+ Considerations</a>.
+</p>
<div id="qv-wrapper" style="margin-top:0;">
<div id="qv">
<h2>In this document</h2>
diff --git a/graphics/java/android/graphics/ColorMatrixColorFilter.java b/graphics/java/android/graphics/ColorMatrixColorFilter.java
index 7822c411c9f0..291c8ff301f4 100644
--- a/graphics/java/android/graphics/ColorMatrixColorFilter.java
+++ b/graphics/java/android/graphics/ColorMatrixColorFilter.java
@@ -58,6 +58,8 @@ public class ColorMatrixColorFilter extends ColorFilter {
* any effect until you call {@link #setColorMatrix(ColorMatrix)}.
*
* @see #setColorMatrix(ColorMatrix)
+ *
+ * @hide
*/
public ColorMatrix getColorMatrix() {
return mMatrix;
@@ -73,6 +75,8 @@ public class ColorMatrixColorFilter extends ColorFilter {
* @see #getColorMatrix()
* @see android.graphics.ColorMatrix#reset()
* @see #setColorMatrix(float[])
+ *
+ * @hide
*/
public void setColorMatrix(ColorMatrix matrix) {
if (matrix == null) {
@@ -98,6 +102,8 @@ public class ColorMatrixColorFilter extends ColorFilter {
*
* @throws ArrayIndexOutOfBoundsException if the specified array's
* length is < 20
+ *
+ * @hide
*/
public void setColorMatrix(float[] array) {
if (array == null) {
diff --git a/graphics/java/android/graphics/LightingColorFilter.java b/graphics/java/android/graphics/LightingColorFilter.java
index 70a3fe83252c..ad78430e2472 100644
--- a/graphics/java/android/graphics/LightingColorFilter.java
+++ b/graphics/java/android/graphics/LightingColorFilter.java
@@ -44,9 +44,6 @@ public class LightingColorFilter extends ColorFilter {
* Create a colorfilter that multiplies the RGB channels by one color,
* and then adds a second color. The alpha components of the mul and add
* arguments are ignored.
- *
- * @see #setColorMultiply(int)
- * @see #setColorAdd(int)
*/
public LightingColorFilter(int mul, int add) {
mMul = mul;
@@ -59,6 +56,8 @@ public class LightingColorFilter extends ColorFilter {
* color filter is applied.
*
* @see #setColorMultiply(int)
+ *
+ * @hide
*/
public int getColorMultiply() {
return mMul;
@@ -70,6 +69,8 @@ public class LightingColorFilter extends ColorFilter {
* The alpha channel of this color is ignored.
*
* @see #getColorMultiply()
+ *
+ * @hide
*/
public void setColorMultiply(int mul) {
mMul = mul;
@@ -81,6 +82,8 @@ public class LightingColorFilter extends ColorFilter {
* when the color filter is applied.
*
* @see #setColorAdd(int)
+ *
+ * @hide
*/
public int getColorAdd() {
return mAdd;
@@ -92,6 +95,8 @@ public class LightingColorFilter extends ColorFilter {
* The alpha channel of this color is ignored.
*
* @see #getColorAdd()
+ *
+ * @hide
*/
public void setColorAdd(int add) {
mAdd = add;
diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java
index ff768b787a52..fe4f8b82c36b 100644
--- a/graphics/java/android/graphics/PorterDuffColorFilter.java
+++ b/graphics/java/android/graphics/PorterDuffColorFilter.java
@@ -46,6 +46,8 @@ public class PorterDuffColorFilter extends ColorFilter {
*
* @see Color
* @see #setColor(int)
+ *
+ * @hide
*/
public int getColor() {
return mColor;
@@ -74,6 +76,8 @@ public class PorterDuffColorFilter extends ColorFilter {
*
* @see PorterDuff
* @see #setMode(android.graphics.PorterDuff.Mode)
+ *
+ * @hide
*/
public PorterDuff.Mode getMode() {
return mMode;
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index f3cfd97d58ee..fc33b7e67e34 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -113,6 +113,9 @@ public:
/** return a new string corresponding to 'className' with all '.'s replaced by '/'s. */
static char* toSlashClassName(const char* className);
+ /** Create a Java string from an ASCII or Latin-1 string */
+ static jstring NewStringLatin1(JNIEnv* env, const char* bytes);
+
private:
static int startReg(JNIEnv* env);
bool parseRuntimeOption(const char* property,
diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h
index c65efe4d4900..ac5eca08a4ff 100644
--- a/include/androidfw/ResourceTypes.h
+++ b/include/androidfw/ResourceTypes.h
@@ -1521,6 +1521,8 @@ public:
bool getResourceName(uint32_t resID, bool allowUtf8, resource_name* outName) const;
+ bool getResourceFlags(uint32_t resID, uint32_t* outFlags) const;
+
/**
* Retrieve the value of a resource. If the resource is found, returns a
* value >= 0 indicating the table it is in (for use with
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 690b1d66f42c..8cef13765cc2 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -5393,6 +5393,44 @@ const char16_t* StringPoolRef::string16(size_t* outLen) const {
return NULL;
}
+bool ResTable::getResourceFlags(uint32_t resID, uint32_t* outFlags) const {
+ if (mError != NO_ERROR) {
+ return false;
+ }
+
+ const ssize_t p = getResourcePackageIndex(resID);
+ const int t = Res_GETTYPE(resID);
+ const int e = Res_GETENTRY(resID);
+
+ if (p < 0) {
+ if (Res_GETPACKAGE(resID)+1 == 0) {
+ ALOGW("No package identifier when getting flags for resource number 0x%08x", resID);
+ } else {
+ ALOGW("No known package when getting flags for resource number 0x%08x", resID);
+ }
+ return false;
+ }
+ if (t < 0) {
+ ALOGW("No type identifier when getting flags for resource number 0x%08x", resID);
+ return false;
+ }
+
+ const PackageGroup* const grp = mPackageGroups[p];
+ if (grp == NULL) {
+ ALOGW("Bad identifier when getting flags for resource number 0x%08x", resID);
+ return false;
+ }
+
+ Entry entry;
+ status_t err = getEntry(grp, t, e, NULL, &entry);
+ if (err != NO_ERROR) {
+ return false;
+ }
+
+ *outFlags = entry.specFlags;
+ return true;
+}
+
status_t ResTable::getEntry(
const PackageGroup* packageGroup, int typeIndex, int entryIndex,
const ResTable_config* config,
diff --git a/libs/androidfw/tests/data/basic/build b/libs/androidfw/tests/data/basic/build
index fa4a9fe0d8f2..036e46828189 100755
--- a/libs/androidfw/tests/data/basic/build
+++ b/libs/androidfw/tests/data/basic/build
@@ -1,6 +1,8 @@
#!/bin/bash
-aapt package -M AndroidManifest.xml -S res --split fr,de -F bundle.apk -f && \
+PATH_TO_FRAMEWORK_RES=$(gettop)/prebuilts/sdk/current/android.jar
+
+aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES --split fr,de -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
mv resources.arsc basic.arsc && \
xxd -i basic.arsc > basic_arsc.h && \
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index 9b0025f3b846..f0bf7b22ff01 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -377,6 +377,7 @@ void Caches::flush(FlushMode mode) {
}
clearGarbage();
+ glFinish();
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 25ea72915057..ce1d09fe149a 100755
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -134,6 +134,8 @@ OpenGLRenderer::OpenGLRenderer(RenderState& renderState)
, mExtensions(Extensions::getInstance())
, mRenderState(renderState)
, mScissorOptimizationDisabled(false)
+ , mSuppressTiling(false)
+ , mFirstFrameAfterResize(true)
, mCountOverdraw(false)
, mLightCenter((Vector3){FLT_MIN, FLT_MIN, FLT_MIN})
, mLightRadius(FLT_MIN)
@@ -179,6 +181,7 @@ void OpenGLRenderer::onViewportInitialized() {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glEnableVertexAttribArray(Program::kBindingPosition);
+ mFirstFrameAfterResize = true;
}
void OpenGLRenderer::setupFrameState(float left, float top,
@@ -202,7 +205,9 @@ status_t OpenGLRenderer::startFrame() {
// Functors break the tiling extension in pretty spectacular ways
// This ensures we don't use tiling when a functor is going to be
// invoked during the frame
- mSuppressTiling = mCaches.hasRegisteredFunctors();
+ mSuppressTiling = mCaches.hasRegisteredFunctors()
+ || mFirstFrameAfterResize;
+ mFirstFrameAfterResize = false;
startTilingCurrentClip(true);
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index e295b1a8659b..47ef1a9bb703 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -1013,6 +1013,7 @@ private:
// No-ops start/endTiling when set
bool mSuppressTiling;
+ bool mFirstFrameAfterResize;
// If true, this renderer will setup drawing to emulate
// an increment stencil buffer in the color buffer
diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h
index feaee8ed5009..7eb9a32843e1 100644
--- a/libs/hwui/Properties.h
+++ b/libs/hwui/Properties.h
@@ -227,7 +227,7 @@ enum DebugLevel {
#define DEFAULT_PATCH_CACHE_SIZE 128 // in kB
#define DEFAULT_GRADIENT_CACHE_SIZE 0.5f
#define DEFAULT_DROP_SHADOW_CACHE_SIZE 2.0f
-#define DEFAULT_FBO_CACHE_SIZE 16
+#define DEFAULT_FBO_CACHE_SIZE 0
#define DEFAULT_TEXTURE_CACHE_FLUSH_RATE 0.6f
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 46eeb6afa444..b936d4b419aa 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -570,7 +570,9 @@ public:
}
bool hasShadow() const {
- return getZ() >= 0.0f && getOutline().getPath() != NULL;
+ return getZ() >= 0.0f
+ && getOutline().getPath() != NULL
+ && getOutline().getAlpha() != 0.0f;
}
private:
diff --git a/libs/hwui/StatefulBaseRenderer.cpp b/libs/hwui/StatefulBaseRenderer.cpp
index 12b8c8db28ea..88d6f6802909 100644
--- a/libs/hwui/StatefulBaseRenderer.cpp
+++ b/libs/hwui/StatefulBaseRenderer.cpp
@@ -49,6 +49,13 @@ void StatefulBaseRenderer::setViewport(int width, int height) {
mHeight = height;
mFirstSnapshot->initializeViewport(width, height);
onViewportInitialized();
+
+ // create a temporary 1st snapshot, so old snapshots are released,
+ // and viewport can be queried safely.
+ // TODO: remove, combine viewport + save stack initialization
+ mSnapshot = new Snapshot(mFirstSnapshot,
+ SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
+ mSaveCount = 1;
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 5e6796c2b406..1c416a7f4671 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -91,7 +91,9 @@ void CanvasContext::setSurface(ANativeWindow* window) {
}
void CanvasContext::swapBuffers() {
- mEglManager.swapBuffers(mEglSurface);
+ if (CC_UNLIKELY(!mEglManager.swapBuffers(mEglSurface))) {
+ setSurface(NULL);
+ }
mHaveNewSurface = false;
}
@@ -102,8 +104,8 @@ void CanvasContext::requireSurface() {
}
bool CanvasContext::initialize(ANativeWindow* window) {
- if (mCanvas) return false;
setSurface(window);
+ if (mCanvas) return false;
mCanvas = new OpenGLRenderer(mRenderThread.renderState());
mCanvas->initProperties();
return true;
@@ -117,10 +119,10 @@ void CanvasContext::pauseSurface(ANativeWindow* window) {
stopDrawing();
}
+// TODO: don't pass viewport size, it's automatic via EGL
void CanvasContext::setup(int width, int height, const Vector3& lightCenter, float lightRadius,
uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha) {
if (!mCanvas) return;
- mCanvas->setViewport(width, height);
mCanvas->initLight(lightCenter, lightRadius, ambientShadowAlpha, spotShadowAlpha);
}
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index e030cdb29ff6..a87834ee0c63 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -254,11 +254,23 @@ void EglManager::beginFrame(EGLSurface surface, EGLint* width, EGLint* height) {
eglBeginFrame(mEglDisplay, surface);
}
-void EglManager::swapBuffers(EGLSurface surface) {
+bool EglManager::swapBuffers(EGLSurface surface) {
eglSwapBuffers(mEglDisplay, surface);
EGLint err = eglGetError();
- LOG_ALWAYS_FATAL_IF(err != EGL_SUCCESS,
- "Encountered EGL error %d %s during rendering", err, egl_error_str(err));
+ if (CC_LIKELY(err == EGL_SUCCESS)) {
+ return true;
+ }
+ if (err == EGL_BAD_SURFACE) {
+ // For some reason our surface was destroyed out from under us
+ // This really shouldn't happen, but if it does we can recover easily
+ // by just not trying to use the surface anymore
+ ALOGW("swapBuffers encountered EGL_BAD_SURFACE on %p, halting rendering...", surface);
+ return false;
+ }
+ LOG_ALWAYS_FATAL("Encountered EGL error %d %s during rendering",
+ err, egl_error_str(err));
+ // Impossible to hit this, but the compiler doesn't know that
+ return false;
}
bool EglManager::enableDirtyRegions(EGLSurface surface) {
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index a844cfcbe61c..71213fbf9343 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -47,7 +47,7 @@ public:
// Returns true if the current surface changed, false if it was already current
bool makeCurrent(EGLSurface surface);
void beginFrame(EGLSurface surface, EGLint* width, EGLint* height);
- void swapBuffers(EGLSurface surface);
+ bool swapBuffers(EGLSurface surface);
bool enableDirtyRegions(EGLSurface surface);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 2c805bbe7835..04458697afdd 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -18,6 +18,7 @@ package android.location;
import com.android.internal.location.ProviderProperties;
+import android.annotation.SystemApi;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
@@ -808,6 +809,7 @@ public class LocationManager {
*
* @hide
*/
+ @SystemApi
public void requestLocationUpdates(LocationRequest request, LocationListener listener,
Looper looper) {
checkListener(listener);
@@ -835,6 +837,7 @@ public class LocationManager {
*
* @hide
*/
+ @SystemApi
public void requestLocationUpdates(LocationRequest request, PendingIntent intent) {
checkPendingIntent(intent);
requestLocationUpdates(request, null, null, intent);
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 33cab8f2ce7a..2b40903d005f 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -146,7 +146,7 @@ public class KeyguardUpdateMonitorCallback {
/**
* Called when the emergency call button is pressed.
*/
- void onEmergencyCallAction() { }
+ public void onEmergencyCallAction() { }
/**
* Called when the transport background changes.
diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml
index 167f7d811d63..e194f554b884 100644
--- a/packages/PrintSpooler/res/values-es-rUS/strings.xml
+++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml
@@ -38,7 +38,7 @@
<string name="print_dialog" msgid="32628687461331979">"Cuadro de diálogo de impresión"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"Página <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> de <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <string name="summary_template" msgid="8899734908625669193">"Resumen, <xliff:g id="COPIES">%1$s</xliff:g> copias, tamaño de papel <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="summary_template" msgid="8899734908625669193">"Resumen, copias <xliff:g id="COPIES">%1$s</xliff:g>, tamaño de papel <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"Controlador para expandir"</string>
<string name="collapse_handle" msgid="6886637989442507451">"Controlador para contraer"</string>
<string name="print_button" msgid="645164566271246268">"Imprimir"</string>
diff --git a/packages/PrintSpooler/res/values-eu-rES/strings.xml b/packages/PrintSpooler/res/values-eu-rES/strings.xml
index b2c2b9c6959f..4f0f8fcc43e3 100644
--- a/packages/PrintSpooler/res/values-eu-rES/strings.xml
+++ b/packages/PrintSpooler/res/values-eu-rES/strings.xml
@@ -43,8 +43,8 @@
<string name="collapse_handle" msgid="6886637989442507451">"Tolestu heldulekua"</string>
<string name="print_button" msgid="645164566271246268">"Inprimatu"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"Gorde PDF gisa"</string>
- <string name="print_options_expanded" msgid="6944679157471691859">"Inprimaketa-aukerak zabalduta daude"</string>
- <string name="print_options_collapsed" msgid="7455930445670414332">"Inprimaketa-aukerak tolestuta daude"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"Inprimatzeko aukerak zabalduta daude"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"Inprimatzeko aukerak tolestuta daude"</string>
<string name="search" msgid="5421724265322228497">"Bilatu"</string>
<string name="all_printers_label" msgid="3178848870161526399">"Inprimagailu guztiak"</string>
<string name="add_print_service_label" msgid="5356702546188981940">"Gehitu zerbitzua"</string>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index 9186f64d587e..81d3bf938ce6 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -33,7 +33,7 @@
<string name="install_for_print_preview" msgid="6366303997385509332">"पूर्वावलोकन के लिए PDF व्यूअर इंस्टॉल करें"</string>
<string name="printing_app_crashed" msgid="854477616686566398">"प्रिंटिंग ऐप्लिकेशन क्रैश हो गया"</string>
<string name="generating_print_job" msgid="3119608742651698916">"प्रिंट कार्य जनरेट हो रहा है"</string>
- <string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में सहेजें"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में जोड़ें"</string>
<string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string>
<string name="print_dialog" msgid="32628687461331979">"प्रिंट डॉयलॉग"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
@@ -42,7 +42,7 @@
<string name="expand_handle" msgid="7282974448109280522">"हैंडल विस्तृत करें"</string>
<string name="collapse_handle" msgid="6886637989442507451">"हैंडल संक्षिप्त करें"</string>
<string name="print_button" msgid="645164566271246268">"प्रिंट करें"</string>
- <string name="savetopdf_button" msgid="2976186791686924743">"PDF में सहेजें"</string>
+ <string name="savetopdf_button" msgid="2976186791686924743">"PDF में जोड़ें"</string>
<string name="print_options_expanded" msgid="6944679157471691859">"प्रिंट विकल्पों को विस्तृत किया गया"</string>
<string name="print_options_collapsed" msgid="7455930445670414332">"प्रिंट विकल्पों को संक्षिप्त किया गया"</string>
<string name="search" msgid="5421724265322228497">"खोजें"</string>
diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
index 349ac3171584..3a3f6bb32762 100644
--- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml
+++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml
@@ -37,9 +37,9 @@
<string name="all_printers" msgid="5018829726861876202">"ທຸກເຄື່ອງພິມ..."</string>
<string name="print_dialog" msgid="32628687461331979">"ໜ້າຕ່າງການພິມ"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <string name="page_description_template" msgid="6831239682256197161">"ໜ້າທີ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ໃນ <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <string name="summary_template" msgid="8899734908625669193">"ສະ​ຫຼຸບ​, ສໍາ​ເນົາ <xliff:g id="COPIES">%1$s</xliff:g> , ຂະ​ຫນາດ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
- <string name="expand_handle" msgid="7282974448109280522">"ຂະ​ຫຍາຍ​ໂຕ​ຈັບ"</string>
+ <string name="page_description_template" msgid="6831239682256197161">"ໜ້າທີ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ​ຈາກ​ທັງ​ໝົດ <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
+ <string name="summary_template" msgid="8899734908625669193">"ສະ​ຫຼຸບ​, ສໍາ​ເນົາ <xliff:g id="COPIES">%1$s</xliff:g>, ຂະ​ຫນາດ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"​ຂະ​ຫຍາຍ​ໂຕ​ຈັດ​ການ"</string>
<string name="collapse_handle" msgid="6886637989442507451">"ປິດ​ໂຕ​ຈັດ​ການ"</string>
<string name="print_button" msgid="645164566271246268">"ພິມ"</string>
<string name="savetopdf_button" msgid="2976186791686924743">"ບັນທຶກເປັນ PDF"</string>
diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
index d115b298abc2..7b47f4c3572f 100644
--- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml
+++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml
@@ -38,7 +38,7 @@
<string name="print_dialog" msgid="32628687461331979">"Caixa de diálogo de impressão"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"Página <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> de <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <string name="summary_template" msgid="8899734908625669193">"Resumo, cópias <xliff:g id="COPIES">%1$s</xliff:g>, tamanho do papel <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="summary_template" msgid="8899734908625669193">"Resumo, <xliff:g id="COPIES">%1$s</xliff:g> cópias, tamanho do papel <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
<string name="expand_handle" msgid="7282974448109280522">"Expandir alça"</string>
<string name="collapse_handle" msgid="6886637989442507451">"Fechar alça"</string>
<string name="print_button" msgid="645164566271246268">"Imprimir"</string>
diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml
index b2541df46452..3038a7fe9639 100644
--- a/packages/PrintSpooler/res/values-pt/strings.xml
+++ b/packages/PrintSpooler/res/values-pt/strings.xml
@@ -31,7 +31,7 @@
<string name="pages_range_example" msgid="8558694453556945172">"Ex.: 1–5, 8, 11–13"</string>
<string name="print_preview" msgid="8010217796057763343">"Visualização de impressão"</string>
<string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o visualizador de PDF"</string>
- <string name="printing_app_crashed" msgid="854477616686566398">"O aplicativo de impressão falhou"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"O app de impressão falhou"</string>
<string name="generating_print_job" msgid="3119608742651698916">"Gerando trabalho de impressão"</string>
<string name="save_as_pdf" msgid="5718454119847596853">"Salvar como PDF"</string>
<string name="all_printers" msgid="5018829726861876202">"Todas as impressoras…"</string>
diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml
index 3f5cb3cbcd44..1446a53bbc61 100644
--- a/packages/PrintSpooler/res/values-ro/strings.xml
+++ b/packages/PrintSpooler/res/values-ro/strings.xml
@@ -37,21 +37,14 @@
<string name="all_printers" msgid="5018829726861876202">"Toate imprimantele..."</string>
<string name="print_dialog" msgid="32628687461331979">"Caseta de dialog de printare"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <!-- no translation found for page_description_template (6831239682256197161) -->
- <skip />
- <!-- no translation found for summary_template (8899734908625669193) -->
- <skip />
- <!-- no translation found for expand_handle (7282974448109280522) -->
- <skip />
- <!-- no translation found for collapse_handle (6886637989442507451) -->
- <skip />
+ <string name="page_description_template" msgid="6831239682256197161">"Pagina <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> din <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
+ <string name="summary_template" msgid="8899734908625669193">"Rezumat, copii <xliff:g id="COPIES">%1$s</xliff:g>, dimensiunea paginii <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"Ghidaj de extindere"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"Ghidaj de restrângere"</string>
<string name="print_button" msgid="645164566271246268">"Printați"</string>
- <!-- no translation found for savetopdf_button (2976186791686924743) -->
- <skip />
- <!-- no translation found for print_options_expanded (6944679157471691859) -->
- <skip />
- <!-- no translation found for print_options_collapsed (7455930445670414332) -->
- <skip />
+ <string name="savetopdf_button" msgid="2976186791686924743">"Salvați în format PDF"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"Opțiuni de printare extinse"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"Opțiuni de printare restrânse"</string>
<string name="search" msgid="5421724265322228497">"Căutați"</string>
<string name="all_printers_label" msgid="3178848870161526399">"Toate imprimantele"</string>
<string name="add_print_service_label" msgid="5356702546188981940">"Adăugați un serviciu"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
index 7a000c570ac6..77ecb21ad72f 100644
--- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml
@@ -37,21 +37,14 @@
<string name="all_printers" msgid="5018829726861876202">"所有打印机…"</string>
<string name="print_dialog" msgid="32628687461331979">"打印对话框"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> / <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
- <!-- no translation found for page_description_template (6831239682256197161) -->
- <skip />
- <!-- no translation found for summary_template (8899734908625669193) -->
- <skip />
- <!-- no translation found for expand_handle (7282974448109280522) -->
- <skip />
- <!-- no translation found for collapse_handle (6886637989442507451) -->
- <skip />
+ <string name="page_description_template" msgid="6831239682256197161">"第<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>页,共<xliff:g id="PAGE_COUNT">%2$d</xliff:g>页"</string>
+ <string name="summary_template" msgid="8899734908625669193">"摘要,<xliff:g id="COPIES">%1$s</xliff:g>份,纸张尺寸为<xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"展开手柄"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"收起手柄"</string>
<string name="print_button" msgid="645164566271246268">"打印"</string>
- <!-- no translation found for savetopdf_button (2976186791686924743) -->
- <skip />
- <!-- no translation found for print_options_expanded (6944679157471691859) -->
- <skip />
- <!-- no translation found for print_options_collapsed (7455930445670414332) -->
- <skip />
+ <string name="savetopdf_button" msgid="2976186791686924743">"保存为PDF格式"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"已展开打印选项"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"已收起打印选项"</string>
<string name="search" msgid="5421724265322228497">"搜索"</string>
<string name="all_printers_label" msgid="3178848870161526399">"所有打印机"</string>
<string name="add_print_service_label" msgid="5356702546188981940">"添加服务"</string>
diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
index eb28f8aff915..3e26a5e88d09 100644
--- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml
+++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml
@@ -38,7 +38,7 @@
<string name="print_dialog" msgid="32628687461331979">"印表機對話方塊"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="page_description_template" msgid="6831239682256197161">"第 <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> 頁,共 <xliff:g id="PAGE_COUNT">%2$d</xliff:g> 頁"</string>
- <string name="summary_template" msgid="8899734908625669193">"摘要,<xliff:g id="COPIES">%1$s</xliff:g> 份,<xliff:g id="PAPER_SIZE">%2$s</xliff:g> 紙張大小"</string>
+ <string name="summary_template" msgid="8899734908625669193">"摘要,<xliff:g id="COPIES">%1$s</xliff:g> 份,紙張為 <xliff:g id="PAPER_SIZE">%2$s</xliff:g> 大小"</string>
<string name="expand_handle" msgid="7282974448109280522">"展開控點"</string>
<string name="collapse_handle" msgid="6886637989442507451">"收合控點"</string>
<string name="print_button" msgid="645164566271246268">"列印"</string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/MutexFileProvider.java b/packages/PrintSpooler/src/com/android/printspooler/model/MutexFileProvider.java
index 1f48638d8d3e..0df5e3cf18d7 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/MutexFileProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/MutexFileProvider.java
@@ -93,7 +93,7 @@ public final class MutexFileProvider {
public void releaseFile() {
synchronized (mLock) {
if (mOwnerThread != Thread.currentThread()) {
- throw new IllegalStateException("Not acquired");
+ return;
}
if (DEBUG) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
index 14c41dadb0ba..f779f87ea6c5 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
@@ -64,9 +64,6 @@ public final class PageContentRepository {
private final CloseGuard mCloseGuard = CloseGuard.get();
- private final ArrayMap<Integer, PageContentProvider> mPageContentProviders =
- new ArrayMap<>();
-
private final AsyncRenderer mRenderer;
private RenderSpec mLastRenderSpec;
@@ -113,13 +110,13 @@ public final class PageContentRepository {
mRenderer.close(callback);
}
- public void destroy() {
+ public void destroy(Runnable callback) {
throwIfNotClosed();
mState = STATE_DESTROYED;
if (DEBUG) {
Log.i(LOG_TAG, "STATE_DESTROYED");
}
- doDestroy();
+ doDestroy(callback);
}
public void startPreload(int firstShownPage, int lastShownPage) {
@@ -141,10 +138,6 @@ public final class PageContentRepository {
return mRenderer.getPageCount();
}
- public PageContentProvider peekPageContentProvider(int pageIndex) {
- return mPageContentProviders.get(pageIndex);
- }
-
public PageContentProvider acquirePageContentProvider(int pageIndex, View owner) {
throwIfDestroyed();
@@ -152,15 +145,7 @@ public final class PageContentRepository {
Log.i(LOG_TAG, "Acquiring provider for page: " + pageIndex);
}
- if (mPageContentProviders.get(pageIndex)!= null) {
- throw new IllegalStateException("Already acquired for page: " + pageIndex);
- }
-
- PageContentProvider provider = new PageContentProvider(pageIndex, owner);
-
- mPageContentProviders.put(pageIndex, provider);
-
- return provider;
+ return new PageContentProvider(pageIndex, owner);
}
public void releasePageContentProvider(PageContentProvider provider) {
@@ -170,10 +155,6 @@ public final class PageContentRepository {
Log.i(LOG_TAG, "Releasing provider for page: " + provider.mPageIndex);
}
- if (mPageContentProviders.remove(provider.mPageIndex) == null) {
- throw new IllegalStateException("Not acquired");
- }
-
provider.cancelLoad();
}
@@ -182,19 +163,19 @@ public final class PageContentRepository {
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy();
+ doDestroy(null);
}
} finally {
super.finalize();
}
}
- private void doDestroy() {
+ private void doDestroy(Runnable callback) {
mState = STATE_DESTROYED;
if (DEBUG) {
Log.i(LOG_TAG, "STATE_DESTROYED");
}
- mRenderer.destroy();
+ mRenderer.destroy(callback);
}
private void throwIfNotOpened() {
@@ -526,7 +507,7 @@ public final class PageContentRepository {
callback.run();
}
}
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null);
+ }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
public void close(final Runnable callback) {
@@ -552,10 +533,10 @@ public final class PageContentRepository {
callback.run();
}
}
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
+ }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
- public void destroy() {
+ public void destroy(final Runnable callback) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
@@ -570,8 +551,12 @@ public final class PageContentRepository {
}
mPageContentCache.invalidate();
mPageContentCache.clear();
+ if (callback != null) {
+ callback.run();
+ }
+
}
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null);
+ }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
public void startPreload(int firstShownPage, int lastShownPage, RenderSpec renderSpec) {
@@ -687,7 +672,7 @@ public final class PageContentRepository {
// Oh well, we will have work to do...
renderTask = new RenderPageTask(pageIndex, renderSpec, callback);
mPageToRenderTaskMap.put(pageIndex, renderTask);
- renderTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null);
+ renderTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
public void cancelRendering(int pageIndex) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
index 369c453937d0..20e774f672d1 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
@@ -274,9 +274,7 @@ public final class PageAdapter extends Adapter implements
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View page = mLayoutInflater.inflate(R.layout.preview_page, parent, false);
- ViewHolder holder = new MyViewHolder(page);
- holder.setIsRecyclable(true);
- return holder;
+ return new MyViewHolder(page);
}
@Override
@@ -314,14 +312,8 @@ public final class PageAdapter extends Adapter implements
+ ", pageIndexInFile: " + pageIndexInFile);
}
- // OK, there are bugs in recycler view which tries to bind views
- // without recycling them which would give us a chance to clean up.
- PageContentProvider boundProvider = mPageContentRepository
- .peekPageContentProvider(pageIndexInFile);
- if (boundProvider != null) {
- PageContentView owner = (PageContentView) boundProvider.getOwner();
- owner.init(null, mEmptyState, mMediaSize, mMinMargins);
- mPageContentRepository.releasePageContentProvider(boundProvider);
+ if (provider != null && provider.getPageIndex() != pageIndexInFile) {
+ mPageContentRepository.releasePageContentProvider(provider);
}
provider = mPageContentRepository.acquirePageContentProvider(
@@ -496,9 +488,9 @@ public final class PageAdapter extends Adapter implements
return selectedPages;
}
- public void destroy() {
+ public void destroy(Runnable callback) {
throwIfNotClosed();
- doDestroy();
+ doDestroy(callback);
}
@Override
@@ -506,7 +498,7 @@ public final class PageAdapter extends Adapter implements
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy();
+ doDestroy(null);
}
} finally {
super.finalize();
@@ -732,7 +724,7 @@ public final class PageAdapter extends Adapter implements
private void recyclePageView(PageContentView page, int pageIndexInAdapter) {
PageContentProvider provider = page.getPageContentProvider();
if (provider != null) {
- page.init(null, null, null, null);
+ page.init(null, mEmptyState, mMediaSize, mMinMargins);
mPageContentRepository.releasePageContentProvider(provider);
}
mBoundPagesInAdapter.remove(pageIndexInAdapter);
@@ -753,8 +745,8 @@ public final class PageAdapter extends Adapter implements
mPageContentRepository.stopPreload();
}
- private void doDestroy() {
- mPageContentRepository.destroy();
+ private void doDestroy(Runnable callback) {
+ mPageContentRepository.destroy(callback);
mCloseGuard.close();
mState = STATE_DESTROYED;
if (DEBUG) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 389988a760bc..56497d7e8444 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -595,7 +595,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
}
});
} else if (resultCode == RESULT_CANCELED) {
- setState(STATE_CONFIGURING);
+ mState = STATE_CONFIGURING;
updateOptionsUi();
} else {
setState(STATE_CREATE_FILE_FAILED);
@@ -953,7 +953,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
// When the update is done we update the print preview.
mProgressMessageController.post();
return true;
- } else {
+ } else if (!willUpdate) {
// Update preview.
updatePrintPreviewController(false);
}
@@ -1562,12 +1562,18 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
if (mState != STATE_INITIALIZING) {
mProgressMessageController.cancel();
mPrinterRegistry.setTrackedPrinter(null);
- mPrintPreviewController.destroy();
mSpoolerProvider.destroy();
mPrintedDocument.finish();
mPrintedDocument.destroy();
+ mPrintPreviewController.destroy(new Runnable() {
+ @Override
+ public void run() {
+ finish();
+ }
+ });
+ } else {
+ finish();
}
- finish();
}
private final class SpinnerItem<T> {
@@ -2335,7 +2341,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
mContext.unbindService(PageShredder.this);
mCallback.run();
}
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
@Override
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
index b999866dba69..e4eab10e1b8c 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
@@ -77,6 +77,7 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
mRecyclerView = (RecyclerView) activity.findViewById(R.id.preview_content);
mRecyclerView.setLayoutManager(mLayoutManger);
mRecyclerView.setAdapter(mPageAdapter);
+ mRecyclerView.setItemViewCacheSize(0);
mPreloadController = new PreloadController(mRecyclerView);
mRecyclerView.setOnScrollListener(mPreloadController);
@@ -191,12 +192,15 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
});
}
- public void destroy() {
+ public void destroy(Runnable callback) {
if (mPageAdapter.isOpened()) {
- mPageAdapter.close(null);
+ Message operation = mHandler.obtainMessage(MyHandler.MSG_CLOSE);
+ mHandler.enqueueOperation(operation);
}
- mRecyclerView.setAdapter(null);
- mPageAdapter.destroy();
+
+ Message operation = mHandler.obtainMessage(MyHandler.MSG_DESTROY);
+ operation.obj = callback;
+ mHandler.enqueueOperation(operation);
}
@Override
@@ -291,7 +295,9 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
} break;
case MSG_DESTROY: {
- mPageAdapter.destroy();
+ Runnable callback = (Runnable) message.obj;
+ mRecyclerView.setAdapter(null);
+ mPageAdapter.destroy(callback);
handleNextOperation();
} break;
@@ -348,8 +354,7 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
public void startPreloadContent() {
PageAdapter pageAdapter = (PageAdapter) mRecyclerView.getAdapter();
-
- if (pageAdapter.isOpened()) {
+ if (pageAdapter != null && pageAdapter.isOpened()) {
PageRange shownPages = computeShownPages();
if (shownPages != null) {
pageAdapter.startPreloadContent(shownPages);
@@ -359,8 +364,7 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
public void stopPreloadContent() {
PageAdapter pageAdapter = (PageAdapter) mRecyclerView.getAdapter();
-
- if (pageAdapter.isOpened()) {
+ if (pageAdapter != null && pageAdapter.isOpened()) {
pageAdapter.stopPreloadContent();
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
index 100011738c47..b79278950eb4 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
@@ -52,12 +52,12 @@ public class PageContentView extends View
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ mContentRequested = false;
requestPageContentIfNeeded();
}
@Override
public void onPageContentAvailable(BitmapDrawable content) {
- assert (getBackground() != content);
setBackground(content);
}
@@ -70,7 +70,7 @@ public class PageContentView extends View
final boolean providerChanged = (mProvider == null)
? provider != null : !mProvider.equals(provider);
final boolean loadingDrawableChanged = (mEmptyState == null)
- ? mEmptyState != null : !mEmptyState.equals(emptyState);
+ ? emptyState != null : !mEmptyState.equals(emptyState);
final boolean mediaSizeChanged = (mMediaSize == null)
? mediaSize != null : !mMediaSize.equals(mediaSize);
final boolean marginsChanged = (mMinMargins == null)
diff --git a/packages/SettingsProvider/res/values-af/defaults.xml b/packages/SettingsProvider/res/values-af/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-af/defaults.xml
+++ b/packages/SettingsProvider/res/values-af/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-am/defaults.xml b/packages/SettingsProvider/res/values-am/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-am/defaults.xml
+++ b/packages/SettingsProvider/res/values-am/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-bg/defaults.xml b/packages/SettingsProvider/res/values-bg/defaults.xml
index 5e46120eadaf..aee229efecc7 100644
--- a/packages/SettingsProvider/res/values-bg/defaults.xml
+++ b/packages/SettingsProvider/res/values-bg/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s от %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-bn-rBD/defaults.xml b/packages/SettingsProvider/res/values-bn-rBD/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-bn-rBD/defaults.xml
+++ b/packages/SettingsProvider/res/values-bn-rBD/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ca/defaults.xml b/packages/SettingsProvider/res/values-ca/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ca/defaults.xml
+++ b/packages/SettingsProvider/res/values-ca/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-cs/defaults.xml
+++ b/packages/SettingsProvider/res/values-cs/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-da/defaults.xml b/packages/SettingsProvider/res/values-da/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-da/defaults.xml
+++ b/packages/SettingsProvider/res/values-da/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-de/defaults.xml
+++ b/packages/SettingsProvider/res/values-de/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-el/defaults.xml b/packages/SettingsProvider/res/values-el/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-el/defaults.xml
+++ b/packages/SettingsProvider/res/values-el/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rGB/defaults.xml b/packages/SettingsProvider/res/values-en-rGB/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-en-rGB/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rGB/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rIN/defaults.xml b/packages/SettingsProvider/res/values-en-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-en-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-es-rUS/defaults.xml b/packages/SettingsProvider/res/values-es-rUS/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-es-rUS/defaults.xml
+++ b/packages/SettingsProvider/res/values-es-rUS/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-es/defaults.xml
+++ b/packages/SettingsProvider/res/values-es/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-et-rEE/defaults.xml b/packages/SettingsProvider/res/values-et-rEE/defaults.xml
index 790297a10dd6..71e91aec8cc5 100644
--- a/packages/SettingsProvider/res/values-et-rEE/defaults.xml
+++ b/packages/SettingsProvider/res/values-et-rEE/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s, %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-eu-rES/defaults.xml b/packages/SettingsProvider/res/values-eu-rES/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-eu-rES/defaults.xml
+++ b/packages/SettingsProvider/res/values-eu-rES/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fi/defaults.xml b/packages/SettingsProvider/res/values-fi/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-fi/defaults.xml
+++ b/packages/SettingsProvider/res/values-fi/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
index 15da9d298256..beba56e52d67 100644
--- a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
+++ b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s de %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-fr/defaults.xml
+++ b/packages/SettingsProvider/res/values-fr/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-gl-rES/defaults.xml b/packages/SettingsProvider/res/values-gl-rES/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-gl-rES/defaults.xml
+++ b/packages/SettingsProvider/res/values-gl-rES/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hi/defaults.xml b/packages/SettingsProvider/res/values-hi/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-hi/defaults.xml
+++ b/packages/SettingsProvider/res/values-hi/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hr/defaults.xml b/packages/SettingsProvider/res/values-hr/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-hr/defaults.xml
+++ b/packages/SettingsProvider/res/values-hr/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hu/defaults.xml b/packages/SettingsProvider/res/values-hu/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-hu/defaults.xml
+++ b/packages/SettingsProvider/res/values-hu/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hy-rAM/defaults.xml b/packages/SettingsProvider/res/values-hy-rAM/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-hy-rAM/defaults.xml
+++ b/packages/SettingsProvider/res/values-hy-rAM/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-in/defaults.xml b/packages/SettingsProvider/res/values-in/defaults.xml
index 3627c9b0c196..012a65ff1ab3 100644
--- a/packages/SettingsProvider/res/values-in/defaults.xml
+++ b/packages/SettingsProvider/res/values-in/defaults.xml
@@ -20,6 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
+ <!-- String.format failed for translation -->
<!-- no translation found for def_device_name_simple (9037785625140748221) -->
<skip />
</resources>
diff --git a/packages/SettingsProvider/res/values-is-rIS/defaults.xml b/packages/SettingsProvider/res/values-is-rIS/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-is-rIS/defaults.xml
+++ b/packages/SettingsProvider/res/values-is-rIS/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml
index 18d0b9305630..3ea32a17dd0f 100644
--- a/packages/SettingsProvider/res/values-it/defaults.xml
+++ b/packages/SettingsProvider/res/values-it/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ja/defaults.xml b/packages/SettingsProvider/res/values-ja/defaults.xml
index 18d0b9305630..3ea32a17dd0f 100644
--- a/packages/SettingsProvider/res/values-ja/defaults.xml
+++ b/packages/SettingsProvider/res/values-ja/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ka-rGE/defaults.xml b/packages/SettingsProvider/res/values-ka-rGE/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ka-rGE/defaults.xml
+++ b/packages/SettingsProvider/res/values-ka-rGE/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml b/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml
+++ b/packages/SettingsProvider/res/values-kk-rKZ/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-km-rKH/defaults.xml b/packages/SettingsProvider/res/values-km-rKH/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-km-rKH/defaults.xml
+++ b/packages/SettingsProvider/res/values-km-rKH/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-kn-rIN/defaults.xml b/packages/SettingsProvider/res/values-kn-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-kn-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-kn-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ko/defaults.xml b/packages/SettingsProvider/res/values-ko/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ko/defaults.xml
+++ b/packages/SettingsProvider/res/values-ko/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ky-rKG/defaults.xml b/packages/SettingsProvider/res/values-ky-rKG/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ky-rKG/defaults.xml
+++ b/packages/SettingsProvider/res/values-ky-rKG/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lo-rLA/defaults.xml b/packages/SettingsProvider/res/values-lo-rLA/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-lo-rLA/defaults.xml
+++ b/packages/SettingsProvider/res/values-lo-rLA/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lt/defaults.xml b/packages/SettingsProvider/res/values-lt/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-lt/defaults.xml
+++ b/packages/SettingsProvider/res/values-lt/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lv/defaults.xml b/packages/SettingsProvider/res/values-lv/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-lv/defaults.xml
+++ b/packages/SettingsProvider/res/values-lv/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mk-rMK/defaults.xml b/packages/SettingsProvider/res/values-mk-rMK/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-mk-rMK/defaults.xml
+++ b/packages/SettingsProvider/res/values-mk-rMK/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ml-rIN/defaults.xml b/packages/SettingsProvider/res/values-ml-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ml-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-ml-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mn-rMN/defaults.xml b/packages/SettingsProvider/res/values-mn-rMN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-mn-rMN/defaults.xml
+++ b/packages/SettingsProvider/res/values-mn-rMN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mr-rIN/defaults.xml b/packages/SettingsProvider/res/values-mr-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-mr-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-mr-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ms-rMY/defaults.xml b/packages/SettingsProvider/res/values-ms-rMY/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ms-rMY/defaults.xml
+++ b/packages/SettingsProvider/res/values-ms-rMY/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-nb/defaults.xml b/packages/SettingsProvider/res/values-nb/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-nb/defaults.xml
+++ b/packages/SettingsProvider/res/values-nb/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ne-rNP/defaults.xml b/packages/SettingsProvider/res/values-ne-rNP/defaults.xml
index 3627c9b0c196..012a65ff1ab3 100644
--- a/packages/SettingsProvider/res/values-ne-rNP/defaults.xml
+++ b/packages/SettingsProvider/res/values-ne-rNP/defaults.xml
@@ -20,6 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
+ <!-- String.format failed for translation -->
<!-- no translation found for def_device_name_simple (9037785625140748221) -->
<skip />
</resources>
diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-nl/defaults.xml
+++ b/packages/SettingsProvider/res/values-nl/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-pl/defaults.xml
+++ b/packages/SettingsProvider/res/values-pl/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
+++ b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pt/defaults.xml b/packages/SettingsProvider/res/values-pt/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-pt/defaults.xml
+++ b/packages/SettingsProvider/res/values-pt/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ro/defaults.xml b/packages/SettingsProvider/res/values-ro/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ro/defaults.xml
+++ b/packages/SettingsProvider/res/values-ro/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ru/defaults.xml b/packages/SettingsProvider/res/values-ru/defaults.xml
index 18d0b9305630..3ea32a17dd0f 100644
--- a/packages/SettingsProvider/res/values-ru/defaults.xml
+++ b/packages/SettingsProvider/res/values-ru/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-si-rLK/defaults.xml b/packages/SettingsProvider/res/values-si-rLK/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-si-rLK/defaults.xml
+++ b/packages/SettingsProvider/res/values-si-rLK/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sk/defaults.xml b/packages/SettingsProvider/res/values-sk/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-sk/defaults.xml
+++ b/packages/SettingsProvider/res/values-sk/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sl/defaults.xml b/packages/SettingsProvider/res/values-sl/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-sl/defaults.xml
+++ b/packages/SettingsProvider/res/values-sl/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sr/defaults.xml b/packages/SettingsProvider/res/values-sr/defaults.xml
index 18d0b9305630..3ea32a17dd0f 100644
--- a/packages/SettingsProvider/res/values-sr/defaults.xml
+++ b/packages/SettingsProvider/res/values-sr/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sv/defaults.xml b/packages/SettingsProvider/res/values-sv/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-sv/defaults.xml
+++ b/packages/SettingsProvider/res/values-sv/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sw/defaults.xml b/packages/SettingsProvider/res/values-sw/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-sw/defaults.xml
+++ b/packages/SettingsProvider/res/values-sw/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ta-rIN/defaults.xml b/packages/SettingsProvider/res/values-ta-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ta-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-ta-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-te-rIN/defaults.xml b/packages/SettingsProvider/res/values-te-rIN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-te-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-te-rIN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-th/defaults.xml b/packages/SettingsProvider/res/values-th/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-th/defaults.xml
+++ b/packages/SettingsProvider/res/values-th/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-tl/defaults.xml b/packages/SettingsProvider/res/values-tl/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-tl/defaults.xml
+++ b/packages/SettingsProvider/res/values-tl/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-tr/defaults.xml b/packages/SettingsProvider/res/values-tr/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-tr/defaults.xml
+++ b/packages/SettingsProvider/res/values-tr/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-uk/defaults.xml b/packages/SettingsProvider/res/values-uk/defaults.xml
index 7da1c93973ab..7655a19a182f 100644
--- a/packages/SettingsProvider/res/values-uk/defaults.xml
+++ b/packages/SettingsProvider/res/values-uk/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%2$s о %1$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ur-rPK/defaults.xml b/packages/SettingsProvider/res/values-ur-rPK/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-ur-rPK/defaults.xml
+++ b/packages/SettingsProvider/res/values-ur-rPK/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml b/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml
+++ b/packages/SettingsProvider/res/values-uz-rUZ/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-vi/defaults.xml b/packages/SettingsProvider/res/values-vi/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-vi/defaults.xml
+++ b/packages/SettingsProvider/res/values-vi/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
index 3627c9b0c196..22443a5673ea 100644
--- a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
@@ -20,6 +20,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
- <!-- no translation found for def_device_name_simple (9037785625140748221) -->
- <skip />
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 45957a49763d..78af78566547 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -352,9 +352,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
if (scanAlways != 0) {
Settings.Global.putInt(cr,
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
- // !!! Give the wifi stack a moment to quiesce
- try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
+ // !!! Give the wifi stack a moment to quiesce
+ try { Thread.sleep(1500); } catch (InterruptedException e) {}
if (restoredSupplicantData != null) {
restoreWifiSupplicant(FILE_WIFI_SUPPLICANT,
restoredSupplicantData, restoredSupplicantData.length);
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 3c2a776cd537..bddd691b0d6e 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -283,6 +283,21 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".egg.LLandActivity"
+ android:theme="@android:style/Theme.Material.Light.NoActionBar.TranslucentDecor"
+ android:exported="true"
+ android:label="@string/lland"
+ android:hardwareAccelerated="true"
+ android:launchMode="singleInstance"
+ android:screenOrientation="locked"
+ android:process=":sweetsweetdesserts"
+ android:excludeFromRecents="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.DEFAULT" />
<category android:name="com.android.internal.category.PLATLOGO" />
</intent-filter>
</activity>
diff --git a/packages/SystemUI/res/drawable/android.xml b/packages/SystemUI/res/drawable/android.xml
new file mode 100644
index 000000000000..750de057439d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/android.xml
@@ -0,0 +1,37 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2 (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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <path
+ android:name="torso"
+ android:pathData="M12,36c0,1.1 0.9,2 2,2l2,0l0,7c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3l0,-7l4,0l0,7c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3l0,-7l2,0c1.1,0 2,-0.9 2,-2L36,16L12,16L12,36z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:name="leftArm"
+ android:pathData="M7,16c-1.7,0 -3,1.3 -3,3l0,14c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3L10,19C10,17.3 8.7,16 7,16z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:name="rightArm"
+ android:pathData="M41,16c-1.7,0 -3,1.3 -3,3l0,14c0,1.7 1.3,3 3,3c1.7,0 3,-1.3 3,-3L44,19C44,17.3 42.7,16 41,16z"
+ android:fillColor="#FFFFFF"/>
+ <path
+ android:name="illFormTheHead"
+ android:pathData="M31.1,4.3l2.6,-2.6c0.4,-0.4 0.4,-1 0,-1.4c-0.4,-0.4 -1,-0.4 -1.4,0l-3,3C27.7,2.5 25.9,2 24,2c-1.9,0 -3.7,0.5 -5.3,1.3l-3,-3c-0.4,-0.4 -1,-0.4 -1.4,0c-0.4,0.4 -0.4,1 0,1.4l2.6,2.6C13.9,6.5 12,10 12,14l24,0C36,10 34.1,6.5 31.1,4.3zM20.31,9c0,0.72 -0.59,1.31 -1.31,1.31c-0.72,0 -1.31,-0.59 -1.31,-1.31c0,-0.72 0.59,-1.31 1.31,-1.31C19.72,7.69 20.31,8.28 20.31,9zM30.31,9c0,0.72 -0.59,1.31 -1.31,1.31c-0.73,0 -1.31,-0.59 -1.31,-1.31c0,-0.72 0.59,-1.31 1.31,-1.31C29.72,7.69 30.31,8.28 30.31,9z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/cloud.xml b/packages/SystemUI/res/drawable/cloud.xml
new file mode 100644
index 000000000000..17e4ad2ad385
--- /dev/null
+++ b/packages/SystemUI/res/drawable/cloud.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48.0dp"
+ android:height="48.0dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M38.700001,20.100000C37.299999,13.200000 31.299999,8.000000 24.000000,8.000000c-5.800000,0.000000 -10.800000,3.300000 -13.300000,8.100000C4.700000,16.700001 0.000000,21.799999 0.000000,28.000000c0.000000,6.600000 5.400000,12.000000 12.000000,12.000000l26.000000,0.000000c5.500000,0.000000 10.000000,-4.500000 10.000000,-10.000000C48.000000,24.700001 43.900002,20.400000 38.700001,20.100000z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/cloud_off.xml b/packages/SystemUI/res/drawable/cloud_off.xml
new file mode 100644
index 000000000000..b15ea5fc48a8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/cloud_off.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M19.400000,10.000000c-0.700000,-3.400000 -3.700000,-6.000000 -7.400000,-6.000000c-1.500000,0.000000 -2.900000,0.400000 -4.000000,1.200000l1.500000,1.500000C10.200000,6.200000 11.100000,6.000000 12.000000,6.000000c3.000000,0.000000 5.500000,2.500000 5.500000,5.500000L17.500000,12.000000L19.000000,12.000000c1.700000,0.000000 3.000000,1.300000 3.000000,3.000000c0.000000,1.100000 -0.600000,2.100000 -1.600000,2.600000l1.500000,1.500000c1.300000,-0.900000 2.100000,-2.400000 2.100000,-4.100000C24.000000,12.400000 21.900000,10.200000 19.400000,10.000000zM3.000000,5.300000L5.800000,8.000000C2.600000,8.200000 0.000000,10.800000 0.000000,14.000000c0.000000,3.300000 2.700000,6.000000 6.000000,6.000000l11.700000,0.000000l2.000000,2.000000l1.300000,-1.300000L4.300000,4.000000L3.000000,5.300000zM7.700000,10.000000l8.000000,8.000000L6.000000,18.000000c-2.200000,0.000000 -4.000000,-1.800000 -4.000000,-4.000000c0.000000,-2.200000 1.800000,-4.000000 4.000000,-4.000000L7.700000,10.000000z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/moon.xml b/packages/SystemUI/res/drawable/moon.xml
new file mode 100644
index 000000000000..4ee628679d18
--- /dev/null
+++ b/packages/SystemUI/res/drawable/moon.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48.0dp"
+ android:height="48.0dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M18.000000,4.000000c-2.100000,0.000000 -4.100000,0.300000 -6.000000,0.900000C20.100000,7.500000 26.000000,15.000000 26.000000,24.000000s-5.900000,16.500000 -14.000000,19.100000c1.900000,0.600000 3.900000,0.900000 6.000000,0.900000c11.000000,0.000000 20.000000,-9.000000 20.000000,-20.000000S29.000000,4.000000 18.000000,4.000000z"
+ android:fillColor="#FFF2F2FF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/placeholder.xml b/packages/SystemUI/res/drawable/placeholder.xml
new file mode 100644
index 000000000000..19331456ebb2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/placeholder.xml
@@ -0,0 +1,51 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="100dp"
+ android:height="400dp"
+ android:viewportWidth="100"
+ android:viewportHeight="400">
+
+ <!-- future site of real artwork -->
+
+ <path android:fillColor="#FFFFFF00"
+ android:pathData="M 0,0 L 100,0 L 100,400 L 0,400 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 L 100,25 L 100,50 L 0,25 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,50 L 100,75 L 100,100 L 0,75 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,100 L 100,125 L 100,150 L 0,125 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,150 L 100,175 L 100,200 L 0,175 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,200 L 100,225 L 100,250 L 0,225 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,250 L 100,275 L 100,300 L 0,275 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,300 L 100,325 L 100,350 L 0,325 z" />
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M 0,350 L 100,375 L 100,400 L 0,375 z" />
+</vector>
+
diff --git a/core/res/res/values/removed.xml b/packages/SystemUI/res/drawable/recents_task_view_header_bg_color.xml
index 8eaca29656b6..5f9341c0d151 100644
--- a/core/res/res/values/removed.xml
+++ b/packages/SystemUI/res/drawable/recents_task_view_header_bg_color.xml
@@ -14,13 +14,9 @@
limitations under the License.
-->
-<!-- Placeholder resources to be removed before release. -->
-<resources>
- <style name="__removed1" />
- <attr name="__removed2" />
- <style name="__removed3" />
- <style name="__removed4" />
- <style name="__removed5" />
- <style name="__removed6" />
- <style name="__removed7" />
-</resources>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:topLeftRadius="@dimen/recents_task_view_rounded_corners_radius"
+ android:topRightRadius="@dimen/recents_task_view_rounded_corners_radius"/>
+ <solid android:color="#00000000" />
+</shape> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/scorecard.xml b/packages/SystemUI/res/drawable/scorecard.xml
new file mode 100644
index 000000000000..707449a8a58e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/scorecard.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle"
+ >
+ <corners
+ android:radius="8dp" />
+ <solid
+ android:color="#ffffffff" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/scorecard_gameover.xml b/packages/SystemUI/res/drawable/scorecard_gameover.xml
new file mode 100644
index 000000000000..f663a661f3f1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/scorecard_gameover.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle"
+ >
+ <corners
+ android:radius="8dp" />
+ <solid
+ android:color="#ffff0000" />
+</shape>
diff --git a/packages/SystemUI/res/drawable/star.xml b/packages/SystemUI/res/drawable/star.xml
new file mode 100644
index 000000000000..73ca04a58373
--- /dev/null
+++ b/packages/SystemUI/res/drawable/star.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48.0dp"
+ android:height="48.0dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M30.250000,17.750000L24.000000,4.000000l-6.250000,13.750000L4.000000,24.000000l13.750000,6.250000L24.000000,44.000000l6.250000,-13.750000L44.000000,24.000000L30.250000,17.750000z"
+ android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/sun.xml b/packages/SystemUI/res/drawable/sun.xml
new file mode 100644
index 000000000000..3e4a233c3281
--- /dev/null
+++ b/packages/SystemUI/res/drawable/sun.xml
@@ -0,0 +1,29 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48.0dp"
+ android:height="48.0dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <group>
+ <path
+ android:pathData="M 24,8 A 16,16 0 1,0 24.0001,8 z"
+ android:fillColor="#FFFFFFCC" />
+ <path
+ android:pathData="M40.0,30.6l6.6,-6.6L40.0,17.4L40.0,8.0l-9.4,0.0L24.0,1.4L17.4,8.0L8.0,8.0l0.0,9.4L1.4,24.0L8.0,30.6L8.0,40.0l9.4,0.0l6.6,6.6l6.6,-6.6L40.0,40.0L40.0,30.6zM24.0,36.0c-6.6,0.0 -12.0,-5.4 -12.0,-12.0s5.4,-12.0 12.0,-12.0c6.6,0.0 12.0,5.4 12.0,12.0S30.6,36.0 24.0,36.0z"
+ android:fillColor="#FFFFFF40"/>
+ </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/sun2.xml b/packages/SystemUI/res/drawable/sun2.xml
new file mode 100644
index 000000000000..6d2d5041f5ab
--- /dev/null
+++ b/packages/SystemUI/res/drawable/sun2.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48.0dp"
+ android:height="48.0dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+ <path
+ android:pathData="M40.000000,17.400000L40.000000,8.000000l-9.400000,0.000000L24.000000,1.400000L17.400000,8.000000L8.000000,8.000000l0.000000,9.400000L1.400000,24.000000L8.000000,30.600000L8.000000,40.000000l9.400000,0.000000l6.600000,6.600000l6.600000,-6.600000L40.000000,40.000000l0.000000,-9.400000l6.600000,-6.600000L40.000000,17.400000zM24.000000,36.000000c-6.600000,0.000000 -12.000000,-5.400000 -12.000000,-12.000000s5.400000,-12.000000 12.000000,-12.000000c6.600000,0.000000 12.000000,5.400000 12.000000,12.000000S30.600000,36.000000 24.000000,36.000000zM24.000000,16.000000c-4.400000,0.000000 -8.000000,3.600000 -8.000000,8.000000c0.000000,4.400000 3.600000,8.000000 8.000000,8.000000s8.000000,-3.600000 8.000000,-8.000000C32.000000,19.600000 28.400000,16.000000 24.000000,16.000000z"
+ android:fillColor="#FF000000"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/lland.xml b/packages/SystemUI/res/layout/lland.xml
new file mode 100644
index 000000000000..053225d93eef
--- /dev/null
+++ b/packages/SystemUI/res/layout/lland.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <com.android.systemui.egg.LLand
+ android:id="@+id/world"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </com.android.systemui.egg.LLand>
+ <TextView
+ android:id="@+id/score"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="32sp"
+ android:textColor="#FFAAAAAA"
+ android:layout_marginTop="32dp"
+ android:layout_marginLeft="16dp"
+ android:layout_gravity="top|left"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:background="@drawable/scorecard"
+ />
+ <TextView
+ android:id="@+id/welcome"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="30sp"
+ android:textColor="#FFFFFFFF"
+ android:layout_gravity="center"
+ android:layout_marginTop="70dp"
+ android:visibility="gone"
+ />
+</FrameLayout>
+
diff --git a/packages/SystemUI/res/layout/recents_task_view.xml b/packages/SystemUI/res/layout/recents_task_view.xml
index 4cb8498e07d0..d1d382826ebe 100644
--- a/packages/SystemUI/res/layout/recents_task_view.xml
+++ b/packages/SystemUI/res/layout/recents_task_view.xml
@@ -15,30 +15,34 @@
-->
<com.android.systemui.recents.views.TaskView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
- android:focusable="true"
- android:background="#FFffffff">
- <com.android.systemui.recents.views.TaskViewThumbnail
- android:id="@+id/task_view_thumbnail"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <include layout="@layout/recents_task_view_header" />
+ android:focusable="true">
<FrameLayout
- android:id="@+id/lock_to_app_fab"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_gravity="bottom|right"
- android:layout_marginRight="15dp"
- android:layout_marginBottom="15dp"
- android:translationZ="3dp"
- android:contentDescription="@string/recents_lock_to_app_button_label"
- android:background="@drawable/recents_lock_to_task_button_bg">
- <ImageView
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:layout_gravity="center"
- android:src="@drawable/recents_lock_to_app_pin" />
+ android:id="@+id/task_view_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <com.android.systemui.recents.views.TaskViewThumbnail
+ android:id="@+id/task_view_thumbnail"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ <include layout="@layout/recents_task_view_header" />
+ <FrameLayout
+ android:id="@+id/lock_to_app_fab"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:layout_gravity="bottom|right"
+ android:layout_marginRight="15dp"
+ android:layout_marginBottom="15dp"
+ android:translationZ="2dp"
+ android:contentDescription="@string/recents_lock_to_app_button_label"
+ android:background="@drawable/recents_lock_to_task_button_bg">
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:layout_gravity="center"
+ android:src="@drawable/recents_lock_to_app_pin" />
+ </FrameLayout>
</FrameLayout>
</com.android.systemui.recents.views.TaskView>
diff --git a/packages/SystemUI/res/layout/super_status_bar.xml b/packages/SystemUI/res/layout/super_status_bar.xml
index 29fec416c656..6d3f976a73e9 100644
--- a/packages/SystemUI/res/layout/super_status_bar.xml
+++ b/packages/SystemUI/res/layout/super_status_bar.xml
@@ -26,7 +26,7 @@
android:fitsSystemWindows="true"
android:descendantFocusability="afterDescendants">
- <com.android.systemui.statusbar.AlphaOptimizedFrameLayout
+ <com.android.systemui.statusbar.BackDropView
android:id="@+id/backdrop"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -41,9 +41,9 @@
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:visibility="invisible" />
- </com.android.systemui.statusbar.AlphaOptimizedFrameLayout>
+ </com.android.systemui.statusbar.BackDropView>
- <View android:id="@+id/scrim_behind"
+ <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_behind"
android:layout_width="match_parent"
android:layout_height="match_parent" />
@@ -80,7 +80,7 @@
android:visibility="gone" />
</com.android.systemui.statusbar.phone.PanelHolder>
- <View android:id="@+id/scrim_in_front"
+ <com.android.systemui.statusbar.ScrimView android:id="@+id/scrim_in_front"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index bfeac9d3ea94..d0fba20d53e4 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -76,7 +76,7 @@
android:layout_alignParentEnd="true"
android:background="@drawable/btn_borderless_rect"
android:clickable="true"
- android:contentDescription="@null"
+ android:contentDescription="@string/accessibility_desc_settings"
android:scaleType="center"
android:src="@drawable/ic_settings" />
diff --git a/packages/SystemUI/res/values-af/config.xml b/packages/SystemUI/res/values-af/config.xml
index 3a66eabecf81..38497cf39c9a 100644
--- a/packages/SystemUI/res/values-af/config.xml
+++ b/packages/SystemUI/res/values-af/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s,10 s,30 s,60 s,120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index b5c8722a87a3..aadc2c4e4fd1 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Programinligting"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"sluit na program"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"soek"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Gelaai"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laai tans"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot vol"</string>
diff --git a/packages/SystemUI/res/values-am/config.xml b/packages/SystemUI/res/values-am/config.xml
index 3a66eabecf81..97e30c93c9c9 100644
--- a/packages/SystemUI/res/values-am/config.xml
+++ b/packages/SystemUI/res/values-am/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s፣10s፣30s፣60s፣120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 2683999cc286..6a5aa472c090 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"የመተግበሪያ መረጃ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"መተግበሪያ-ጋር-ቆልፍ"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ፈልግ"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ባትሪ ሞልቷል"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ኃይል በመሙላት ላይ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> እስኪሞላ ድረስ"</string>
diff --git a/packages/SystemUI/res/values-ar/config.xml b/packages/SystemUI/res/values-ar/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-ar/config.xml
+++ b/packages/SystemUI/res/values-ar/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index ba44c637fc29..2f37ce50aa0a 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"معلومات التطبيق"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"تقييد بالتطبيق"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"بحث"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"تم الشحن"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"جارٍ الشحن"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> حتى الاكتمال"</string>
diff --git a/packages/SystemUI/res/values-bg/config.xml b/packages/SystemUI/res/values-bg/config.xml
new file mode 100644
index 000000000000..3a6872f1d029
--- /dev/null
+++ b/packages/SystemUI/res/values-bg/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 с, 10 с, 30 с, 60 с, 120 с"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index af76911d38d6..2cfe2b50adb9 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информация за приложението"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"заключване в приложението"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"търсене"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заредена"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарежда се"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до пълно зареждане"</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/config.xml b/packages/SystemUI/res/values-bn-rBD/config.xml
index 947fde9ca97f..be49df5eac02 100644
--- a/packages/SystemUI/res/values-bn-rBD/config.xml
+++ b/packages/SystemUI/res/values-bn-rBD/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"৬০০০০:১০০০০,৩০০০০০:৩০০০০,১৮০০০০০:৬০০০০,০"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"১সে.,১০সে.,৩০সে.,৬০সে.,১২০সে."</string>
</resources>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index 044bbda9dced..b0a19e46d7b3 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"অ্যাপ্লিকেশানের তথ্য"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"অ্যাপ্লিকেশানে লক করুন"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"অনুসন্ধান"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"চার্জ হয়েছে"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"চার্জ হচ্ছে"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"পূর্ণ হতে <xliff:g id="CHARGING_TIME">%s</xliff:g> সময় লাগবে"</string>
diff --git a/packages/SystemUI/res/values-ca/config.xml b/packages/SystemUI/res/values-ca/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-ca/config.xml
+++ b/packages/SystemUI/res/values-ca/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index c6a381c0fbdf..ba2081ce5b2b 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -214,10 +214,8 @@
<string name="gps_notification_found_text" msgid="4619274244146446464">"S\'ha establert la ubicació per GPS"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Sol·licituds d\'ubicació actives"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Esborra totes les notificacions."</string>
- <!-- no translation found for status_bar_notification_inspect_item_title (5668348142410115323) -->
- <skip />
- <!-- no translation found for status_bar_notification_app_settings_title (5525260160341558869) -->
- <skip />
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Configuració de les notificacions"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Configuració de l\'aplicació <xliff:g id="APP_NAME">%s</xliff:g>"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla girarà automàticament."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla està bloquejada en orientació horitzontal."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla està bloquejada en orientació vertical."</string>
@@ -283,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informació de l\'aplicació"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueig d\'aplicació"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"S\'està carregant"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> per completar la càrrega"</string>
@@ -323,7 +323,7 @@
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Torna a començar"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Sí, continua"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vols afegir un usuari nou?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai.\n\nQualsevol usuari pot actualitzar les aplicacions dels altres usuaris."</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar-se l\'espai.\n\nQualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Estalvi de bateria activada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Redueix el rendiment i l\'ús de les dades en segon pla."</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactiva l\'estalvi de bateria"</string>
diff --git a/packages/SystemUI/res/values-cs/config.xml b/packages/SystemUI/res/values-cs/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-cs/config.xml
+++ b/packages/SystemUI/res/values-cs/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 878673c33640..ff608704d9ce 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informace o aplikaci"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"uzamknout v aplikaci"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"vyhledat"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabito"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíjení"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do plného nabití"</string>
diff --git a/packages/SystemUI/res/values-da/config.xml b/packages/SystemUI/res/values-da/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-da/config.xml
+++ b/packages/SystemUI/res/values-da/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index b40bd49a4686..5f2e7e955c7e 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Oplysninger om applikationen"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Bliv i app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"søg"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opladet"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Oplader"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> indtil fuld opladet"</string>
diff --git a/packages/SystemUI/res/values-de/config.xml b/packages/SystemUI/res/values-de/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-de/config.xml
+++ b/packages/SystemUI/res/values-de/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a742d87de601..db5c5c6e8113 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"App-Info"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"App-Verriegelung"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"Suche"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Aufgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Wird aufgeladen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Voll in <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-el/config.xml b/packages/SystemUI/res/values-el/config.xml
index 3a66eabecf81..f3cccde86a18 100644
--- a/packages/SystemUI/res/values-el/config.xml
+++ b/packages/SystemUI/res/values-el/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 δ, 10 δ, 30 δ, 60 δ, 120 δ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 5cba90d02191..8b14fdd45ae1 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Πληροφορίες εφαρμογής"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"αναζήτηση"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Φορτίστηκε"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Φόρτιση"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> για πλήρη φόρτιση"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/config.xml b/packages/SystemUI/res/values-en-rGB/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-en-rGB/config.xml
+++ b/packages/SystemUI/res/values-en-rGB/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 0418ae05b44d..9b8d66d15099 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -279,6 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> until full"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/config.xml b/packages/SystemUI/res/values-en-rIN/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-en-rIN/config.xml
+++ b/packages/SystemUI/res/values-en-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 0418ae05b44d..9b8d66d15099 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -279,6 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Application Info"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"search"</string>
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"Could not start <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Charged"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charging"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> until full"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/config.xml b/packages/SystemUI/res/values-es-rUS/config.xml
index 3a66eabecf81..0b667d0ab2af 100644
--- a/packages/SystemUI/res/values-es-rUS/config.xml
+++ b/packages/SystemUI/res/values-es-rUS/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index ebce179c5090..5ca3af8a433a 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"fijar aplicación"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completarse"</string>
diff --git a/packages/SystemUI/res/values-es/config.xml b/packages/SystemUI/res/values-es/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-es/config.xml
+++ b/packages/SystemUI/res/values-es/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 4328c5b1b042..4f6dd03a3ca2 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Información de la aplicación"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueo de aplicación"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completarse"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/config.xml b/packages/SystemUI/res/values-et-rEE/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-et-rEE/config.xml
+++ b/packages/SystemUI/res/values-et-rEE/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index af22a9884afa..2025aa86adcc 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Rakenduste teave"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lukusta rakendusele"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"otsing"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laetud"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laadimine"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Täislaadimiseks kulub <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-eu-rES/config.xml b/packages/SystemUI/res/values-eu-rES/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-eu-rES/config.xml
+++ b/packages/SystemUI/res/values-eu-rES/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index ae83468e2585..4cc0a0f2371a 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -212,7 +212,7 @@
<string name="gps_notification_found_text" msgid="4619274244146446464">"Kokapena GPS bidez ezarri da"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Aplikazioen kokapen-eskaerak aktibo daude"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Garbitu jakinarazpen guztiak."</string>
- <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Jakinarazpenen ezarpenak"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Jakinarazpen-ezarpenak"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ezarpenak"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Pantaila automatikoki biratuko da."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Pantaila horizontalki blokeatuta dago."</string>
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Aplikazioaren informazioa"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"aplikazio bakarreko modua"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"bilatu"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kargatuta"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kargatzen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> falta zaizkio guztiz kargatzeko"</string>
@@ -318,7 +320,7 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Saioarekin jarraitu nahi duzu?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Hasi berriro"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Bai, jarraitu"</string>
- <string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu nahi duzu?"</string>
+ <string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Errendimendua eta atzeko planoko datuak murrizten ditu"</string>
diff --git a/packages/SystemUI/res/values-fa/config.xml b/packages/SystemUI/res/values-fa/config.xml
index a4a7ca290773..e938c9aa5903 100644
--- a/packages/SystemUI/res/values-fa/config.xml
+++ b/packages/SystemUI/res/values-fa/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"۶۰۰۰۰:۱۰۰۰۰,۳۰۰۰۰۰:۳۰۰۰۰,۱۸۰۰۰۰۰:۶۰۰۰۰,۰"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"۱ ثانیه، ۱۰ ثانیه، ۳۰ ثانیه، ۶۰ ثانیه، ۱۲۰ ثانیه"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 11e624118fab..ee25680f51c3 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -70,7 +70,7 @@
<string name="screenshot_saving_title" msgid="8242282144535555697">"در حال ذخیره تصویر صفحه..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"تصویر صفحه ذخیره شد."</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"تصویر صفحه گرفته شد."</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"برای مشاهده تصویر صفحه خود، لمس کنید."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"برای مشاهده عکس صفحه‌نمایشتان، لمس کنید."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"تصویر صفحه گرفته نشد."</string>
<string name="screenshot_failed_text" msgid="1260203058661337274">"به دلیل فضای ذخیره‌سازی کم یا عدم اجازه برنامه یا سازمانتان، نمی‌توان از صفحه عکس گرفت."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"‏گزینه‌های انتقال فایل USB"</string>
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"اطلاعات برنامه"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"قفل به برنامه"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"جستجو"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"شارژ کامل شد"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"در حال شارژ شدن"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> مانده تا شارژ کامل شود"</string>
diff --git a/packages/SystemUI/res/values-fi/config.xml b/packages/SystemUI/res/values-fi/config.xml
new file mode 100644
index 000000000000..af68cdb79511
--- /dev/null
+++ b/packages/SystemUI/res/values-fi/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s,10 s, 30 s, 60 s, 120 s"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index a1742378f611..6ede21e27ea7 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Sovellustiedot"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lukitse sovellukseen"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"haku"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Ladattu"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Ladataan"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> kunnes täynnä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/config.xml b/packages/SystemUI/res/values-fr-rCA/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-fr-rCA/config.xml
+++ b/packages/SystemUI/res/values-fr-rCA/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 4c6e9fab5ca5..7a495311ab27 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Détails de l\'application"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"verrouiller sur l\'application"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargée"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Charge en cours..."</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargée dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-fr/config.xml b/packages/SystemUI/res/values-fr/config.xml
index 3a66eabecf81..0b667d0ab2af 100644
--- a/packages/SystemUI/res/values-fr/config.xml
+++ b/packages/SystemUI/res/values-fr/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index fc41386dd789..de32089b3375 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informations sur l\'application"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"verrouiller sur l\'application"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"rechercher"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Chargé"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"En charge"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Chargé dans <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-gl-rES/config.xml b/packages/SystemUI/res/values-gl-rES/config.xml
index 3a66eabecf81..f134bdc90103 100644
--- a/packages/SystemUI/res/values-gl-rES/config.xml
+++ b/packages/SystemUI/res/values-gl-rES/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s e 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index 68d3af470055..1cb1056f48cd 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Información da aplicación"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloqueo de aplicación"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"buscar"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Cargada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Cargando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completar a carga"</string>
@@ -301,9 +303,9 @@
<string name="keyguard_unlock" msgid="8043466894212841998">"Pasa o dedo cara arriba para desbloquear"</string>
<string name="phone_hint" msgid="3101468054914424646">"Pasa o dedo cara á dereita para acceder ao teléfono"</string>
<string name="camera_hint" msgid="5241441720959174226">"Pasa o dedo cara á esquerda para abrir a cámara"</string>
- <string name="interruption_level_none" msgid="3831278883136066646">"Nunca"</string>
+ <string name="interruption_level_none" msgid="3831278883136066646">"Ningún"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"Prioridade"</string>
- <string name="interruption_level_all" msgid="1330581184930945764">"Sempre"</string>
+ <string name="interruption_level_all" msgid="1330581184930945764">"Todas"</string>
<string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Cargando (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> para finalizar a carga)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Cambiar usuario"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Cambiar usuario, usuario actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-hi/config.xml b/packages/SystemUI/res/values-hi/config.xml
index 3a66eabecf81..000d96f1a7d4 100644
--- a/packages/SystemUI/res/values-hi/config.xml
+++ b/packages/SystemUI/res/values-hi/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 से,10 से, 30 से, 60 से, 120 से"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 74e4d2720794..6805d50467df 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
<item quantity="one" msgid="5854176083865845541">"1 हाल ही का ऐप्स"</item>
<item quantity="other" msgid="1040784359794890744">"%d हाल ही के ऐप्स"</item>
</plurals>
- <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई सूचना नहीं"</string>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई नोटिफिकेशन नहीं"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाएं"</string>
<string name="battery_low_title" msgid="6456385927409742437">"बैटरी कम है"</string>
@@ -149,7 +149,7 @@
<string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> प्रति‍शत बैटरी."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"सूचनाएं."</string>
- <string name="accessibility_remove_notification" msgid="3603099514902182350">"सूचना साफ़ करें"</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"नोटिफिकेशन साफ़ करें"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS सक्षम."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS प्राप्त करना."</string>
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"टेलीटाइपराइटर सक्षम."</string>
@@ -160,8 +160,8 @@
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> को ख़ारिज करें."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> खा़रिज कर दिया गया."</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> प्रारंभ हो रहा है."</string>
- <string name="accessibility_notification_dismissed" msgid="854211387186306927">"सूचना खारिज की गई."</string>
- <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"सूचना शेड."</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"नोटिफिकेशन खारिज की गई."</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"नोटिफिकेशन शेड."</string>
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"त्वरित सेटिंग."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग"</string>
@@ -212,7 +212,7 @@
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS द्वारा सेट किया गया स्‍थान"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"स्थान अनुरोध सक्रिय"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"सभी सूचनाएं साफ़ करें."</string>
- <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"सूचना सेटिंग"</string>
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"नोटिफिकेशन सेटिंग"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> सेटिंग"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"स्‍क्रीन स्‍वचालित रूप से घूमेगी."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"स्‍क्रीन लैंडस्केप अभिविन्यास में लॉक है."</string>
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"एप्‍लिकेशन जानकारी"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ऐप्स पर लॉक करें"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"खोज"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज हो गई है"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हो रही है"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"पूर्ण होने में <xliff:g id="CHARGING_TIME">%s</xliff:g> शेष"</string>
@@ -329,7 +331,7 @@
<string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"सभी साफ करें"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"अब प्रारंभ करें"</string>
- <string name="empty_shade_text" msgid="708135716272867002">"कोई सूचना नहीं"</string>
+ <string name="empty_shade_text" msgid="708135716272867002">"कोई नोटिफिकेशन नहीं"</string>
<string name="device_owned_footer" msgid="3802752663326030053">"उपकरण को मॉनीटर किया जा सकता है"</string>
<string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string>
<string name="vpn_footer" msgid="2388611096129106812">"नेटवर्क को मॉनीटर किया जा सकता है"</string>
diff --git a/packages/SystemUI/res/values-hr/config.xml b/packages/SystemUI/res/values-hr/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-hr/config.xml
+++ b/packages/SystemUI/res/values-hr/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index bb4007090c29..46ac883e0dfa 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacije o aplikaciji"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"zaključaj na aplikaciju"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pretraži"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Napunjeno"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Punjenje"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do napunjenosti"</string>
diff --git a/packages/SystemUI/res/values-hu/config.xml b/packages/SystemUI/res/values-hu/config.xml
index 3a66eabecf81..f5ccf756f096 100644
--- a/packages/SystemUI/res/values-hu/config.xml
+++ b/packages/SystemUI/res/values-hu/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1, 10, 30, 60, 120"</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 0c57c379bd03..9885ee61d5c5 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Az alkalmazás adatai"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"alkalmazászárolás"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"keresés"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Feltöltve"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Töltés"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> a teljes töltöttségig"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/config.xml b/packages/SystemUI/res/values-hy-rAM/config.xml
new file mode 100644
index 000000000000..cc0d74a10def
--- /dev/null
+++ b/packages/SystemUI/res/values-hy-rAM/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1վ,10վ,30վ,60վ,120վ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index c84e380f5cf7..51aba9b6a277 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Հավելվածի մասին"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Lock-to-app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"որոնել"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Լիցքավորված է"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Լիցքավորվում է"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Լրիվ լիցքավորմանը մնաց <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
@@ -318,8 +320,8 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Դուք ցանկանու՞մ եք շարունակել ձեր գործողությունը:"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Սկսել"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Այո, շարունակել"</string>
- <string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր օգտվող:"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր տարածքը:\n\nՑանկացած օգտվող կարող է թարմացնել ծրագրերը՝ մյուս բոլոր օգտվողների համար:"</string>
+ <string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր պրոֆիլ:"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Անջատել մարտկոցի տնտեսումը"</string>
diff --git a/packages/SystemUI/res/values-in/config.xml b/packages/SystemUI/res/values-in/config.xml
index 3a66eabecf81..2aa4b09bc208 100644
--- a/packages/SystemUI/res/values-in/config.xml
+++ b/packages/SystemUI/res/values-in/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1dtk,10dtk,30dtk,60dtk,120dtk"</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index cb3146c08cfa..07d6784e4c4d 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Info Aplikasi"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"kunci ke aplikasi"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"telusuri"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Terisi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengisi daya"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> sampai penuh"</string>
diff --git a/packages/SystemUI/res/values-is-rIS/config.xml b/packages/SystemUI/res/values-is-rIS/config.xml
index 3a66eabecf81..46f74562986c 100644
--- a/packages/SystemUI/res/values-is-rIS/config.xml
+++ b/packages/SystemUI/res/values-is-rIS/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek.,10 sek., 30 sek., 60 sek.,120 sek."</string>
</resources>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 37ac04207fa7..f9963765f7ac 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Forritsupplýsingar"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"forritslæsing"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"leita"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Fullhlaðin"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Í hleðslu"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> þar til fullri hleðslu er náð"</string>
diff --git a/packages/SystemUI/res/values-it/config.xml b/packages/SystemUI/res/values-it/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-it/config.xml
+++ b/packages/SystemUI/res/values-it/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 8879cfdd7488..68f491324117 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informazioni sull\'applicazione"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"blocca su app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"cerca"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carica"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"In carica"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> al termine della carica"</string>
diff --git a/packages/SystemUI/res/values-iw/config.xml b/packages/SystemUI/res/values-iw/config.xml
index 3a66eabecf81..42e8d6f3a1d4 100644
--- a/packages/SystemUI/res/values-iw/config.xml
+++ b/packages/SystemUI/res/values-iw/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"שנייה אחת, 10 שניות, 30 שניות, 60 שניות, 120 שניות"</string>
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index a59e61ad8564..961fbb48c6cf 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"מידע על האפליקציה"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"נעל לאפליקציה"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"חפש"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"טעון"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"טוען"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> עד למילוי"</string>
diff --git a/packages/SystemUI/res/values-ja/config.xml b/packages/SystemUI/res/values-ja/config.xml
index 3a66eabecf81..d0aaa2241e3f 100644
--- a/packages/SystemUI/res/values-ja/config.xml
+++ b/packages/SystemUI/res/values-ja/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s、10s、30s、60s、120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 2d926844fc14..383985a313cc 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"アプリ情報"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"アプリロック"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"検索"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"充電が完了しました"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電しています"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"充電完了まで<xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/config.xml b/packages/SystemUI/res/values-ka-rGE/config.xml
new file mode 100644
index 000000000000..57f58de0038a
--- /dev/null
+++ b/packages/SystemUI/res/values-ka-rGE/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1წმ,10წმ,30წმ,60წმ,120წმ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index 039cdd01309f..6010df5f7875 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"აპლიკაციის შესახებ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"აპზე ფიქსაცია"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ძიება"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"დატენილია"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"მიმდინარეობს დატენვა"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> სრულად დატენვამდე"</string>
diff --git a/packages/SystemUI/res/values-kk-rKZ/config.xml b/packages/SystemUI/res/values-kk-rKZ/config.xml
index 3a66eabecf81..2b93a22990bf 100644
--- a/packages/SystemUI/res/values-kk-rKZ/config.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1с,10с,30с,60с,120с"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 489a634621ae..12b83f5c5b42 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Қолданба туралы ақпарат"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"қолданбаға бекіту"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"іздеу"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Зарядталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядталуда"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Толғанға дейін <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/config.xml b/packages/SystemUI/res/values-km-rKH/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-km-rKH/config.xml
+++ b/packages/SystemUI/res/values-km-rKH/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index e49dd34fd073..67e42ada2256 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ព័ត៌មាន​កម្មវិធី"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ចាក់​សោ​ទៅ​កម្មវិធី"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"បាន​បញ្ចូល​ថ្ម​​"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុង​បញ្ចូល​ថ្ម"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូត​ដល់ពេញ"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/config.xml b/packages/SystemUI/res/values-kn-rIN/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-kn-rIN/config.xml
+++ b/packages/SystemUI/res/values-kn-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index f9f4ff9ad4e0..395d34657fce 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ಅಪ್ಲಿಕೇಶನ್ ಮಾಹಿತಿ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಲಾಕ್‌"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ಹುಡುಕಾಟ"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ಚಾರ್ಜ್ ಆಗಿದೆ"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/config.xml b/packages/SystemUI/res/values-ko/config.xml
new file mode 100644
index 000000000000..aa99bd513955
--- /dev/null
+++ b/packages/SystemUI/res/values-ko/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1초,10초,30초,60초,120초"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 6a39c1a6ed13..e767bc8b0c20 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"애플리케이션 정보"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"앱에 잠금"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"검색"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"충전됨"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"충전 중"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"완충까지 <xliff:g id="CHARGING_TIME">%s</xliff:g> 남음"</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/config.xml b/packages/SystemUI/res/values-ky-rKG/config.xml
index 3a66eabecf81..70f9c98f5393 100644
--- a/packages/SystemUI/res/values-ky-rKG/config.xml
+++ b/packages/SystemUI/res/values-ky-rKG/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1сек.,10сек.,30сек.,60сек.,120сек."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index c11f2cf954a2..dbc435408aa3 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -305,6 +305,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Колдонмо жөнүндө маалымат"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"колдонмого кулпулоо"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"издөө"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Кубатталды"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Кубатталууда"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> толгонго чейин"</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/config.xml b/packages/SystemUI/res/values-lo-rLA/config.xml
new file mode 100644
index 000000000000..3b10d52f6ffb
--- /dev/null
+++ b/packages/SystemUI/res/values-lo-rLA/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 ວິ,10 ວິ, 30 ວິ, 60 ວິ, 120 ວິ"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index fdc0a602ba73..b862d98f95a5 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"​ຂໍ້​ມູນ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ຊອກຫາ"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ສາກເຕັມແລ້ວ."</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ກຳລັງສາກໄຟ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ຈຶ່ງ​ຈະ​ເຕັມ"</string>
diff --git a/packages/SystemUI/res/values-lt/config.xml b/packages/SystemUI/res/values-lt/config.xml
new file mode 100644
index 000000000000..edfec94853ea
--- /dev/null
+++ b/packages/SystemUI/res/values-lt/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek., 10 sek., 30 sek., 60 sek., 120 sek."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 9439dc897516..7af8b7dcdf12 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Programos informacija"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Programos užrakinimo funkcija"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"paieška"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Įkrautas"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Kraunamas"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> iki visiško įkrovimo"</string>
diff --git a/packages/SystemUI/res/values-lv/config.xml b/packages/SystemUI/res/values-lv/config.xml
index 3a66eabecf81..0b667d0ab2af 100644
--- a/packages/SystemUI/res/values-lv/config.xml
+++ b/packages/SystemUI/res/values-lv/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 778c64bdc166..4aac8d8115d2 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informācija par lietojumprogrammu"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"fiksēt lietotni"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"Meklēt"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulators uzlādēts"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Notiek uzlāde"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> līdz pilnam akumulatoram"</string>
diff --git a/packages/SystemUI/res/values-mk-rMK/config.xml b/packages/SystemUI/res/values-mk-rMK/config.xml
new file mode 100644
index 000000000000..024f528cb554
--- /dev/null
+++ b/packages/SystemUI/res/values-mk-rMK/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1сек., 10 сек., 30 сек., 60 сек., 120 сек."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 7225f3734b84..b6399165e807 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информации за апликацијата"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"заклучи на апликација"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"пребарај"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Наполнета"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Се полни"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> додека не се наполни"</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/config.xml b/packages/SystemUI/res/values-ml-rIN/config.xml
index 3a66eabecf81..d2d29f9af5bf 100644
--- a/packages/SystemUI/res/values-ml-rIN/config.xml
+++ b/packages/SystemUI/res/values-ml-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1സെ,10സെ,30സെ,60സെ,120സെ"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index e10963d2a75d..3940e45138a3 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"അപ്ലിക്കേഷൻ വിവരം"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"അപ്ലിക്കേഷനിലേക്ക് ലോക്കുചെയ്യൽ"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"തിരയുക"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ചാർജ്ജുചെയ്‌തു"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ചാർജ്ജുചെയ്യുന്നു"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"പൂർണ്ണമായും ചാർജ്ജാകുന്നതിന്, <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/config.xml b/packages/SystemUI/res/values-mn-rMN/config.xml
index 3a66eabecf81..2b93a22990bf 100644
--- a/packages/SystemUI/res/values-mn-rMN/config.xml
+++ b/packages/SystemUI/res/values-mn-rMN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1с,10с,30с,60с,120с"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index bc58845dc0af..caa4c8a82729 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -212,10 +212,8 @@
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS байршил"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Байршлын хүсэлтүүд идэвхтэй"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"Бүх мэдэгдлийг цэвэрлэх."</string>
- <!-- no translation found for status_bar_notification_inspect_item_title (5668348142410115323) -->
- <skip />
- <!-- no translation found for status_bar_notification_app_settings_title (5525260160341558869) -->
- <skip />
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Мэдэгдлийн тохиргоо"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> тохиргоо"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Дэлгэц автоматаар эргэнэ."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Дэлгэц хэвтээ чиглэлд түгжигдсэн."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Дэлгэц босоо чиглэлээр түгжигдсэн."</string>
@@ -281,6 +279,7 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Аппликешны мэдээлэл"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Апп-дотор-түгжих"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"хайх"</string>
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж чадсангүй."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Цэнэглэгдсэн"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Цэнэглэж байна"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"дүүргэхэд <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-mr-rIN/config.xml b/packages/SystemUI/res/values-mr-rIN/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-mr-rIN/config.xml
+++ b/packages/SystemUI/res/values-mr-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index 9a611caa3d83..9e3baeda9020 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग माहिती"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"अ‍ॅप-लॉक-करणे"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"शोधा"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज झाली"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज होत आहे"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण होईपर्यंत"</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/config.xml b/packages/SystemUI/res/values-ms-rMY/config.xml
new file mode 100644
index 000000000000..4bbdea2560b1
--- /dev/null
+++ b/packages/SystemUI/res/values-ms-rMY/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 852788158c55..f1369e530222 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Maklumat Aplikasi"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"kunci ke apl"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"cari"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Sudah dicas"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Mengecas"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Lagi <xliff:g id="CHARGING_TIME">%s</xliff:g> untuk penuh"</string>
diff --git a/packages/SystemUI/res/values-my-rMM/config.xml b/packages/SystemUI/res/values-my-rMM/config.xml
index 3a26007c41e4..805d89328986 100644
--- a/packages/SystemUI/res/values-my-rMM/config.xml
+++ b/packages/SystemUI/res/values-my-rMM/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"၆၀၀၀၀:၁၀၀၀၀၊ ၃၀၀၀၀၀:၃၀၀၀၀၊ ၁၈၀၀၀၀၀:၆၀၀၀၀,၀"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"၁စက္ကန့်၊ ၁၀စက္ကန့်၊ ၃၀စက္ကန့်၊ 60စက္ကန့်၊ ၁၂၀စက္ကန့်"</string>
</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 30f53f9fa914..0e248c3f0f8c 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -277,6 +277,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်း အင်ဖို"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"appသို့ သော့ခတ်ထားရန်"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ရှာဖွေရန်"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
diff --git a/packages/SystemUI/res/values-nb/config.xml b/packages/SystemUI/res/values-nb/config.xml
new file mode 100644
index 000000000000..f87a0a3b4db9
--- /dev/null
+++ b/packages/SystemUI/res/values-nb/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 98919848a7c7..1047c3812fab 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformasjon"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lås til app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"Søk"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Oppladet"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Lader"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Fulladet om <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/config.xml b/packages/SystemUI/res/values-ne-rNP/config.xml
index 5fbf1d8d753d..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-ne-rNP/config.xml
+++ b/packages/SystemUI/res/values-ne-rNP/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"६००००:१००००,३०००००:३००००, १८०००००:६००००,०"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index dd3eb27793fd..9db7486a36dd 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"अनुप्रयोग जानकारी"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"अनुप्रयोग बन्द गर्न"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"खोजी गर्नुहोस्"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"चार्ज भयो"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"चार्ज हुँदै"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण नभएसम्म"</string>
diff --git a/packages/SystemUI/res/values-nl/config.xml b/packages/SystemUI/res/values-nl/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-nl/config.xml
+++ b/packages/SystemUI/res/values-nl/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 06bbfe1b3910..f9d42910a5c8 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"App-informatie"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"app-slot"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"zoeken"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Opgeladen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Opladen"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tot volledig opgeladen"</string>
diff --git a/packages/SystemUI/res/values-pl/config.xml b/packages/SystemUI/res/values-pl/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-pl/config.xml
+++ b/packages/SystemUI/res/values-pl/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index ab2983f3ce12..85c8784ebe84 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informacje o aplikacji"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"zablokuj na aplikacji"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"szukaj"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Naładowana"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Ładuje się"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do pełnego naładowania"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/config.xml b/packages/SystemUI/res/values-pt-rPT/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-pt-rPT/config.xml
+++ b/packages/SystemUI/res/values-pt-rPT/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 28dcc55c77ef..ec2531324235 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações da aplicação"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloquear numa aplicação"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"A carregar"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até ficar completa"</string>
diff --git a/packages/SystemUI/res/values-pt/config.xml b/packages/SystemUI/res/values-pt/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-pt/config.xml
+++ b/packages/SystemUI/res/values-pt/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 480c4904ef7d..e9688106ad8d 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -22,12 +22,12 @@
<string name="app_label" msgid="7164937344850004466">"Interf sist"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Limpar"</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_recent_inspect_item_title" msgid="7793624864528818569">"Informações do app"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar aplicativos recentes"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="5854176083865845541">"1 aplicativo recente"</item>
- <item quantity="other" msgid="1040784359794890744">"%d aplicativos recentes"</item>
+ <item quantity="one" msgid="5854176083865845541">"1 app recente"</item>
+ <item quantity="other" msgid="1040784359794890744">"%d apps recentes"</item>
</plurals>
<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>
@@ -52,8 +52,8 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth vinculado"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Configurar métodos de entrada"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Teclado físico"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"Permitir que o aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o dispositivo USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Permitir que o aplicativo <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o acessório USB?"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Permitir que o app <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o dispositivo USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Permitir que o app <xliff:g id="APPLICATION">%1$s</xliff:g> acesse o acessório USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Abrir <xliff:g id="ACTIVITY">%1$s</xliff:g> quando este dispositivo USB estiver conectado?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Abrir <xliff:g id="ACTIVITY">%1$s</xliff:g> quando este acessório USB estiver conectado?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Nenhum apl. instalado funciona com o USB. Saiba mais sobre o acessório em <xliff:g id="URL">%1$s</xliff:g>"</string>
@@ -278,9 +278,11 @@
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="recents_empty_message" msgid="8682129509540827999">"Suas telas recentes aparecem aqui"</string>
- <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do aplicativo"</string>
+ <string name="recents_app_info_button_label" msgid="2890317189376000030">"Informações do app"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"bloquear no app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Carregando"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até concluir"</string>
diff --git a/packages/SystemUI/res/values-ro/config.xml b/packages/SystemUI/res/values-ro/config.xml
new file mode 100644
index 000000000000..4bbdea2560b1
--- /dev/null
+++ b/packages/SystemUI/res/values-ro/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index d7843173cb57..96ac8745d530 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informații despre aplicație"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"blocare la aplicație"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"căutare"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"S-a încărcat"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Se încarcă"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> până la încărcare completă"</string>
@@ -314,7 +316,7 @@
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"Ștergeți invitatul?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"Toate aplicațiile și datele din această sesiune vor fi șterse."</string>
<string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"Ștergeți"</string>
- <string name="guest_wipe_session_title" msgid="6419439912885956132">"Welcome back, guest!"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"Bine ați revenit în sesiunea pentru invitați!"</string>
<string name="guest_wipe_session_message" msgid="8476238178270112811">"Vreți să continuați sesiunea?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"Începeți din nou"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"Da, continuați"</string>
diff --git a/packages/SystemUI/res/values-ru/config.xml b/packages/SystemUI/res/values-ru/config.xml
new file mode 100644
index 000000000000..09db84be424a
--- /dev/null
+++ b/packages/SystemUI/res/values-ru/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 сек.,10 сек.,30 сек.,60 сек.,120 сек."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index f83d7f9bcd0b..6c80c0245a48 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Сведения о приложении"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Блокировать в приложении"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"поиск"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Батарея заряжена"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Зарядка батареи"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> до полной зарядки"</string>
diff --git a/packages/SystemUI/res/values-si-rLK/config.xml b/packages/SystemUI/res/values-si-rLK/config.xml
new file mode 100644
index 000000000000..e693c1062adc
--- /dev/null
+++ b/packages/SystemUI/res/values-si-rLK/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"ත1,ත10,ත30,ත60,ත120"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index cff1265b58c9..94310db611dd 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"යෙදුම් තොරතුරු"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"යෙදුමට අඟුළු දැමීම"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"සෙවීම"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"අරෝපිතයි"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ආරෝපණය වෙමින්"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> සම්පූර්ණ වන තෙක්"</string>
diff --git a/packages/SystemUI/res/values-sk/config.xml b/packages/SystemUI/res/values-sk/config.xml
index 3a66eabecf81..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-sk/config.xml
+++ b/packages/SystemUI/res/values-sk/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index d782dd7dcbb4..e4159c51096f 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Informácie o aplikácii"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"Uzamknutie v aplikácii"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"hľadať"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nabitá"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nabíja sa"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Úplné nabitie o <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-sl/config.xml b/packages/SystemUI/res/values-sl/config.xml
index cd49028cbbf2..f87a0a3b4db9 100644
--- a/packages/SystemUI/res/values-sl/config.xml
+++ b/packages/SystemUI/res/values-sl/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000, 300000:30000, 1800000:60000, 0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 s, 10 s, 30 s, 60 s, 120 s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e913e91ccf1f..1036d0aa31f1 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Podatki o aplikaciji"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"zakleni v aplikacijo"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"iskanje"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Akumulator napolnjen"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Polnjenje"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> do napolnjenosti"</string>
diff --git a/packages/SystemUI/res/values-sr/config.xml b/packages/SystemUI/res/values-sr/config.xml
index 3a66eabecf81..f82a740ecbd9 100644
--- a/packages/SystemUI/res/values-sr/config.xml
+++ b/packages/SystemUI/res/values-sr/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 сек, 10 сек, 30 сек, 60 сек, 120 сек"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 9db6f9fddd23..9cfeb712f105 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Информације о апликацији"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"закључај апликацију"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"претражи"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Напуњена је"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Пуњење"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> док се не напуни"</string>
diff --git a/packages/SystemUI/res/values-sv/config.xml b/packages/SystemUI/res/values-sv/config.xml
index 3a66eabecf81..3b683a83006b 100644
--- a/packages/SystemUI/res/values-sv/config.xml
+++ b/packages/SystemUI/res/values-sv/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sek,10 sek, 30 sek, 60 sek,120 sek"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 1aebac0bda5f..1195affe46aa 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Appinformation"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lås till app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"sök"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Laddat"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Laddar"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> tills batteriet är fulladdat"</string>
diff --git a/packages/SystemUI/res/values-sw/config.xml b/packages/SystemUI/res/values-sw/config.xml
index 3a66eabecf81..cfde15909d7e 100644
--- a/packages/SystemUI/res/values-sw/config.xml
+++ b/packages/SystemUI/res/values-sw/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"sek 1,sek 10,sek 30,sek 60,sek 120"</string>
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 5d03ad80396a..74dfb90e616d 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -277,6 +277,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Maelezo ya Programu"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lazimisha kutumia programu"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"tafuta"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Betri imejaa"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Inachaji"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Imebakisha <xliff:g id="CHARGING_TIME">%s</xliff:g> ijae"</string>
diff --git a/packages/SystemUI/res/values-ta-rIN/config.xml b/packages/SystemUI/res/values-ta-rIN/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-ta-rIN/config.xml
+++ b/packages/SystemUI/res/values-ta-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 0838e606cc5d..79be0a319e4c 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -144,7 +144,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"வைஃபை"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"சிம் இல்லை."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"புளூடூத் இணைப்பு முறை."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"புளூடூத் டெதெரிங்."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"விமானப் பயன்முறை."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"பேட்டரி சக்தி <xliff:g id="NUMBER">%d</xliff:g> சதவிகிதம் உள்ளது."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"கணினி அமைப்பு."</string>
@@ -221,7 +221,7 @@
<string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"தற்போது திரை அகலவாக்குத் திசையமைப்பில் பூட்டப்பட்டுள்ளது."</string>
<string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"தற்போது திரை நீளவாக்குத் திசையமைப்பில் பூட்டப்பட்டுள்ளது."</string>
<string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string>
- <string name="start_dreams" msgid="7219575858348719790">"முழுநேர இயக்கம்"</string>
+ <string name="start_dreams" msgid="7219575858348719790">"பகல்கனா"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"விமானப் பயன்முறை"</string>
<string name="quick_settings_battery_charging_label" msgid="490074774465309209">"சார்ஜ் ஏற்றுகிறது, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
@@ -264,7 +264,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"முடிந்தது"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"இணைக்கப்பட்டது"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"இணைக்கிறது..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"இணைப்பு முறை"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"டெதெரிங்"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ஹாட்ஸ்பாட்"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"அறிவிப்புகள்"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ஃபிளாஷ்லைட்"</string>
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"பயன்பாட்டு தகவல்"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"லாக்-டு-ஆப்"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"தேடு"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"சார்ஜ் செய்யப்பட்டது"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"சார்ஜாகிறது"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"முழுவதும் சார்ஜாக <xliff:g id="CHARGING_TIME">%s</xliff:g> ஆகும்"</string>
@@ -287,9 +289,9 @@
<string name="description_target_search" msgid="3091587249776033139">"தேடு"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக இழுக்கவும்."</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக இழுக்கவும்."</string>
- <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"குறுக்கீடுகளும் இல்லை. அலாரங்களும் இல்லை."</string>
- <string name="zen_no_interruptions" msgid="7970973750143632592">"குறுக்கீடுகள் இல்லை"</string>
- <string name="zen_important_interruptions" msgid="3477041776609757628">"முதன்மையான குறுக்கீடுகள் மட்டும்"</string>
+ <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"அறிவிப்பும் இல்லை. அலாரங்களும் இல்லை."</string>
+ <string name="zen_no_interruptions" msgid="7970973750143632592">"தெரிவிக்காதே"</string>
+ <string name="zen_important_interruptions" msgid="3477041776609757628">"முக்கிய அறிவிப்புகள் மட்டும்"</string>
<string name="zen_alarm_information_time" msgid="5235772206174372272">"அடுத்த அலாரம் - <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_information_day_time" msgid="8422733576255047893">"அடுத்த அலாரம் - <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_warning" msgid="6873910860111498041">"<xliff:g id="ALARM_TIME">%s</xliff:g> க்கு அலாரத்தைக் கேட்க மாட்டீர்கள்"</string>
diff --git a/packages/SystemUI/res/values-te-rIN/config.xml b/packages/SystemUI/res/values-te-rIN/config.xml
index 3a66eabecf81..7a4c0cbdc716 100644
--- a/packages/SystemUI/res/values-te-rIN/config.xml
+++ b/packages/SystemUI/res/values-te-rIN/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1సె,10సె,30సె,60సె,120సె"</string>
</resources>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 302e5aca7d1b..2afb65f0cd99 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"అనువర్తన సమాచారం"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"లాక్ టు యాప్"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"శోధించు"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ఛార్జ్ చేయబడింది"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"ఛార్జ్ అవుతోంది"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"పూర్తిగా నిండటానికి <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-th/config.xml b/packages/SystemUI/res/values-th/config.xml
index 3a66eabecf81..f08a88004836 100644
--- a/packages/SystemUI/res/values-th/config.xml
+++ b/packages/SystemUI/res/values-th/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1, 10, 30, 60, 120 วินาที"</string>
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 09a8530b2eec..0e3754d2c772 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ข้อมูลแอปพลิเคชัน"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"การล็อกแอป"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ค้นหา"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"ชาร์จแล้ว"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"กำลังชาร์จ"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"อีก <xliff:g id="CHARGING_TIME">%s</xliff:g> จึงจะเต็ม"</string>
diff --git a/packages/SystemUI/res/values-tl/config.xml b/packages/SystemUI/res/values-tl/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-tl/config.xml
+++ b/packages/SystemUI/res/values-tl/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index a0f94fd4535e..ba3664362d16 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Impormasyon ng Application"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"lock to app"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"maghanap"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Nasingil na"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Nagcha-charge"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> hanggang mapuno"</string>
diff --git a/packages/SystemUI/res/values-tr/config.xml b/packages/SystemUI/res/values-tr/config.xml
new file mode 100644
index 000000000000..22b58731170d
--- /dev/null
+++ b/packages/SystemUI/res/values-tr/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 sn., 10 sn., 30 sn., 60 sn., 120 sn."</string>
+</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index bab860bffc40..af9c0f283aa1 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Uygulama Bilgileri"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"uygulamaya kilitle"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ara"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Ödeme alındı"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Şarj oluyor"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"Tam şarj olmasına <xliff:g id="CHARGING_TIME">%s</xliff:g> kaldı"</string>
diff --git a/packages/SystemUI/res/values-uk/config.xml b/packages/SystemUI/res/values-uk/config.xml
index 3a66eabecf81..3a6872f1d029 100644
--- a/packages/SystemUI/res/values-uk/config.xml
+++ b/packages/SystemUI/res/values-uk/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 с, 10 с, 30 с, 60 с, 120 с"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index cbbdbe9bc96e..78f7986d57dc 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Інформація про додаток"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"блокування в додатку"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"пошук"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Заряджено"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Заряджається"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"До повного зарядження <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/config.xml b/packages/SystemUI/res/values-ur-rPK/config.xml
new file mode 100644
index 000000000000..4bbdea2560b1
--- /dev/null
+++ b/packages/SystemUI/res/values-ur-rPK/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index dccf861aa515..367f19b71293 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -212,10 +212,8 @@
<string name="gps_notification_found_text" msgid="4619274244146446464">"‏مقام متعین کیا گیا بذریعہ GPS"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"مقام کی درخواستیں فعال ہیں"</string>
<string name="accessibility_clear_all" msgid="5235938559247164925">"سبھی اطلاعات صاف کریں۔"</string>
- <!-- no translation found for status_bar_notification_inspect_item_title (5668348142410115323) -->
- <skip />
- <!-- no translation found for status_bar_notification_app_settings_title (5525260160341558869) -->
- <skip />
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"اطلاع کی ترتیبات"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ترتیبات"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"اسکرین خود بخود گردش کرے گی۔"</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"اسکرین لینڈ اسکیپ سمت بندی میں مقفل ہے۔"</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"اسکرین پورٹریٹ سمت بندی میں مقفل ہے۔"</string>
@@ -281,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"ایپلیکیشن کی معلومات"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"لاک ٹو ایپ"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"تلاش کریں"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"چارج ہوگئی"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"چارج ہو رہی ہے"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> مکمل ہونے تک"</string>
@@ -321,7 +321,7 @@
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"دوبارہ شروع کریں"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ہاں، جاری رکھیں"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"نیا صارف شامل کریں؟"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"بیٹری کی بچت آف کریں"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/config.xml b/packages/SystemUI/res/values-uz-rUZ/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-uz-rUZ/config.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 4cf823b0a14e..6eaaee674e51 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Ilova haqida ma’lumot"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ilovaga qulflash"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"qidirish"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Batareya quvvati to‘ldi"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Quvvat olmoqda"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>da to‘ladi"</string>
diff --git a/packages/SystemUI/res/values-vi/config.xml b/packages/SystemUI/res/values-vi/config.xml
new file mode 100644
index 000000000000..17306ca950b0
--- /dev/null
+++ b/packages/SystemUI/res/values-vi/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 giây,10 giây,30 giây,60 giây,120 giây"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index f0f1268dc62e..8546f8c02720 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Thông tin ứng dụng"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"khóa trong ứng dụng"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"tìm kiếm"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Đã sạc"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Đang sạc"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> cho đến khi đầy"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/config.xml b/packages/SystemUI/res/values-zh-rCN/config.xml
new file mode 100644
index 000000000000..73c3807cd586
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rCN/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1秒、10秒、30秒、60秒、120秒"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 97886c92468b..d3ae7fe523d6 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"应用信息"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"固定屏幕"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜索"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"充电完成"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"正在充电"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"还需<xliff:g id="CHARGING_TIME">%s</xliff:g>充满"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/config.xml b/packages/SystemUI/res/values-zh-rHK/config.xml
new file mode 100644
index 000000000000..1f7d76cbcb73
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rHK/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 秒、10 秒、30 秒、60 秒、120 秒"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 31191c191527..becba6224649 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資料"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"應用程式鎖定"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已完成充電"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後完成充電"</string>
@@ -321,7 +323,7 @@
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"重新開始"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"是的,請繼續"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為其他所有使用者更新應用程式。"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為所有其他使用者更新應用程式。"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"關閉省電模式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/config.xml b/packages/SystemUI/res/values-zh-rTW/config.xml
new file mode 100644
index 000000000000..51eb00d38f45
--- /dev/null
+++ b/packages/SystemUI/res/values-zh-rTW/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1 秒,10 秒,30 秒,60 秒,120 秒"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index f6f862088d9a..705cea962e61 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -281,6 +281,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"應用程式資訊"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"應用程式鎖定"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"搜尋"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"已充飽"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"充電中"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g>後充飽"</string>
diff --git a/packages/SystemUI/res/values-zu/config.xml b/packages/SystemUI/res/values-zu/config.xml
index 3a66eabecf81..4bbdea2560b1 100644
--- a/packages/SystemUI/res/values-zu/config.xml
+++ b/packages/SystemUI/res/values-zu/config.xml
@@ -22,5 +22,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="doze_pulse_period_function" msgid="3632386860508136337">"60000:10000,300000:30000,1800000:60000,0"</string>
+ <string name="doze_pulse_schedule" msgid="1301215615981695214">"1s,10s,30s,60s,120s"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index d0cfb5b2d197..1441bd3b9d9e 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -279,6 +279,8 @@
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Ulwazi lohlelo lokusebenza"</string>
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ukukhiya kuhlelo lokusebenza"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"sesha"</string>
+ <!-- no translation found for recents_launch_error_message (2969287838120550506) -->
+ <skip />
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Kushajiwe"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"Iyashaja"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ize igcwale"</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index d5b0f17f96a1..82dccd2b215f 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -117,4 +117,10 @@
<!-- The color of the navigation bar icons. Need to be in sync with ic_sysbar_* -->
<color name="navigation_bar_icon_color">#E5FFFFFF</color>
+
+ <!-- Shadow color for the first pixels around the fake shadow for recents. -->
+ <color name="fake_shadow_start_color">#44000000</color>
+
+ <!-- Shadow color for the furthest pixels around the fake shadow for recents. -->
+ <color name="fake_shadow_end_color">#03000000</color>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 9654da99ed03..2e6f898dc470 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -29,12 +29,18 @@
ImageView -->
<bool name="config_recents_thumbnail_image_fits_to_xy">false</bool>
+ <!-- Whether recents should use hardware layers for its taskviews. This flag can be enabled
+ for devices where the java drawing of round rects may be slow -->
+ <bool name="config_recents_use_hardware_layers">false</bool>
+
<!-- The number of app thumbnails we keep in memory -->
<integer name="config_recents_max_thumbnail_count">10</integer>
<!-- The number of app icons we keep in memory -->
<integer name="config_recents_max_icon_count">20</integer>
+ <!-- Whether to use cheap, less good looking shadows for recents -->
+ <bool name="config_recents_fake_shadows">false</bool>
<!-- The theme to use for RecentsActivity. -->
<item type="style" name="config_recents_activity_theme">@style/RecentsTheme.Wallpaper</item>
@@ -148,9 +154,12 @@
duration of the transition in to recents from home. -->
<integer name="recents_animate_task_enter_from_home_delay">150</integer>
<!-- The min animation duration for animating the task in when transitioning from home. -->
- <integer name="recents_animate_task_enter_from_home_duration">275</integer>
- <!-- The animation stagger to apply to each task animation when transitioning from home. -->
- <integer name="recents_animate_task_enter_from_home_stagger_delay">10</integer>
+ <integer name="recents_animate_task_enter_from_home_duration">200</integer>
+ <!-- The total animation stagger delay when entering from home. -->
+ <integer name="recents_animate_task_enter_from_home_stagger_delay">110</integer>
+ <!-- The total animation duration added to the last card when entering from home.
+ This value is partialy also added to the previous tasks -->
+ <integer name="recents_animate_task_enter_from_home_stagger_duration">72</integer>
<!-- The short duration when animating in/out the lock to app button. -->
<integer name="recents_animate_lock_to_app_button_short_duration">150</integer>
<!-- The long duration when animating in/out the lock to app button. -->
@@ -202,7 +211,7 @@
<bool name="doze_pulse_on_notifications">true</bool>
<!-- Doze: when to pulse after a buzzworthy notification arrives -->
- <string name="doze_pulse_schedule">1s,10s,30s,60s,120s</string>
+ <string name="doze_pulse_schedule" translatable="false">1s,10s,30s,60s,120s</string>
<!-- Doze: maximum number of times the notification pulse schedule can be reset -->
<integer name="doze_pulse_schedule_resets">3</integer>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 37ee0aea1301..c690ef4f89e9 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -292,7 +292,7 @@
<dimen name="unlock_falsing_threshold">80dp</dimen>
<!-- Lockscreen falsing threshold for quick settings. -->
- <dimen name="qs_falsing_threshold">80dp</dimen>
+ <dimen name="qs_falsing_threshold">40dp</dimen>
<!-- Falsing threshold used when dismissing notifications from the lockscreen. -->
<dimen name="swipe_helper_falsing_threshold">70dp</dimen>
@@ -452,10 +452,14 @@
<!-- How far the user needs to drag up to invoke search. -->
<dimen name="search_panel_threshold">100dp</dimen>
- <!-- The width/height of the phone/camera/unlock icon on keyguard. -->
+ <!-- The width/height of the phone/camera/unlock icon view on keyguard. -->
<dimen name="keyguard_affordance_height">56dp</dimen>
<dimen name="keyguard_affordance_width">56dp</dimen>
+ <!-- The width/height of the phone/camera/unlock icon drawable on keyguard. -->
+ <dimen name="keyguard_affordance_icon_height">24dp</dimen>
+ <dimen name="keyguard_affordance_icon_width">24dp</dimen>
+
<dimen name="keyguard_indication_margin_bottom">65dp</dimen>
<!-- The text size for battery level -->
@@ -492,4 +496,10 @@
<!-- The maximum width of the navigation bar ripples. -->
<dimen name="key_button_ripple_max_width">95dp</dimen>
+
+ <!-- Inset shadow for FakeShadowDrawable. It is used to avoid gaps between the card
+ and the shadow. -->
+ <dimen name="fake_shadow_inset">1dp</dimen>
+
+ <dimen name="fake_shadow_size">8dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/lland_config.xml b/packages/SystemUI/res/values/lland_config.xml
new file mode 100644
index 000000000000..56125a57f96c
--- /dev/null
+++ b/packages/SystemUI/res/values/lland_config.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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>
+ <dimen name="obstacle_spacing">380dp</dimen>
+ <dimen name="translation_per_sec">100dp</dimen>
+ <dimen name="boost_dv">600dp</dimen>
+ <dimen name="player_hit_size">40dp</dimen>
+ <dimen name="player_size">40dp</dimen>
+ <dimen name="obstacle_width">80dp</dimen>
+ <dimen name="obstacle_gap">170dp</dimen>
+ <dimen name="obstacle_height_min">40dp</dimen>
+ <dimen name="building_width_min">20dp</dimen>
+ <dimen name="building_width_max">250dp</dimen>
+ <dimen name="building_height_min">20dp</dimen>
+ <dimen name="cloud_size_min">10dp</dimen>
+ <dimen name="cloud_size_max">100dp</dimen>
+ <dimen name="sun_size">45dp</dimen>
+ <dimen name="moon_size">30dp</dimen>
+ <dimen name="star_size_min">3dp</dimen>
+ <dimen name="star_size_max">5dp</dimen>
+ <dimen name="G">30dp</dimen>
+ <dimen name="max_v">1000dp</dimen>
+ <dimen name="scenery_z">6dp</dimen>
+ <dimen name="obstacle_z">15dp</dimen>
+ <dimen name="player_z">15dp</dimen>
+ <dimen name="player_z_boost">18dp</dimen>
+ <dimen name="hud_z">35dp</dimen>
+</resources>
diff --git a/packages/SystemUI/res/values/lland_strings.xml b/packages/SystemUI/res/values/lland_strings.xml
new file mode 100644
index 000000000000..ce88157d2dac
--- /dev/null
+++ b/packages/SystemUI/res/values/lland_strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2014, 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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Name of the L Land easter egg. DO NOT TRANSLATE -->
+ <string name="lland">L Land</string>
+</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 0445fe816af6..e9a1acff87b0 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -670,6 +670,8 @@
<string name="recents_lock_to_app_button_label">lock to app</string>
<!-- Recents: Temporary string for the button in the recents search bar. [CHAR LIMIT=NONE] -->
<string name="recents_search_bar_label">search</string>
+ <!-- Recents: Launch error string. [CHAR LIMIT=NONE] -->
+ <string name="recents_launch_error_message">Could not start <xliff:g id="app" example="Calendar">%s</xliff:g>.</string>
<!-- Expanded Status Bar Header: Battery Charged [CHAR LIMIT=40] -->
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
new file mode 100644
index 000000000000..e92f9888ac99
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.doze;
+
+import android.annotation.NonNull;
+
+/**
+ * Interface the doze service uses to communicate with the rest of system UI.
+ */
+public interface DozeHost {
+ void addCallback(@NonNull Callback callback);
+ void removeCallback(@NonNull Callback callback);
+ void startDozing(@NonNull Runnable ready);
+ void pulseWhileDozing(@NonNull PulseCallback callback);
+ void stopDozing();
+ boolean isPowerSaveActive();
+
+ public interface Callback {
+ void onNewNotifications();
+ void onBuzzBeepBlinked();
+ void onNotificationLight(boolean on);
+ void onPowerSaveChanged(boolean active);
+ }
+
+ public interface PulseCallback {
+ void onPulseStarted();
+ void onPulseFinished();
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
new file mode 100644
index 000000000000..3bf86a094941
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.doze;
+
+import android.content.Context;
+import android.os.Build;
+import android.util.Log;
+import android.util.TimeUtils;
+
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
+
+import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DozeLog {
+ private static final String TAG = "DozeLog";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ private static final boolean ENABLED = true;
+ private static final int SIZE = Build.IS_DEBUGGABLE ? 400 : 50;
+ private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+
+ private static long[] sTimes;
+ private static String[] sMessages;
+ private static int sPosition;
+ private static int sCount;
+ private static boolean sPulsing;
+
+ private static long sSince;
+ private static SummaryStats sPickupPulseNearVibrationStats;
+ private static SummaryStats sPickupPulseNotNearVibrationStats;
+ private static SummaryStats sNotificationPulseStats;
+ private static SummaryStats sScreenOnPulsingStats;
+ private static SummaryStats sScreenOnNotPulsingStats;
+ private static SummaryStats sEmergencyCallStats;
+
+ public static void tracePickupPulse(boolean withinVibrationThreshold) {
+ if (!ENABLED) return;
+ log("pickupPulse withinVibrationThreshold=" + withinVibrationThreshold);
+ (withinVibrationThreshold ? sPickupPulseNearVibrationStats
+ : sPickupPulseNotNearVibrationStats).append();
+ }
+
+ public static void tracePulseStart() {
+ if (!ENABLED) return;
+ sPulsing = true;
+ log("pulseStart");
+ }
+
+ public static void tracePulseFinish() {
+ if (!ENABLED) return;
+ sPulsing = false;
+ log("pulseFinish");
+ }
+
+ public static void traceNotificationPulse(long instance) {
+ if (!ENABLED) return;
+ log("notificationPulse instance=" + instance);
+ sNotificationPulseStats.append();
+ }
+
+ public static void traceDozing(Context context, boolean dozing) {
+ if (!ENABLED) return;
+ sPulsing = false;
+ synchronized (DozeLog.class) {
+ if (dozing && sMessages == null) {
+ sTimes = new long[SIZE];
+ sMessages = new String[SIZE];
+ sSince = System.currentTimeMillis();
+ sPickupPulseNearVibrationStats = new SummaryStats();
+ sPickupPulseNotNearVibrationStats = new SummaryStats();
+ sNotificationPulseStats = new SummaryStats();
+ sScreenOnPulsingStats = new SummaryStats();
+ sScreenOnNotPulsingStats = new SummaryStats();
+ sEmergencyCallStats = new SummaryStats();
+ log("init");
+ KeyguardUpdateMonitor.getInstance(context)
+ .registerCallback(new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onEmergencyCallAction() {
+ traceEmergencyCall();
+ }
+ @Override
+ public void onKeyguardBouncerChanged(boolean bouncer) {
+ traceKeyguardBouncerChanged(bouncer);
+ }
+ @Override
+ public void onScreenTurnedOn() {
+ traceScreenOn();
+ }
+ @Override
+ public void onScreenTurnedOff(int why) {
+ traceScreenOff(why);
+ }
+ @Override
+ public void onKeyguardVisibilityChanged(boolean showing) {
+ traceKeyguard(showing);
+ }
+ });
+ }
+ }
+ log("dozing " + dozing);
+ }
+
+ public static void traceFling(boolean expand, boolean aboveThreshold, boolean thresholdNeeded) {
+ if (!ENABLED) return;
+ log("fling expand=" + expand + " aboveThreshold=" + aboveThreshold + " thresholdNeeded="
+ + thresholdNeeded);
+ }
+
+ public static void traceEmergencyCall() {
+ if (!ENABLED) return;
+ log("emergencyCall");
+ }
+
+ public static void traceKeyguardBouncerChanged(boolean showing) {
+ if (!ENABLED) return;
+ log("bouncer " + showing);
+ }
+
+ public static void traceScreenOn() {
+ if (!ENABLED) return;
+ log("screenOn pulsing=" + sPulsing);
+ (sPulsing ? sScreenOnPulsingStats : sScreenOnNotPulsingStats).append();
+ sPulsing = false;
+ }
+
+ public static void traceScreenOff(int why) {
+ if (!ENABLED) return;
+ log("screenOff why=" + why);
+ }
+
+ public static void traceKeyguard(boolean showing) {
+ if (!ENABLED) return;
+ log("keyguard " + showing);
+ if (!showing) {
+ sPulsing = false;
+ }
+ }
+
+ public static void dump(PrintWriter pw) {
+ synchronized (DozeLog.class) {
+ if (sMessages == null) return;
+ pw.println(" Doze log:");
+ final int start = (sPosition - sCount + SIZE) % SIZE;
+ for (int i = 0; i < sCount; i++) {
+ final int j = (start + i) % SIZE;
+ pw.print(" ");
+ pw.print(FORMAT.format(new Date(sTimes[j])));
+ pw.print(' ');
+ pw.println(sMessages[j]);
+ }
+ pw.print(" Doze summary stats (for ");
+ TimeUtils.formatDuration(System.currentTimeMillis() - sSince, pw);
+ pw.println("):");
+ sPickupPulseNearVibrationStats.dump(pw, "Pickup pulse (near vibration)");
+ sPickupPulseNotNearVibrationStats.dump(pw, "Pickup pulse (not near vibration)");
+ sNotificationPulseStats.dump(pw, "Notification pulse");
+ sScreenOnPulsingStats.dump(pw, "Screen on (pulsing)");
+ sScreenOnNotPulsingStats.dump(pw, "Screen on (not pulsing)");
+ sEmergencyCallStats.dump(pw, "Emergency call");
+ }
+ }
+
+ private static void log(String msg) {
+ synchronized (DozeLog.class) {
+ if (sMessages == null) return;
+ sTimes[sPosition] = System.currentTimeMillis();
+ sMessages[sPosition] = msg;
+ sPosition = (sPosition + 1) % SIZE;
+ sCount = Math.min(sCount + 1, SIZE);
+ }
+ if (DEBUG) Log.d(TAG, msg);
+ }
+
+ private static class SummaryStats {
+ private int mCount;
+
+ public void append() {
+ mCount++;
+ }
+
+ public void dump(PrintWriter pw, String type) {
+ pw.print(" ");
+ pw.print(type);
+ pw.print(": n=");
+ pw.print(mCount);
+ pw.print(" (");
+ final double perHr = (double) mCount / (System.currentTimeMillis() - sSince)
+ * 1000 * 60 * 60;
+ pw.print(perHr);
+ pw.print("/hr)");
+ pw.println();
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index e2c8ff95ae17..b07e99379abb 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -27,7 +27,6 @@ import android.hardware.SensorManager;
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.media.AudioAttributes;
-import android.os.Handler;
import android.os.PowerManager;
import android.os.Vibrator;
import android.service.dreams.DreamService;
@@ -49,13 +48,13 @@ public class DozeService extends DreamService {
private static final String ACTION_BASE = "com.android.systemui.doze";
private static final String PULSE_ACTION = ACTION_BASE + ".pulse";
private static final String NOTIFICATION_PULSE_ACTION = ACTION_BASE + ".notification_pulse";
+ private static final String EXTRA_INSTANCE = "instance";
private final String mTag = String.format(TAG + ".%08x", hashCode());
private final Context mContext = this;
- private final Handler mHandler = new Handler();
private final DozeParameters mDozeParameters = new DozeParameters(mContext);
- private Host mHost;
+ private DozeHost mHost;
private SensorManager mSensors;
private TriggerSensor mSigMotionSensor;
private TriggerSensor mPickupSensor;
@@ -63,11 +62,10 @@ public class DozeService extends DreamService {
private PowerManager.WakeLock mWakeLock;
private AlarmManager mAlarmManager;
private boolean mDreaming;
+ private boolean mPulsing;
private boolean mBroadcastReceiverRegistered;
private boolean mDisplayStateSupported;
- private int mDisplayStateWhenOn;
private boolean mNotificationLightOn;
- private PendingIntent mNotificationPulseIntent;
private boolean mPowerSaveActive;
private long mNotificationPulseTime;
private int mScheduleResetsRemaining;
@@ -81,6 +79,8 @@ public class DozeService extends DreamService {
protected void dumpOnHandler(FileDescriptor fd, PrintWriter pw, String[] args) {
super.dumpOnHandler(fd, pw, args);
pw.print(" mDreaming: "); pw.println(mDreaming);
+ pw.print(" mPulsing: "); pw.println(mPulsing);
+ pw.print(" mWakeLock: held="); pw.println(mWakeLock.isHeld());
pw.print(" mHost: "); pw.println(mHost);
pw.print(" mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered);
pw.print(" mSigMotionSensor: "); pw.println(mSigMotionSensor);
@@ -100,7 +100,7 @@ public class DozeService extends DreamService {
if (getApplication() instanceof SystemUIApplication) {
final SystemUIApplication app = (SystemUIApplication) getApplication();
- mHost = app.getComponent(Host.class);
+ mHost = app.getComponent(DozeHost.class);
}
if (mHost == null) Log.w(TAG, "No doze service host found.");
@@ -113,13 +113,10 @@ public class DozeService extends DreamService {
mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup());
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag);
+ mWakeLock.setReferenceCounted(true);
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mDisplayStateSupported = mDozeParameters.getDisplayStateSupported();
- mNotificationPulseIntent = PendingIntent.getBroadcast(mContext, 0,
- new Intent(NOTIFICATION_PULSE_ACTION).setPackage(getPackageName()),
- PendingIntent.FLAG_UPDATE_CURRENT);
- mDisplayStateWhenOn = mDisplayStateSupported ? Display.STATE_DOZE : Display.STATE_ON;
- mDisplayOff.run();
+ turnDisplayOff();
}
@Override
@@ -131,32 +128,39 @@ public class DozeService extends DreamService {
@Override
public void onDreamingStarted() {
super.onDreamingStarted();
- mPowerSaveActive = mHost != null && mHost.isPowerSaveActive();
+
+ if (mHost == null) {
+ finish();
+ return;
+ }
+
+ mPowerSaveActive = mHost.isPowerSaveActive();
if (DEBUG) Log.d(mTag, "onDreamingStarted canDoze=" + canDoze() + " mPowerSaveActive="
+ mPowerSaveActive);
if (mPowerSaveActive) {
finishToSavePower();
return;
}
+
mDreaming = true;
listenForPulseSignals(true);
rescheduleNotificationPulse(false /*predicate*/); // cancel any pending pulse alarms
- requestDoze();
- }
-
- public void stayAwake(long millis) {
- if (mDreaming && millis > 0) {
- if (DEBUG) Log.d(mTag, "stayAwake millis=" + millis);
- mWakeLock.acquire(millis);
- setDozeScreenState(mDisplayStateWhenOn);
- rescheduleOff(millis);
- }
- }
- private void rescheduleOff(long millis) {
- if (DEBUG) Log.d(TAG, "rescheduleOff millis=" + millis);
- mHandler.removeCallbacks(mDisplayOff);
- mHandler.postDelayed(mDisplayOff, millis);
+ // Ask the host to get things ready to start dozing.
+ // Once ready, we call startDozing() at which point the CPU may suspend
+ // and we will need to acquire a wakelock to do work.
+ mHost.startDozing(new Runnable() {
+ @Override
+ public void run() {
+ if (mDreaming) {
+ startDozing();
+
+ // From this point until onDreamingStopped we will need to hold a
+ // wakelock whenever we are doing work. Note that we never call
+ // stopDozing because can we just keep dozing until the bitter end.
+ }
+ }
+ });
}
@Override
@@ -164,37 +168,52 @@ public class DozeService extends DreamService {
if (DEBUG) Log.d(mTag, "onDreamingStopped isDozing=" + isDozing());
super.onDreamingStopped();
- mDreaming = false;
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
+ if (mHost == null) {
+ return;
}
+
+ mDreaming = false;
listenForPulseSignals(false);
- dozingStopped();
- mHandler.removeCallbacks(mDisplayOff);
- }
- @Override
- public void startDozing() {
- if (DEBUG) Log.d(mTag, "startDozing");
- super.startDozing();
+ // Tell the host that it's over.
+ mHost.stopDozing();
}
- private void requestDoze() {
- if (mHost != null) {
- mHost.requestDoze(this);
+ private void requestPulse() {
+ if (mHost != null && mDreaming && !mPulsing) {
+ // Let the host know we want to pulse. Wait for it to be ready, then
+ // turn the screen on. When finished, turn the screen off again.
+ // Here we need a wakelock to stay awake until the pulse is finished.
+ mWakeLock.acquire();
+ mPulsing = true;
+ mHost.pulseWhileDozing(new DozeHost.PulseCallback() {
+ @Override
+ public void onPulseStarted() {
+ if (mPulsing && mDreaming) {
+ turnDisplayOn();
+ }
+ }
+
+ @Override
+ public void onPulseFinished() {
+ if (mPulsing && mDreaming) {
+ mPulsing = false;
+ turnDisplayOff();
+ mWakeLock.release();
+ }
+ }
+ });
}
}
- private void requestPulse() {
- if (mHost != null) {
- mHost.requestPulse(this);
- }
+ private void turnDisplayOff() {
+ if (DEBUG) Log.d(TAG, "Display off");
+ setDozeScreenState(Display.STATE_OFF);
}
- private void dozingStopped() {
- if (mHost != null) {
- mHost.dozingStopped(this);
- }
+ private void turnDisplayOn() {
+ if (DEBUG) Log.d(TAG, "Display on");
+ setDozeScreenState(mDisplayStateSupported ? Display.STATE_DOZE : Display.STATE_ON);
}
private void finishToSavePower() {
@@ -225,7 +244,6 @@ public class DozeService extends DreamService {
}
private void listenForNotifications(boolean listen) {
- if (mHost == null) return;
if (listen) {
resetNotificationResets();
mHost.addCallback(mHostCallback);
@@ -257,9 +275,19 @@ public class DozeService extends DreamService {
rescheduleNotificationPulse(true /*predicate*/);
}
+ private PendingIntent notificationPulseIntent(long instance) {
+ return PendingIntent.getBroadcast(mContext, 0,
+ new Intent(NOTIFICATION_PULSE_ACTION)
+ .setPackage(getPackageName())
+ .putExtra(EXTRA_INSTANCE, instance)
+ .setFlags(Intent.FLAG_RECEIVER_FOREGROUND),
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
private void rescheduleNotificationPulse(boolean predicate) {
if (DEBUG) Log.d(TAG, "rescheduleNotificationPulse predicate=" + predicate);
- mAlarmManager.cancel(mNotificationPulseIntent);
+ final PendingIntent notificationPulseIntent = notificationPulseIntent(0);
+ mAlarmManager.cancel(notificationPulseIntent);
if (!predicate) {
if (DEBUG) Log.d(TAG, " don't reschedule: predicate is false");
return;
@@ -280,8 +308,10 @@ public class DozeService extends DreamService {
if (DEBUG) Log.d(TAG, " don't reschedule: delta is " + delta);
return;
}
- if (DEBUG) Log.d(TAG, "Scheduling pulse in " + delta + "ms for " + new Date(time));
- mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, mNotificationPulseIntent);
+ final long instance = time - mNotificationPulseTime;
+ if (DEBUG) Log.d(TAG, "Scheduling pulse " + instance + " in " + delta + "ms for "
+ + new Date(time));
+ mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, notificationPulseIntent(instance));
}
private static String triggerEventToString(TriggerEvent event) {
@@ -297,14 +327,6 @@ public class DozeService extends DreamService {
return sb.append(']').toString();
}
- private final Runnable mDisplayOff = new Runnable() {
- @Override
- public void run() {
- if (DEBUG) Log.d(TAG, "Display off");
- setDozeScreenState(Display.STATE_OFF);
- }
- };
-
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -313,14 +335,16 @@ public class DozeService extends DreamService {
requestPulse();
}
if (NOTIFICATION_PULSE_ACTION.equals(intent.getAction())) {
- if (DEBUG) Log.d(mTag, "Received notification pulse intent");
+ final long instance = intent.getLongExtra(EXTRA_INSTANCE, -1);
+ if (DEBUG) Log.d(mTag, "Received notification pulse intent instance=" + instance);
+ DozeLog.traceNotificationPulse(instance);
requestPulse();
rescheduleNotificationPulse(mNotificationLightOn);
}
}
};
- private final Host.Callback mHostCallback = new Host.Callback() {
+ private final DozeHost.Callback mHostCallback = new DozeHost.Callback() {
@Override
public void onNewNotifications() {
if (DEBUG) Log.d(mTag, "onNewNotifications");
@@ -352,22 +376,6 @@ public class DozeService extends DreamService {
}
};
- public interface Host {
- void addCallback(Callback callback);
- void removeCallback(Callback callback);
- void requestDoze(DozeService dozeService);
- void requestPulse(DozeService dozeService);
- void dozingStopped(DozeService dozeService);
- boolean isPowerSaveActive();
-
- public interface Callback {
- void onNewNotifications();
- void onBuzzBeepBlinked();
- void onNotificationLight(boolean on);
- void onPowerSaveChanged(boolean active);
- }
- }
-
private class TriggerSensor extends TriggerEventListener {
private final Sensor mSensor;
private final boolean mConfigured;
@@ -400,25 +408,37 @@ public class DozeService extends DreamService {
@Override
public void onTrigger(TriggerEvent event) {
- if (DEBUG) Log.d(mTag, "onTrigger: " + triggerEventToString(event));
- if (mDebugVibrate) {
- final Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
- if (v != null) {
- v.vibrate(1000, new AudioAttributes.Builder()
- .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
- .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION).build());
+ mWakeLock.acquire();
+ try {
+ if (DEBUG) Log.d(mTag, "onTrigger: " + triggerEventToString(event));
+ if (mDebugVibrate) {
+ final Vibrator v = (Vibrator) mContext.getSystemService(
+ Context.VIBRATOR_SERVICE);
+ if (v != null) {
+ v.vibrate(1000, new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION).build());
+ }
}
- }
- requestPulse();
- setListening(true); // reregister, this sensor only fires once
-
- // reset the notification pulse schedule, but only if we think we were not triggered
- // by a notification-related vibration
- final long timeSinceNotification = System.currentTimeMillis() - mNotificationPulseTime;
- if (timeSinceNotification < mDozeParameters.getPickupVibrationThreshold()) {
- if (DEBUG) Log.d(mTag, "Not resetting schedule, recent notification");
- } else {
- resetNotificationResets();
+
+ requestPulse();
+ setListening(true); // reregister, this sensor only fires once
+
+ // reset the notification pulse schedule, but only if we think we were not triggered
+ // by a notification-related vibration
+ final long timeSinceNotification = System.currentTimeMillis() - mNotificationPulseTime;
+ final boolean withinVibrationThreshold =
+ timeSinceNotification < mDozeParameters.getPickupVibrationThreshold();
+ if (withinVibrationThreshold) {
+ if (DEBUG) Log.d(mTag, "Not resetting schedule, recent notification");
+ } else {
+ resetNotificationResets();
+ }
+ if (mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) {
+ DozeLog.tracePickupPulse(withinVibrationThreshold);
+ }
+ } finally {
+ mWakeLock.release();
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/LLand.java b/packages/SystemUI/src/com/android/systemui/egg/LLand.java
new file mode 100644
index 000000000000..d1c02dd38d95
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/egg/LLand.java
@@ -0,0 +1,748 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.egg;
+
+import android.animation.TimeAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.*;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.*;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import com.android.systemui.R;
+
+public class LLand extends FrameLayout {
+ public static final String TAG = "LLand";
+
+ public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+ public static final boolean DEBUG_DRAW = false && DEBUG;
+
+ public static final void L(String s, Object ... objects) {
+ if (DEBUG) {
+ Log.d(TAG, String.format(s, objects));
+ }
+ }
+
+ public static final boolean AUTOSTART = true;
+ public static final boolean HAVE_STARS = true;
+
+ public static final float DEBUG_SPEED_MULTIPLIER = 1f; // 0.1f;
+ public static final boolean DEBUG_IDDQD = false;
+
+ private static class Params {
+ public float TRANSLATION_PER_SEC;
+ public int OBSTACLE_SPACING, OBSTACLE_PERIOD;
+ public int BOOST_DV;
+ public int PLAYER_HIT_SIZE;
+ public int PLAYER_SIZE;
+ public int OBSTACLE_WIDTH;
+ public int OBSTACLE_GAP;
+ public int OBSTACLE_MIN;
+ public int BUILDING_WIDTH_MIN, BUILDING_WIDTH_MAX;
+ public int BUILDING_HEIGHT_MIN;
+ public int CLOUD_SIZE_MIN, CLOUD_SIZE_MAX;
+ public int STAR_SIZE_MIN, STAR_SIZE_MAX;
+ public int G;
+ public int MAX_V;
+ public float SCENERY_Z, OBSTACLE_Z, PLAYER_Z, PLAYER_Z_BOOST, HUD_Z;
+ public Params(Resources res) {
+ TRANSLATION_PER_SEC = res.getDimension(R.dimen.translation_per_sec);
+ OBSTACLE_SPACING = res.getDimensionPixelSize(R.dimen.obstacle_spacing);
+ OBSTACLE_PERIOD = (int) (OBSTACLE_SPACING / TRANSLATION_PER_SEC);
+ BOOST_DV = res.getDimensionPixelSize(R.dimen.boost_dv);
+ PLAYER_HIT_SIZE = res.getDimensionPixelSize(R.dimen.player_hit_size);
+ PLAYER_SIZE = res.getDimensionPixelSize(R.dimen.player_size);
+ OBSTACLE_WIDTH = res.getDimensionPixelSize(R.dimen.obstacle_width);
+ OBSTACLE_GAP = res.getDimensionPixelSize(R.dimen.obstacle_gap);
+ OBSTACLE_MIN = res.getDimensionPixelSize(R.dimen.obstacle_height_min);
+ BUILDING_HEIGHT_MIN = res.getDimensionPixelSize(R.dimen.building_height_min);
+ BUILDING_WIDTH_MIN = res.getDimensionPixelSize(R.dimen.building_width_min);
+ BUILDING_WIDTH_MAX = res.getDimensionPixelSize(R.dimen.building_width_max);
+ CLOUD_SIZE_MIN = res.getDimensionPixelSize(R.dimen.cloud_size_min);
+ CLOUD_SIZE_MAX = res.getDimensionPixelSize(R.dimen.cloud_size_max);
+ STAR_SIZE_MIN = res.getDimensionPixelSize(R.dimen.star_size_min);
+ STAR_SIZE_MAX = res.getDimensionPixelSize(R.dimen.star_size_max);
+
+ G = res.getDimensionPixelSize(R.dimen.G);
+ MAX_V = res.getDimensionPixelSize(R.dimen.max_v);
+
+ SCENERY_Z = res.getDimensionPixelSize(R.dimen.scenery_z);
+ OBSTACLE_Z = res.getDimensionPixelSize(R.dimen.obstacle_z);
+ PLAYER_Z = res.getDimensionPixelSize(R.dimen.player_z);
+ PLAYER_Z_BOOST = res.getDimensionPixelSize(R.dimen.player_z_boost);
+ HUD_Z = res.getDimensionPixelSize(R.dimen.hud_z);
+ }
+ }
+
+ private TimeAnimator mAnim;
+
+ private TextView mScoreField;
+ private View mSplash;
+
+ private Player mDroid;
+ private ArrayList<Obstacle> mObstaclesInPlay = new ArrayList<Obstacle>();
+
+ private float t, dt;
+
+ private int mScore;
+ private float mLastPipeTime; // in sec
+ private int mWidth, mHeight;
+ private boolean mAnimating, mPlaying;
+ private boolean mFrozen; // after death, a short backoff
+
+ private int mTimeOfDay;
+ private static final int DAY = 0, NIGHT = 1, TWILIGHT = 2, SUNSET = 3;
+ private static final int[][] SKIES = {
+ { 0xFFc0c0FF, 0xFFa0a0FF }, // DAY
+ { 0xFF000010, 0xFF000000 }, // NIGHT
+ { 0xFF000040, 0xFF000010 }, // TWILIGHT
+ { 0xFF805010, 0xFF202080 }, // SUNSET
+ };
+
+ private static Params PARAMS;
+
+ public LLand(Context context) {
+ this(context, null);
+ }
+
+ public LLand(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public LLand(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ setFocusable(true);
+ PARAMS = new Params(getResources());
+ mTimeOfDay = irand(0, SKIES.length);
+ }
+
+ @Override
+ public boolean willNotDraw() {
+ return !DEBUG;
+ }
+
+ public int getGameWidth() { return mWidth; }
+ public int getGameHeight() { return mHeight; }
+ public float getGameTime() { return t; }
+ public float getLastTimeStep() { return dt; }
+
+ public void setScoreField(TextView tv) {
+ mScoreField = tv;
+ if (tv != null) {
+ tv.setTranslationZ(PARAMS.HUD_Z);
+ if (!(mAnimating && mPlaying)) {
+ tv.setTranslationY(-500);
+ }
+ }
+ }
+
+ public void setSplash(View v) {
+ mSplash = v;
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ stop();
+ reset();
+ if (AUTOSTART) {
+ start(false);
+ }
+ }
+
+ final float hsv[] = {0, 0, 0};
+
+ private void reset() {
+ L("reset");
+ final Drawable sky = new GradientDrawable(
+ GradientDrawable.Orientation.BOTTOM_TOP,
+ SKIES[mTimeOfDay]
+ );
+ sky.setDither(true);
+ setBackground(sky);
+
+ setScaleX(frand() > 0.5f ? 1 : -1);
+
+ setScore(0);
+
+ int i = getChildCount();
+ while (i-->0) {
+ final View v = getChildAt(i);
+ if (v instanceof GameView) {
+ removeViewAt(i);
+ }
+ }
+
+ mObstaclesInPlay.clear();
+
+ mWidth = getWidth();
+ mHeight = getHeight();
+
+ boolean showingSun = (mTimeOfDay == DAY || mTimeOfDay == SUNSET) && frand() > 0.25;
+ if (showingSun) {
+ final Star sun = new Star(getContext());
+ sun.setBackgroundResource(R.drawable.sun);
+ final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
+ sun.setTranslationX(frand(w, mWidth-w));
+ if (mTimeOfDay == DAY) {
+ sun.setTranslationY(frand(w, (mHeight * 0.66f)));
+ sun.getBackground().setTint(0);
+ } else {
+ sun.setTranslationY(frand(mHeight * 0.66f, mHeight - w));
+ sun.getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
+ sun.getBackground().setTint(0xC0FF8000);
+
+ }
+ addView(sun, new LayoutParams(w, w));
+ }
+ if (!showingSun) {
+ final boolean dark = mTimeOfDay == NIGHT || mTimeOfDay == TWILIGHT;
+ final float ff = frand();
+ if ((dark && ff < 0.75f) || ff < 0.5f) {
+ final Star moon = new Star(getContext());
+ moon.setBackgroundResource(R.drawable.moon);
+ moon.getBackground().setAlpha(dark ? 255 : 128);
+ moon.setScaleX(frand() > 0.5 ? -1 : 1);
+ moon.setRotation(moon.getScaleX() * frand(5, 30));
+ final int w = getResources().getDimensionPixelSize(R.dimen.sun_size);
+ moon.setTranslationX(frand(w, mWidth - w));
+ moon.setTranslationY(frand(w, mHeight - w));
+ addView(moon, new LayoutParams(w, w));
+ }
+ }
+
+ final int mh = mHeight / 6;
+ final boolean cloudless = frand() < 0.25;
+ final int N = 20;
+ for (i=0; i<N; i++) {
+ final float r1 = frand();
+ final Scenery s;
+ if (HAVE_STARS && r1 < 0.3 && mTimeOfDay != DAY) {
+ s = new Star(getContext());
+ } else if (r1 < 0.6 && !cloudless) {
+ s = new Cloud(getContext());
+ } else {
+ s = new Building(getContext());
+
+ s.z = (float)i/N;
+ s.setTranslationZ(PARAMS.SCENERY_Z * (1+s.z));
+ s.v = 0.85f * s.z; // buildings move proportional to their distance
+ hsv[0] = 175;
+ hsv[1] = 0.25f;
+ hsv[2] = 1 * s.z;
+ s.setBackgroundColor(Color.HSVToColor(hsv));
+ s.h = irand(PARAMS.BUILDING_HEIGHT_MIN, mh);
+ }
+ final LayoutParams lp = new LayoutParams(s.w, s.h);
+ if (s instanceof Building) {
+ lp.gravity = Gravity.BOTTOM;
+ } else {
+ lp.gravity = Gravity.TOP;
+ final float r = frand();
+ if (s instanceof Star) {
+ lp.topMargin = (int) (r * r * mHeight);
+ } else {
+ lp.topMargin = (int) (1 - r*r * mHeight/2) + mHeight/2;
+ }
+ }
+
+ addView(s, lp);
+ s.setTranslationX(frand(-lp.width, mWidth + lp.width));
+ }
+
+ mDroid = new Player(getContext());
+ mDroid.setX(mWidth / 2);
+ mDroid.setY(mHeight / 2);
+ addView(mDroid, new LayoutParams(PARAMS.PLAYER_SIZE, PARAMS.PLAYER_SIZE));
+ if (mAnim != null) {
+ Log.wtf(TAG, "reseting while animating??!?");
+ }
+ mAnim = new TimeAnimator();
+ mAnim.setTimeListener(new TimeAnimator.TimeListener() {
+ @Override
+ public void onTimeUpdate(TimeAnimator timeAnimator, long t, long dt) {
+ step(t, dt);
+ }
+ });
+ }
+
+ private void setScore(int score) {
+ mScore = score;
+ if (mScoreField != null) mScoreField.setText(String.valueOf(score));
+ }
+
+ private void addScore(int incr) {
+ setScore(mScore + incr);
+ }
+
+ private void start(boolean startPlaying) {
+ L("start(startPlaying=%s)", startPlaying?"true":"false");
+ if (startPlaying) {
+ mPlaying = true;
+
+ t = 0;
+ mLastPipeTime = getGameTime() - PARAMS.OBSTACLE_PERIOD; // queue up a obstacle
+
+ if (mSplash != null && mSplash.getAlpha() > 0f) {
+ mSplash.setTranslationZ(PARAMS.HUD_Z);
+ mSplash.animate().alpha(0).translationZ(0).setDuration(400);
+
+ mScoreField.animate().translationY(0)
+ .setInterpolator(new DecelerateInterpolator())
+ .setDuration(1500);
+ }
+
+ mScoreField.setTextColor(0xFFAAAAAA);
+ mScoreField.setBackgroundResource(R.drawable.scorecard);
+ mDroid.setVisibility(View.VISIBLE);
+ mDroid.setX(mWidth / 2);
+ mDroid.setY(mHeight / 2);
+ } else {
+ mDroid.setVisibility(View.GONE);
+ }
+ if (!mAnimating) {
+ mAnim.start();
+ mAnimating = true;
+ }
+ }
+
+ private void stop() {
+ if (mAnimating) {
+ mAnim.cancel();
+ mAnim = null;
+ mAnimating = false;
+ mScoreField.setTextColor(0xFFFFFFFF);
+ mScoreField.setBackgroundResource(R.drawable.scorecard_gameover);
+ mTimeOfDay = irand(0, SKIES.length); // for next reset
+ mFrozen = true;
+ postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ mFrozen = false;
+ }
+ }, 250);
+ }
+ }
+
+ public static final float lerp(float x, float a, float b) {
+ return (b - a) * x + a;
+ }
+
+ public static final float rlerp(float v, float a, float b) {
+ return (v - a) / (b - a);
+ }
+
+ public static final float clamp(float f) {
+ return f < 0f ? 0f : f > 1f ? 1f : f;
+ }
+
+ public static final float frand() {
+ return (float) Math.random();
+ }
+
+ public static final float frand(float a, float b) {
+ return lerp(frand(), a, b);
+ }
+
+ public static final int irand(int a, int b) {
+ return (int) lerp(frand(), (float) a, (float) b);
+ }
+
+ private void step(long t_ms, long dt_ms) {
+ t = t_ms / 1000f; // seconds
+ dt = dt_ms / 1000f;
+
+ if (DEBUG) {
+ t *= DEBUG_SPEED_MULTIPLIER;
+ dt *= DEBUG_SPEED_MULTIPLIER;
+ }
+
+ // 1. Move all objects and update bounds
+ final int N = getChildCount();
+ int i = 0;
+ for (; i<N; i++) {
+ final View v = getChildAt(i);
+ if (v instanceof GameView) {
+ ((GameView) v).step(t_ms, dt_ms, t, dt);
+ }
+ }
+
+ // 2. Check for altitude
+ if (mPlaying && mDroid.below(mHeight)) {
+ if (DEBUG_IDDQD) {
+ poke();
+ } else {
+ L("player hit the floor");
+ stop();
+ }
+ }
+
+ // 3. Check for obstacles
+ boolean passedBarrier = false;
+ for (int j = mObstaclesInPlay.size(); j-->0;) {
+ final Obstacle ob = mObstaclesInPlay.get(j);
+ if (mPlaying && ob.intersects(mDroid) && !DEBUG_IDDQD) {
+ L("player hit an obstacle");
+ stop();
+ } else if (ob.cleared(mDroid)) {
+ passedBarrier = true;
+ mObstaclesInPlay.remove(j);
+ }
+ }
+
+ if (mPlaying && passedBarrier) {
+ addScore(1);
+ }
+
+ // 4. Handle edge of screen
+ // Walk backwards to make sure removal is safe
+ while (i-->0) {
+ final View v = getChildAt(i);
+ if (v instanceof Obstacle) {
+ if (v.getTranslationX() + v.getWidth() < 0) {
+ removeViewAt(i);
+ }
+ } else if (v instanceof Scenery) {
+ final Scenery s = (Scenery) v;
+ if (v.getTranslationX() + s.w < 0) {
+ v.setTranslationX(getWidth());
+ }
+ }
+ }
+
+ // 3. Time for more obstacles!
+ if (mPlaying && (t - mLastPipeTime) > PARAMS.OBSTACLE_PERIOD) {
+ mLastPipeTime = t;
+ final int obstacley = (int) (Math.random()
+ * (mHeight - 2*PARAMS.OBSTACLE_MIN - PARAMS.OBSTACLE_GAP)) + PARAMS.OBSTACLE_MIN;
+
+ final Obstacle p1 = new Obstacle(getContext(), obstacley);
+ addView(p1, new LayoutParams(
+ PARAMS.OBSTACLE_WIDTH,
+ mHeight,
+ Gravity.TOP|Gravity.LEFT));
+ p1.setTranslationX(mWidth);
+ p1.setTranslationY(-mHeight);
+ p1.setTranslationZ(0);
+ p1.animate()
+ .translationY(-mHeight+p1.h)
+ .translationZ(PARAMS.OBSTACLE_Z)
+ .setStartDelay(irand(0,250))
+ .setDuration(250);
+ mObstaclesInPlay.add(p1);
+
+ final Obstacle p2 = new Obstacle(getContext(),
+ mHeight - obstacley - PARAMS.OBSTACLE_GAP);
+ addView(p2, new LayoutParams(
+ PARAMS.OBSTACLE_WIDTH,
+ mHeight,
+ Gravity.TOP|Gravity.LEFT));
+ p2.setTranslationX(mWidth);
+ p2.setTranslationY(mHeight);
+ p2.setTranslationZ(0);
+ p2.animate()
+ .translationY(mHeight-p2.h)
+ .translationZ(PARAMS.OBSTACLE_Z)
+ .setStartDelay(irand(0,100))
+ .setDuration(400);
+ mObstaclesInPlay.add(p2);
+ }
+
+ if (DEBUG) {
+ final Rect r = new Rect();
+ mDroid.getHitRect(r);
+ r.inset(-4, -4);
+ invalidate(r);
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ if (DEBUG) L("touch: %s", ev);
+ if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ poke();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onTrackballEvent(MotionEvent ev) {
+ if (DEBUG) L("trackball: %s", ev);
+ if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ poke();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent ev) {
+ if (DEBUG) L("keyDown: %d", keyCode);
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ case KeyEvent.KEYCODE_SPACE:
+ case KeyEvent.KEYCODE_ENTER:
+ case KeyEvent.KEYCODE_BUTTON_A:
+ poke();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onGenericMotionEvent (MotionEvent ev) {
+ if (DEBUG) L("generic: %s", ev);
+ return false;
+ }
+
+ private void poke() {
+ L("poke");
+ if (mFrozen) return;
+ if (!mAnimating) {
+ reset();
+ start(true);
+ } else if (!mPlaying) {
+ start(true);
+ }
+ mDroid.boost();
+ if (DEBUG) {
+ mDroid.dv *= DEBUG_SPEED_MULTIPLIER;
+ mDroid.animate().setDuration((long) (200/DEBUG_SPEED_MULTIPLIER));
+ }
+ }
+
+ @Override
+ public void onDraw(Canvas c) {
+ super.onDraw(c);
+
+ if (!DEBUG_DRAW) return;
+
+ final Paint pt = new Paint();
+ pt.setColor(0xFFFFFFFF);
+ final int L = mDroid.corners.length;
+ final int N = L/2;
+ for (int i=0; i<N; i++) {
+ final int x = (int) mDroid.corners[i*2];
+ final int y = (int) mDroid.corners[i*2+1];
+ c.drawCircle(x, y, 4, pt);
+ c.drawLine(x, y,
+ mDroid.corners[(i*2+2)%L],
+ mDroid.corners[(i*2+3)%L],
+ pt);
+ }
+
+ final int M = getChildCount();
+ pt.setColor(0x6000FF00);
+ for (int i=0; i<M; i++) {
+ final View v = getChildAt(i);
+ if (v == mDroid) continue;
+ if (!(v instanceof GameView)) continue;
+ final Rect r = new Rect();
+ v.getHitRect(r);
+ c.drawRect(r, pt);
+ }
+
+ pt.setColor(Color.BLACK);
+ final StringBuilder sb = new StringBuilder("obstacles: ");
+ for (Obstacle ob : mObstaclesInPlay) {
+ sb.append(ob.hitRect.toShortString());
+ sb.append(" ");
+ }
+ pt.setTextSize(20f);
+ c.drawText(sb.toString(), 20, 100, pt);
+ }
+
+ static final Rect sTmpRect = new Rect();
+
+ private interface GameView {
+ public void step(long t_ms, long dt_ms, float t, float dt);
+ }
+
+ private class Player extends ImageView implements GameView {
+ public float dv;
+
+ private final float[] sHull = new float[] {
+ 0.3f, 0f, // left antenna
+ 0.7f, 0f, // right antenna
+ 0.92f, 0.33f, // off the right shoulder of Orion
+ 0.92f, 0.75f, // right hand (our right, not his right)
+ 0.6f, 1f, // right foot
+ 0.4f, 1f, // left foot BLUE!
+ 0.08f, 0.75f, // sinistram
+ 0.08f, 0.33f, // cold shoulder
+ };
+ public final float[] corners = new float[sHull.length];
+
+ public Player(Context context) {
+ super(context);
+
+ setBackgroundResource(R.drawable.android);
+ getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
+ getBackground().setTint(0xFF00FF00);
+ setOutlineProvider(new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ final int w = view.getWidth();
+ final int h = view.getHeight();
+ final int ix = (int) (w * 0.3f);
+ final int iy = (int) (h * 0.2f);
+ outline.setRect(ix, iy, w - ix, h - iy);
+ }
+ });
+ }
+
+ public void prepareCheckIntersections() {
+ final int inset = (PARAMS.PLAYER_SIZE - PARAMS.PLAYER_HIT_SIZE)/2;
+ final int scale = PARAMS.PLAYER_HIT_SIZE;
+ final int N = sHull.length/2;
+ for (int i=0; i<N; i++) {
+ corners[i*2] = scale * sHull[i*2] + inset;
+ corners[i*2+1] = scale * sHull[i*2+1] + inset;
+ }
+ final Matrix m = getMatrix();
+ m.mapPoints(corners);
+ }
+
+ public boolean below(int h) {
+ final int N = corners.length/2;
+ for (int i=0; i<N; i++) {
+ final int y = (int) corners[i*2+1];
+ if (y >= h) return true;
+ }
+ return false;
+ }
+
+ public void step(long t_ms, long dt_ms, float t, float dt) {
+ if (getVisibility() != View.VISIBLE) return; // not playing yet
+
+ dv += PARAMS.G;
+ if (dv < -PARAMS.MAX_V) dv = -PARAMS.MAX_V;
+ else if (dv > PARAMS.MAX_V) dv = PARAMS.MAX_V;
+
+ final float y = getTranslationY() + dv * dt;
+ setTranslationY(y < 0 ? 0 : y);
+ setRotation(
+ 90 + lerp(clamp(rlerp(dv, PARAMS.MAX_V, -1 * PARAMS.MAX_V)), 90, -90));
+
+ prepareCheckIntersections();
+ }
+
+ public void boost() {
+ dv = -PARAMS.BOOST_DV;
+ setTranslationZ(PARAMS.PLAYER_Z_BOOST);
+ setScaleX(1.25f);
+ setScaleY(1.25f);
+ animate()
+ .scaleX(1f)
+ .scaleY(1f)
+ .translationZ(PARAMS.PLAYER_Z)
+ .setDuration(200);
+ }
+ }
+
+ private class Obstacle extends View implements GameView {
+ public float h;
+
+ public final Rect hitRect = new Rect();
+
+ public Obstacle(Context context, float h) {
+ super(context);
+ setBackgroundResource(R.drawable.placeholder);
+ this.h = h;
+ }
+
+ public boolean intersects(Player p) {
+ final int N = p.corners.length/2;
+ for (int i=0; i<N; i++) {
+ final int x = (int) p.corners[i*2];
+ final int y = (int) p.corners[i*2+1];
+ if (hitRect.contains(x, y)) return true;
+ }
+ return false;
+ }
+
+ public boolean cleared(Player p) {
+ final int N = p.corners.length/2;
+ for (int i=0; i<N; i++) {
+ final int x = (int) p.corners[i*2];
+ if (hitRect.right >= x) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void step(long t_ms, long dt_ms, float t, float dt) {
+ setTranslationX(getTranslationX()-PARAMS.TRANSLATION_PER_SEC*dt);
+ getHitRect(hitRect);
+ }
+ }
+
+ private class Scenery extends FrameLayout implements GameView {
+ public float z;
+ public float v;
+ public int h, w;
+ public Scenery(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void step(long t_ms, long dt_ms, float t, float dt) {
+ setTranslationX(getTranslationX() - PARAMS.TRANSLATION_PER_SEC * dt * v);
+ }
+ }
+
+ private class Building extends Scenery {
+ public Building(Context context) {
+ super(context);
+
+ w = irand(PARAMS.BUILDING_WIDTH_MIN, PARAMS.BUILDING_WIDTH_MAX);
+ h = 0; // will be setup later, along with z
+
+ setTranslationZ(PARAMS.SCENERY_Z);
+ }
+ }
+
+ private class Cloud extends Scenery {
+ public Cloud(Context context) {
+ super(context);
+ setBackgroundResource(frand() < 0.01f ? R.drawable.cloud_off : R.drawable.cloud);
+ getBackground().setAlpha(0x40);
+ w = h = irand(PARAMS.CLOUD_SIZE_MIN, PARAMS.CLOUD_SIZE_MAX);
+ z = 0;
+ v = frand(0.15f,0.5f);
+ }
+ }
+
+ private class Star extends Scenery {
+ public Star(Context context) {
+ super(context);
+ setBackgroundResource(R.drawable.star);
+ w = h = irand(PARAMS.STAR_SIZE_MIN, PARAMS.STAR_SIZE_MAX);
+ v = z = 0;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java b/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java
new file mode 100644
index 000000000000..88fd9521fe83
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/egg/LLandActivity.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.egg;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+
+public class LLandActivity extends Activity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.lland);
+ LLand world = (LLand) findViewById(R.id.world);
+ world.setScoreField((TextView) findViewById(R.id.score));
+ world.setSplash(findViewById(R.id.welcome));
+ Log.v(LLand.TAG, "focus: " + world.requestFocus());
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 9af893d79e5f..4af84994c708 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -170,6 +170,8 @@ public class KeyguardViewMediator extends SystemUI {
private boolean mSwitchingUser;
private boolean mSystemReady;
+ private boolean mBootCompleted;
+ private boolean mBootSendUserPresent;
// Whether the next call to playSounds() should be skipped. Defaults to
// true because the first lock (on boot) should be silent.
@@ -1145,8 +1147,14 @@ public class KeyguardViewMediator extends SystemUI {
}
private void sendUserPresentBroadcast() {
- final UserHandle currentUser = new UserHandle(mLockPatternUtils.getCurrentUser());
- mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, currentUser);
+ synchronized (this) {
+ if (mBootCompleted) {
+ final UserHandle currentUser = new UserHandle(mLockPatternUtils.getCurrentUser());
+ mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, currentUser);
+ } else {
+ mBootSendUserPresent = true;
+ }
+ }
}
/**
@@ -1406,6 +1414,12 @@ public class KeyguardViewMediator extends SystemUI {
public void onBootCompleted() {
mUpdateMonitor.dispatchBootCompleted();
+ synchronized (this) {
+ mBootCompleted = true;
+ if (mBootSendUserPresent) {
+ sendUserPresentBroadcast();
+ }
+ }
}
public StatusBarKeyguardViewManager registerStatusBar(PhoneStatusBar phoneStatusBar,
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
index 8d7edb9d38b2..3574877782a1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
@@ -298,10 +298,11 @@ public class QSTileView extends ViewGroup {
if (mDual) {
mDualLabel.setText(state.label);
mDualLabel.setContentDescription(state.dualLabelContentDescription);
+ mTopBackgroundView.setContentDescription(state.contentDescription);
} else {
mLabel.setText(state.label);
+ setContentDescription(state.contentDescription);
}
- setContentDescription(state.contentDescription);
}
public void onStateChanged(QSTile.State state) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 787de4ed0109..5caf1ac4a120 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -19,6 +19,7 @@ package com.android.systemui.recents;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityOptions;
+import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -32,6 +33,7 @@ import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Handler;
import android.os.UserHandle;
+import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import com.android.systemui.R;
@@ -118,6 +120,22 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta
// Load the header bar layout
reloadHeaderBarLayout();
mBootCompleted = true;
+
+ // Try and pre-emptively bind the search widget on startup to ensure that we
+ // have the right thumbnail bounds to animate to.
+ if (Constants.DebugFlags.App.EnableSearchLayout) {
+ // If there is no id, then bind a new search app widget
+ if (mConfig.searchBarAppWidgetId < 0) {
+ AppWidgetHost host = new RecentsAppWidgetHost(mContext,
+ Constants.Values.App.AppWidgetHostId);
+ Pair<Integer, AppWidgetProviderInfo> widgetInfo =
+ mSystemServicesProxy.bindSearchAppWidget(host);
+ if (widgetInfo != null) {
+ // Save the app widget id into the settings
+ mConfig.updateSearchBarAppWidgetId(mContext, widgetInfo.first);
+ }
+ }
+ }
}
/** Shows the recents */
@@ -222,9 +240,8 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta
// Bring an active task to the foreground
mSystemServicesProxy.moveTaskToFront(toTask.key.id, launchOpts);
} else {
- try {
- mSystemServicesProxy.startActivityFromRecents(toTask.key.id, launchOpts);
- } catch (ActivityNotFoundException anfe) {}
+ mSystemServicesProxy.startActivityFromRecents(mContext, toTask.key.id,
+ toTask.activityLabel, launchOpts);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index 52ec54b9c340..103f96f58421 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -32,15 +32,13 @@ public class Constants {
// Enables the filtering of tasks according to their grouping
public static final boolean EnableTaskFiltering = false;
// Enables clipping of tasks against each other
- public static final boolean EnableTaskStackClipping = false;
+ public static final boolean EnableTaskStackClipping = true;
// Enables tapping on the TaskBar to launch the task
public static final boolean EnableTaskBarTouchEvents = true;
// Enables app-info pane on long-pressing the icon
public static final boolean EnableDevAppInfoOnLongPress = true;
// Enables the search bar layout
public static final boolean EnableSearchLayout = true;
- // Enables the dynamic shadows behind each task
- public static final boolean EnableShadows = true;
// Enables the thumbnail alpha on the front-most task
public static final boolean EnableThumbnailAlphaOnFrontmost = false;
// This disables the bitmap and icon caches
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 8f92027206d3..a49bbf964ad6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -405,6 +405,22 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
mConfig.updateOnConfigurationChange();
onConfigurationChange();
}
+
+ // Start listening for widget package changes if there is one bound, post it since we don't
+ // want it stalling the startup
+ if (mConfig.searchBarAppWidgetId >= 0) {
+ final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> callback =
+ new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(this);
+ mRecentsView.post(new Runnable() {
+ @Override
+ public void run() {
+ RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = callback.get();
+ if (cb != null) {
+ mAppWidgetHost.startListening(cb);
+ }
+ }
+ });
+ }
}
/** Inflates the debug overlay if debug mode is enabled. */
@@ -464,22 +480,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
protected void onResume() {
super.onResume();
- // Start listening for widget package changes if there is one bound, post it since we don't
- // want it stalling the startup
- if (mConfig.searchBarAppWidgetId >= 0) {
- final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> callback =
- new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(this);
- mRecentsView.postDelayed(new Runnable() {
- @Override
- public void run() {
- RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = callback.get();
- if (cb != null) {
- mAppWidgetHost.startListening(cb);
- }
- }
- }, 1);
- }
-
// Mark Recents as visible
mVisible = true;
}
@@ -496,11 +496,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Unregister any broadcast receivers for the task loader
RecentsTaskLoader.getInstance().unregisterReceivers();
-
- // Stop listening for widget package changes if there was one bound
- if (mAppWidgetHost.isListening()) {
- mAppWidgetHost.stopListening();
- }
}
@Override
@@ -509,6 +504,11 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Unregister the system broadcast receivers
unregisterReceiver(mSystemBroadcastReceiver);
+
+ // Stop listening for widget package changes if there was one bound
+ if (mAppWidgetHost.isListening()) {
+ mAppWidgetHost.stopListening();
+ }
}
@Override
@@ -614,6 +614,12 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
}
@Override
+ public void onTaskLaunchFailed() {
+ // Return to Home
+ dismissRecentsToHomeRaw(true);
+ }
+
+ @Override
public void onAllTaskViewsDismissed() {
mFinishLaunchHomeRunnable.run();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index 2a2caa054210..4696c82ecd8e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -78,6 +78,7 @@ public class RecentsConfiguration {
public int taskViewEnterFromHomeDelay;
public int taskViewEnterFromHomeDuration;
public int taskViewEnterFromHomeStaggerDelay;
+ public int taskViewEnterFromHomeStaggerDuration;
public int taskViewExitToHomeDuration;
public int taskViewRemoveAnimDuration;
public int taskViewRemoveAnimTranslationXPx;
@@ -119,7 +120,9 @@ public class RecentsConfiguration {
public int launchedToTaskId;
/** Misc **/
+ public boolean useHardwareLayers;
public int altTabKeyDelay;
+ public boolean fakeShadows;
/** Dev options and global settings */
public boolean lockToAppEnabled;
@@ -217,6 +220,8 @@ public class RecentsConfiguration {
res.getInteger(R.integer.recents_animate_task_enter_from_home_duration);
taskViewEnterFromHomeStaggerDelay =
res.getInteger(R.integer.recents_animate_task_enter_from_home_stagger_delay);
+ taskViewEnterFromHomeStaggerDuration =
+ res.getInteger(R.integer.recents_animate_task_enter_from_home_stagger_duration);
taskViewExitToHomeDuration =
res.getInteger(R.integer.recents_animate_task_exit_to_home_duration);
taskViewRemoveAnimDuration =
@@ -271,7 +276,9 @@ public class RecentsConfiguration {
res.getInteger(R.integer.recents_nav_bar_scrim_enter_duration);
// Misc
+ useHardwareLayers = res.getBoolean(R.bool.config_recents_use_hardware_layers);
altTabKeyDelay = res.getInteger(R.integer.recents_alt_tab_key_delay);
+ fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
}
/** Updates the system insets */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 11b7b8b57be3..9554f01fc6fe 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -57,6 +57,7 @@ import android.view.DisplayInfo;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
+import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import java.io.IOException;
@@ -515,12 +516,18 @@ public class SystemServicesProxy {
return takeScreenshot();
}
- public void startActivityFromRecents(int taskId, ActivityOptions options) {
+ /** Starts an activity from recents. */
+ public boolean startActivityFromRecents(Context context, int taskId, String taskName,
+ ActivityOptions options) {
if (mIam != null) {
try {
mIam.startActivityFromRecents(taskId, options == null ? null : options.toBundle());
- } catch (RemoteException e) {
+ return true;
+ } catch (Exception e) {
+ Console.logError(context,
+ context.getString(R.string.recents_launch_error_message, taskName));
}
}
+ return false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
index 4c6b389062a4..f01d17c611c9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
@@ -18,11 +18,14 @@ package com.android.systemui.recents.misc;
import android.content.Intent;
import android.graphics.Color;
+import android.graphics.Matrix;
import android.graphics.Rect;
+import android.view.View;
import com.android.systemui.recents.RecentsConfiguration;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.ArrayList;
/* Common code */
public class Utilities {
@@ -68,6 +71,80 @@ public class Utilities {
}
}
+ /** Maps a coorindate in a descendant view into the parent. */
+ public static float mapCoordInDescendentToSelf(View descendant, View root,
+ float[] coord, boolean includeRootScroll) {
+ ArrayList<View> ancestorChain = new ArrayList<View>();
+
+ float[] pt = {coord[0], coord[1]};
+
+ View v = descendant;
+ while(v != root && v != null) {
+ ancestorChain.add(v);
+ v = (View) v.getParent();
+ }
+ ancestorChain.add(root);
+
+ float scale = 1.0f;
+ int count = ancestorChain.size();
+ for (int i = 0; i < count; i++) {
+ View v0 = ancestorChain.get(i);
+ // For TextViews, scroll has a meaning which relates to the text position
+ // which is very strange... ignore the scroll.
+ if (v0 != descendant || includeRootScroll) {
+ pt[0] -= v0.getScrollX();
+ pt[1] -= v0.getScrollY();
+ }
+
+ v0.getMatrix().mapPoints(pt);
+ pt[0] += v0.getLeft();
+ pt[1] += v0.getTop();
+ scale *= v0.getScaleX();
+ }
+
+ coord[0] = pt[0];
+ coord[1] = pt[1];
+ return scale;
+ }
+
+ /** Maps a coordinate in the root to a descendent. */
+ public static float mapCoordInSelfToDescendent(View descendant, View root,
+ float[] coord, Matrix tmpInverseMatrix) {
+ ArrayList<View> ancestorChain = new ArrayList<View>();
+
+ float[] pt = {coord[0], coord[1]};
+
+ View v = descendant;
+ while(v != root) {
+ ancestorChain.add(v);
+ v = (View) v.getParent();
+ }
+ ancestorChain.add(root);
+
+ float scale = 1.0f;
+ int count = ancestorChain.size();
+ tmpInverseMatrix.set(Matrix.IDENTITY_MATRIX);
+ for (int i = count - 1; i >= 0; i--) {
+ View ancestor = ancestorChain.get(i);
+ View next = i > 0 ? ancestorChain.get(i-1) : null;
+
+ pt[0] += ancestor.getScrollX();
+ pt[1] += ancestor.getScrollY();
+
+ if (next != null) {
+ pt[0] -= next.getLeft();
+ pt[1] -= next.getTop();
+ next.getMatrix().invert(tmpInverseMatrix);
+ tmpInverseMatrix.mapPoints(pt);
+ scale *= next.getScaleX();
+ }
+ }
+
+ coord[0] = pt[0];
+ coord[1] = pt[1];
+ return scale;
+ }
+
/** Calculates the constrast between two colors, using the algorithm provided by the WCAG v2. */
public static float computeContrastBetweenColors(int bg, int fg) {
float bgR = Color.red(bg) / 255f;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index e5c06fd2b26f..d4b403d1f127 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -204,7 +204,8 @@ class TaskResourceLoader implements Runnable {
if (!mCancelled) {
// Notify that the task data has changed
final Drawable newIcon = cachedIcon;
- final Bitmap newThumbnail = cachedThumbnail;
+ final Bitmap newThumbnail = cachedThumbnail == mDefaultThumbnail
+ ? null : cachedThumbnail;
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
@@ -252,7 +253,6 @@ public class RecentsTaskLoader {
BitmapDrawable mDefaultApplicationIcon;
Bitmap mDefaultThumbnail;
- Bitmap mLoadingThumbnail;
/** Private Constructor */
private RecentsTaskLoader(Context context) {
@@ -271,9 +271,6 @@ public class RecentsTaskLoader {
mDefaultThumbnail = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
mDefaultThumbnail.setHasAlpha(false);
mDefaultThumbnail.eraseColor(0xFFffffff);
- mLoadingThumbnail = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- mLoadingThumbnail.setHasAlpha(false);
- mLoadingThumbnail.eraseColor(0xFFffffff);
mDefaultApplicationIcon = new BitmapDrawable(context.getResources(), icon);
// Initialize the proxy, cache and loaders
@@ -500,17 +497,16 @@ public class RecentsTaskLoader {
// use the default assets in their place until they load
boolean requiresLoad = (applicationIcon == null) || (thumbnail == null);
applicationIcon = applicationIcon != null ? applicationIcon : mDefaultApplicationIcon;
- thumbnail = thumbnail != null ? thumbnail : mDefaultThumbnail;
if (requiresLoad) {
mLoadQueue.addTask(t);
}
- t.notifyTaskDataLoaded(thumbnail, applicationIcon);
+ t.notifyTaskDataLoaded(thumbnail == mDefaultThumbnail ? null : thumbnail, applicationIcon);
}
/** Releases the task resource data back into the pool. */
public void unloadTaskData(Task t) {
mLoadQueue.removeTask(t);
- t.notifyTaskDataUnloaded(mDefaultThumbnail, mDefaultApplicationIcon);
+ t.notifyTaskDataUnloaded(null, mDefaultApplicationIcon);
}
/** Completely removes the resource data from the pool. */
@@ -519,7 +515,7 @@ public class RecentsTaskLoader {
mThumbnailCache.remove(t.key);
mApplicationIconCache.remove(t.key);
if (notifyTaskDataUnloaded) {
- t.notifyTaskDataUnloaded(mDefaultThumbnail, mDefaultApplicationIcon);
+ t.notifyTaskDataUnloaded(null, mDefaultApplicationIcon);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
index d6889d080b7d..d2fdaff2b88f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
@@ -22,6 +22,7 @@ import android.graphics.Outline;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewOutlineProvider;
+
import com.android.systemui.recents.RecentsConfiguration;
/* An outline provider that has a clip and outline that can be animated. */
@@ -29,8 +30,10 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
RecentsConfiguration mConfig;
- View mSourceView;
+ TaskView mSourceView;
+ Rect mTmpRect = new Rect();
Rect mClipRect = new Rect();
+ Rect mClipBounds = new Rect();
Rect mOutlineClipRect = new Rect();
int mCornerRadius;
float mAlpha = 1f;
@@ -40,11 +43,10 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
ObjectAnimator mClipRightAnimator;
ObjectAnimator mClipBottomAnimator;
- public AnimateableViewBounds(View source, int cornerRadius) {
+ public AnimateableViewBounds(TaskView source, int cornerRadius) {
mConfig = RecentsConfiguration.getInstance();
mSourceView = source;
mCornerRadius = cornerRadius;
- mSourceView.setClipToOutline(true);
setClipTop(getClipTop());
setClipRight(getClipRight());
setClipBottom(getClipBottom());
@@ -56,8 +58,8 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
outline.setAlpha(mMinAlpha + mAlpha / (1f - mMinAlpha));
outline.setRoundRect(Math.max(mClipRect.left, mOutlineClipRect.left),
Math.max(mClipRect.top, mOutlineClipRect.top),
- mSourceView.getMeasuredWidth() - Math.max(mClipRect.right, mOutlineClipRect.right),
- mSourceView.getMeasuredHeight() - Math.max(mClipRect.bottom, mOutlineClipRect.bottom),
+ mSourceView.getWidth() - Math.max(mClipRect.right, mOutlineClipRect.right),
+ mSourceView.getHeight() - Math.max(mClipRect.bottom, mOutlineClipRect.bottom),
mCornerRadius);
}
@@ -89,6 +91,7 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
if (top != mClipRect.top) {
mClipRect.top = top;
mSourceView.invalidateOutline();
+ updateClipBounds();
}
}
@@ -114,6 +117,7 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
if (right != mClipRect.right) {
mClipRect.right = right;
mSourceView.invalidateOutline();
+ updateClipBounds();
}
}
@@ -139,6 +143,11 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
if (bottom != mClipRect.bottom) {
mClipRect.bottom = bottom;
mSourceView.invalidateOutline();
+ updateClipBounds();
+ if (!mConfig.useHardwareLayers) {
+ mSourceView.mThumbnailView.updateVisibility(
+ bottom - mSourceView.getPaddingBottom());
+ }
}
}
@@ -159,4 +168,11 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
public int getOutlineClipBottom() {
return mOutlineClipRect.bottom;
}
+
+ private void updateClipBounds() {
+ mClipBounds.set(mClipRect.left, mClipRect.top,
+ mSourceView.getWidth() - mClipRect.right,
+ mSourceView.getHeight() - mClipRect.bottom);
+ mSourceView.setClipBounds(mClipBounds);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java b/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java
new file mode 100644
index 000000000000..72f9001727c2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java
@@ -0,0 +1,286 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.systemui.recents.views;
+
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.LinearGradient;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.PixelFormat;
+import android.graphics.RadialGradient;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import com.android.systemui.R;
+import com.android.systemui.recents.RecentsConfiguration;
+
+/**
+ * A rounded rectangle drawable which also includes a shadow around. This is mostly copied from
+ * frameworks/support/v7/cardview/eclair-mr1/android/support/v7/widget/
+ * RoundRectDrawableWithShadow.java revision c42ba8c000d1e6ce85e152dfc17089a0a69e739f with a few
+ * modifications to suit our needs in SystemUI.
+ */
+class FakeShadowDrawable extends Drawable {
+ // used to calculate content padding
+ final static double COS_45 = Math.cos(Math.toRadians(45));
+
+ final static float SHADOW_MULTIPLIER = 1.5f;
+
+ final float mInsetShadow; // extra shadow to avoid gaps between card and shadow
+
+ Paint mCornerShadowPaint;
+
+ Paint mEdgeShadowPaint;
+
+ final RectF mCardBounds;
+
+ float mCornerRadius;
+
+ Path mCornerShadowPath;
+
+ // updated value with inset
+ float mMaxShadowSize;
+
+ // actual value set by developer
+ float mRawMaxShadowSize;
+
+ // multiplied value to account for shadow offset
+ float mShadowSize;
+
+ // actual value set by developer
+ float mRawShadowSize;
+
+ private boolean mDirty = true;
+
+ private final int mShadowStartColor;
+
+ private final int mShadowEndColor;
+
+ private boolean mAddPaddingForCorners = true;
+
+ /**
+ * If shadow size is set to a value above max shadow, we print a warning
+ */
+ private boolean mPrintedShadowClipWarning = false;
+
+ public FakeShadowDrawable(Resources resources, RecentsConfiguration config) {
+ mShadowStartColor = resources.getColor(R.color.fake_shadow_start_color);
+ mShadowEndColor = resources.getColor(R.color.fake_shadow_end_color);
+ mInsetShadow = resources.getDimension(R.dimen.fake_shadow_inset);
+ setShadowSize(resources.getDimensionPixelSize(R.dimen.fake_shadow_size),
+ resources.getDimensionPixelSize(R.dimen.fake_shadow_size));
+ mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
+ mCornerShadowPaint.setStyle(Paint.Style.FILL);
+ mCornerShadowPaint.setDither(true);
+ mCornerRadius = config.taskViewRoundedCornerRadiusPx;
+ mCardBounds = new RectF();
+ mEdgeShadowPaint = new Paint(mCornerShadowPaint);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ mCornerShadowPaint.setAlpha(alpha);
+ mEdgeShadowPaint.setAlpha(alpha);
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ super.onBoundsChange(bounds);
+ mDirty = true;
+ }
+
+ void setShadowSize(float shadowSize, float maxShadowSize) {
+ if (shadowSize < 0 || maxShadowSize < 0) {
+ throw new IllegalArgumentException("invalid shadow size");
+ }
+ if (shadowSize > maxShadowSize) {
+ shadowSize = maxShadowSize;
+ if (!mPrintedShadowClipWarning) {
+ Log.w("CardView", "Shadow size is being clipped by the max shadow size. See "
+ + "{CardView#setMaxCardElevation}.");
+ mPrintedShadowClipWarning = true;
+ }
+ }
+ if (mRawShadowSize == shadowSize && mRawMaxShadowSize == maxShadowSize) {
+ return;
+ }
+ mRawShadowSize = shadowSize;
+ mRawMaxShadowSize = maxShadowSize;
+ mShadowSize = shadowSize * SHADOW_MULTIPLIER + mInsetShadow;
+ mMaxShadowSize = maxShadowSize + mInsetShadow;
+ mDirty = true;
+ invalidateSelf();
+ }
+
+ @Override
+ public boolean getPadding(Rect padding) {
+ int vOffset = (int) Math.ceil(calculateVerticalPadding(mRawMaxShadowSize, mCornerRadius,
+ mAddPaddingForCorners));
+ int hOffset = (int) Math.ceil(calculateHorizontalPadding(mRawMaxShadowSize, mCornerRadius,
+ mAddPaddingForCorners));
+ padding.set(hOffset, vOffset, hOffset, vOffset);
+ return true;
+ }
+
+ static float calculateVerticalPadding(float maxShadowSize, float cornerRadius,
+ boolean addPaddingForCorners) {
+ if (addPaddingForCorners) {
+ return (float) (maxShadowSize * SHADOW_MULTIPLIER + (1 - COS_45) * cornerRadius);
+ } else {
+ return maxShadowSize * SHADOW_MULTIPLIER;
+ }
+ }
+
+ static float calculateHorizontalPadding(float maxShadowSize, float cornerRadius,
+ boolean addPaddingForCorners) {
+ if (addPaddingForCorners) {
+ return (float) (maxShadowSize + (1 - COS_45) * cornerRadius);
+ } else {
+ return maxShadowSize;
+ }
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ mCornerShadowPaint.setColorFilter(cf);
+ mEdgeShadowPaint.setColorFilter(cf);
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.OPAQUE;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ if (mDirty) {
+ buildComponents(getBounds());
+ mDirty = false;
+ }
+ canvas.translate(0, mRawShadowSize / 4);
+ drawShadow(canvas);
+ canvas.translate(0, -mRawShadowSize / 4);
+ }
+
+ private void drawShadow(Canvas canvas) {
+ final float edgeShadowTop = -mCornerRadius - mShadowSize;
+ final float inset = mCornerRadius + mInsetShadow + mRawShadowSize / 2;
+ final boolean drawHorizontalEdges = mCardBounds.width() - 2 * inset > 0;
+ final boolean drawVerticalEdges = mCardBounds.height() - 2 * inset > 0;
+ // LT
+ int saved = canvas.save();
+ canvas.translate(mCardBounds.left + inset, mCardBounds.top + inset);
+ canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
+ if (drawHorizontalEdges) {
+ canvas.drawRect(0, edgeShadowTop,
+ mCardBounds.width() - 2 * inset, -mCornerRadius,
+ mEdgeShadowPaint);
+ }
+ canvas.restoreToCount(saved);
+ // RB
+ saved = canvas.save();
+ canvas.translate(mCardBounds.right - inset, mCardBounds.bottom - inset);
+ canvas.rotate(180f);
+ canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
+ if (drawHorizontalEdges) {
+ canvas.drawRect(0, edgeShadowTop,
+ mCardBounds.width() - 2 * inset, -mCornerRadius + mShadowSize,
+ mEdgeShadowPaint);
+ }
+ canvas.restoreToCount(saved);
+ // LB
+ saved = canvas.save();
+ canvas.translate(mCardBounds.left + inset, mCardBounds.bottom - inset);
+ canvas.rotate(270f);
+ canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
+ if (drawVerticalEdges) {
+ canvas.drawRect(0, edgeShadowTop,
+ mCardBounds.height() - 2 * inset, -mCornerRadius, mEdgeShadowPaint);
+ }
+ canvas.restoreToCount(saved);
+ // RT
+ saved = canvas.save();
+ canvas.translate(mCardBounds.right - inset, mCardBounds.top + inset);
+ canvas.rotate(90f);
+ canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
+ if (drawVerticalEdges) {
+ canvas.drawRect(0, edgeShadowTop,
+ mCardBounds.height() - 2 * inset, -mCornerRadius, mEdgeShadowPaint);
+ }
+ canvas.restoreToCount(saved);
+ }
+
+ private void buildShadowCorners() {
+ RectF innerBounds = new RectF(-mCornerRadius, -mCornerRadius, mCornerRadius, mCornerRadius);
+ RectF outerBounds = new RectF(innerBounds);
+ outerBounds.inset(-mShadowSize, -mShadowSize);
+
+ if (mCornerShadowPath == null) {
+ mCornerShadowPath = new Path();
+ } else {
+ mCornerShadowPath.reset();
+ }
+ mCornerShadowPath.setFillType(Path.FillType.EVEN_ODD);
+ mCornerShadowPath.moveTo(-mCornerRadius, 0);
+ mCornerShadowPath.rLineTo(-mShadowSize, 0);
+ // outer arc
+ mCornerShadowPath.arcTo(outerBounds, 180f, 90f, false);
+ // inner arc
+ mCornerShadowPath.arcTo(innerBounds, 270f, -90f, false);
+ mCornerShadowPath.close();
+
+ float startRatio = mCornerRadius / (mCornerRadius + mShadowSize);
+ mCornerShadowPaint.setShader(new RadialGradient(0, 0, mCornerRadius + mShadowSize,
+ new int[]{mShadowStartColor, mShadowStartColor, mShadowEndColor},
+ new float[]{0f, startRatio, 1f}
+ , Shader.TileMode.CLAMP));
+
+ // we offset the content shadowSize/2 pixels up to make it more realistic.
+ // this is why edge shadow shader has some extra space
+ // When drawing bottom edge shadow, we use that extra space.
+ mEdgeShadowPaint.setShader(new LinearGradient(0, -mCornerRadius + mShadowSize, 0,
+ -mCornerRadius - mShadowSize,
+ new int[]{mShadowStartColor, mShadowStartColor, mShadowEndColor},
+ new float[]{0f, .5f, 1f}, Shader.TileMode.CLAMP));
+ }
+
+ private void buildComponents(Rect bounds) {
+ // Card is offset SHADOW_MULTIPLIER * maxShadowSize to account for the shadow shift.
+ // We could have different top-bottom offsets to avoid extra gap above but in that case
+ // center aligning Views inside the CardView would be problematic.
+ final float verticalOffset = mMaxShadowSize * SHADOW_MULTIPLIER;
+ mCardBounds.set(bounds.left + mMaxShadowSize, bounds.top + verticalOffset,
+ bounds.right - mMaxShadowSize, bounds.bottom - verticalOffset);
+ buildShadowCorners();
+ }
+
+ float getMinWidth() {
+ final float content = 2 *
+ Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow + mRawMaxShadowSize / 2);
+ return content + (mRawMaxShadowSize + mInsetShadow) * 2;
+ }
+
+ float getMinHeight() {
+ final float content = 2 * Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow
+ + mRawMaxShadowSize * SHADOW_MULTIPLIER / 2);
+ return content + (mRawMaxShadowSize * SHADOW_MULTIPLIER + mInsetShadow) * 2;
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 1bfb41f9ac95..6c22a3b28798 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -56,6 +56,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
/** The RecentsView callbacks */
public interface RecentsViewCallbacks {
public void onTaskViewClicked();
+ public void onTaskLaunchFailed();
public void onAllTaskViewsDismissed();
public void onExitToHomeAnimationTriggered();
}
@@ -393,7 +394,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
// Upfront the processing of the thumbnail
TaskViewTransform transform = new TaskViewTransform();
- View sourceView = tv;
+ View sourceView;
int offsetX = 0;
int offsetY = 0;
float stackScroll = stackView.getScroller().getStackScroll();
@@ -406,6 +407,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
offsetX = transform.rect.left;
offsetY = mConfig.displayRect.height();
} else {
+ sourceView = tv.mThumbnailView;
transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
}
@@ -470,13 +472,18 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
// Bring an active task to the foreground
ssp.moveTaskToFront(task.key.id, launchOpts);
} else {
- try {
- ssp.startActivityFromRecents(task.key.id, launchOpts);
+ if (ssp.startActivityFromRecents(getContext(), task.key.id,
+ task.activityLabel, launchOpts)) {
if (launchOpts == null && lockToTask) {
ssp.lockCurrentTask();
}
- } catch (ActivityNotFoundException anfe) {
- Console.logError(getContext(), "Could not start Activity");
+ } else {
+ // Dismiss the task and return the user to home if we fail to
+ // launch the task
+ onTaskViewDismissed(task);
+ if (mCb != null) {
+ mCb.onTaskLaunchFailed();
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 895b9d17f597..e1e4068a18d7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -16,21 +16,23 @@
package com.android.systemui.recents.views;
+import android.animation.ValueAnimator;
import android.content.ComponentName;
import android.content.Context;
+import android.graphics.Matrix;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.DozeTrigger;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.RecentsPackageMonitor;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.Task;
@@ -76,15 +78,28 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Optimizations
int mStackViewsAnimationDuration;
boolean mStackViewsDirty = true;
+ boolean mStackViewsClipDirty = true;
boolean mAwaitingFirstLayout = true;
boolean mStartEnterAnimationRequestedAfterLayout;
boolean mStartEnterAnimationCompleted;
ViewAnimation.TaskViewEnterContext mStartEnterAnimationContext;
int[] mTmpVisibleRange = new int[2];
+ float[] mTmpCoord = new float[2];
+ Matrix mTmpMatrix = new Matrix();
+ Rect mTmpRect = new Rect();
TaskViewTransform mTmpTransform = new TaskViewTransform();
HashMap<Task, TaskView> mTmpTaskViewMap = new HashMap<Task, TaskView>();
LayoutInflater mInflater;
+ // A convenience update listener to request updating clipping of tasks
+ ValueAnimator.AnimatorUpdateListener mRequestUpdateClippingListener =
+ new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ requestUpdateStackViewsClip();
+ }
+ };
+
// A convenience runnable to return all views to the pool
Runnable mReturnAllViewsToPoolRunnable = new Runnable() {
@Override
@@ -151,6 +166,14 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
}
+ /** Requests that the views clipping be updated. */
+ void requestUpdateStackViewsClip() {
+ if (!mStackViewsClipDirty) {
+ invalidate();
+ mStackViewsClipDirty = true;
+ }
+ }
+
/** Finds the child view given a specific task. */
public TaskView getChildViewForTask(Task t) {
int childCount = getChildCount();
@@ -300,7 +323,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Animate the task into place
tv.updateViewPropertiesToTaskTransform(mCurrentTaskTransforms.get(taskIndex),
- mStackViewsAnimationDuration);
+ mStackViewsAnimationDuration, mRequestUpdateClippingListener);
// Request accessibility focus on the next view if we removed the task
// that previously held accessibility focus
@@ -318,6 +341,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Reset the request-synchronize params
mStackViewsAnimationDuration = 0;
mStackViewsDirty = false;
+ mStackViewsClipDirty = true;
return true;
}
return false;
@@ -348,10 +372,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// stacked and we can make assumptions about the visibility of the this
// task relative to the ones in front of it.
if (nextTv != null) {
- // We can reuse the current task transforms to find the task rects
- TaskViewTransform transform = mCurrentTaskTransforms.get(mStack.indexOfTask(tv.getTask()));
- TaskViewTransform nextTransform = mCurrentTaskTransforms.get(mStack.indexOfTask(nextTv.getTask()));
- clipBottom = transform.rect.bottom - nextTransform.rect.top;
+ // Map the top edge of next task view into the local space of the current
+ // task view to find the clip amount in local space
+ mTmpCoord[0] = mTmpCoord[1] = 0;
+ Utilities.mapCoordInDescendentToSelf(nextTv, this, mTmpCoord, false);
+ Utilities.mapCoordInSelfToDescendent(tv, this, mTmpCoord, mTmpMatrix);
+ clipBottom = (int) Math.floor(tv.getMeasuredHeight() - mTmpCoord[1]
+ - nextTv.getPaddingTop() - 1);
}
}
tv.getViewBounds().setClipBottom(clipBottom);
@@ -362,6 +389,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
tv.getViewBounds().setClipBottom(0);
}
}
+ mStackViewsClipDirty = false;
}
/** The stack insets to apply to the stack contents */
@@ -537,10 +565,17 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (tv.isFullScreenView()) {
tv.measure(widthMeasureSpec, heightMeasureSpec);
} else {
+ if (tv.getBackground() != null) {
+ tv.getBackground().getPadding(mTmpRect);
+ } else {
+ mTmpRect.setEmpty();
+ }
tv.measure(
- MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.width(),
+ MeasureSpec.makeMeasureSpec(
+ mLayoutAlgorithm.mTaskRect.width() + mTmpRect.left + mTmpRect.right,
MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.height() +
+ MeasureSpec.makeMeasureSpec(
+ mLayoutAlgorithm.mTaskRect.height() + mTmpRect.top + mTmpRect.bottom +
tv.getMaxFooterHeight(), MeasureSpec.EXACTLY));
}
}
@@ -562,8 +597,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (tv.isFullScreenView()) {
tv.layout(left, top, left + tv.getMeasuredWidth(), top + tv.getMeasuredHeight());
} else {
- tv.layout(mLayoutAlgorithm.mTaskRect.left, mLayoutAlgorithm.mTaskRect.top,
- mLayoutAlgorithm.mTaskRect.right, mLayoutAlgorithm.mTaskRect.bottom +
+ if (tv.getBackground() != null) {
+ tv.getBackground().getPadding(mTmpRect);
+ } else {
+ mTmpRect.setEmpty();
+ }
+ tv.layout(mLayoutAlgorithm.mTaskRect.left - mTmpRect.left,
+ mLayoutAlgorithm.mTaskRect.top - mTmpRect.top,
+ mLayoutAlgorithm.mTaskRect.right + mTmpRect.right,
+ mLayoutAlgorithm.mTaskRect.bottom + mTmpRect.bottom +
tv.getMaxFooterHeight());
}
}
@@ -650,6 +692,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
ctx.currentTaskRect = mLayoutAlgorithm.mTaskRect;
ctx.currentTaskOccludesLaunchTarget = (launchTargetTask != null) &&
launchTargetTask.group.isTaskAboveTask(task, launchTargetTask);
+ ctx.updateListener = mRequestUpdateClippingListener;
mLayoutAlgorithm.getStackTransform(task, mStackScroller.getStackScroll(), ctx.currentTaskTransform, null);
tv.startEnterRecentsAnimation(ctx);
}
@@ -988,7 +1031,9 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void onTaskViewClipStateChanged(TaskView tv) {
- invalidate();
+ if (!mStackViewsDirty) {
+ invalidate();
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 51adc28c5e85..17508045b818 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -20,12 +20,9 @@ import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
-import android.graphics.Color;
-import android.graphics.Outline;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.Rect;
+import android.graphics.*;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewOutlineProvider;
@@ -72,6 +69,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
AnimateableViewBounds mViewBounds;
Paint mLayerPaint = new Paint();
+ View mContent;
TaskViewThumbnail mThumbnailView;
TaskViewHeader mHeaderView;
TaskViewFooter mFooterView;
@@ -106,9 +104,12 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mMaxDimScale = mConfig.taskStackMaxDim / 255f;
mClipViewInStack = true;
mViewBounds = new AnimateableViewBounds(this, mConfig.taskViewRoundedCornerRadiusPx);
- setOutlineProvider(mViewBounds);
setTaskProgress(getTaskProgress());
setDim(getDim());
+ if (mConfig.fakeShadows) {
+ setBackground(new FakeShadowDrawable(context.getResources(), mConfig));
+ }
+ setOutlineProvider(mViewBounds);
}
/** Set callback */
@@ -129,15 +130,16 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
@Override
protected void onFinishInflate() {
// Bind the views
+ mContent = findViewById(R.id.task_view_content);
mHeaderView = (TaskViewHeader) findViewById(R.id.task_view_bar);
mThumbnailView = (TaskViewThumbnail) findViewById(R.id.task_view_thumbnail);
+ mThumbnailView.enableTaskBarClip(mHeaderView);
mActionButtonView = findViewById(R.id.lock_to_app_fab);
mActionButtonView.setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
// Set the outline to match the FAB background
- outline.setOval(0, 0, mActionButtonView.getWidth(),
- mActionButtonView.getHeight());
+ outline.setOval(0, 0, mActionButtonView.getWidth(), mActionButtonView.getHeight());
}
});
if (mFooterView != null) {
@@ -150,24 +152,35 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
+ int widthWithoutPadding = width - mPaddingLeft - mPaddingRight;
+ int heightWithoutPadding = height - mPaddingTop - mPaddingBottom;
+
+ // Measure the content
+ mContent.measure(MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY));
+
// Measure the bar view, thumbnail, and footer
- mHeaderView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ mHeaderView.measure(MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mConfig.taskBarHeight, MeasureSpec.EXACTLY));
if (mFooterView != null) {
- mFooterView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ mFooterView.measure(
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mConfig.taskViewLockToAppButtonHeight,
MeasureSpec.EXACTLY));
}
- mActionButtonView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
+ mActionButtonView.measure(
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.AT_MOST),
+ MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.AT_MOST));
if (mIsFullScreenView) {
// Measure the thumbnail height to be the full dimensions
- mThumbnailView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
+ mThumbnailView.measure(
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.EXACTLY));
} else {
// Measure the thumbnail to be square
- mThumbnailView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY));
+ mThumbnailView.measure(
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY));
}
setMeasuredDimension(width, height);
invalidateOutline();
@@ -175,10 +188,15 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
/** Synchronizes this view's properties with the task's transform */
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
+ updateViewPropertiesToTaskTransform(toTransform, duration, null);
+ }
+
+ void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration,
+ ValueAnimator.AnimatorUpdateListener updateCallback) {
// If we are a full screen view, then only update the Z to keep it in order
// XXX: Also update/animate the dim as well
if (mIsFullScreenView) {
- if (Constants.DebugFlags.App.EnableShadows &&
+ if (!mConfig.fakeShadows &&
toTransform.hasTranslationZChangedFrom(getTranslationZ())) {
setTranslationZ(toTransform.translationZ);
}
@@ -186,7 +204,8 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
}
// Apply the transform
- toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false);
+ toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false,
+ !mConfig.fakeShadows, updateCallback);
// Update the task progress
if (mTaskProgressAnimator != null) {
@@ -258,9 +277,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
} else if (mConfig.launchedFromHome) {
// Move the task view off screen (below) so we can animate it in
setTranslationY(offscreenY);
- if (Constants.DebugFlags.App.EnableShadows) {
- setTranslationZ(0);
- }
+ setTranslationZ(0);
setScaleX(1f);
setScaleY(1f);
}
@@ -321,8 +338,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mViewBounds.setClipRight(0);
// Reset the bar translation
mHeaderView.setTranslationY(0);
- // Enable the thumbnail clip
- mThumbnailView.enableTaskBarClip(mHeaderView);
// Animate the footer into view (if it is the front most task)
animateFooterVisibility(true, mConfig.taskBarEnterAnimDuration);
@@ -339,9 +354,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
})
.start();
} else {
- // Otherwise, just enable the thumbnail clip
- mThumbnailView.enableTaskBarClip(mHeaderView);
-
// Animate the footer into view
animateFooterVisibility(true, 0);
}
@@ -349,8 +361,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
} else if (mConfig.launchedFromAppWithThumbnail) {
if (mTask.isLaunchTarget) {
- // Enable the task bar clip
- mThumbnailView.enableTaskBarClip(mHeaderView);
// Animate the dim/overlay
if (Constants.DebugFlags.App.EnableThumbnailAlphaOnFrontmost) {
// Animate the thumbnail alpha before the dim animation (to prevent updating the
@@ -382,8 +392,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
.withLayer()
.start();
} else {
- // Enable the task bar clip
- mThumbnailView.enableTaskBarClip(mHeaderView);
// Animate the task up if it was occluding the launch target
if (ctx.currentTaskOccludesLaunchTarget) {
setTranslationY(transform.translationY + mConfig.taskViewAffiliateGroupEnterOffsetPx);
@@ -397,7 +405,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
.withEndAction(new Runnable() {
@Override
public void run() {
- mThumbnailView.enableTaskBarClip(mHeaderView);
// Decrement the post animation trigger
ctx.postAnimationTrigger.decrement();
}
@@ -411,9 +418,12 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
} else if (mConfig.launchedFromHome) {
// Animate the tasks up
int frontIndex = (ctx.currentStackViewCount - ctx.currentStackViewIndex - 1);
- int delay = mConfig.taskViewEnterFromHomeDelay +
- frontIndex * mConfig.taskViewEnterFromHomeStaggerDelay;
- if (Constants.DebugFlags.App.EnableShadows) {
+ float fraction = (float) frontIndex / (ctx.currentStackViewCount - 1);
+ fraction = (float) Math.pow(fraction, 0.85f);
+ int delay = (int) (mConfig.taskViewEnterFromHomeDelay +
+ fraction * mConfig.taskViewEnterFromHomeStaggerDelay);
+ long delayIncrease = (long) (fraction * mConfig.taskViewEnterFromHomeStaggerDuration);
+ if (!mConfig.fakeShadows) {
animate().translationZ(transform.translationZ);
}
animate()
@@ -421,13 +431,12 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
.scaleY(transform.scale)
.translationY(transform.translationY)
.setStartDelay(delay)
- .setUpdateListener(null)
+ .setUpdateListener(ctx.updateListener)
.setInterpolator(mConfig.quintOutInterpolator)
- .setDuration(mConfig.taskViewEnterFromHomeDuration)
+ .setDuration(mConfig.taskViewEnterFromHomeDuration + delayIncrease)
.withEndAction(new Runnable() {
@Override
public void run() {
- mThumbnailView.enableTaskBarClip(mHeaderView);
// Decrement the post animation trigger
ctx.postAnimationTrigger.decrement();
}
@@ -440,9 +449,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
startDelay = delay;
} else {
- // Otherwise, just enable the thumbnail clip
- mThumbnailView.enableTaskBarClip(mHeaderView);
-
// Animate the footer into view
animateFooterVisibility(true, 0);
}
@@ -474,8 +480,6 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
void startLaunchTaskAnimation(final Runnable postAnimRunnable, boolean isLaunchingTask,
boolean occludesLaunchTarget, boolean lockToTask) {
if (isLaunchingTask) {
- // Disable the thumbnail clip
- mThumbnailView.disableTaskBarClip();
// Animate the thumbnail alpha back into full opacity for the window animation out
mThumbnailView.startLaunchTaskAnimation(postAnimRunnable);
@@ -637,17 +641,31 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
/** Returns the current dim. */
public void setDim(int dim) {
mDim = dim;
- // Defer setting hardware layers if we have not yet measured, or there is no dim to draw
- if (getMeasuredWidth() > 0 && getMeasuredHeight() > 0) {
- if (mDimAnimator != null) {
- mDimAnimator.removeAllListeners();
- mDimAnimator.cancel();
- }
+ if (mDimAnimator != null) {
+ mDimAnimator.removeAllListeners();
+ mDimAnimator.cancel();
+ }
+ if (mConfig.useHardwareLayers) {
+ // Defer setting hardware layers if we have not yet measured, or there is no dim to draw
+ if (getMeasuredWidth() > 0 && getMeasuredHeight() > 0) {
+ if (mDimAnimator != null) {
+ mDimAnimator.removeAllListeners();
+ mDimAnimator.cancel();
+ }
- int inverse = 255 - mDim;
- mDimColorFilter.setColor(Color.argb(0xFF, inverse, inverse, inverse));
- mLayerPaint.setColorFilter(mDimColorFilter);
- setLayerType(LAYER_TYPE_HARDWARE, mLayerPaint);
+ int inverse = 255 - mDim;
+ mDimColorFilter.setColor(Color.argb(0xFF, inverse, inverse, inverse));
+ mLayerPaint.setColorFilter(mDimColorFilter);
+ mContent.setLayerType(LAYER_TYPE_HARDWARE, mLayerPaint);
+ }
+ } else {
+ float dimAlpha = mDim / 255.0f;
+ if (mThumbnailView != null) {
+ mThumbnailView.setDimAlpha(dimAlpha);
+ }
+ if (mHeaderView != null) {
+ mHeaderView.setDimAlpha(dim);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
index 1743433a858e..396d4419edd0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -30,10 +30,13 @@ import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.RippleDrawable;
+import android.graphics.drawable.ShapeDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -58,17 +61,20 @@ public class TaskViewHeader extends FrameLayout {
TextView mActivityDescription;
RippleDrawable mBackground;
- ColorDrawable mBackgroundColor;
+ GradientDrawable mBackgroundColorDrawable;
+ int mBackgroundColor;
Drawable mLightDismissDrawable;
Drawable mDarkDismissDrawable;
AnimatorSet mFocusAnimator;
ValueAnimator backgroundColorAnimator;
+ PorterDuffColorFilter mDimFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_ATOP);
boolean mIsFullscreen;
boolean mCurrentPrimaryColorIsDark;
int mCurrentPrimaryColor;
static Paint sHighlightPaint;
+ private Paint mDimPaint = new Paint();
public TaskViewHeader(Context context) {
this(context, null);
@@ -140,13 +146,14 @@ public class TaskViewHeader extends FrameLayout {
}
}
- mBackgroundColor = new ColorDrawable(0);
+ mBackgroundColorDrawable = (GradientDrawable) getContext().getDrawable(R.drawable
+ .recents_task_view_header_bg_color);
// Copy the ripple drawable since we are going to be manipulating it
mBackground = (RippleDrawable)
getContext().getDrawable(R.drawable.recents_task_view_header_bg);
mBackground = (RippleDrawable) mBackground.mutate().getConstantState().newDrawable();
mBackground.setColor(ColorStateList.valueOf(0));
- mBackground.setDrawableByLayerId(mBackground.getId(0), mBackgroundColor);
+ mBackground.setDrawableByLayerId(mBackground.getId(0), mBackgroundColorDrawable);
setBackground(mBackground);
}
@@ -197,7 +204,8 @@ public class TaskViewHeader extends FrameLayout {
int existingBgColor = (getBackground() instanceof ColorDrawable) ?
((ColorDrawable) getBackground()).getColor() : 0;
if (existingBgColor != t.colorPrimary) {
- mBackgroundColor.setColor(t.colorPrimary);
+ mBackgroundColorDrawable.setColor(t.colorPrimary);
+ mBackgroundColor = t.colorPrimary;
}
mCurrentPrimaryColor = t.colorPrimary;
mCurrentPrimaryColorIsDark = t.useLightOnPrimaryColor;
@@ -251,6 +259,14 @@ public class TaskViewHeader extends FrameLayout {
}
}
+ @Override
+ protected int[] onCreateDrawableState(int extraSpace) {
+
+ // Don't forward our state to the drawable - we do it manually in onTaskViewFocusChanged.
+ // This is to prevent layer trashing when the view is pressed.
+ return new int[] {};
+ }
+
/** Notifies the associated TaskView has been focused. */
void onTaskViewFocusChanged(boolean focused) {
boolean isRunning = false;
@@ -276,7 +292,7 @@ public class TaskViewHeader extends FrameLayout {
mBackground.setColor(new ColorStateList(states, colors));
mBackground.setState(newStates);
// Pulse the background color
- int currentColor = mBackgroundColor.getColor();
+ int currentColor = mBackgroundColor;
int lightPrimaryColor = getSecondaryColor(mCurrentPrimaryColor, mCurrentPrimaryColorIsDark);
ValueAnimator backgroundColor = ValueAnimator.ofObject(new ArgbEvaluator(),
lightPrimaryColor, currentColor);
@@ -289,7 +305,9 @@ public class TaskViewHeader extends FrameLayout {
backgroundColor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- mBackgroundColor.setColor((Integer) animation.getAnimatedValue());
+ int color = (int) animation.getAnimatedValue();
+ mBackgroundColorDrawable.setColor(color);
+ mBackgroundColor = color;
}
});
backgroundColor.setRepeatCount(ValueAnimator.INFINITE);
@@ -307,13 +325,15 @@ public class TaskViewHeader extends FrameLayout {
} else {
if (isRunning) {
// Restore the background color
- int currentColor = mBackgroundColor.getColor();
+ int currentColor = mBackgroundColor;
ValueAnimator backgroundColor = ValueAnimator.ofObject(new ArgbEvaluator(),
currentColor, mCurrentPrimaryColor);
backgroundColor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- mBackgroundColor.setColor((Integer) animation.getAnimatedValue());
+ int color = (int) animation.getAnimatedValue();
+ mBackgroundColorDrawable.setColor(color);
+ mBackgroundColor = color;
}
});
// Restore the translation
@@ -329,4 +349,11 @@ public class TaskViewHeader extends FrameLayout {
}
}
}
+
+ public void setDimAlpha(int alpha) {
+ int color = Color.argb(alpha, 0, 0, 0);
+ mDimFilter.setColor(color);
+ mDimPaint.setColorFilter(mDimFilter);
+ setLayerType(LAYER_TYPE_HARDWARE, mDimPaint);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
index fe369879ad16..a946a849310b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
@@ -16,9 +16,20 @@
package com.android.systemui.recents.views;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.LightingColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
import com.android.systemui.recents.RecentsConfiguration;
@@ -26,12 +37,32 @@ import com.android.systemui.recents.model.Task;
/** The task thumbnail view */
-public class TaskViewThumbnail extends FixedSizeImageView {
+public class TaskViewThumbnail extends View {
+ private final int mCornerRadius;
+ private final Matrix mScaleMatrix = new Matrix();
RecentsConfiguration mConfig;
// Task bar clipping
Rect mClipRect = new Rect();
+ Paint mDrawPaint = new Paint();
+ LightingColorFilter mLightingColorFilter = new LightingColorFilter(0xffffffff, 0);
+ private final RectF mBitmapRect = new RectF();
+ private final RectF mLayoutRect = new RectF();
+ private BitmapShader mBitmapShader;
+ private float mBitmapAlpha;
+ private float mDimAlpha;
+ private View mTaskBar;
+ private boolean mInvisible;
+ private ValueAnimator mAlphaAnimator;
+ private ValueAnimator.AnimatorUpdateListener mAlphaUpdateListener
+ = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mBitmapAlpha = (float) animation.getAnimatedValue();
+ updateFilter();
+ }
+ };
public TaskViewThumbnail(Context context) {
this(context, null);
@@ -48,35 +79,75 @@ public class TaskViewThumbnail extends FixedSizeImageView {
public TaskViewThumbnail(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mConfig = RecentsConfiguration.getInstance();
- setScaleType(ScaleType.FIT_XY);
+ mCornerRadius = mConfig.taskViewRoundedCornerRadiusPx;
+ mDrawPaint.setColorFilter(mLightingColorFilter);
+ mDrawPaint.setFilterBitmap(true);
+ mDrawPaint.setAntiAlias(true);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mInvisible) {
+ return;
+ }
+ canvas.drawRoundRect(0,
+ 0,
+ getWidth(),
+ getHeight(),
+ mCornerRadius,
+ mCornerRadius,
+ mDrawPaint);
}
@Override
protected void onFinishInflate() {
- setAlpha(0.9f);
+ mBitmapAlpha = 0.9f;
+ updateFilter();
+ }
+
+ private void updateFilter() {
+ if (mInvisible) {
+ return;
+ }
+ int mul = (int) ((1.0f - mDimAlpha) * mBitmapAlpha * 255);
+ int add = (int) ((1.0f - mDimAlpha) * (1 - mBitmapAlpha) * 255);
+ if (mBitmapShader != null) {
+ mLightingColorFilter.setColorMultiply(Color.argb(255, mul, mul, mul));
+ mLightingColorFilter.setColorAdd(Color.argb(0, add, add, add));
+ mDrawPaint.setColorFilter(mLightingColorFilter);
+ mDrawPaint.setColor(0xffffffff);
+ } else {
+ mDrawPaint.setColorFilter(null);
+ int grey = mul + add;
+ mDrawPaint.setColor(Color.argb(255, grey, grey, grey));
+ }
+ invalidate();
}
/** Updates the clip rect based on the given task bar. */
void enableTaskBarClip(View taskBar) {
+ mTaskBar = taskBar;
int top = (int) Math.max(0, taskBar.getTranslationY() +
taskBar.getMeasuredHeight() - 1);
mClipRect.set(0, top, getMeasuredWidth(), getMeasuredHeight());
setClipBounds(mClipRect);
}
- /** Disables the task bar clipping. */
- void disableTaskBarClip() {
- mClipRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());
- setClipBounds(mClipRect);
+ void updateVisibility(int clipBottom) {
+ boolean invisible = mTaskBar != null && getHeight() - clipBottom < mTaskBar.getHeight();
+ if (invisible != mInvisible) {
+ mInvisible = invisible;
+ if (!mInvisible) {
+ updateFilter();
+ }
+ invalidate();
+ }
}
/** Binds the thumbnail view to the screenshot. */
boolean bindToScreenshot(Bitmap ss) {
- if (ss != null) {
- setImageBitmap(ss);
- return true;
- }
- return false;
+ setImageBitmap(ss);
+ return ss != null;
}
/** Unbinds the thumbnail view from the screenshot. */
@@ -88,12 +159,49 @@ public class TaskViewThumbnail extends FixedSizeImageView {
void rebindToTask(Task t) {
if (t.thumbnail != null) {
setImageBitmap(t.thumbnail);
+ } else {
+ setImageBitmap(null);
+ }
+ }
+
+ public void setImageBitmap(Bitmap bm) {
+ if (bm != null) {
+ mBitmapShader = new BitmapShader(bm, Shader.TileMode.CLAMP,
+ Shader.TileMode.CLAMP);
+ mDrawPaint.setShader(mBitmapShader);
+ mBitmapRect.set(0, 0, bm.getWidth(), bm.getHeight());
+ updateBitmapScale();
+ } else {
+ mBitmapShader = null;
+ mDrawPaint.setShader(null);
+ }
+ updateFilter();
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ if (changed) {
+ mLayoutRect.set(0, 0, getWidth(), getHeight());
+ updateBitmapScale();
+ }
+ }
+
+ private void updateBitmapScale() {
+ if (mBitmapShader != null) {
+ mScaleMatrix.setRectToRect(mBitmapRect, mLayoutRect, Matrix.ScaleToFit.FILL);
+ mBitmapShader.setLocalMatrix(mScaleMatrix);
}
}
+ public void setDimAlpha(float dimAlpha) {
+ mDimAlpha = dimAlpha;
+ updateFilter();
+ }
+
/** Unbinds the thumbnail view from the task */
void unbindFromTask() {
- setImageDrawable(null);
+ setImageBitmap(null);
}
/** Handles focus changes. */
@@ -112,10 +220,11 @@ public class TaskViewThumbnail extends FixedSizeImageView {
/** Prepares for the enter recents animation. */
void prepareEnterRecentsAnimation(boolean isTaskViewLaunchTargetTask) {
if (isTaskViewLaunchTargetTask) {
- setAlpha(1f);
+ mBitmapAlpha = 1f;
} else {
- setAlpha(mConfig.taskViewThumbnailAlpha);
+ mBitmapAlpha = mConfig.taskViewThumbnailAlpha;
}
+ updateFilter();
}
/** Animates this task thumbnail as it enters recents */
@@ -130,16 +239,32 @@ public class TaskViewThumbnail extends FixedSizeImageView {
}
/** Animates the thumbnail alpha. */
- void startFadeAnimation(float finalAlpha, int delay, int duration, Runnable postAnimRunnable) {
+ void startFadeAnimation(float finalAlpha, int delay, int duration, final Runnable postAnimRunnable) {
+ if (mAlphaAnimator != null) {
+ mAlphaAnimator.cancel();
+ }
+ mAlphaAnimator = ValueAnimator.ofFloat(mBitmapAlpha, finalAlpha);
+ mAlphaAnimator.addUpdateListener(mAlphaUpdateListener);
+ mAlphaAnimator.setStartDelay(delay);
+ mAlphaAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
+ mAlphaAnimator.setDuration(duration);
+ mAlphaAnimator.start();
if (postAnimRunnable != null) {
- animate().withEndAction(postAnimRunnable);
+ mAlphaAnimator.addListener(new AnimatorListenerAdapter() {
+ public boolean mCancelled;
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mCancelled = true;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!mCancelled) {
+ postAnimRunnable.run();
+ }
+ }
+ });
}
- animate()
- .alpha(finalAlpha)
- .setStartDelay(delay)
- .setInterpolator(mConfig.fastOutSlowInInterpolator)
- .setDuration(duration)
- .withLayer()
- .start();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
index ce2e80b85ac9..42c0f9fc7350 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
@@ -77,7 +77,8 @@ public class TaskViewTransform {
}
/** Applies this transform to a view. */
- public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers) {
+ public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers,
+ boolean allowShadows, ValueAnimator.AnimatorUpdateListener updateCallback) {
// Check to see if any properties have changed, and update the task view
if (duration > 0) {
ViewPropertyAnimator anim = v.animate();
@@ -87,8 +88,7 @@ public class TaskViewTransform {
if (hasTranslationYChangedFrom(v.getTranslationY())) {
anim.translationY(translationY);
}
- if (Constants.DebugFlags.App.EnableShadows &&
- hasTranslationZChangedFrom(v.getTranslationZ())) {
+ if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
anim.translationZ(translationZ);
}
if (hasScaleChangedFrom(v.getScaleX())) {
@@ -104,6 +104,11 @@ public class TaskViewTransform {
if (requiresLayers && allowLayers) {
anim.withLayer();
}
+ if (updateCallback != null) {
+ anim.setUpdateListener(updateCallback);
+ } else {
+ anim.setUpdateListener(null);
+ }
anim.setStartDelay(startDelay)
.setDuration(duration)
.setInterpolator(interp)
@@ -113,8 +118,7 @@ public class TaskViewTransform {
if (hasTranslationYChangedFrom(v.getTranslationY())) {
v.setTranslationY(translationY);
}
- if (Constants.DebugFlags.App.EnableShadows &&
- hasTranslationZChangedFrom(v.getTranslationZ())) {
+ if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
v.setTranslationZ(translationZ);
}
if (hasScaleChangedFrom(v.getScaleX())) {
@@ -131,9 +135,7 @@ public class TaskViewTransform {
public static void reset(View v) {
v.setTranslationX(0f);
v.setTranslationY(0f);
- if (Constants.DebugFlags.App.EnableShadows) {
- v.setTranslationZ(0f);
- }
+ v.setTranslationZ(0f);
v.setScaleX(1f);
v.setScaleY(1f);
v.setAlpha(1f);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java b/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java
index a1fc40fcba9f..4586f1251cf8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java
@@ -16,6 +16,7 @@
package com.android.systemui.recents.views;
+import android.animation.ValueAnimator;
import android.graphics.Rect;
import com.android.systemui.recents.misc.ReferenceCountedTrigger;
@@ -27,6 +28,8 @@ public class ViewAnimation {
// A trigger to run some logic when all the animations complete. This works around the fact
// that it is difficult to coordinate ViewPropertyAnimators
ReferenceCountedTrigger postAnimationTrigger;
+ // An update listener to notify as the enter animation progresses (used for the home transition)
+ ValueAnimator.AnimatorUpdateListener updateListener;
// These following properties are updated for each task view we start the enter animation on
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BackDropView.java b/packages/SystemUI/src/com/android/systemui/statusbar/BackDropView.java
new file mode 100644
index 000000000000..f1eb9febfb33
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BackDropView.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.FrameLayout;
+
+/**
+ * A view who contains media artwork.
+ */
+public class BackDropView extends FrameLayout
+{
+ private Runnable mOnVisibilityChangedRunnable;
+
+ public BackDropView(Context context) {
+ super(context);
+ }
+
+ public BackDropView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public BackDropView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public BackDropView(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ public boolean hasOverlappingRendering() {
+ return false;
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ if (changedView == this && mOnVisibilityChangedRunnable != null) {
+ mOnVisibilityChangedRunnable.run();
+ }
+ }
+
+ public void setOnVisibilityChangedRunnable(Runnable runnable) {
+ mOnVisibilityChangedRunnable = runnable;
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
new file mode 100644
index 000000000000..23534255db11
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.Interpolator;
+
+/**
+ * A view which can draw a scrim
+ */
+public class ScrimView extends View
+{
+ private int mScrimColor;
+ private boolean mIsEmpty;
+ private boolean mDrawAsSrc;
+ private float mViewAlpha = 1.0f;
+ private ValueAnimator mAlphaAnimator;
+ private ValueAnimator.AnimatorUpdateListener mAlphaUpdateListener
+ = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ mViewAlpha = (float) animation.getAnimatedValue();
+ invalidate();
+ }
+ };
+ private AnimatorListenerAdapter mClearAnimatorListener = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mAlphaAnimator = null;
+ }
+ };
+
+ public ScrimView(Context context) {
+ this(context, null);
+ }
+
+ public ScrimView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public ScrimView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public ScrimView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mDrawAsSrc || !mIsEmpty) {
+ PorterDuff.Mode mode = mDrawAsSrc ? PorterDuff.Mode.SRC : PorterDuff.Mode.SRC_OVER;
+ int color = mScrimColor;
+ color = Color.argb((int) (Color.alpha(color) * mViewAlpha), Color.red(color),
+ Color.green(color), Color.blue(color));
+ canvas.drawColor(color, mode);
+ }
+ }
+
+ public void setDrawAsSrc(boolean asSrc) {
+ mDrawAsSrc = asSrc;
+ invalidate();
+ }
+
+ public void setScrimColor(int color) {
+ if (color != mScrimColor) {
+ mIsEmpty = Color.alpha(color) == 0;
+ mScrimColor = color;
+ invalidate();
+ }
+ }
+
+ public int getScrimColor() {
+ return mScrimColor;
+ }
+
+ @Override
+ public boolean hasOverlappingRendering() {
+ return false;
+ }
+
+ public void setViewAlpha(float alpha) {
+ if (mAlphaAnimator != null) {
+ mAlphaAnimator.cancel();
+ }
+ mViewAlpha = alpha;
+ invalidate();
+ }
+
+ public void animateViewAlpha(float alpha, long durationOut, Interpolator interpolator) {
+ if (mAlphaAnimator != null) {
+ mAlphaAnimator.cancel();
+ }
+ mAlphaAnimator = ValueAnimator.ofFloat(mViewAlpha, alpha);
+ mAlphaAnimator.addUpdateListener(mAlphaUpdateListener);
+ mAlphaAnimator.addListener(mClearAnimatorListener);
+ mAlphaAnimator.setInterpolator(interpolator);
+ mAlphaAnimator.setDuration(durationOut);
+ mAlphaAnimator.start();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index e323dd615989..754fade75556 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -25,6 +25,8 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
@@ -91,6 +93,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
private final TrustDrawable mTrustDrawable;
+ private int mLastUnlockIconRes = 0;
+
public KeyguardBottomAreaView(Context context) {
this(context, null);
}
@@ -380,7 +384,17 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
? com.android.internal.R.drawable.ic_account_circle
: mUnlockMethodCache.isMethodInsecure() ? R.drawable.ic_lock_open_24dp
: R.drawable.ic_lock_24dp;
- mLockIcon.setImageResource(iconRes);
+ if (mLastUnlockIconRes != iconRes) {
+ Drawable icon = mContext.getDrawable(iconRes);
+ int iconHeight = getResources().getDimensionPixelSize(
+ R.dimen.keyguard_affordance_icon_height);
+ int iconWidth = getResources().getDimensionPixelSize(
+ R.dimen.keyguard_affordance_icon_width);
+ if (icon.getIntrinsicHeight() != iconHeight || icon.getIntrinsicWidth() != iconWidth) {
+ icon = new IntrinsicSizeDrawable(icon, iconWidth, iconHeight);
+ }
+ mLockIcon.setImageDrawable(icon);
+ }
boolean trustManaged = mUnlockMethodCache.isTrustManaged();
mTrustDrawable.setTrustManaged(trustManaged);
updateLockIconClickability();
@@ -469,4 +483,30 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
KeyguardIndicationController keyguardIndicationController) {
mIndicationController = keyguardIndicationController;
}
+
+
+ /**
+ * A wrapper around another Drawable that overrides the intrinsic size.
+ */
+ private static class IntrinsicSizeDrawable extends InsetDrawable {
+
+ private final int mIntrinsicWidth;
+ private final int mIntrinsicHeight;
+
+ public IntrinsicSizeDrawable(Drawable drawable, int intrinsicWidth, int intrinsicHeight) {
+ super(drawable, 0);
+ mIntrinsicWidth = intrinsicWidth;
+ mIntrinsicHeight = intrinsicHeight;
+ }
+
+ @Override
+ public int getIntrinsicWidth() {
+ return mIntrinsicWidth;
+ }
+
+ @Override
+ public int getIntrinsicHeight() {
+ return mIntrinsicHeight;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
index 685c184a672a..4715d0abd996 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java
@@ -67,8 +67,7 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener
@Override
public void onClick(View v) {
- final UserManager um = UserManager.get(getContext());
- if (um.isUserSwitcherEnabled()) {
+ if (opensUserSwitcherWhenClicked()) {
if (mKeyguardMode) {
if (mKeyguardUserSwitcher != null) {
mKeyguardUserSwitcher.show(true /* animate */);
@@ -92,9 +91,8 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener
super.onPopulateAccessibilityEvent(event);
if (isClickable()) {
- final UserManager um = UserManager.get(getContext());
String text;
- if (um.isUserSwitcherEnabled()) {
+ if (opensUserSwitcherWhenClicked()) {
String currentUser = null;
if (mQsPanel != null) {
UserSwitcherController controller = mQsPanel.getHost()
@@ -122,4 +120,9 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener
public boolean hasOverlappingRendering() {
return false;
}
+
+ private boolean opensUserSwitcherWhenClicked() {
+ UserManager um = UserManager.get(getContext());
+ return UserManager.supportsMultipleUsers() && um.isUserSwitcherEnabled();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index c04ca83300cd..80e966386e2a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -1738,6 +1738,10 @@ public class NotificationPanelView extends PanelView implements
updateKeyguardStatusBarVisibility();
}
+ public boolean isDozing() {
+ return mDozing;
+ }
+
private static void setBackgroundColorAlpha(final View target, int rgb, int targetAlpha,
boolean animate) {
int currentAlpha = getBackgroundAlpha(target);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 873d528c8fe4..67c77236ba78 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -33,6 +33,7 @@ import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import com.android.systemui.R;
+import com.android.systemui.doze.DozeLog;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.StatusBarState;
@@ -347,6 +348,8 @@ public abstract class PanelView extends FrameLayout {
if (PhoneStatusBar.DEBUG_EMPTY_KEYGUARD) {
Log.i(TAG, "Flinging: expand=" + expand);
}
+ DozeLog.traceFling(expand, mTouchAboveFalsingThreshold,
+ mStatusBar.isFalsingThresholdNeeded());
fling(vel, expand);
mUpdateFlingOnLayout = expand && mPanelClosedOnDown && !mHasLayoutedSinceDown;
if (mUpdateFlingOnLayout) {
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 1b4254c95aa3..90f9cdd772bc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -32,6 +32,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.TimeInterpolator;
+import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
@@ -51,7 +52,9 @@ import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
+import android.graphics.Xfermode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.InputMethodService;
@@ -115,10 +118,12 @@ import com.android.systemui.DemoMode;
import com.android.systemui.EventLogTags;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
-import com.android.systemui.doze.DozeService;
+import com.android.systemui.doze.DozeHost;
+import com.android.systemui.doze.DozeLog;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.statusbar.ActivatableNotificationView;
+import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DismissView;
@@ -130,6 +135,7 @@ import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationData.Entry;
import com.android.systemui.statusbar.NotificationOverflowContainer;
+import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.SpeedBumpView;
import com.android.systemui.statusbar.StatusBarIconView;
@@ -430,8 +436,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f);
public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f);
- private FrameLayout mBackdrop;
+ private BackDropView mBackdrop;
private ImageView mBackdropFront, mBackdropBack;
+ private PorterDuffXfermode mSrcXferMode = new PorterDuffXfermode(PorterDuff.Mode.SRC);
+ private PorterDuffXfermode mSrcOverXferMode = new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER);
private MediaSessionManager mMediaSessionManager;
private MediaController mMediaController;
@@ -586,7 +594,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
startKeyguard();
mDozeServiceHost = new DozeServiceHost();
- putComponent(DozeService.Host.class, mDozeServiceHost);
+ putComponent(DozeHost.class, mDozeServiceHost);
putComponent(PhoneStatusBar.class, this);
setControllerUsers();
@@ -722,8 +730,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mStackScroller.setDismissView(mDismissView);
mExpandedContents = mStackScroller;
- mScrimController = new ScrimController(mStatusBarWindow.findViewById(R.id.scrim_behind),
- mStatusBarWindow.findViewById(R.id.scrim_in_front));
+ mBackdrop = (BackDropView) mStatusBarWindow.findViewById(R.id.backdrop);
+ mBackdropFront = (ImageView) mBackdrop.findViewById(R.id.backdrop_front);
+ mBackdropBack = (ImageView) mBackdrop.findViewById(R.id.backdrop_back);
+
+ ScrimView scrimBehind = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_behind);
+ ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front);
+ mScrimController = new ScrimController(scrimBehind, scrimInFront);
+ mScrimController.setBackDropView(mBackdrop);
mStatusBarView.setScrimController(mScrimController);
mHeader = (StatusBarHeaderView) mStatusBarWindow.findViewById(R.id.header);
@@ -862,10 +876,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
});
}
- mBackdrop = (FrameLayout) mStatusBarWindow.findViewById(R.id.backdrop);
- mBackdropFront = (ImageView) mBackdrop.findViewById(R.id.backdrop_front);
- mBackdropBack = (ImageView) mBackdrop.findViewById(R.id.backdrop_back);
-
// User info. Trigger first load.
mHeader.setUserInfoController(mUserInfoController);
mKeyguardStatusBar.setUserInfoController(mUserInfoController);
@@ -1485,7 +1495,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
updateClearAll();
updateEmptyShadeView();
- mNotificationPanel.setQsExpansionEnabled(isDeviceProvisioned());
+ // Disable QS if device not provisioned.
+ // If the user switcher is simple then disable QS during setup because
+ // the user intends to use the lock screen user switcher, QS in not needed.
+ mNotificationPanel.setQsExpansionEnabled(isDeviceProvisioned()
+ && (!mUserSwitcherController.isSimpleUserSwitcher() || mUserSetup));
mShadeUpdates.check();
}
@@ -1847,7 +1861,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
if (metaDataChanged) {
if (mBackdropBack.getDrawable() != null) {
- mBackdropFront.setImageDrawable(mBackdropBack.getDrawable());
+ Drawable drawable = mBackdropBack.getDrawable();
+ mBackdropFront.setImageDrawable(drawable);
+ mBackdropFront.getDrawable().mutate().setXfermode(mSrcOverXferMode);
mBackdropFront.setAlpha(1f);
mBackdropFront.setVisibility(View.VISIBLE);
} else {
@@ -1862,6 +1878,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
} else {
mBackdropBack.setImageBitmap(artworkBitmap);
}
+ mBackdropBack.getDrawable().mutate().setXfermode(mSrcXferMode);
if (mBackdropFront.getVisibility() == View.VISIBLE) {
if (DEBUG_MEDIA) {
@@ -2097,8 +2114,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
public boolean isFalsingThresholdNeeded() {
boolean onKeyguard = getBarState() == StatusBarState.KEYGUARD;
- boolean isMethodInSecure = mUnlockMethodCache.isMethodInsecure();
- return onKeyguard && isMethodInSecure;
+ boolean isMethodInsecure = mUnlockMethodCache.isMethodInsecure();
+ return onKeyguard && (isMethodInsecure || mDozing);
}
@Override // NotificationData.Environment
@@ -2870,6 +2887,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mNotificationPanel.dump(fd, pw, args);
}
+ DozeLog.dump(pw);
+
if (DUMPTRUCK) {
synchronized (mNotificationData) {
mNotificationData.dump(pw, " ");
@@ -3622,7 +3641,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
private void updateDozingState() {
- if (mState != StatusBarState.KEYGUARD) {
+ if (mState != StatusBarState.KEYGUARD && !mNotificationPanel.isDozing()) {
return;
}
mNotificationPanel.setDozing(mDozing);
@@ -3987,8 +4006,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
public void wakeUpIfDozing(long time) {
- if (mDozeServiceHost != null && mDozeServiceHost.isDozing()
- && mScrimController.isPulsing()) {
+ if (mDozing && mScrimController.isPulsing()) {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
pm.wakeUp(time);
}
@@ -4020,7 +4038,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
}
- private final class DozeServiceHost implements DozeService.Host {
+ private final class DozeServiceHost implements DozeHost {
// Amount of time to allow to update the time shown on the screen before releasing
// the wakelock. This timeout is design to compensate for the fact that we don't
// currently have a way to know when time display contents have actually been
@@ -4030,16 +4048,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
private final H mHandler = new H();
- private DozeService mCurrentDozeService;
-
@Override
public String toString() {
- return "PSB.DozeServiceHost[mCallbacks=" + mCallbacks.size() + " mCurrentDozeService="
- + mCurrentDozeService + "]";
- }
-
- public boolean isDozing() {
- return mCurrentDozeService != null;
+ return "PSB.DozeServiceHost[mCallbacks=" + mCallbacks.size() + "]";
}
public void firePowerSaveChanged(boolean active) {
@@ -4067,32 +4078,28 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
@Override
- public void addCallback(Callback callback) {
+ public void addCallback(@NonNull Callback callback) {
mCallbacks.add(callback);
}
@Override
- public void removeCallback(Callback callback) {
+ public void removeCallback(@NonNull Callback callback) {
mCallbacks.remove(callback);
}
@Override
- public void requestDoze(DozeService dozeService) {
- if (dozeService == null) return;
- mHandler.obtainMessage(H.REQUEST_DOZE, dozeService).sendToTarget();
+ public void startDozing(@NonNull Runnable ready) {
+ mHandler.obtainMessage(H.MSG_START_DOZING, ready).sendToTarget();
}
@Override
- public void requestPulse(DozeService dozeService) {
- if (dozeService == null) return;
- dozeService.stayAwake(PROCESSING_TIME);
- mHandler.obtainMessage(H.REQUEST_PULSE, dozeService).sendToTarget();
+ public void pulseWhileDozing(@NonNull PulseCallback callback) {
+ mHandler.obtainMessage(H.MSG_PULSE_WHILE_DOZING, callback).sendToTarget();
}
@Override
- public void dozingStopped(DozeService dozeService) {
- if (dozeService == null) return;
- mHandler.obtainMessage(H.DOZING_STOPPED, dozeService).sendToTarget();
+ public void stopDozing() {
+ mHandler.obtainMessage(H.MSG_STOP_DOZING).sendToTarget();
}
@Override
@@ -4100,44 +4107,44 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
return mBatteryController != null && mBatteryController.isPowerSave();
}
- private void handleRequestDoze(DozeService dozeService) {
- mCurrentDozeService = dozeService;
+ private void handleStartDozing(@NonNull Runnable ready) {
if (!mDozing) {
mDozing = true;
+ DozeLog.traceDozing(mContext, mDozing);
updateDozingState();
}
- mCurrentDozeService.startDozing();
+ ready.run();
}
- private void handleRequestPulse(DozeService dozeService) {
- if (!dozeService.equals(mCurrentDozeService)) return;
- final long stayAwake = mScrimController.pulse();
- mCurrentDozeService.stayAwake(stayAwake);
+ private void handlePulseWhileDozing(@NonNull PulseCallback callback) {
+ mScrimController.pulse(callback);
}
- private void handleDozingStopped(DozeService dozeService) {
- if (dozeService.equals(mCurrentDozeService)) {
- mCurrentDozeService = null;
- }
+ private void handleStopDozing() {
if (mDozing) {
mDozing = false;
+ DozeLog.traceDozing(mContext, mDozing);
updateDozingState();
}
}
private final class H extends Handler {
- private static final int REQUEST_DOZE = 1;
- private static final int REQUEST_PULSE = 2;
- private static final int DOZING_STOPPED = 3;
+ private static final int MSG_START_DOZING = 1;
+ private static final int MSG_PULSE_WHILE_DOZING = 2;
+ private static final int MSG_STOP_DOZING = 3;
@Override
public void handleMessage(Message msg) {
- if (msg.what == REQUEST_DOZE) {
- handleRequestDoze((DozeService) msg.obj);
- } else if (msg.what == REQUEST_PULSE) {
- handleRequestPulse((DozeService) msg.obj);
- } else if (msg.what == DOZING_STOPPED) {
- handleDozingStopped((DozeService) msg.obj);
+ switch (msg.what) {
+ case MSG_START_DOZING:
+ handleStartDozing((Runnable) msg.obj);
+ break;
+ case MSG_PULSE_WHILE_DOZING:
+ handlePulseWhileDozing((PulseCallback) msg.obj);
+ break;
+ case MSG_STOP_DOZING:
+ handleStopDozing();
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 3ff11d271f8c..5353f25b4cdb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -19,9 +19,9 @@ package com.android.systemui.statusbar.phone;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
+import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
@@ -30,6 +30,10 @@ import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import com.android.systemui.R;
+import com.android.systemui.doze.DozeHost;
+import com.android.systemui.doze.DozeLog;
+import com.android.systemui.statusbar.BackDropView;
+import com.android.systemui.statusbar.ScrimView;
/**
* Controls both the scrim behind the notifications and in front of the notifications (when a
@@ -47,8 +51,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
private static final float SCRIM_IN_FRONT_ALPHA = 0.75f;
private static final int TAG_KEY_ANIM = R.id.scrim;
- private final View mScrimBehind;
- private final View mScrimInFront;
+ private final ScrimView mScrimBehind;
+ private final ScrimView mScrimInFront;
private final UnlockMethodCache mUnlockMethodCache;
private final DozeParameters mDozeParameters;
@@ -66,11 +70,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
private Runnable mOnAnimationFinished;
private boolean mAnimationStarted;
private boolean mDozing;
- private long mPulseEndTime;
+ private DozeHost.PulseCallback mPulseCallback;
private final Interpolator mInterpolator = new DecelerateInterpolator();
private final Interpolator mLinearOutSlowInInterpolator;
+ private BackDropView mBackDropView;
- public ScrimController(View scrimBehind, View scrimInFront) {
+ public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront) {
mScrimBehind = scrimBehind;
mScrimInFront = scrimInFront;
final Context context = scrimBehind.getContext();
@@ -136,25 +141,48 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
}
/** When dozing, fade screen contents in and out using the front scrim. */
- public long pulse() {
- if (!mDozing) return 0;
- final long now = System.currentTimeMillis();
- if (DEBUG) Log.d(TAG, "pulse mPulseEndTime=" + mPulseEndTime + " now=" + now);
- if (mPulseEndTime != 0 && mPulseEndTime > now) return mPulseEndTime - now;
+ public void pulse(@NonNull DozeHost.PulseCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
+ }
+
+ if (!mDozing || mPulseCallback != null) {
+ // Pulse suppressed.
+ callback.onPulseFinished();
+ return;
+ }
+
+ // Begin pulse. Note that it's very important that the pulse finished callback
+ // be invoked when we're done so that the caller can drop the pulse wakelock.
+ mPulseCallback = callback;
mScrimInFront.post(mPulseIn);
- mPulseEndTime = now + mDozeParameters.getPulseDuration();
- return mPulseEndTime - now;
}
public boolean isPulsing() {
- return mDozing && mPulseEndTime != 0;
+ return mPulseCallback != null;
}
private void cancelPulsing() {
if (DEBUG) Log.d(TAG, "Cancel pulsing");
- mScrimInFront.removeCallbacks(mPulseIn);
- mScrimInFront.removeCallbacks(mPulseOut);
- mPulseEndTime = 0;
+
+ if (mPulseCallback != null) {
+ mScrimInFront.removeCallbacks(mPulseIn);
+ mScrimInFront.removeCallbacks(mPulseOut);
+ pulseFinished();
+ }
+ }
+
+ private void pulseStarted() {
+ if (mPulseCallback != null) {
+ mPulseCallback.onPulseStarted();
+ }
+ }
+
+ private void pulseFinished() {
+ if (mPulseCallback != null) {
+ mPulseCallback.onPulseFinished();
+ mPulseCallback = null;
+ }
}
private void scheduleUpdate() {
@@ -229,17 +257,17 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
}
}
- private void setScrimColor(View scrim, float alpha) {
+ private void setScrimColor(ScrimView scrim, float alpha) {
int color = Color.argb((int) (alpha * 255), 0, 0, 0);
if (mAnimateChange) {
startScrimAnimation(scrim, color);
} else {
- scrim.setBackgroundColor(color);
+ scrim.setScrimColor(color);
}
}
- private void startScrimAnimation(final View scrim, int targetColor) {
- int current = getBackgroundAlpha(scrim);
+ private void startScrimAnimation(final ScrimView scrim, int targetColor) {
+ int current = Color.alpha(scrim.getScrimColor());
int target = Color.alpha(targetColor);
if (current == targetColor) {
return;
@@ -253,7 +281,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
- scrim.setBackgroundColor(Color.argb(value, 0, 0, 0));
+ scrim.setScrimColor(Color.argb(value, 0, 0, 0));
}
});
anim.setInterpolator(mAnimateKeyguardFadingOut
@@ -262,7 +290,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
anim.setStartDelay(mAnimationDelay);
anim.setDuration(mDurationOverride != -1 ? mDurationOverride : ANIMATION_DURATION);
anim.addListener(new AnimatorListenerAdapter() {
-
@Override
public void onAnimationEnd(Animator animation) {
if (mOnAnimationFinished != null) {
@@ -277,15 +304,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
mAnimationStarted = true;
}
- private int getBackgroundAlpha(View scrim) {
- if (scrim.getBackground() instanceof ColorDrawable) {
- ColorDrawable drawable = (ColorDrawable) scrim.getBackground();
- return Color.alpha(drawable.getColor());
- } else {
- return 0;
- }
- }
-
@Override
public boolean onPreDraw() {
mScrimBehind.getViewTreeObserver().removeOnPreDrawListener(this);
@@ -309,11 +327,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
public void run() {
if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing);
if (!mDozing) return;
+ DozeLog.tracePulseStart();
mDurationOverride = mDozeParameters.getPulseInDuration();
mAnimationDelay = 0;
mAnimateChange = true;
mOnAnimationFinished = mPulseInFinished;
setScrimColor(mScrimInFront, 0);
+
+ // Signal that the pulse is ready to turn the screen on and draw.
+ pulseStarted();
}
};
@@ -343,7 +365,26 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
@Override
public void run() {
if (DEBUG) Log.d(TAG, "Pulse out finished");
- mPulseEndTime = 0;
+ DozeLog.tracePulseFinish();
+
+ // Signal that the pulse is all finished so we can turn the screen off now.
+ pulseFinished();
}
};
+
+ public void setBackDropView(BackDropView backDropView) {
+ mBackDropView = backDropView;
+ mBackDropView.setOnVisibilityChangedRunnable(new Runnable() {
+ @Override
+ public void run() {
+ updateScrimBehindDrawingMode();
+ }
+ });
+ updateScrimBehindDrawingMode();
+ }
+
+ private void updateScrimBehindDrawingMode() {
+ boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE;
+ mScrimBehind.setDrawAsSrc(asSrc);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index 15a722930e75..072fb29430ef 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -207,6 +207,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
FontSizeUtils.updateFontSize(mAmPm, R.dimen.qs_time_collapsed_size);
FontSizeUtils.updateFontSize(this, R.id.empty_time_view, R.dimen.qs_time_expanded_size);
+ mEmergencyCallsOnly.setText(com.android.internal.R.string.emergency_calls_only);
+
mClockCollapsedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size);
mClockExpandedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
mClockCollapsedScaleFactor = (float) mClockCollapsedSize / (float) mClockExpandedSize;
@@ -746,7 +748,9 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL
transition(mQsDetailHeader, showingDetail);
mShowingDetail = showingDetail;
if (showingDetail) {
- mQsDetailHeaderTitle.setText(detail.getTitle());
+ String title = mContext.getString(detail.getTitle());
+ mQsDetailHeaderTitle.setText(title);
+ announceForAccessibility(title);
final Boolean toggleState = detail.getToggleState();
if (toggleState == null) {
mQsDetailHeaderSwitch.setVisibility(INVISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 78554525e720..89ce257cec08 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -20,12 +20,17 @@ import android.app.StatusBarManager;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
+import android.os.IBinder;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewRootImpl;
+import android.view.WindowManager;
+import android.view.WindowManagerGlobal;
import android.widget.FrameLayout;
import com.android.systemui.R;
@@ -45,11 +50,14 @@ public class StatusBarWindowView extends FrameLayout {
private View mBrightnessMirror;
PhoneStatusBar mService;
+ private final Paint mTransparentSrcPaint = new Paint();
public StatusBarWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
setMotionEventSplittingEnabled(false);
- setWillNotDraw(!DEBUG);
+ setWillNotDraw(false);
+ mTransparentSrcPaint.setColor(0);
+ mTransparentSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
}
@Override
@@ -93,6 +101,15 @@ public class StatusBarWindowView extends FrameLayout {
if (root != null) {
root.setDrawDuringWindowsAnimating(true);
}
+
+ // We need to ensure that our window doesn't suffer from overdraw which would normally
+ // occur if our window is translucent. Since we are drawing the whole window anyway with
+ // the scrim, we don't need the window to be cleared in the beginning.
+ IBinder windowToken = getWindowToken();
+ WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams();
+ lp.token = windowToken;
+ setLayoutParams(lp);
+ WindowManagerGlobal.getInstance().changeCanvasOpacity(windowToken, true);
}
@Override
@@ -182,6 +199,24 @@ public class StatusBarWindowView extends FrameLayout {
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
+ // We need to ensure that our window is always drawn fully even when we have paddings,
+ // since we simulate it to be opaque.
+ int paddedBottom = getHeight() - getPaddingBottom();
+ int paddedRight = getWidth() - getPaddingRight();
+ if (getPaddingTop() != 0) {
+ canvas.drawRect(0, 0, getWidth(), getPaddingTop(), mTransparentSrcPaint);
+ }
+ if (getPaddingBottom() != 0) {
+ canvas.drawRect(0, paddedBottom, getWidth(), getHeight(), mTransparentSrcPaint);
+ }
+ if (getPaddingLeft() != 0) {
+ canvas.drawRect(0, getPaddingTop(), getPaddingLeft(), paddedBottom,
+ mTransparentSrcPaint);
+ }
+ if (getPaddingRight() != 0) {
+ canvas.drawRect(paddedRight, getPaddingTop(), getWidth(), paddedBottom,
+ mTransparentSrcPaint);
+ }
if (DEBUG) {
Paint pt = new Paint();
pt.setColor(0x80FFFF00);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index 7bd2e5c6df04..895af628e1d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -17,11 +17,11 @@
package com.android.systemui.statusbar.policy;
import com.android.systemui.R;
+import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import android.view.View;
-import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.widget.FrameLayout;
@@ -33,26 +33,26 @@ public class BrightnessMirrorController {
public long TRANSITION_DURATION_OUT = 150;
public long TRANSITION_DURATION_IN = 200;
- private final View mScrimBehind;
+ private final ScrimView mScrimBehind;
private final View mBrightnessMirror;
private final View mPanelHolder;
private final int[] mInt2Cache = new int[2];
public BrightnessMirrorController(StatusBarWindowView statusBarWindow) {
- mScrimBehind = statusBarWindow.findViewById(R.id.scrim_behind);
+ mScrimBehind = (ScrimView) statusBarWindow.findViewById(R.id.scrim_behind);
mBrightnessMirror = statusBarWindow.findViewById(R.id.brightness_mirror);
mPanelHolder = statusBarWindow.findViewById(R.id.panel_holder);
}
public void showMirror() {
mBrightnessMirror.setVisibility(View.VISIBLE);
- outAnimation(mScrimBehind.animate());
+ mScrimBehind.animateViewAlpha(0.0f, TRANSITION_DURATION_OUT, PhoneStatusBar.ALPHA_OUT);
outAnimation(mPanelHolder.animate())
.withLayer();
}
public void hideMirror() {
- inAnimation(mScrimBehind.animate());
+ mScrimBehind.animateViewAlpha(1.0f, TRANSITION_DURATION_IN, PhoneStatusBar.ALPHA_IN);
inAnimation(mPanelHolder.animate())
.withLayer()
.withEndAction(new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
index eb0be054e8b9..e34495492c02 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CastControllerImpl.java
@@ -55,6 +55,7 @@ public class CastControllerImpl implements CastController {
private final Object mProjectionLock = new Object();
private boolean mDiscovering;
+ private boolean mCallbackRegistered;
private MediaProjectionInfo mProjection;
public CastControllerImpl(Context context) {
@@ -70,6 +71,7 @@ public class CastControllerImpl implements CastController {
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("CastController state:");
pw.print(" mDiscovering="); pw.println(mDiscovering);
+ pw.print(" mCallbackRegistered="); pw.println(mCallbackRegistered);
pw.print(" mCallbacks.size="); pw.println(mCallbacks.size());
pw.print(" mRoutes.size="); pw.println(mRoutes.size());
for (int i = 0; i < mRoutes.size(); i++) {
@@ -83,11 +85,17 @@ public class CastControllerImpl implements CastController {
public void addCallback(Callback callback) {
mCallbacks.add(callback);
fireOnCastDevicesChanged(callback);
+ synchronized (mDiscoveringLock) {
+ handleDiscoveryChangeLocked();
+ }
}
@Override
public void removeCallback(Callback callback) {
mCallbacks.remove(callback);
+ synchronized (mDiscoveringLock) {
+ handleDiscoveryChangeLocked();
+ }
}
@Override
@@ -96,12 +104,23 @@ public class CastControllerImpl implements CastController {
if (mDiscovering == request) return;
mDiscovering = request;
if (DEBUG) Log.d(TAG, "setDiscovering: " + request);
- if (request) {
- mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
- MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
- } else {
- mMediaRouter.removeCallback(mMediaCallback);
- }
+ handleDiscoveryChangeLocked();
+ }
+ }
+
+ private void handleDiscoveryChangeLocked() {
+ if (mCallbackRegistered) {
+ mMediaRouter.removeCallback(mMediaCallback);
+ mCallbackRegistered = false;
+ }
+ if (mDiscovering) {
+ mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
+ MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
+ mCallbackRegistered = true;
+ } else if (mCallbacks.size() != 0) {
+ mMediaRouter.addCallback(ROUTE_TYPE_REMOTE_DISPLAY, mMediaCallback,
+ MediaRouter.CALLBACK_FLAG_PASSIVE_DISCOVERY);
+ mCallbackRegistered = true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index e8f35fd77bf9..bbe6622d1e81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -227,7 +227,14 @@ public class UserSwitcherController {
int id;
if (record.isGuest && record.info == null) {
// No guest user. Create one.
- id = mUserManager.createGuest(mContext, mContext.getString(R.string.guest_nickname)).id;
+ UserInfo guest = mUserManager.createGuest(
+ mContext, mContext.getString(R.string.guest_nickname));
+ if (guest == null) {
+ // Couldn't create guest, most likely because there already exists one, we just
+ // haven't reloaded the user list yet.
+ return;
+ }
+ id = guest.id;
} else if (record.isAddUser) {
showAddUserDialog();
return;
@@ -564,8 +571,14 @@ public class UserSwitcherController {
cancel();
} else {
dismiss();
- int id = mUserManager.createUser(
- mContext.getString(R.string.user_new_user_name), 0 /* flags */).id;
+ UserInfo user = mUserManager.createUser(
+ mContext.getString(R.string.user_new_user_name), 0 /* flags */);
+ if (user == null) {
+ // Couldn't create user, most likely because there are too many, but we haven't
+ // been able to reload the list yet.
+ return;
+ }
+ int id = user.id;
Bitmap icon = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(
id, /* light= */ false));
mUserManager.setUserIcon(id, icon);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index c5168744415d..00026dc58338 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -1241,6 +1241,13 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
st.decorView = new DecorView(getContext(), st.featureId);
st.gravity = Gravity.CENTER | Gravity.BOTTOM;
st.setStyle(getContext());
+ TypedArray a = getContext().obtainStyledAttributes(null,
+ R.styleable.Window, 0, st.listPresenterTheme);
+ final float elevation = a.getDimension(R.styleable.Window_windowElevation, 0);
+ if (elevation != 0) {
+ st.decorView.setElevation(elevation);
+ }
+ a.recycle();
return true;
}
@@ -2125,8 +2132,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
}
- private final class DecorView extends FrameLayout implements RootViewSurfaceTaker,
- View.OnSystemUiVisibilityChangeListener {
+ private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
/* package */int mDefaultOpacity = PixelFormat.OPAQUE;
/** The feature ID of the panel, or -1 if this is the application's DecorView */
@@ -2163,8 +2169,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private int mLastTopInset = 0;
private int mLastBottomInset = 0;
private int mLastRightInset = 0;
- private int mLastSystemUiVisibility = 0;
- private int mLastWindowSystemUiVisibility = 0;
public DecorView(Context context, int featureId) {
@@ -2643,19 +2647,35 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
} else {
if (mActionModeView == null) {
if (isFloating()) {
- mActionModeView = new ActionBarContextView(mContext);
- mActionModePopup = new PopupWindow(mContext, null,
+ // Use the action bar theme.
+ final TypedValue outValue = new TypedValue();
+ final Theme baseTheme = mContext.getTheme();
+ baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
+
+ final Context actionBarContext;
+ if (outValue.resourceId != 0) {
+ final Theme actionBarTheme = mContext.getResources().newTheme();
+ actionBarTheme.setTo(baseTheme);
+ actionBarTheme.applyStyle(outValue.resourceId, true);
+
+ actionBarContext = new ContextThemeWrapper(mContext, 0);
+ actionBarContext.getTheme().setTo(actionBarTheme);
+ } else {
+ actionBarContext = mContext;
+ }
+
+ mActionModeView = new ActionBarContextView(actionBarContext);
+ mActionModePopup = new PopupWindow(actionBarContext, null,
R.attr.actionModePopupWindowStyle);
mActionModePopup.setWindowLayoutType(
WindowManager.LayoutParams.TYPE_APPLICATION);
mActionModePopup.setContentView(mActionModeView);
mActionModePopup.setWidth(MATCH_PARENT);
- TypedValue heightValue = new TypedValue();
- mContext.getTheme().resolveAttribute(
- R.attr.actionBarSize, heightValue, true);
- final int height = TypedValue.complexToDimensionPixelSize(heightValue.data,
- mContext.getResources().getDisplayMetrics());
+ actionBarContext.getTheme().resolveAttribute(
+ R.attr.actionBarSize, outValue, true);
+ final int height = TypedValue.complexToDimensionPixelSize(outValue.data,
+ actionBarContext.getResources().getDisplayMetrics());
mActionModeView.setContentHeight(height);
mActionModePopup.setHeight(WRAP_CONTENT);
mShowActionModePopup = new Runnable() {
@@ -2676,8 +2696,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
if (mActionModeView != null) {
mActionModeView.killMode();
- mode = new StandaloneActionMode(getContext(), mActionModeView, wrappedCallback,
- mActionModePopup == null);
+ mode = new StandaloneActionMode(mActionModeView.getContext(), mActionModeView,
+ wrappedCallback, mActionModePopup == null);
if (callback.onCreateActionMode(mode, mode.getMenu())) {
mode.invalidate();
mActionModeView.initForMode(mode);
@@ -2745,14 +2765,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
@Override
- public void onSystemUiVisibilityChange(int visible) {
- mLastSystemUiVisibility = visible;
- updateColorViews(null /* insets */);
- }
-
- @Override
public void onWindowSystemUiVisibilityChanged(int visible) {
- mLastWindowSystemUiVisibility = visible;
updateColorViews(null /* insets */);
}
@@ -2774,6 +2787,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
private WindowInsets updateColorViews(WindowInsets insets) {
+ WindowManager.LayoutParams attrs = getAttributes();
+ int sysUiVisibility = attrs.systemUiVisibility | getWindowSystemUiVisibility();
+
if (!mIsFloating && ActivityManager.isHighEndGfx()) {
if (insets != null) {
mLastTopInset = Math.min(insets.getStableInsetTop(),
@@ -2783,13 +2799,13 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
mLastRightInset = Math.min(insets.getStableInsetRight(),
insets.getSystemWindowInsetRight());
}
- mStatusColorView = updateColorViewInt(mStatusColorView,
+ mStatusColorView = updateColorViewInt(mStatusColorView, sysUiVisibility,
SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS,
mStatusBarColor, mLastTopInset, Gravity.TOP,
STATUS_BAR_BACKGROUND_TRANSITION_NAME,
com.android.internal.R.id.statusBarBackground,
(getAttributes().flags & FLAG_FULLSCREEN) != 0);
- mNavigationColorView = updateColorViewInt(mNavigationColorView,
+ mNavigationColorView = updateColorViewInt(mNavigationColorView, sysUiVisibility,
SYSTEM_UI_FLAG_HIDE_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION,
mNavigationBarColor, mLastBottomInset, Gravity.BOTTOM,
NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME,
@@ -2797,9 +2813,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
false /* hiddenByWindowFlag */);
}
- WindowManager.LayoutParams attrs = getAttributes();
- int sysUiVisibility = attrs.systemUiVisibility | mLastWindowSystemUiVisibility;
-
// When we expand the window with FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, we still need
// to ensure that the rest of the view hierarchy doesn't notice it, unless they've
// explicitly asked for it.
@@ -2807,7 +2820,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
boolean consumingNavBar =
(attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0
&& (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0
- && (mLastSystemUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
+ && (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
int consumedRight = consumingNavBar ? mLastRightInset : 0;
int consumedBottom = consumingNavBar ? mLastBottomInset : 0;
@@ -2841,10 +2854,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
return insets;
}
- private View updateColorViewInt(View view, int systemUiHideFlag, int translucentFlag,
- int color, int height, int verticalGravity, String transitionName, int id,
- boolean hiddenByWindowFlag) {
- boolean show = height > 0 && (mLastSystemUiVisibility & systemUiHideFlag) == 0
+ private View updateColorViewInt(View view, int sysUiVis, int systemUiHideFlag,
+ int translucentFlag, int color, int height, int verticalGravity,
+ String transitionName, int id, boolean hiddenByWindowFlag) {
+ boolean show = height > 0 && (sysUiVis & systemUiHideFlag) == 0
&& !hiddenByWindowFlag
&& (getAttributes().flags & translucentFlag) == 0
&& (color & Color.BLACK) != 0
@@ -2881,32 +2894,35 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
if (mActionModeView.getLayoutParams() instanceof MarginLayoutParams) {
MarginLayoutParams mlp = (MarginLayoutParams) mActionModeView.getLayoutParams();
boolean mlpChanged = false;
- final boolean nonOverlayShown =
- (getLocalFeatures() & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0
- && mActionModeView.isShown();
- if (nonOverlayShown) {
- // set top margin to top insets, show status guard
+ if (mActionModeView.isShown()) {
+ final boolean nonOverlay = (getLocalFeatures()
+ & (1 << FEATURE_ACTION_MODE_OVERLAY)) == 0;
if (mlp.topMargin != insets.getSystemWindowInsetTop()) {
mlpChanged = true;
mlp.topMargin = insets.getSystemWindowInsetTop();
- if (mStatusGuard == null) {
- mStatusGuard = new View(mContext);
- mStatusGuard.setBackgroundColor(mContext.getResources()
- .getColor(R.color.input_method_navigation_guard));
- addView(mStatusGuard, indexOfChild(mStatusColorView),
- new LayoutParams(LayoutParams.MATCH_PARENT, mlp.topMargin,
- Gravity.START | Gravity.TOP));
- } else {
- LayoutParams lp = (LayoutParams) mStatusGuard.getLayoutParams();
- if (lp.height != mlp.topMargin) {
- lp.height = mlp.topMargin;
- mStatusGuard.setLayoutParams(lp);
+
+ // Only show status guard for non-overlay modes.
+ if (nonOverlay) {
+ if (mStatusGuard == null) {
+ mStatusGuard = new View(mContext);
+ mStatusGuard.setBackgroundColor(mContext.getResources()
+ .getColor(R.color.input_method_navigation_guard));
+ addView(mStatusGuard, indexOfChild(mStatusColorView),
+ new LayoutParams(LayoutParams.MATCH_PARENT,
+ mlp.topMargin,
+ Gravity.START | Gravity.TOP));
+ } else {
+ LayoutParams lp = (LayoutParams) mStatusGuard.getLayoutParams();
+ if (lp.height != mlp.topMargin) {
+ lp.height = mlp.topMargin;
+ mStatusGuard.setLayoutParams(lp);
+ }
}
}
}
insets = insets.consumeSystemWindowInsets(
- false, true /* top */, false, false);
- showStatusGuard = true;
+ false, nonOverlay /* top */, false, false);
+ showStatusGuard = nonOverlay;
} else {
// reset top margin
if (mlp.topMargin != 0) {
@@ -3320,7 +3336,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
setFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS & ~getForcedWindowFlags());
}
- decor.setOnSystemUiVisibilityChangeListener(decor);
}
if (!mForcedStatusBarColor) {
mStatusBarColor = a.getColor(R.styleable.Window_statusBarColor, 0xFF000000);
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 02adef473cbb..aa49d3747f39 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -351,8 +351,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean mLidControlsSleep;
int mShortPressOnPowerBehavior = -1;
int mLongPressOnPowerBehavior = -1;
- boolean mScreenOnEarly = false;
- boolean mScreenOnFully = false;
+ boolean mAwakeEarly = false;
+ boolean mAwakeFully = false;
boolean mOrientationSensorEnabled = false;
int mCurrentAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
boolean mHasSoftInput = false;
@@ -548,6 +548,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_DISPATCH_SHOW_GLOBAL_ACTIONS = 10;
private static final int MSG_HIDE_BOOT_MESSAGE = 11;
private static final int MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK = 12;
+ private static final int MSG_SCREEN_TURNING_ON = 13;
private class PolicyHandler extends Handler {
@Override
@@ -573,22 +574,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
break;
case MSG_KEYGUARD_DRAWN_COMPLETE:
if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mKeyguardDrawComplete");
- mKeyguardDrawComplete = true;
- finishScreenTurningOn();
+ finishKeyguardDrawn();
break;
case MSG_KEYGUARD_DRAWN_TIMEOUT:
Slog.w(TAG, "Keyguard drawn timeout. Setting mKeyguardDrawComplete");
- mKeyguardDrawComplete = true;
- finishScreenTurningOn();
+ finishKeyguardDrawn();
break;
case MSG_WINDOW_MANAGER_DRAWN_COMPLETE:
if (DEBUG_WAKEUP) Slog.w(TAG, "Setting mWindowManagerDrawComplete");
- mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- mWindowManagerDrawComplete = true;
- finishScreenTurningOn();
+ finishWindowsDrawn();
break;
case MSG_WAKING_UP:
- handleWakingUp((ScreenOnListener) msg.obj);
+ handleWakingUp();
break;
case MSG_HIDE_BOOT_MESSAGE:
handleHideBootMessage();
@@ -596,6 +593,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case MSG_LAUNCH_VOICE_ASSIST_WITH_WAKE_LOCK:
launchVoiceAssistWithWakeLock(msg.arg1 != 0);
break;
+ case MSG_SCREEN_TURNING_ON:
+ handleScreenTurningOn((ScreenOnListener)msg.obj);
+ break;
}
}
}
@@ -766,11 +766,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
//Could have been invoked due to screen turning on or off or
//change of the currently visible window's orientation
- if (localLOGV) Slog.v(TAG, "Screen status="+mScreenOnEarly+
+ if (localLOGV) Slog.v(TAG, "Screen status="+mAwakeEarly+
", current orientation="+mCurrentAppOrientation+
", SensorEnabled="+mOrientationSensorEnabled);
boolean disable = true;
- if (mScreenOnEarly) {
+ if (mAwakeEarly) {
if (needSensorRunningLp()) {
disable = false;
//enable listener if not already enabled
@@ -1332,7 +1332,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
private boolean shouldEnableWakeGestureLp() {
- return mWakeGestureEnabledSetting && !mScreenOnEarly
+ return mWakeGestureEnabledSetting && !mAwakeEarly
&& (!mLidControlsSleep || mLidState != LID_CLOSED)
&& mWakeGestureListener.isSupported();
}
@@ -1827,6 +1827,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
params.packageName = packageName;
params.windowAnimations = win.getWindowStyle().getResourceId(
com.android.internal.R.styleable.Window_windowAnimationStyle, 0);
+ params.privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
params.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
if (!compatInfo.supportsScreen()) {
@@ -4729,9 +4731,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
@Override
public void goingToSleep(int why) {
EventLog.writeEvent(70000, 0);
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Going to sleep...");
synchronized (mLock) {
- mScreenOnEarly = false;
- mScreenOnFully = false;
+ mAwakeEarly = false;
+ mAwakeFully = false;
}
if (mKeyguardDelegate != null) {
mKeyguardDelegate.onScreenTurnedOff(why);
@@ -4744,70 +4747,101 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
- public void wakingUp(final ScreenOnListener screenOnListener) {
+ public void wakingUp() {
EventLog.writeEvent(70000, 1);
- if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...",
- new RuntimeException("here").fillInStackTrace());
- mHandler.obtainMessage(MSG_WAKING_UP, screenOnListener).sendToTarget();
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Waking up...");
+ mHandler.obtainMessage(MSG_WAKING_UP).sendToTarget();
}
// Called on the mHandler thread.
- private void handleWakingUp(final ScreenOnListener screenOnListener) {
- if (screenOnListener != null) {
- mScreenOnListener = screenOnListener;
- }
-
+ private void handleWakingUp() {
synchronized (mLock) {
- mScreenOnEarly = true;
+ mAwakeEarly = true;
updateWakeGestureListenerLp();
updateOrientationListenerLp();
updateLockScreenTimeout();
}
mKeyguardDrawComplete = false;
- mWindowManagerDrawComplete = false;
+ mWindowManagerDrawComplete = false; // wait for later call to screenTurningOn
if (mKeyguardDelegate != null) {
mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
mKeyguardDelegate.onScreenTurnedOn(mKeyguardDelegateCallback);
+ // ... eventually calls finishKeyguardDrawn
} else {
if (DEBUG_WAKEUP) Slog.d(TAG, "null mKeyguardDelegate: setting mKeyguardDrawComplete.");
+ finishKeyguardDrawn();
+ }
+ }
+
+ // Called on the mHandler thread.
+ private void finishKeyguardDrawn() {
+ if (!mKeyguardDrawComplete) {
mKeyguardDrawComplete = true;
+ mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
+ finishScreenTurningOn();
}
+ }
+
+ @Override
+ public void screenTurningOn(final ScreenOnListener screenOnListener) {
+ EventLog.writeEvent(70000, 1);
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");
+ mHandler.obtainMessage(MSG_SCREEN_TURNING_ON, screenOnListener).sendToTarget();
+ }
+
+ // Called on the mHandler thread.
+ private void handleScreenTurningOn(ScreenOnListener screenOnListener) {
+ mScreenOnListener = screenOnListener;
+
+ mWindowManagerDrawComplete = false;
mWindowManagerInternal.waitForAllWindowsDrawn(mWindowManagerDrawCallback,
WAITING_FOR_DRAWN_TIMEOUT);
+ // ... eventually calls finishWindowsDrawn
+ }
+
+ // Called on the mHandler thread.
+ private void finishWindowsDrawn() {
+ if (!mWindowManagerDrawComplete) {
+ mWindowManagerDrawComplete = true;
+ finishScreenTurningOn();
+ }
}
// Called on the mHandler thread.
private void finishScreenTurningOn() {
if (DEBUG_WAKEUP) Slog.d(TAG,
- "finishScreenTurningOn: mKeyguardDrawComplete=" + mKeyguardDrawComplete
+ "finishScreenTurningOn: mAwakeEarly=" + mAwakeEarly
+ + " mKeyguardDrawComplete=" + mKeyguardDrawComplete
+ " mWindowManagerDrawComplete=" + mWindowManagerDrawComplete);
- if (!mKeyguardDrawComplete || !mWindowManagerDrawComplete) {
- return;
- }
-
- ScreenOnListener screenOnListener;
+ boolean awake;
synchronized (mLock) {
- mScreenOnFully = true;
- screenOnListener = mScreenOnListener;
- mScreenOnListener = null;
- }
+ if ((mAwakeEarly && !mKeyguardDrawComplete)
+ || !mWindowManagerDrawComplete) {
+ return;
+ }
- try {
- mWindowManager.setEventDispatching(true);
- } catch (RemoteException unhandled) {
+ if (mAwakeEarly) {
+ mAwakeFully = true;
+ }
+ awake = mAwakeFully;
}
- if (screenOnListener != null) {
- screenOnListener.onScreenOn();
+ if (DEBUG_WAKEUP) Slog.i(TAG, "Finished screen turning on...");
+
+ if (mScreenOnListener != null) {
+ mScreenOnListener.onScreenOn();
+ mScreenOnListener = null;
}
- setKeyguardDrawn();
+ if (awake) {
+ setKeyguardDrawnFirstTime();
- if (mBootMessageNeedsHiding) {
- handleHideBootMessage();
- mBootMessageNeedsHiding = false;
+ if (mBootMessageNeedsHiding) {
+ handleHideBootMessage();
+ mBootMessageNeedsHiding = false;
+ }
}
}
@@ -4827,13 +4861,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
- public boolean isScreenOnEarly() {
- return mScreenOnEarly;
- }
-
- @Override
- public boolean isScreenOnFully() {
- return mScreenOnFully;
+ public boolean isAwake() {
+ return mAwakeFully;
}
/** {@inheritDoc} */
@@ -4907,7 +4936,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
- private void setKeyguardDrawn() {
+ private void setKeyguardDrawnFirstTime() {
synchronized (mLock) {
mKeyguardDrawn = true;
}
@@ -5220,7 +5249,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
synchronized (mLock) {
mSystemBooted = true;
}
- wakingUp(null);
+ wakingUp();
+ screenTurningOn(null);
}
ProgressDialog mBootMsgDialog = null;
@@ -5350,7 +5380,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private void updateLockScreenTimeout() {
synchronized (mScreenLockTimeout) {
- boolean enable = (mAllowLockscreenWhenOn && mScreenOnEarly &&
+ boolean enable = (mAllowLockscreenWhenOn && mAwakeEarly &&
mKeyguardDelegate != null && mKeyguardDelegate.isSecure());
if (mLockScreenTimerActive != enable) {
if (enable) {
@@ -5888,8 +5918,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print("mShortPressOnPowerBehavior="); pw.print(mShortPressOnPowerBehavior);
pw.print(" mLongPressOnPowerBehavior="); pw.println(mLongPressOnPowerBehavior);
pw.print(prefix); pw.print("mHasSoftInput="); pw.println(mHasSoftInput);
- pw.print(prefix); pw.print("mScreenOnEarly="); pw.print(mScreenOnEarly);
- pw.print(" mScreenOnFully="); pw.print(mScreenOnFully);
+ pw.print(prefix); pw.print("mAwakeEarly="); pw.print(mAwakeEarly);
+ pw.print(" mAwakeFully="); pw.print(mAwakeFully);
pw.print(" mOrientationSensorEnabled="); pw.println(mOrientationSensorEnabled);
pw.print(prefix); pw.print("mOverscanScreen=("); pw.print(mOverscanScreenLeft);
pw.print(","); pw.print(mOverscanScreenTop);
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
index aac02add704e..e9ca5c97ad6c 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
@@ -295,6 +295,7 @@ public class KeyguardServiceDelegate {
stretch, stretch, type, flags, PixelFormat.TRANSLUCENT);
lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_FAKE_HARDWARE_ACCELERATED;
lp.setTitle("KeyguardScrim");
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.addView(view, lp);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index ebe21ff58da5..ac78630af171 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -758,29 +758,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
.getAccessibilityFocusClickPointInScreenNotLocked(outPoint);
}
- /**
- * Gets the bounds of the active window.
- *
- * @param outBounds The output to which to write the bounds.
- */
- boolean getActiveWindowBounds(Rect outBounds) {
- // TODO: This should be refactored to work with accessibility
- // focus in multiple windows.
- IBinder token;
- synchronized (mLock) {
- final int windowId = mSecurityPolicy.mActiveWindowId;
- token = mGlobalWindowTokens.get(windowId);
- if (token == null) {
- token = getCurrentUserStateLocked().mWindowTokens.get(windowId);
- }
- }
- mWindowManagerService.getWindowFrame(token, outBounds);
- if (!outBounds.isEmpty()) {
- return true;
- }
- return false;
- }
-
int getActiveWindowId() {
return mSecurityPolicy.mActiveWindowId;
}
@@ -3196,13 +3173,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
point.y = (int) (point.y * (1 / spec.scale));
}
- // Make sure the point is within the window.
- Rect windowBounds = mTempRect;
- getActiveWindowBounds(windowBounds);
- if (!windowBounds.contains(point.x, point.y)) {
- return false;
- }
-
// Make sure the point is within the screen.
Point screenSize = mTempPoint;
mDefaultDisplay.getRealSize(screenSize);
@@ -3277,7 +3247,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
// But we still have not gotten the window state from the
// window manager, so delay the notification until then.
AccessibilityWindowInfo window = findWindowById(event.getWindowId());
- if (window == null || !window.isFocused()) {
+ if (window == null) {
mShowingFocusedWindowEvent = AccessibilityEvent.obtain(event);
return false;
}
@@ -3377,7 +3347,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
if (mShowingFocusedWindowEvent != null) {
final int windowId = mShowingFocusedWindowEvent.getWindowId();
AccessibilityWindowInfo window = findWindowById(windowId);
- if (window != null && window.isFocused()) {
+ if (window != null) {
// Sending does the recycle.
sendAccessibilityEvent(mShowingFocusedWindowEvent, mCurrentUserId);
}
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index 9e63433fd1f4..94befad3670d 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -205,9 +205,6 @@ class TouchExplorer implements EventStreamTransformation {
// The long pressing pointer Y if coordinate remapping is needed.
private int mLongPressingPointerDeltaY;
- // The id of the last touch explored window.
- private int mLastTouchedWindowId;
-
// Whether touch exploration is in progress.
private boolean mTouchExplorationInProgress;
@@ -368,11 +365,6 @@ class TouchExplorer implements EventStreamTransformation {
mInjectedPointerTracker.mLastInjectedHoverEventForClick.recycle();
mInjectedPointerTracker.mLastInjectedHoverEventForClick = null;
}
- mLastTouchedWindowId = -1;
- } break;
- case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:
- case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: {
- mLastTouchedWindowId = event.getWindowId();
} break;
}
if (mNext != null) {
@@ -1151,42 +1143,12 @@ class TouchExplorer implements EventStreamTransformation {
mSendTouchInteractionEndDelayed.forceSendAndRemove();
}
- int clickLocationX;
- int clickLocationY;
-
final int pointerId = secondTapUp.getPointerId(secondTapUp.getActionIndex());
final int pointerIndex = secondTapUp.findPointerIndex(pointerId);
- MotionEvent lastExploreEvent =
- mInjectedPointerTracker.getLastInjectedHoverEventForClick();
- if (lastExploreEvent == null) {
- // No last touch explored event but there is accessibility focus in
- // the active window. We click in the focus bounds.
- Point point = mTempPoint;
- if (mAms.getAccessibilityFocusClickPointInScreen(point)) {
- clickLocationX = point.x;
- clickLocationY = point.y;
- } else {
- // Out of luck - do nothing.
- return;
- }
- } else {
- // If the click is within the active window but not within the
- // accessibility focus bounds we click in the focus bounds.
- final int lastExplorePointerIndex = lastExploreEvent.getActionIndex();
- clickLocationX = (int) lastExploreEvent.getX(lastExplorePointerIndex);
- clickLocationY = (int) lastExploreEvent.getY(lastExplorePointerIndex);
- Rect activeWindowBounds = mTempRect;
- if (mLastTouchedWindowId == mAms.getActiveWindowId()) {
- mAms.getActiveWindowBounds(activeWindowBounds);
- if (activeWindowBounds.contains(clickLocationX, clickLocationY)) {
- Point point = mTempPoint;
- if (mAms.getAccessibilityFocusClickPointInScreen(point)) {
- clickLocationX = point.x;
- clickLocationY = point.y;
- }
- }
- }
+ Point clickLocation = mTempPoint;
+ if (!computeClickLocation(clickLocation)) {
+ return;
}
// Do the click.
@@ -1195,8 +1157,8 @@ class TouchExplorer implements EventStreamTransformation {
secondTapUp.getPointerProperties(pointerIndex, properties[0]);
PointerCoords[] coords = new PointerCoords[1];
coords[0] = new PointerCoords();
- coords[0].x = clickLocationX;
- coords[0].y = clickLocationY;
+ coords[0].x = clickLocation.x;
+ coords[0].y = clickLocation.y;
MotionEvent event = MotionEvent.obtain(secondTapUp.getDownTime(),
secondTapUp.getEventTime(), MotionEvent.ACTION_DOWN, 1, properties,
coords, 0, 0, 1.0f, 1.0f, secondTapUp.getDeviceId(), 0,
@@ -1322,47 +1284,18 @@ class TouchExplorer implements EventStreamTransformation {
return;
}
- int clickLocationX;
- int clickLocationY;
-
final int pointerId = mEvent.getPointerId(mEvent.getActionIndex());
final int pointerIndex = mEvent.findPointerIndex(pointerId);
- MotionEvent lastExploreEvent =
- mInjectedPointerTracker.getLastInjectedHoverEventForClick();
- if (lastExploreEvent == null) {
- // No last touch explored event but there is accessibility focus in
- // the active window. We click in the focus bounds.
- Point point = mTempPoint;
- if (mAms.getAccessibilityFocusClickPointInScreen(point)) {
- clickLocationX = point.x;
- clickLocationY = point.y;
- } else {
- // Out of luck - do nothing.
- return;
- }
- } else {
- // If the click is within the active window but not within the
- // accessibility focus bounds we click in the focus bounds.
- final int lastExplorePointerIndex = lastExploreEvent.getActionIndex();
- clickLocationX = (int) lastExploreEvent.getX(lastExplorePointerIndex);
- clickLocationY = (int) lastExploreEvent.getY(lastExplorePointerIndex);
- Rect activeWindowBounds = mTempRect;
- if (mLastTouchedWindowId == mAms.getActiveWindowId()) {
- mAms.getActiveWindowBounds(activeWindowBounds);
- if (activeWindowBounds.contains(clickLocationX, clickLocationY)) {
- Point point = mTempPoint;
- if (mAms.getAccessibilityFocusClickPointInScreen(point)) {
- clickLocationX = point.x;
- clickLocationY = point.y;
- }
- }
- }
+
+ Point clickLocation = mTempPoint;
+ if (!computeClickLocation(clickLocation)) {
+ return;
}
mLongPressingPointerId = pointerId;
- mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocationX;
- mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocationY;
+ mLongPressingPointerDeltaX = (int) mEvent.getX(pointerIndex) - clickLocation.x;
+ mLongPressingPointerDeltaY = (int) mEvent.getY(pointerIndex) - clickLocation.y;
sendHoverExitAndTouchExplorationGestureEndIfNeeded(mPolicyFlags);
@@ -1378,6 +1311,27 @@ class TouchExplorer implements EventStreamTransformation {
}
}
+ private boolean computeClickLocation(Point outPoint) {
+ // Try to click on the accessiblity focused view and if that
+ // fails try the last touch explored location, if such.
+ Point point = mTempPoint;
+ if (mAms.getAccessibilityFocusClickPointInScreen(point)) {
+ outPoint.x = point.x;
+ outPoint.y = point.y;
+ return true;
+ } else {
+ MotionEvent lastExploreEvent =
+ mInjectedPointerTracker.getLastInjectedHoverEventForClick();
+ if (lastExploreEvent != null) {
+ final int lastExplorePointerIndex = lastExploreEvent.getActionIndex();
+ outPoint.x = (int) lastExploreEvent.getX(lastExplorePointerIndex);
+ outPoint.y = (int) lastExploreEvent.getY(lastExplorePointerIndex);
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Class for delayed sending of hover enter and move events.
*/
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index d05de697d40f..86cfdb98b715 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -434,6 +434,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
}
+ clearProvidersAndHostsTagsLocked();
+
loadGroupWidgetProvidersLocked(newProfileIds);
loadGroupStateLocked(newProfileIds);
}
@@ -2372,6 +2374,20 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
}
}
+ private void clearProvidersAndHostsTagsLocked() {
+ final int providerCount = mProviders.size();
+ for (int i = 0; i < providerCount; i++) {
+ Provider provider = mProviders.get(i);
+ provider.tag = TAG_UNDEFINED;
+ }
+
+ final int hostCount = mHosts.size();
+ for (int i = 0; i < hostCount; i++) {
+ Host host = mHosts.get(i);
+ host.tag = TAG_UNDEFINED;
+ }
+ }
+
private boolean writeProfileStateToFileLocked(FileOutputStream stream, int userId) {
int N;
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 77163855581d..47396bda1be1 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -1537,7 +1537,9 @@ class AlarmManagerService extends SystemService {
for (int i=0; i<triggerList.size(); i++) {
Alarm alarm = triggerList.get(i);
try {
- Slog.v(TAG, "sending alarm " + alarm);
+ if (localLOGV) {
+ Slog.v(TAG, "sending alarm " + alarm);
+ }
alarm.operation.send(getContext(), 0,
mBackgroundIntent.putExtra(
Intent.EXTRA_ALARM_COUNT, alarm.count),
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index dfec307ab075..967681b20d8a 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1357,13 +1357,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
"ConnectivityService");
}
- // TODO Make this a special check when it goes public
- private void enforceTetherChangePermission() {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.CHANGE_NETWORK_STATE,
- "ConnectivityService");
- }
-
private void enforceTetherAccessPermission() {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_NETWORK_STATE,
@@ -2389,8 +2382,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// javadoc from interface
public int tether(String iface) {
- enforceTetherChangePermission();
-
+ ConnectivityManager.enforceTetherChangePermission(mContext);
if (isTetheringSupported()) {
return mTethering.tether(iface);
} else {
@@ -2400,7 +2392,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// javadoc from interface
public int untether(String iface) {
- enforceTetherChangePermission();
+ ConnectivityManager.enforceTetherChangePermission(mContext);
if (isTetheringSupported()) {
return mTethering.untether(iface);
@@ -2449,7 +2441,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
public int setUsbTethering(boolean enable) {
- enforceTetherChangePermission();
+ ConnectivityManager.enforceTetherChangePermission(mContext);
if (isTetheringSupported()) {
return mTethering.setUsbTethering(enable);
} else {
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 060c8e30212f..1623eac6ac9e 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -40,6 +40,7 @@ import org.xmlpull.v1.XmlSerializer;
import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.AlertDialog;
+import android.app.AppOpsManager;
import android.app.IUserSwitchObserver;
import android.app.KeyguardManager;
import android.app.Notification;
@@ -175,6 +176,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
private InputMethodFileManager mFileManager;
private final HardKeyboardListener mHardKeyboardListener;
private final WindowManagerService mWindowManagerService;
+ private final AppOpsManager mAppOpsManager;
final InputBindResult mNoBinding = new InputBindResult(null, null, null, -1, -1);
@@ -643,6 +645,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
}, true /*asyncHandler*/);
mWindowManagerService = windowManager;
+ mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mHardKeyboardListener = new HardKeyboardListener();
mHasFeature = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_INPUT_METHODS);
@@ -1746,6 +1749,20 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
throw new IllegalArgumentException("Unknown id: " + id);
}
+ if (mCurClient != null && mCurAttribute != null) {
+ final int uid = mCurClient.uid;
+ final String packageName = mCurAttribute.packageName;
+ if (SystemConfig.getInstance().getFixedImeApps().contains(packageName)) {
+ if (InputMethodUtils.checkIfPackageBelongsToUid(mAppOpsManager, uid, packageName)) {
+ return;
+ }
+ // TODO: Do we need to lock the input method when the application reported an
+ // incorrect package name?
+ Slog.e(TAG, "Ignoring FixedImeApps due to the validation failure. uid=" + uid
+ + " package=" + packageName);
+ }
+ }
+
// See if we need to notify a subtype change within the same IME.
if (id.equals(mCurMethodId)) {
final int subtypeCount = info.getSubtypeCount();
diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java
index fdcb3b9029e5..cf2a49f922e2 100644
--- a/services/core/java/com/android/server/SystemConfig.java
+++ b/services/core/java/com/android/server/SystemConfig.java
@@ -50,19 +50,16 @@ public class SystemConfig {
// These are the built-in uid -> permission mappings that were read from the
// system configuration files.
- final SparseArray<HashSet<String>> mSystemPermissions =
- new SparseArray<HashSet<String>>();
+ final SparseArray<HashSet<String>> mSystemPermissions = new SparseArray<>();
// These are the built-in shared libraries that were read from the
// system configuration files. Keys are the library names; strings are the
// paths to the libraries.
- final ArrayMap<String, String> mSharedLibraries
- = new ArrayMap<String, String>();
+ final ArrayMap<String, String> mSharedLibraries = new ArrayMap<>();
// These are the features this devices supports that were read from the
// system configuration files.
- final HashMap<String, FeatureInfo> mAvailableFeatures =
- new HashMap<String, FeatureInfo>();
+ final HashMap<String, FeatureInfo> mAvailableFeatures = new HashMap<>();
public static final class PermissionEntry {
public final String name;
@@ -75,12 +72,14 @@ public class SystemConfig {
// These are the permission -> gid mappings that were read from the
// system configuration files.
- final ArrayMap<String, PermissionEntry> mPermissions =
- new ArrayMap<String, PermissionEntry>();
+ final ArrayMap<String, PermissionEntry> mPermissions = new ArrayMap<>();
// These are the packages that are white-listed to be able to run in the
// background while in power save mode, as read from the configuration files.
- final ArraySet<String> mAllowInPowerSave = new ArraySet<String>();
+ final ArraySet<String> mAllowInPowerSave = new ArraySet<>();
+
+ // These are the app package names that should not allow IME switching.
+ final ArraySet<String> mFixedImeApps = new ArraySet<>();
public static SystemConfig getInstance() {
synchronized (SystemConfig.class) {
@@ -115,6 +114,10 @@ public class SystemConfig {
return mAllowInPowerSave;
}
+ public ArraySet<String> getFixedImeApps() {
+ return mFixedImeApps;
+ }
+
SystemConfig() {
// Read configuration from system
readPermissions(Environment.buildPath(
@@ -298,6 +301,17 @@ public class SystemConfig {
XmlUtils.skipCurrentTag(parser);
continue;
+ } else if ("fixed-ime-app".equals(name)) {
+ String pkgname = parser.getAttributeValue(null, "package");
+ if (pkgname == null) {
+ Slog.w(TAG, "<fixed-ime-app> without package at "
+ + parser.getPositionDescription());
+ } else {
+ mFixedImeApps.add(pkgname);
+ }
+ XmlUtils.skipCurrentTag(parser);
+ continue;
+
} else {
XmlUtils.skipCurrentTag(parser);
continue;
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index d38074fb7496..34d7cb37cb61 100755
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -24,6 +24,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import android.os.Build;
import android.os.DeadObjectException;
import android.os.Handler;
import android.os.Looper;
@@ -590,6 +591,8 @@ public final class ActiveServices {
r.cancelNotification();
r.foregroundId = 0;
r.foregroundNoti = null;
+ } else if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.L) {
+ r.stripForegroundServiceFlagFromNotification();
}
}
}
@@ -2116,7 +2119,8 @@ public final class ActiveServices {
boolean hasCreate = false;
for (int conni=abind.connections.size()-1; conni>=0; conni--) {
ConnectionRecord conn = abind.connections.valueAt(conni);
- if ((conn.flags&Context.BIND_AUTO_CREATE) != 0) {
+ if ((conn.flags&(Context.BIND_AUTO_CREATE|Context.BIND_ALLOW_OOM_MANAGEMENT
+ |Context.BIND_WAIVE_PRIORITY)) == Context.BIND_AUTO_CREATE) {
hasCreate = true;
break;
}
@@ -2347,7 +2351,7 @@ public final class ActiveServices {
void serviceTimeout(ProcessRecord proc) {
String anrMessage = null;
- synchronized(this) {
+ synchronized(mAm) {
if (proc.executingServices.size() == 0 || proc.thread == null) {
return;
}
@@ -2643,7 +2647,7 @@ public final class ActiveServices {
int opti, boolean dumpAll) {
ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>();
- synchronized (this) {
+ synchronized (mAm) {
int[] users = mAm.getUsersLocked();
if ("all".equals(name)) {
for (int user : users) {
@@ -2717,7 +2721,7 @@ public final class ActiveServices {
private void dumpService(String prefix, FileDescriptor fd, PrintWriter pw,
final ServiceRecord r, String[] args, boolean dumpAll) {
String innerPrefix = prefix + " ";
- synchronized (this) {
+ synchronized (mAm) {
pw.print(prefix); pw.print("SERVICE ");
pw.print(r.shortName); pw.print(" ");
pw.print(Integer.toHexString(System.identityHashCode(r)));
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 6d8e10574fe5..04e18171eb3f 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -937,13 +937,6 @@ public final class ActivityManagerService extends ActivityManagerNative
private boolean mRunningVoice = false;
/**
- * Set while the keyguard is waiting for an activity to draw.
- * In this state, if we are sleeping, we allow Activities to launch
- * so that they can draw before Keyguard dismisses itself.
- */
- private boolean mKeyguardWaitingForDraw = false;
-
- /**
* State of external calls telling us if the device is asleep.
*/
private boolean mWentToSleep = false;
@@ -2623,6 +2616,11 @@ public final class ActivityManagerService extends ActivityManagerNative
final void removeLruProcessLocked(ProcessRecord app) {
int lrui = mLruProcesses.lastIndexOf(app);
if (lrui >= 0) {
+ if (!app.killed) {
+ Slog.wtf(TAG, "Removing process that hasn't been killed: " + app);
+ Process.killProcessQuiet(app.pid);
+ Process.killProcessGroup(app.info.uid, app.pid);
+ }
if (lrui <= mLruProcessActivityStart) {
mLruProcessActivityStart--;
}
@@ -3206,6 +3204,7 @@ public final class ActivityManagerService extends ActivityManagerNative
app.setPid(startResult.pid);
app.usingWrapper = startResult.usingWrapper;
app.removed = false;
+ app.killed = false;
app.killedByAm = false;
checkTime(startTime, "startProcess: starting to update pids map");
synchronized (mPidsSelfLocked) {
@@ -4804,15 +4803,16 @@ public final class ActivityManagerService extends ActivityManagerNative
appDiedLocked(app, app.pid, app.thread);
}
- final void appDiedLocked(ProcessRecord app, int pid,
- IApplicationThread thread) {
+ final void appDiedLocked(ProcessRecord app, int pid, IApplicationThread thread) {
BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
synchronized (stats) {
stats.noteProcessDiedLocked(app.info.uid, pid);
}
+ Process.killProcessQuiet(pid);
Process.killProcessGroup(app.info.uid, pid);
+ app.killed = true;
// Clean up already done if the process has been re-started.
if (app.pid == pid && app.thread != null &&
@@ -6249,7 +6249,10 @@ public final class ActivityManagerService extends ActivityManagerNative
synchronized (this) {
if (DEBUG_LOCKSCREEN) logLockScreen("");
mWindowManager.keyguardWaitingForActivityDrawn();
- mKeyguardWaitingForDraw = true;
+ if (mLockScreenShown) {
+ mLockScreenShown = false;
+ comeOutOfSleepIfNeededLocked();
+ }
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -7528,8 +7531,8 @@ public final class ActivityManagerService extends ActivityManagerNative
// Does the caller have this permission on the URI?
if (!checkHoldingPermissionsLocked(pm, pi, grantUri, callingUid, modeFlags)) {
- // Have they don't have direct access to the URI, then revoke any URI
- // permissions that have been granted to them.
+ // If they don't have direct access to the URI, then revoke any
+ // ownerless URI permissions that have been granted to them.
final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.get(callingUid);
if (perms != null) {
boolean persistChanged = false;
@@ -7538,10 +7541,10 @@ public final class ActivityManagerService extends ActivityManagerNative
if (perm.uri.sourceUserId == grantUri.sourceUserId
&& perm.uri.uri.isPathPrefixMatch(grantUri.uri)) {
if (DEBUG_URI_PERMISSION)
- Slog.v(TAG,
- "Revoking " + perm.targetUid + " permission to " + perm.uri);
+ Slog.v(TAG, "Revoking non-owned " + perm.targetUid +
+ " permission to " + perm.uri);
persistChanged |= perm.revokeModes(
- modeFlags | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+ modeFlags | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, false);
if (perm.modeFlags == 0) {
it.remove();
}
@@ -7573,7 +7576,7 @@ public final class ActivityManagerService extends ActivityManagerNative
Slog.v(TAG,
"Revoking " + perm.targetUid + " permission to " + perm.uri);
persistChanged |= perm.revokeModes(
- modeFlags | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+ modeFlags | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
if (perm.modeFlags == 0) {
it.remove();
}
@@ -7661,8 +7664,8 @@ public final class ActivityManagerService extends ActivityManagerNative
// Only inspect grants matching package
if (packageName == null || perm.sourcePkg.equals(packageName)
|| perm.targetPkg.equals(packageName)) {
- persistChanged |= perm.revokeModes(
- persistable ? ~0 : ~Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
+ persistChanged |= perm.revokeModes(persistable
+ ? ~0 : ~Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true);
// Only remove when no modes remain; any persisted grants
// will keep this alive.
@@ -8375,12 +8378,17 @@ public final class ActivityManagerService extends ActivityManagerNative
synchronized (this) {
ActivityRecord r = ActivityRecord.isInStackLocked(token);
if (r != null) {
- r.taskDescription = td;
+ r.setTaskDescription(td);
r.task.updateTaskDescription();
}
}
}
+ @Override
+ public Bitmap getTaskDescriptionIcon(String filename) {
+ return mTaskPersister.getTaskDescriptionIcon(filename);
+ }
+
private void cleanUpRemovedTaskLocked(TaskRecord tr, int flags) {
mRecentTasks.remove(tr);
tr.removedFromRecents(mTaskPersister);
@@ -9947,13 +9955,12 @@ public final class ActivityManagerService extends ActivityManagerNative
}
public boolean isSleeping() {
- return mSleeping && !mKeyguardWaitingForDraw;
+ return mSleeping;
}
void goingToSleep() {
synchronized(this) {
mWentToSleep = true;
- updateEventDispatchingLocked();
goToSleepIfNeededLocked();
}
}
@@ -9969,7 +9976,6 @@ public final class ActivityManagerService extends ActivityManagerNative
if (mWentToSleep && !mRunningVoice) {
if (!mSleeping) {
mSleeping = true;
- mKeyguardWaitingForDraw = false;
mStackSupervisor.goingToSleepLocked();
// Initialize the wake times of all processes.
@@ -10051,7 +10057,6 @@ public final class ActivityManagerService extends ActivityManagerNative
void wakingUp() {
synchronized(this) {
mWentToSleep = false;
- updateEventDispatchingLocked();
comeOutOfSleepIfNeededLocked();
}
}
@@ -10079,7 +10084,6 @@ public final class ActivityManagerService extends ActivityManagerNative
try {
if (DEBUG_LOCKSCREEN) logLockScreen(" shown=" + shown);
mLockScreenShown = shown;
- mKeyguardWaitingForDraw = false;
comeOutOfSleepIfNeededLocked();
} finally {
Binder.restoreCallingIdentity(ident);
@@ -12225,6 +12229,7 @@ public final class ActivityManagerService extends ActivityManagerNative
pw.println(" package [PACKAGE_NAME]: all state related to given package");
pw.println(" all: dump all activities");
pw.println(" top: dump the top activity");
+ pw.println(" write: write all pending state to storage");
pw.println(" cmd may also be a COMP_SPEC to dump activities.");
pw.println(" COMP_SPEC may be a component name (com.foo/.myApp),");
pw.println(" a partial substring in a component name, a");
@@ -12359,6 +12364,10 @@ public final class ActivityManagerService extends ActivityManagerNative
synchronized (this) {
mServices.dumpServicesLocked(fd, pw, args, opti, true, dumpClient, null);
}
+ } else if ("write".equals(cmd)) {
+ mTaskPersister.flush();
+ pw.println("All tasks persisted.");
+ return;
} else {
// Dumping a single activity?
if (!dumpActivity(fd, pw, cmd, args, opti, dumpAll)) {
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index e043f03fc51d..2db7cec61139 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -205,14 +205,18 @@ final class ActivityRecord {
pw.print(" resultWho="); pw.print(resultWho);
pw.print(" resultCode="); pw.println(requestCode);
}
- if (taskDescription.getIcon() != null || taskDescription.getLabel() != null ||
+ final String iconFilename = taskDescription.getIconFilename();
+ if (iconFilename != null || taskDescription.getLabel() != null ||
taskDescription.getPrimaryColor() != 0) {
pw.print(prefix); pw.print("taskDescription:");
- pw.print(" icon="); pw.print(taskDescription.getIcon());
+ pw.print(" iconFilename="); pw.print(taskDescription.getIconFilename());
pw.print(" label=\""); pw.print(taskDescription.getLabel()); pw.print("\"");
pw.print(" color=");
pw.println(Integer.toHexString(taskDescription.getPrimaryColor()));
}
+ if (iconFilename == null && taskDescription.getIcon() != null) {
+ pw.print(prefix); pw.println("taskDescription contains Bitmap");
+ }
if (results != null) {
pw.print(prefix); pw.print("results="); pw.println(results);
}
@@ -917,6 +921,7 @@ final class ActivityRecord {
if (displayStartTime != 0) {
reportLaunchTimeLocked(SystemClock.uptimeMillis());
}
+ mStackSupervisor.sendWaitingVisibleReportLocked(this);
startTime = 0;
finishLaunchTickingLocked();
if (task != null) {
@@ -1092,6 +1097,17 @@ final class ActivityRecord {
TaskPersister.IMAGE_EXTENSION;
}
+ void setTaskDescription(TaskDescription _taskDescription) {
+ Bitmap icon;
+ if (_taskDescription.getIconFilename() == null &&
+ (icon = _taskDescription.getIcon()) != null) {
+ final String iconFilename = createImageFilename(createTime, task.taskId);
+ mStackSupervisor.mService.mTaskPersister.saveImage(icon, iconFilename);
+ _taskDescription.setIconFilename(iconFilename);
+ }
+ taskDescription = _taskDescription;
+ }
+
void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException {
out.attribute(null, ATTR_ID, String.valueOf(createTime));
out.attribute(null, ATTR_LAUNCHEDFROMUID, String.valueOf(launchedFromUid));
@@ -1105,8 +1121,7 @@ final class ActivityRecord {
out.attribute(null, ATTR_USERID, String.valueOf(userId));
if (taskDescription != null) {
- task.saveTaskDescription(taskDescription, createImageFilename(createTime, task.taskId),
- out);
+ taskDescription.saveToXml(out);
}
out.startTag(null, TAG_INTENT);
@@ -1150,9 +1165,8 @@ final class ActivityRecord {
componentSpecified = Boolean.valueOf(attrValue);
} else if (ATTR_USERID.equals(attrName)) {
userId = Integer.valueOf(attrValue);
- } else if (TaskRecord.readTaskDescriptionAttribute(taskDescription, attrName,
- attrValue)) {
- // Completed in TaskRecord.readTaskDescriptionAttribute()
+ } else if (attrName.startsWith(TaskDescription.ATTR_TASKDESCRIPTION_PREFIX)) {
+ taskDescription.restoreFromXml(attrName, attrValue);
} else {
Log.d(TAG, "Unknown ActivityRecord attribute=" + attrName);
}
@@ -1196,11 +1210,6 @@ final class ActivityRecord {
null, null, 0, componentSpecified, stackSupervisor, null, null);
r.persistentState = persistentState;
-
- if (createTime >= 0) {
- taskDescription.setIcon(TaskPersister.restoreImage(createImageFilename(createTime,
- taskId)));
- }
r.taskDescription = taskDescription;
r.createTime = createTime;
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index a75fc5a01221..0646cce92c71 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2856,7 +2856,8 @@ final class ActivityStack {
// they need to re-create their task if this current activity is the root
// of a document, unless simply finishing it will return them to the the
// correct app behind.
- if (srec.frontOfTask && srec.task != null) {
+ if (srec.frontOfTask && srec.task != null && srec.task.getBaseIntent() != null
+ && srec.task.getBaseIntent().isDocument()) {
// Okay, this activity is at the root of its task. What to do, what to do...
if (srec.task.getTaskToReturnTo() != ActivityRecord.APPLICATION_ACTIVITY_TYPE) {
// Finishing won't return to an application, so we need to recreate.
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 49404937344c..482a5829d7dd 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -650,31 +650,47 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
void reportActivityVisibleLocked(ActivityRecord r) {
+ sendWaitingVisibleReportLocked(r);
+ notifyActivityDrawnForKeyguard();
+ }
+
+ void sendWaitingVisibleReportLocked(ActivityRecord r) {
+ boolean changed = false;
for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
WaitResult w = mWaitingActivityVisible.get(i);
- w.timeout = false;
- if (r != null) {
- w.who = new ComponentName(r.info.packageName, r.info.name);
+ if (w.who == null) {
+ changed = true;
+ w.timeout = false;
+ if (r != null) {
+ w.who = new ComponentName(r.info.packageName, r.info.name);
+ }
+ w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
+ w.thisTime = w.totalTime;
}
- w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
- w.thisTime = w.totalTime;
}
- mService.notifyAll();
- notifyActivityDrawnForKeyguard();
+ if (changed) {
+ mService.notifyAll();
+ }
}
void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
long thisTime, long totalTime) {
+ boolean changed = false;
for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
WaitResult w = mWaitingActivityLaunched.remove(i);
- w.timeout = timeout;
- if (r != null) {
- w.who = new ComponentName(r.info.packageName, r.info.name);
+ if (w.who == null) {
+ changed = true;
+ w.timeout = timeout;
+ if (r != null) {
+ w.who = new ComponentName(r.info.packageName, r.info.name);
+ }
+ w.thisTime = thisTime;
+ w.totalTime = totalTime;
}
- w.thisTime = thisTime;
- w.totalTime = totalTime;
}
- mService.notifyAll();
+ if (changed) {
+ mService.notifyAll();
+ }
}
ActivityRecord topRunningActivityLocked() {
@@ -936,7 +952,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
} while (!outResult.timeout && outResult.who == null);
} else if (res == ActivityManager.START_TASK_TO_FRONT) {
ActivityRecord r = stack.topRunningActivityLocked(null);
- if (r.nowVisible) {
+ if (r.nowVisible && r.state == ActivityState.RESUMED) {
outResult.timeout = false;
outResult.who = new ComponentName(r.info.packageName, r.info.name);
outResult.totalTime = 0;
@@ -3673,7 +3689,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
}
- private void detachLocked() {
+ protected void detachLocked() {
if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display="
+ mActivityDisplay + " Callers=" + Debug.getCallers(2));
if (mActivityDisplay != null) {
@@ -3797,12 +3813,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
void onTaskListEmptyLocked() {
- mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
- if (!mStack.isHomeStack()) {
- detachLocked();
- deleteActivityContainer(this);
- }
- mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
}
@Override
@@ -3891,6 +3901,13 @@ public final class ActivityStackSupervisor implements DisplayListener {
return false;
}
+ void onTaskListEmptyLocked() {
+ mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
+ detachLocked();
+ deleteActivityContainer(this);
+ mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
+ }
+
private void setSurfaceIfReadyLocked() {
if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
" mContainerState=" + mContainerState + " mSurface=" + mSurface);
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index 0817dd84b375..7c48f3e00fac 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -100,6 +100,7 @@ final class ProcessRecord {
boolean treatLikeActivity; // Bound using BIND_TREAT_LIKE_ACTIVITY
boolean bad; // True if disabled in the bad process list
boolean killedByAm; // True when proc has been killed by activity manager, not for RAM
+ boolean killed; // True once we know the process has been killed
boolean procStateChanged; // Keep track of whether we changed 'setAdj'.
String waitingToKill; // Process is waiting to be killed when in the bg, and reason
IBinder forcingToForeground;// Token that is forcing this process to be foreground
@@ -303,8 +304,9 @@ final class ProcessRecord {
pw.print(" lastLowMemory=");
TimeUtils.formatDuration(lastLowMemory, now, pw);
pw.print(" reportLowMemory="); pw.println(reportLowMemory);
- if (killedByAm || waitingToKill != null) {
- pw.print(prefix); pw.print("killedByAm="); pw.print(killedByAm);
+ if (killed || killedByAm || waitingToKill != null) {
+ pw.print(prefix); pw.print("killed="); pw.print(killed);
+ pw.print(" killedByAm="); pw.print(killedByAm);
pw.print(" waitingToKill="); pw.println(waitingToKill);
}
if (debugging || crashing || crashDialog != null || notResponding
@@ -514,6 +516,7 @@ final class ProcessRecord {
Process.killProcessQuiet(pid);
Process.killProcessGroup(info.uid, pid);
if (!persistent) {
+ killed = true;
killedByAm = true;
}
}
diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java
index 0a66a5c8aab2..d4a378b5687d 100644
--- a/services/core/java/com/android/server/am/ServiceRecord.java
+++ b/services/core/java/com/android/server/am/ServiceRecord.java
@@ -517,6 +517,31 @@ final class ServiceRecord extends Binder {
});
}
}
+
+ public void stripForegroundServiceFlagFromNotification() {
+ if (foregroundId == 0) {
+ return;
+ }
+
+ final int localForegroundId = foregroundId;
+ final int localUserId = userId;
+ final String localPackageName = packageName;
+
+ // Do asynchronous communication with notification manager to
+ // avoid deadlocks.
+ ams.mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ NotificationManagerInternal nmi = LocalServices.getService(
+ NotificationManagerInternal.class);
+ if (nmi == null) {
+ return;
+ }
+ nmi.removeForegroundServiceFlagFromNotification(localPackageName, localForegroundId,
+ localUserId);
+ }
+ });
+ }
public void clearDeliveredStartsLocked() {
for (int i=deliveredStarts.size()-1; i>=0; i--) {
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index df1772a56550..afc781fd32ee 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -187,6 +187,19 @@ public class TaskPersister {
yieldIfQueueTooDeep();
}
+ void flush() {
+ synchronized (this) {
+ mNextWriteTime = FLUSH_QUEUE;
+ notifyAll();
+ do {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ }
+ } while (mNextWriteTime == FLUSH_QUEUE);
+ }
+ }
+
void saveImage(Bitmap image, String filename) {
synchronized (this) {
int queueNdx;
@@ -218,7 +231,16 @@ public class TaskPersister {
yieldIfQueueTooDeep();
}
- Bitmap getThumbnail(String filename) {
+ Bitmap getTaskDescriptionIcon(String filename) {
+ // See if it is in the write queue
+ final Bitmap icon = getImageFromWriteQueue(filename);
+ if (icon != null) {
+ return icon;
+ }
+ return restoreImage(filename);
+ }
+
+ Bitmap getImageFromWriteQueue(String filename) {
synchronized (this) {
for (int queueNdx = mWriteQueue.size() - 1; queueNdx >= 0; --queueNdx) {
final WriteQueueItem item = mWriteQueue.get(queueNdx);
@@ -474,8 +496,12 @@ public class TaskPersister {
INTER_WRITE_DELAY_MS + " msec. (" + mNextWriteTime + ")");
}
+
while (mWriteQueue.isEmpty()) {
- mNextWriteTime = 0; // idle.
+ if (mNextWriteTime != 0) {
+ mNextWriteTime = 0; // idle.
+ TaskPersister.this.notifyAll(); // wake up flush() if needed.
+ }
try {
if (DEBUG) Slog.d(TAG, "LazyTaskWriter: waiting indefinitely.");
TaskPersister.this.wait();
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 4de73675db02..73c97839b932 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -25,6 +25,7 @@ import static com.android.server.am.ActivityStackSupervisor.DEBUG_ADD_REMOVE;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.TaskThumbnail;
+import android.app.ActivityManager.TaskDescription;
import android.app.ActivityOptions;
import android.app.AppGlobals;
import android.content.ComponentName;
@@ -70,15 +71,12 @@ final class TaskRecord {
private static final String ATTR_LASTDESCRIPTION = "last_description";
private static final String ATTR_LASTTIMEMOVED = "last_time_moved";
private static final String ATTR_NEVERRELINQUISH = "never_relinquish_identity";
- private static final String ATTR_TASKDESCRIPTIONLABEL = "task_description_label";
- private static final String ATTR_TASKDESCRIPTIONCOLOR = "task_description_color";
private static final String ATTR_TASK_AFFILIATION = "task_affiliation";
private static final String ATTR_PREV_AFFILIATION = "prev_affiliation";
private static final String ATTR_NEXT_AFFILIATION = "next_affiliation";
private static final String ATTR_TASK_AFFILIATION_COLOR = "task_affiliation_color";
private static final String ATTR_CALLING_UID = "calling_uid";
private static final String ATTR_CALLING_PACKAGE = "calling_package";
- private static final String LAST_ACTIVITY_ICON_SUFFIX = "_last_activity_icon_";
private static final String TASK_THUMBNAIL_SUFFIX = "_task_thumbnail";
@@ -113,8 +111,7 @@ final class TaskRecord {
// This represents the last resolved activity values for this task
// NOTE: This value needs to be persisted with each task
- ActivityManager.TaskDescription lastTaskDescription =
- new ActivityManager.TaskDescription();
+ TaskDescription lastTaskDescription = new TaskDescription();
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities;
@@ -180,7 +177,7 @@ final class TaskRecord {
}
TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent,
- ActivityManager.TaskDescription _taskDescription) {
+ TaskDescription _taskDescription) {
mService = service;
mFilename = String.valueOf(_taskId) + TASK_THUMBNAIL_SUFFIX +
TaskPersister.IMAGE_EXTENSION;
@@ -215,7 +212,7 @@ final class TaskRecord {
boolean _askedCompatMode, int _taskType, int _userId, int _effectiveUid,
String _lastDescription, ArrayList<ActivityRecord> activities, long _firstActiveTime,
long _lastActiveTime, long lastTimeMoved, boolean neverRelinquishIdentity,
- ActivityManager.TaskDescription _lastTaskDescription, int taskAffiliation,
+ TaskDescription _lastTaskDescription, int taskAffiliation,
int prevTaskId, int nextTaskId, int taskAffiliationColor, int callingUid,
String callingPackage) {
mService = service;
@@ -327,8 +324,8 @@ final class TaskRecord {
}
}
- if (intent != null &&
- (intent.getFlags()&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
+ final int intentFlags = intent == null ? 0 : intent.getFlags();
+ if ((intentFlags & Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
// Once we are set to an Intent with this flag, we count this
// task as having a true root activity.
rootWasReset = true;
@@ -338,8 +335,8 @@ final class TaskRecord {
if ((info.flags & ActivityInfo.FLAG_AUTO_REMOVE_FROM_RECENTS) != 0) {
// If the activity itself has requested auto-remove, then just always do it.
autoRemoveRecents = true;
- } else if ((intent.getFlags()&(Intent.FLAG_ACTIVITY_NEW_DOCUMENT
- |Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)) == Intent.FLAG_ACTIVITY_NEW_DOCUMENT) {
+ } else if ((intentFlags & (Intent.FLAG_ACTIVITY_NEW_DOCUMENT
+ | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)) == Intent.FLAG_ACTIVITY_NEW_DOCUMENT) {
// If the caller has not asked for the document to be retained, then we may
// want to turn on auto-remove, depending on whether the target has set its
// own document launch mode.
@@ -441,7 +438,7 @@ final class TaskRecord {
thumbs.mainThumbnail = mLastThumbnail;
thumbs.thumbnailFileDescriptor = null;
if (mLastThumbnail == null) {
- thumbs.mainThumbnail = mService.mTaskPersister.getThumbnail(mFilename);
+ thumbs.mainThumbnail = mService.mTaskPersister.getImageFromWriteQueue(mFilename);
}
// Only load the thumbnail file if we don't have a thumbnail
if (thumbs.mainThumbnail == null && mLastThumbnailFile.exists()) {
@@ -759,7 +756,7 @@ final class TaskRecord {
// recent activity values, then we do not fall back to the last set
// values in the TaskRecord.
String label = null;
- Bitmap icon = null;
+ String iconFilename = null;
int colorPrimary = 0;
for (--activityNdx; activityNdx >= 0; --activityNdx) {
final ActivityRecord r = mActivities.get(activityNdx);
@@ -767,15 +764,15 @@ final class TaskRecord {
if (label == null) {
label = r.taskDescription.getLabel();
}
- if (icon == null) {
- icon = r.taskDescription.getIcon();
+ if (iconFilename == null) {
+ iconFilename = r.taskDescription.getIconFilename();
}
if (colorPrimary == 0) {
colorPrimary = r.taskDescription.getPrimaryColor();
}
}
}
- lastTaskDescription = new ActivityManager.TaskDescription(label, icon, colorPrimary);
+ lastTaskDescription = new TaskDescription(label, colorPrimary, iconFilename);
// Update the task affiliation color if we are the parent of the group
if (taskId == mAffiliatedTaskId) {
mAffiliatedTaskColor = lastTaskDescription.getPrimaryColor();
@@ -784,18 +781,19 @@ final class TaskRecord {
}
int findEffectiveRootIndex() {
- int activityNdx;
+ int effectiveNdx = 0;
final int topActivityNdx = mActivities.size() - 1;
- for (activityNdx = 0; activityNdx < topActivityNdx; ++activityNdx) {
+ for (int activityNdx = 0; activityNdx < topActivityNdx; ++activityNdx) {
final ActivityRecord r = mActivities.get(activityNdx);
if (r.finishing) {
continue;
}
+ effectiveNdx = activityNdx;
if ((r.info.flags & ActivityInfo.FLAG_RELINQUISH_TASK_IDENTITY) == 0) {
break;
}
}
- return activityNdx;
+ return effectiveNdx;
}
void updateEffectiveIntent() {
@@ -804,41 +802,6 @@ final class TaskRecord {
setIntent(r);
}
- void saveTaskDescription(ActivityManager.TaskDescription taskDescription,
- String iconFilename, XmlSerializer out) throws IOException {
- if (taskDescription != null) {
- final String label = taskDescription.getLabel();
- if (label != null) {
- out.attribute(null, ATTR_TASKDESCRIPTIONLABEL, label);
- }
- final int colorPrimary = taskDescription.getPrimaryColor();
- if (colorPrimary != 0) {
- out.attribute(null, ATTR_TASKDESCRIPTIONCOLOR, Integer.toHexString(colorPrimary));
- }
- final Bitmap icon = taskDescription.getIcon();
- if (icon != null) {
- mService.mTaskPersister.saveImage(icon, iconFilename);
- }
- }
- }
-
- static boolean readTaskDescriptionAttribute(ActivityManager.TaskDescription taskDescription,
- String attrName, String attrValue) {
- if (ATTR_TASKDESCRIPTIONLABEL.equals(attrName)) {
- taskDescription.setLabel(attrValue);
- } else if (ATTR_TASKDESCRIPTIONCOLOR.equals(attrName)) {
- taskDescription.setPrimaryColor((int) Long.parseLong(attrValue, 16));
- } else {
- return false;
- }
- return true;
- }
-
- private static String createLastTaskDescriptionIconFilename(int taskId, long lastActiveTime) {
- return String.valueOf(taskId) + LAST_ACTIVITY_ICON_SUFFIX + lastActiveTime +
- TaskPersister.IMAGE_EXTENSION;
- }
-
void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException {
if (ActivityManagerService.DEBUG_RECENTS) Slog.i(TAG, "Saving task=" + this);
@@ -875,8 +838,7 @@ final class TaskRecord {
out.attribute(null, ATTR_LASTDESCRIPTION, lastDescription.toString());
}
if (lastTaskDescription != null) {
- saveTaskDescription(lastTaskDescription, createLastTaskDescriptionIconFilename(taskId,
- lastActiveTime), out);
+ lastTaskDescription.saveToXml(out);
}
out.attribute(null, ATTR_TASK_AFFILIATION_COLOR, String.valueOf(mAffiliatedTaskColor));
out.attribute(null, ATTR_TASK_AFFILIATION, String.valueOf(mAffiliatedTaskId));
@@ -934,7 +896,7 @@ final class TaskRecord {
boolean neverRelinquishIdentity = true;
int taskId = -1;
final int outerDepth = in.getDepth();
- ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription();
+ TaskDescription taskDescription = new TaskDescription();
int taskAffiliation = -1;
int taskAffiliationColor = 0;
int prevTaskId = -1;
@@ -980,8 +942,8 @@ final class TaskRecord {
lastTimeOnTop = Long.valueOf(attrValue);
} else if (ATTR_NEVERRELINQUISH.equals(attrName)) {
neverRelinquishIdentity = Boolean.valueOf(attrValue);
- } else if (readTaskDescriptionAttribute(taskDescription, attrName, attrValue)) {
- // Completed in TaskPersister.readTaskDescriptionAttribute()
+ } else if (attrName.startsWith(TaskDescription.ATTR_TASKDESCRIPTION_PREFIX)) {
+ taskDescription.restoreFromXml(attrName, attrValue);
} else if (ATTR_TASK_AFFILIATION.equals(attrName)) {
taskAffiliation = Integer.valueOf(attrValue);
} else if (ATTR_PREV_AFFILIATION.equals(attrName)) {
@@ -1025,11 +987,6 @@ final class TaskRecord {
}
}
- if (lastActiveTime >= 0) {
- taskDescription.setIcon(TaskPersister.restoreImage(
- createLastTaskDescriptionIconFilename(taskId, lastActiveTime)));
- }
-
if (!hasRootAffinity) {
rootAffinity = affinity;
} else if ("@".equals(rootAffinity)) {
diff --git a/services/core/java/com/android/server/am/UriPermission.java b/services/core/java/com/android/server/am/UriPermission.java
index 284086dcbd79..91daf776a061 100644
--- a/services/core/java/com/android/server/am/UriPermission.java
+++ b/services/core/java/com/android/server/am/UriPermission.java
@@ -180,7 +180,7 @@ final class UriPermission {
/**
* @return if mode changes should trigger persisting.
*/
- boolean revokeModes(int modeFlags) {
+ boolean revokeModes(int modeFlags, boolean includingOwners) {
final boolean persistable = (modeFlags & Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) != 0;
modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
@@ -193,7 +193,7 @@ final class UriPermission {
persistedModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
}
globalModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
- if (mReadOwners != null) {
+ if (mReadOwners != null && includingOwners) {
ownedModeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION;
for (UriPermissionOwner r : mReadOwners) {
r.removeReadPermission(this);
@@ -207,7 +207,7 @@ final class UriPermission {
persistedModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
}
globalModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
- if (mWriteOwners != null) {
+ if (mWriteOwners != null && includingOwners) {
ownedModeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
for (UriPermissionOwner r : mWriteOwners) {
r.removeWritePermission(this);
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index fab064cdeaa4..fb98236ca4cc 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -82,10 +82,6 @@ public class NetworkMonitor extends StateMachine {
private static final String PERMISSION_ACCESS_NETWORK_CONDITIONS =
"android.permission.ACCESS_NETWORK_CONDITIONS";
- // Intent broadcast when user selects sign-in notification.
- private static final String ACTION_SIGN_IN_REQUESTED =
- "android.net.netmon.sign_in_requested";
-
// Keep these in sync with CaptivePortalLoginActivity.java.
// Intent broadcast from CaptivePortalLogin indicating sign-in is complete.
// Extras:
@@ -404,38 +400,42 @@ public class NetworkMonitor extends StateMachine {
}
}
- private class UserPromptedState extends State {
- private class UserRespondedBroadcastReceiver extends BroadcastReceiver {
- private final int mToken;
- UserRespondedBroadcastReceiver(int token) {
- mToken = token;
- }
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Integer.parseInt(intent.getStringExtra(Intent.EXTRA_TEXT)) ==
- mNetworkAgentInfo.network.netId) {
- sendMessage(obtainMessage(CMD_USER_WANTS_SIGN_IN, mToken));
- }
- }
+ // BroadcastReceiver that waits for a particular Intent and then posts a message.
+ private class CustomIntentReceiver extends BroadcastReceiver {
+ private final Message mMessage;
+ private final String mAction;
+ CustomIntentReceiver(String action, int token, int message) {
+ mMessage = obtainMessage(message, token);
+ mAction = action + "_" + mNetworkAgentInfo.network.netId + "_" + token;
+ mContext.registerReceiver(this, new IntentFilter(mAction));
+ }
+ public PendingIntent getPendingIntent() {
+ return PendingIntent.getBroadcast(mContext, 0, new Intent(mAction), 0);
+ }
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(mAction)) sendMessage(mMessage);
}
+ }
+
+ private class UserPromptedState extends State {
+ // Intent broadcast when user selects sign-in notification.
+ private static final String ACTION_SIGN_IN_REQUESTED =
+ "android.net.netmon.sign_in_requested";
- private UserRespondedBroadcastReceiver mUserRespondedBroadcastReceiver;
+ private CustomIntentReceiver mUserRespondedBroadcastReceiver;
@Override
public void enter() {
mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
NETWORK_TEST_RESULT_INVALID, 0, mNetworkAgentInfo));
// Wait for user to select sign-in notifcation.
- mUserRespondedBroadcastReceiver = new UserRespondedBroadcastReceiver(
- ++mUserPromptedToken);
- IntentFilter filter = new IntentFilter(ACTION_SIGN_IN_REQUESTED);
- mContext.registerReceiver(mUserRespondedBroadcastReceiver, filter);
+ mUserRespondedBroadcastReceiver = new CustomIntentReceiver(ACTION_SIGN_IN_REQUESTED,
+ ++mUserPromptedToken, CMD_USER_WANTS_SIGN_IN);
// Initiate notification to sign-in.
- Intent intent = new Intent(ACTION_SIGN_IN_REQUESTED);
- intent.putExtra(Intent.EXTRA_TEXT, String.valueOf(mNetworkAgentInfo.network.netId));
Message message = obtainMessage(EVENT_PROVISIONING_NOTIFICATION, 1,
mNetworkAgentInfo.network.netId,
- PendingIntent.getBroadcast(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
+ mUserRespondedBroadcastReceiver.getPendingIntent());
mConnectivityServiceHandler.sendMessage(message);
}
@@ -530,33 +530,15 @@ public class NetworkMonitor extends StateMachine {
private class LingeringState extends State {
private static final String ACTION_LINGER_EXPIRED = "android.net.netmon.lingerExpired";
- private static final String EXTRA_NETID = "lingerExpiredNetId";
- private static final String EXTRA_TOKEN = "lingerExpiredToken";
- private class LingerExpiredBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(ACTION_LINGER_EXPIRED) &&
- Integer.parseInt(intent.getStringExtra(EXTRA_NETID)) ==
- mNetworkAgentInfo.network.netId) {
- sendMessage(CMD_LINGER_EXPIRED,
- Integer.parseInt(intent.getStringExtra(EXTRA_TOKEN)));
- }
- }
- }
-
- private BroadcastReceiver mBroadcastReceiver;
+ private CustomIntentReceiver mBroadcastReceiver;
private PendingIntent mIntent;
@Override
public void enter() {
- mBroadcastReceiver = new LingerExpiredBroadcastReceiver();
- mContext.registerReceiver(mBroadcastReceiver, new IntentFilter(ACTION_LINGER_EXPIRED));
-
- Intent intent = new Intent(ACTION_LINGER_EXPIRED, null);
- intent.putExtra(EXTRA_NETID, String.valueOf(mNetworkAgentInfo.network.netId));
- intent.putExtra(EXTRA_TOKEN, String.valueOf(++mLingerToken));
- mIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
+ mBroadcastReceiver = new CustomIntentReceiver(ACTION_LINGER_EXPIRED, ++mLingerToken,
+ CMD_LINGER_EXPIRED);
+ mIntent = mBroadcastReceiver.getPendingIntent();
long wakeupTime = SystemClock.elapsedRealtime() + mLingerDelayMs;
mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime,
// Give a specific window so we aren't subject to unknown inexactitude.
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java
index 63178eb0e06b..07fe7ba79582 100644
--- a/services/core/java/com/android/server/connectivity/PacManager.java
+++ b/services/core/java/com/android/server/connectivity/PacManager.java
@@ -71,7 +71,7 @@ public class PacManager {
public static final String KEY_PROXY = "keyProxy";
private String mCurrentPac;
@GuardedBy("mProxyLock")
- private Uri mPacUrl;
+ private Uri mPacUrl = Uri.EMPTY;
private AlarmManager mAlarmManager;
@GuardedBy("mProxyLock")
@@ -175,7 +175,7 @@ public class PacManager {
} else {
getAlarmManager().cancel(mPacRefreshIntent);
synchronized (mProxyLock) {
- mPacUrl = null;
+ mPacUrl = Uri.EMPTY;
mCurrentPac = null;
if (mProxyService != null) {
try {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index b4009ca462fa..67d97766df32 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -349,8 +349,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
* was turned off by the proximity sensor.
* @return True if display is ready, false if there are important changes that must
* be made asynchronously (such as turning the screen on), in which case the caller
- * should grab a wake lock, watch for {@link Callbacks#onStateChanged()} then try
- * the request again later until the state converges.
+ * should grab a wake lock, watch for {@link DisplayPowerCallbacks#onStateChanged()}
+ * then try the request again later until the state converges.
*/
public boolean requestPowerState(DisplayPowerRequest request,
boolean waitForNegativeProximity) {
@@ -628,97 +628,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
? BRIGHTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST);
}
- // Animate the screen on or off unless blocked.
- if (state == Display.STATE_ON) {
- // Want screen on.
- // Wait for previous off animation to complete beforehand.
- // It is relatively short but if we cancel it and switch to the
- // on animation immediately then the results are pretty ugly.
- if (!mColorFadeOffAnimator.isStarted()) {
- // Turn the screen on. The contents of the screen may not yet
- // be visible if the electron beam has not been dismissed because
- // its last frame of animation is solid black.
- setScreenState(Display.STATE_ON);
- if (mPowerRequest.blockScreenOn
- && mPowerState.getColorFadeLevel() == 0.0f) {
- blockScreenOn();
- } else {
- unblockScreenOn();
- if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {
- // Perform screen on animation.
- if (!mColorFadeOnAnimator.isStarted()) {
- if (mPowerState.getColorFadeLevel() == 1.0f) {
- mPowerState.dismissColorFade();
- } else if (mPowerState.prepareColorFade(mContext,
- mColorFadeFadesConfig ?
- ColorFade.MODE_FADE :
- ColorFade.MODE_WARM_UP)) {
- mColorFadeOnAnimator.start();
- } else {
- mColorFadeOnAnimator.end();
- }
- }
- } else {
- // Skip screen on animation.
- mPowerState.setColorFadeLevel(1.0f);
- mPowerState.dismissColorFade();
- }
- }
- }
- } else if (state == Display.STATE_DOZE) {
- // Want screen dozing.
- // Wait for brightness animation to complete beforehand when entering doze
- // from screen on.
- unblockScreenOn();
- if (!mScreenBrightnessRampAnimator.isAnimating()
- || mPowerState.getScreenState() != Display.STATE_ON) {
- // Set screen state and dismiss the black surface without fanfare.
- setScreenState(state);
- mPowerState.setColorFadeLevel(1.0f);
- mPowerState.dismissColorFade();
- }
- } else if (state == Display.STATE_DOZE_SUSPEND) {
- // Want screen dozing and suspended.
- // Wait for brightness animation to complete beforehand unless already
- // suspended because we may not be able to change it after suspension.
- unblockScreenOn();
- if (!mScreenBrightnessRampAnimator.isAnimating()
- || mPowerState.getScreenState() == Display.STATE_DOZE_SUSPEND) {
- // Set screen state and dismiss the black surface without fanfare.
- setScreenState(state);
- mPowerState.setColorFadeLevel(1.0f);
- mPowerState.dismissColorFade();
- }
- } else {
- // Want screen off.
- // Wait for previous on animation to complete beforehand.
- unblockScreenOn();
- if (!mColorFadeOnAnimator.isStarted()) {
- if (performScreenOffTransition) {
- // Perform screen off animation.
- if (!mColorFadeOffAnimator.isStarted()) {
- if (mPowerState.getColorFadeLevel() == 0.0f) {
- setScreenState(Display.STATE_OFF);
- } else if (mPowerState.prepareColorFade(mContext,
- mColorFadeFadesConfig ?
- ColorFade.MODE_FADE :
- ColorFade.MODE_COOL_DOWN)
- && mPowerState.getScreenState() != Display.STATE_OFF) {
- mColorFadeOffAnimator.start();
- } else {
- mColorFadeOffAnimator.end();
- }
- }
- } else {
- // Skip screen off animation.
- setScreenState(Display.STATE_OFF);
- }
- }
- }
+ // Animate the screen state change unless already animating.
+ animateScreenStateChange(state, performScreenOffTransition);
- // Report whether the display is ready for use.
- // We mostly care about the screen state here, ignoring brightness changes
- // which will be handled asynchronously.
+ // Report whether the display is ready for use and all changes have been applied.
if (mustNotify
&& !mScreenOnWasBlocked
&& !mColorFadeOnAnimator.isStarted()
@@ -787,6 +700,96 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
}
}
+ private void animateScreenStateChange(int target, boolean performScreenOffTransition) {
+ // If there is already an animation in progress, don't interfere with it.
+ if (mColorFadeOnAnimator.isStarted()
+ || mColorFadeOffAnimator.isStarted()) {
+ return;
+ }
+
+ // Temporarily block turning the screen on if requested and there is already a
+ // black surface covering the screen.
+ if (mPowerRequest.blockScreenOn
+ && mPowerState.getColorFadeLevel() == 0.0f
+ && target != Display.STATE_OFF) {
+ blockScreenOn();
+ return;
+ }
+
+ if (target == Display.STATE_ON) {
+ // Want screen on. The contents of the screen may not yet
+ // be visible if the electron beam has not been dismissed because
+ // its last frame of animation is solid black.
+ unblockScreenOn();
+ setScreenState(Display.STATE_ON);
+ if (USE_COLOR_FADE_ON_ANIMATION && mPowerRequest.isBrightOrDim()) {
+ // Perform screen on animation.
+ if (mPowerState.getColorFadeLevel() == 1.0f) {
+ mPowerState.dismissColorFade();
+ } else if (mPowerState.prepareColorFade(mContext,
+ mColorFadeFadesConfig ?
+ ColorFade.MODE_FADE :
+ ColorFade.MODE_WARM_UP)) {
+ mColorFadeOnAnimator.start();
+ } else {
+ mColorFadeOnAnimator.end();
+ }
+ } else {
+ // Skip screen on animation.
+ mPowerState.setColorFadeLevel(1.0f);
+ mPowerState.dismissColorFade();
+ }
+ } else if (target == Display.STATE_DOZE) {
+ // Want screen dozing.
+ // Wait for brightness animation to complete beforehand when entering doze
+ // from screen on to prevent a perceptible jump because brightness may operate
+ // differently when the display is configured for dozing.
+ if (mScreenBrightnessRampAnimator.isAnimating()
+ && mPowerState.getScreenState() == Display.STATE_ON) {
+ return;
+ }
+
+ // Set screen state and dismiss the black surface without fanfare.
+ unblockScreenOn();
+ setScreenState(Display.STATE_DOZE);
+ mPowerState.setColorFadeLevel(1.0f);
+ mPowerState.dismissColorFade();
+ } else if (target == Display.STATE_DOZE_SUSPEND) {
+ // Want screen dozing and suspended.
+ // Wait for brightness animation to complete beforehand unless already
+ // suspended because we may not be able to change it after suspension.
+ if (mScreenBrightnessRampAnimator.isAnimating()
+ && mPowerState.getScreenState() != Display.STATE_DOZE_SUSPEND) {
+ return;
+ }
+
+ // Set screen state and dismiss the black surface without fanfare.
+ unblockScreenOn();
+ setScreenState(Display.STATE_DOZE_SUSPEND);
+ mPowerState.setColorFadeLevel(1.0f);
+ mPowerState.dismissColorFade();
+ } else {
+ // Want screen off.
+ unblockScreenOn();
+ if (mPowerState.getColorFadeLevel() == 0.0f) {
+ // Turn the screen off.
+ // A black surface is already hiding the contents of the screen.
+ setScreenState(Display.STATE_OFF);
+ } else if (performScreenOffTransition
+ && mPowerState.prepareColorFade(mContext,
+ mColorFadeFadesConfig ?
+ ColorFade.MODE_FADE : ColorFade.MODE_COOL_DOWN)
+ && mPowerState.getScreenState() != Display.STATE_OFF) {
+ // Perform the screen off animation.
+ mColorFadeOffAnimator.start();
+ } else {
+ // Skip the screen off animation and add a black surface to hide the
+ // contents of the screen.
+ mColorFadeOffAnimator.end();
+ }
+ }
+ }
+
private final Runnable mCleanListener = new Runnable() {
@Override
public void run() {
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 81b579d9174f..7f89947420a9 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -37,6 +37,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -806,8 +807,8 @@ public class InputManagerService extends IInputManager.Stub
final HashSet<String> availableKeyboardLayouts = new HashSet<String>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
- public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, String collection, int keyboardLayoutResId) {
+ public void visitKeyboardLayout(Resources resources, String descriptor, String label,
+ String collection, int keyboardLayoutResId, int priority) {
availableKeyboardLayouts.add(descriptor);
}
});
@@ -840,9 +841,9 @@ public class InputManagerService extends IInputManager.Stub
final ArrayList<KeyboardLayout> list = new ArrayList<KeyboardLayout>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
- public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, String collection, int keyboardLayoutResId) {
- list.add(new KeyboardLayout(descriptor, label, collection));
+ public void visitKeyboardLayout(Resources resources, String descriptor, String label,
+ String collection, int keyboardLayoutResId, int priority) {
+ list.add(new KeyboardLayout(descriptor, label, collection, priority));
}
});
return list.toArray(new KeyboardLayout[list.size()]);
@@ -857,9 +858,9 @@ public class InputManagerService extends IInputManager.Stub
final KeyboardLayout[] result = new KeyboardLayout[1];
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
- public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, String collection, int keyboardLayoutResId) {
- result[0] = new KeyboardLayout(descriptor, label, collection);
+ public void visitKeyboardLayout(Resources resources, String descriptor,
+ String label, String collection, int keyboardLayoutResId, int priority) {
+ result[0] = new KeyboardLayout(descriptor, label, collection, priority);
}
});
if (result[0] == null) {
@@ -874,7 +875,9 @@ public class InputManagerService extends IInputManager.Stub
Intent intent = new Intent(InputManager.ACTION_QUERY_KEYBOARD_LAYOUTS);
for (ResolveInfo resolveInfo : pm.queryBroadcastReceivers(intent,
PackageManager.GET_META_DATA)) {
- visitKeyboardLayoutsInPackage(pm, resolveInfo.activityInfo, null, visitor);
+ final ActivityInfo activityInfo = resolveInfo.activityInfo;
+ final int priority = resolveInfo.priority;
+ visitKeyboardLayoutsInPackage(pm, activityInfo, null, priority, visitor);
}
}
@@ -887,14 +890,14 @@ public class InputManagerService extends IInputManager.Stub
ActivityInfo receiver = pm.getReceiverInfo(
new ComponentName(d.packageName, d.receiverName),
PackageManager.GET_META_DATA);
- visitKeyboardLayoutsInPackage(pm, receiver, d.keyboardLayoutName, visitor);
+ visitKeyboardLayoutsInPackage(pm, receiver, d.keyboardLayoutName, 0, visitor);
} catch (NameNotFoundException ex) {
}
}
}
private void visitKeyboardLayoutsInPackage(PackageManager pm, ActivityInfo receiver,
- String keyboardName, KeyboardLayoutVisitor visitor) {
+ String keyboardName, int requestedPriority, KeyboardLayoutVisitor visitor) {
Bundle metaData = receiver.metaData;
if (metaData == null) {
return;
@@ -909,6 +912,12 @@ public class InputManagerService extends IInputManager.Stub
CharSequence receiverLabel = receiver.loadLabel(pm);
String collection = receiverLabel != null ? receiverLabel.toString() : "";
+ int priority;
+ if ((receiver.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
+ priority = requestedPriority;
+ } else {
+ priority = 0;
+ }
try {
Resources resources = pm.getResourcesForApplication(receiver.applicationInfo);
@@ -943,7 +952,7 @@ public class InputManagerService extends IInputManager.Stub
receiver.packageName, receiver.name, name);
if (keyboardName == null || name.equals(keyboardName)) {
visitor.visitKeyboardLayout(resources, descriptor,
- label, collection, keyboardLayoutResId);
+ label, collection, keyboardLayoutResId, priority);
}
}
} finally {
@@ -1550,8 +1559,8 @@ public class InputManagerService extends IInputManager.Stub
final String[] result = new String[2];
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
- public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, String collection, int keyboardLayoutResId) {
+ public void visitKeyboardLayout(Resources resources, String descriptor, String label,
+ String collection, int keyboardLayoutResId, int priority) {
try {
result[0] = descriptor;
result[1] = Streams.readFully(new InputStreamReader(
@@ -1699,8 +1708,8 @@ public class InputManagerService extends IInputManager.Stub
}
private interface KeyboardLayoutVisitor {
- void visitKeyboardLayout(Resources resources,
- String descriptor, String label, String collection, int keyboardLayoutResId);
+ void visitKeyboardLayout(Resources resources, String descriptor, String label,
+ String collection, int keyboardLayoutResId, int priority);
}
private final class InputDevicesChangedListenerRecord implements DeathRecipient {
diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java
index df846a848d91..f1c5a6c934e4 100644
--- a/services/core/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/core/java/com/android/server/location/GpsLocationProvider.java
@@ -162,6 +162,10 @@ public class GpsLocationProvider implements LocationProviderInterface {
private static final int GPS_CAPABILITY_SINGLE_SHOT = 0x0000008;
private static final int GPS_CAPABILITY_ON_DEMAND_TIME = 0x0000010;
+ // The AGPS SUPL mode
+ private static final int AGPS_SUPL_MODE_MSA = 0x02;
+ private static final int AGPS_SUPL_MODE_MSB = 0x01;
+
// these need to match AGpsType enum in gps.h
private static final int AGPS_TYPE_SUPL = 1;
private static final int AGPS_TYPE_C2K = 2;
@@ -486,12 +490,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
} else if (action.equals(SIM_STATE_CHANGED)) {
TelephonyManager phone = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
- int simState = phone.getSimState();
- Log.d(TAG, "SIM STATE CHANGED to " + simState);
String mccMnc = phone.getSimOperator();
- if (simState == TelephonyManager.SIM_STATE_READY &&
- !TextUtils.isEmpty(mccMnc)) {
- Log.d(TAG, "SIM STATE is ready, SIM MCC/MNC is " + mccMnc);
+ if (!TextUtils.isEmpty(mccMnc)) {
+ Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc);
synchronized (mLock) {
reloadGpsProperties(context, mProperties);
mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
@@ -922,6 +923,39 @@ public class GpsLocationProvider implements LocationProviderInterface {
}
}
+ /**
+ * Checks what SUPL mode to use, according to the AGPS mode as well as the
+ * allowed mode from properties.
+ *
+ * @param properties GPS properties
+ * @param agpsEnabled whether AGPS is enabled by settings value
+ * @param singleShot whether "singleshot" is needed
+ * @return SUPL mode (MSA vs MSB vs STANDALONE)
+ */
+ private int getSuplMode(Properties properties, boolean agpsEnabled, boolean singleShot) {
+ if (agpsEnabled) {
+ String modeString = properties.getProperty("SUPL_MODE");
+ int suplMode = 0;
+ if (!TextUtils.isEmpty(modeString)) {
+ try {
+ suplMode = Integer.parseInt(modeString);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "unable to parse SUPL_MODE: " + modeString);
+ return GPS_POSITION_MODE_STANDALONE;
+ }
+ }
+ if (singleShot
+ && hasCapability(GPS_CAPABILITY_MSA)
+ && (suplMode & AGPS_SUPL_MODE_MSA) != 0) {
+ return GPS_POSITION_MODE_MS_ASSISTED;
+ } else if (hasCapability(GPS_CAPABILITY_MSB)
+ && (suplMode & AGPS_SUPL_MODE_MSB) != 0) {
+ return GPS_POSITION_MODE_MS_BASED;
+ }
+ }
+ return GPS_POSITION_MODE_STANDALONE;
+ }
+
private void handleEnable() {
if (DEBUG) Log.d(TAG, "handleEnable");
@@ -1199,14 +1233,10 @@ public class GpsLocationProvider implements LocationProviderInterface {
mSingleShot = singleShot;
mPositionMode = GPS_POSITION_MODE_STANDALONE;
- if (Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.ASSISTED_GPS_ENABLED, 1) != 0) {
- if (singleShot && hasCapability(GPS_CAPABILITY_MSA)) {
- mPositionMode = GPS_POSITION_MODE_MS_ASSISTED;
- } else if (hasCapability(GPS_CAPABILITY_MSB)) {
- mPositionMode = GPS_POSITION_MODE_MS_BASED;
- }
- }
+ boolean agpsEnabled =
+ (Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.ASSISTED_GPS_ENABLED, 1) != 0);
+ mPositionMode = getSuplMode(mProperties, agpsEnabled, singleShot);
if (DEBUG) {
String mode;
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index 8a1f3ad5479c..cdfb656f439e 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -23,6 +23,7 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.display.DisplayManager;
+import android.media.MediaRouter;
import android.media.projection.IMediaProjectionManager;
import android.media.projection.IMediaProjection;
import android.media.projection.IMediaProjectionCallback;
@@ -68,6 +69,10 @@ public final class MediaProjectionManagerService extends SystemService
private final Context mContext;
private final AppOpsManager mAppOps;
+ private final MediaRouter mMediaRouter;
+ private final MediaRouterCallback mMediaRouterCallback;
+ private MediaRouter.RouteInfo mMediaRouteInfo;
+
private IBinder mProjectionToken;
private MediaProjection mProjectionGrant;
@@ -77,6 +82,8 @@ public final class MediaProjectionManagerService extends SystemService
mDeathEaters = new ArrayMap<IBinder, IBinder.DeathRecipient>();
mCallbackDelegate = new CallbackDelegate();
mAppOps = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
+ mMediaRouter = (MediaRouter) mContext.getSystemService(Context.MEDIA_ROUTER_SERVICE);
+ mMediaRouterCallback = new MediaRouterCallback();
Watchdog.getInstance().addMonitor(this);
}
@@ -84,6 +91,12 @@ public final class MediaProjectionManagerService extends SystemService
public void onStart() {
publishBinderService(Context.MEDIA_PROJECTION_SERVICE, new BinderService(),
false /*allowIsolated*/);
+ mMediaRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mMediaRouterCallback);
+ }
+
+ @Override
+ public void onSwitchUser(int userId) {
+ mMediaRouter.rebindAsUser(userId);
}
@Override
@@ -95,6 +108,9 @@ public final class MediaProjectionManagerService extends SystemService
if (mProjectionGrant != null) {
mProjectionGrant.stop();
}
+ if (mMediaRouteInfo != null) {
+ mMediaRouter.getDefaultRoute().select();
+ }
mProjectionToken = projection.asBinder();
mProjectionGrant = projection;
dispatchStart(projection);
@@ -448,6 +464,27 @@ public final class MediaProjectionManagerService extends SystemService
}
}
+ private class MediaRouterCallback extends MediaRouter.SimpleCallback {
+ @Override
+ public void onRouteSelected(MediaRouter router, int type, MediaRouter.RouteInfo info) {
+ synchronized (mLock) {
+ if ((type & MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY) != 0) {
+ mMediaRouteInfo = info;
+ if (mProjectionGrant != null) {
+ mProjectionGrant.stop();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onRouteUnselected(MediaRouter route, int type, MediaRouter.RouteInfo info) {
+ if (mMediaRouteInfo == info) {
+ mMediaRouteInfo = null;
+ }
+ }
+ }
+
private static class CallbackDelegate {
private Map<IBinder, IMediaProjectionCallback> mClientCallbacks;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerInternal.java b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
index b695b6819b4f..c6b0d369e4dd 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerInternal.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerInternal.java
@@ -21,4 +21,6 @@ import android.app.Notification;
public interface NotificationManagerInternal {
void enqueueNotification(String pkg, String basePkg, int callingUid, int callingPid,
String tag, int id, Notification notification, int[] idReceived, int userId);
+
+ void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 14587e63ace6..2829e2b7aa2c 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1610,6 +1610,30 @@ public class NotificationManagerService extends SystemService {
enqueueNotificationInternal(pkg, opPkg, callingUid, callingPid, tag, id, notification,
idReceived, userId);
}
+
+ @Override
+ public void removeForegroundServiceFlagFromNotification(String pkg, int notificationId,
+ int userId) {
+ checkCallerIsSystem();
+ synchronized (mNotificationList) {
+ int i = indexOfNotificationLocked(pkg, null, notificationId, userId);
+ if (i < 0) {
+ Log.d(TAG, "stripForegroundServiceFlag: Could not find notification with "
+ + "pkg=" + pkg + " / id=" + notificationId + " / userId=" + userId);
+ return;
+ }
+ NotificationRecord r = mNotificationList.get(i);
+ StatusBarNotification sbn = r.sbn;
+ // NoMan adds flags FLAG_NO_CLEAR and FLAG_ONGOING_EVENT when it sees
+ // FLAG_FOREGROUND_SERVICE. Hence it's not enough to remove FLAG_FOREGROUND_SERVICE,
+ // we have to revert to the flags we received initially *and* force remove
+ // FLAG_FOREGROUND_SERVICE.
+ sbn.getNotification().flags =
+ (r.mOriginalFlags & ~Notification.FLAG_FOREGROUND_SERVICE);
+ mRankingHelper.sort(mNotificationList);
+ mListeners.notifyPostedLocked(sbn, sbn /* oldSbn */);
+ }
+ }
};
void enqueueNotificationInternal(final String pkg, final String opPkg, final int callingUid,
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index fd34aa5fbcb3..ea6f2db0efc1 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -45,6 +45,8 @@ import java.util.Objects;
*/
public final class NotificationRecord {
final StatusBarNotification sbn;
+ final int mOriginalFlags;
+
NotificationUsageStats.SingleNotificationStats stats;
boolean isCanceled;
int score;
@@ -73,6 +75,7 @@ public final class NotificationRecord {
{
this.sbn = sbn;
this.score = score;
+ mOriginalFlags = sbn.getNotification().flags;
mRankingTimeMs = calculateRankingTimeMs(0L);
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 479af894fc89..5038d03a48af 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -182,6 +182,12 @@ public class ZenModeHelper {
}
return shouldInterceptAudience(record);
}
+ if (isEvent(record)) {
+ if (!mConfig.allowEvents) {
+ ZenLog.traceIntercepted(record, "!allowEvents");
+ return true;
+ }
+ }
ZenLog.traceIntercepted(record, "!allowed");
return true;
}
@@ -328,17 +334,20 @@ public class ZenModeHelper {
}
}
- private boolean isSystem(NotificationRecord record) {
+ private static boolean isSystem(NotificationRecord record) {
return record.isCategory(Notification.CATEGORY_SYSTEM);
}
- private boolean isAlarm(NotificationRecord record) {
+ private static boolean isAlarm(NotificationRecord record) {
return record.isCategory(Notification.CATEGORY_ALARM)
- || record.isCategory(Notification.CATEGORY_EVENT)
|| record.isAudioStream(AudioManager.STREAM_ALARM)
|| record.isAudioAttributesUsage(AudioAttributes.USAGE_ALARM);
}
+ private static boolean isEvent(NotificationRecord record) {
+ return record.isCategory(Notification.CATEGORY_EVENT);
+ }
+
private boolean isCall(NotificationRecord record) {
return isDefaultPhoneApp(record.sbn.getPackageName())
|| record.isCategory(Notification.CATEGORY_CALL);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 79c9955cfa37..5a94f23f0054 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -201,6 +201,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
@@ -2161,7 +2162,8 @@ public class PackageManagerService extends IPackageManager.Stub {
userId);
}
if (mResolveComponentName.equals(component)) {
- return mResolveActivity;
+ return PackageParser.generateActivityInfo(mResolveActivity, flags,
+ new PackageUserState(), userId);
}
}
return null;
@@ -5939,25 +5941,26 @@ public class PackageManagerService extends IPackageManager.Stub {
p.group = mPermissionGroups.get(p.info.group);
if (p.info.group == null || p.group != null) {
BasePermission bp = permissionMap.get(p.info.name);
+
+ // Allow system apps to redefine non-system permissions
+ if (bp != null && !Objects.equals(bp.sourcePackage, p.info.packageName)) {
+ final boolean currentOwnerIsSystem = (bp.perm != null
+ && isSystemApp(bp.perm.owner));
+ if (isSystemApp(p.owner) && !currentOwnerIsSystem) {
+ String msg = "New decl " + p.owner + " of permission "
+ + p.info.name + " is system; overriding " + bp.sourcePackage;
+ reportSettingsProblem(Log.WARN, msg);
+ bp = null;
+ }
+ }
+
if (bp == null) {
bp = new BasePermission(p.info.name, p.info.packageName,
BasePermission.TYPE_NORMAL);
permissionMap.put(p.info.name, bp);
}
+
if (bp.perm == null) {
- if (bp.sourcePackage != null
- && !bp.sourcePackage.equals(p.info.packageName)) {
- // If this is a permission that was formerly defined by a non-system
- // app, but is now defined by a system app (following an upgrade),
- // discard the previous declaration and consider the system's to be
- // canonical.
- if (isSystemApp(p.owner)) {
- String msg = "New decl " + p.owner + " of permission "
- + p.info.name + " is system";
- reportSettingsProblem(Log.WARN, msg);
- bp.sourcePackage = null;
- }
- }
if (bp.sourcePackage == null
|| bp.sourcePackage.equals(p.info.packageName)) {
BasePermission tree = findPermissionTreeLP(p.info.name);
@@ -5966,6 +5969,7 @@ public class PackageManagerService extends IPackageManager.Stub {
bp.packageSetting = pkgSetting;
bp.perm = p;
bp.uid = pkg.applicationInfo.uid;
+ bp.sourcePackage = p.info.packageName;
if ((parseFlags&PackageParser.PARSE_CHATTY) != 0) {
if (r == null) {
r = new StringBuilder(256);
@@ -11366,15 +11370,12 @@ public class PackageManagerService extends IPackageManager.Stub {
if (cur.mPref.mAlways && cur.mPref.mComponent.equals(activity)
&& cur.mPref.mMatch == (match&IntentFilter.MATCH_CATEGORY_MASK)
&& cur.mPref.sameSet(set)) {
+ // Setting the preferred activity to what it happens to be already
if (DEBUG_PREFERRED) {
Slog.i(TAG, "Replacing with same preferred activity "
+ cur.mPref.mShortComponent + " for user "
+ userId + ":");
filter.dump(new LogPrinter(Log.INFO, TAG), " ");
- } else {
- Slog.i(TAG, "Replacing with same preferred activity "
- + cur.mPref.mShortComponent + " for user "
- + userId);
}
return;
}
diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java
index 464972428409..c720668de693 100644
--- a/services/core/java/com/android/server/power/Notifier.java
+++ b/services/core/java/com/android/server/power/Notifier.java
@@ -256,16 +256,11 @@ final class Notifier {
if (mActualPowerState != POWER_STATE_AWAKE) {
mActualPowerState = POWER_STATE_AWAKE;
mPendingWakeUpBroadcast = true;
- if (mPendingScreenOnUnblocker == null) {
- mScreenOnBlocker.acquire();
- }
- final ScreenOnUnblocker unblocker = new ScreenOnUnblocker();
- mPendingScreenOnUnblocker = unblocker;
mHandler.post(new Runnable() {
@Override
public void run() {
EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, 0, 0, 0);
- mPolicy.wakingUp(unblocker);
+ mPolicy.wakingUp();
mActivityManagerInternal.wakingUp();
}
});
@@ -338,6 +333,21 @@ final class Notifier {
}
/**
+ * Notifies that screen is about to be turned on (any state other than off).
+ */
+ public void onScreenTurningOn() {
+ synchronized (mLock) {
+ final ScreenOnUnblocker unblocker = blockScreenOnLocked();
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mPolicy.screenTurningOn(unblocker);
+ }
+ });
+ }
+ }
+
+ /**
* Called when there has been user activity.
*/
public void onUserActivity(int event, int uid) {
@@ -460,6 +470,14 @@ final class Notifier {
}
}
+ private ScreenOnUnblocker blockScreenOnLocked() {
+ if (mPendingScreenOnUnblocker == null) {
+ mScreenOnBlocker.acquire();
+ }
+ mPendingScreenOnUnblocker = new ScreenOnUnblocker();
+ return mPendingScreenOnUnblocker;
+ }
+
private final class ScreenOnUnblocker implements WindowManagerPolicy.ScreenOnListener {
@Override
public void onScreenOn() {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index c79a6d64121e..71e059ab3a60 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -1767,6 +1767,7 @@ public final class PowerManagerService extends SystemService
if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS
| DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED
| DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) {
+ boolean wasBlockerNeeded = isScreenOnBlockerNeededLocked(mDisplayPowerRequest);
mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked();
int screenBrightness = mScreenBrightnessSettingDefault;
@@ -1803,8 +1804,6 @@ public final class PowerManagerService extends SystemService
mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked();
- mDisplayPowerRequest.blockScreenOn = mScreenOnBlocker.isHeld();
-
mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled;
if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) {
@@ -1816,6 +1815,12 @@ public final class PowerManagerService extends SystemService
mDisplayPowerRequest.dozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
}
+ if (!wasBlockerNeeded && isScreenOnBlockerNeededLocked(mDisplayPowerRequest)
+ && !mScreenOnBlocker.isHeld()) {
+ mNotifier.onScreenTurningOn();
+ }
+ mDisplayPowerRequest.blockScreenOn = mScreenOnBlocker.isHeld();
+
mDisplayReady = mDisplayManagerInternal.requestPowerState(mDisplayPowerRequest,
mRequestWaitForNegativeProximity);
mRequestWaitForNegativeProximity = false;
@@ -1832,6 +1837,17 @@ public final class PowerManagerService extends SystemService
return mDisplayReady && !oldDisplayReady;
}
+ private static boolean isScreenOnBlockerNeededLocked(DisplayPowerRequest req) {
+ switch (req.policy) {
+ case DisplayPowerRequest.POLICY_OFF:
+ return false;
+ case DisplayPowerRequest.POLICY_DOZE:
+ return req.dozeScreenState != Display.STATE_OFF;
+ default:
+ return true;
+ }
+ }
+
private static boolean isValidBrightness(int value) {
return value >= 0 && value <= 255;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index a3da1e66c4db..a4edc8628787 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -3356,7 +3356,8 @@ public class WindowManagerService extends IWindowManager.Stub
}
isFullScreen =
((win.mSystemUiVisibility & SYSTEM_UI_FLAGS_LAYOUT_STABLE_FULLSCREEN) ==
- SYSTEM_UI_FLAGS_LAYOUT_STABLE_FULLSCREEN);
+ SYSTEM_UI_FLAGS_LAYOUT_STABLE_FULLSCREEN) ||
+ ((win.mAttrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0);
}
if (atoken.mLaunchTaskBehind) {
@@ -3473,7 +3474,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
boolean okToDisplay() {
- return !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully();
+ return !mDisplayFrozen && mDisplayEnabled && mPolicy.isAwake();
}
AppWindowToken findAppWindowToken(IBinder token) {
@@ -10396,7 +10397,7 @@ public class WindowManagerService extends IWindowManager.Stub
return;
}
- if (!mDisplayReady || !mPolicy.isScreenOnFully()) {
+ if (!mDisplayReady || !mPolicy.isAwake()) {
// No need to freeze the screen before the system is ready or if
// the screen is off.
return;
@@ -11189,6 +11190,7 @@ public class WindowManagerService extends IWindowManager.Stub
pw.println(" p[policy]: policy state");
pw.println(" a[animator]: animator state");
pw.println(" s[essions]: active sessions");
+ pw.println(" surfaces: active surfaces (debugging enabled only)");
pw.println(" d[isplays]: active display contents");
pw.println(" t[okens]: token list");
pw.println(" w[indows]: window list");
@@ -11228,6 +11230,11 @@ public class WindowManagerService extends IWindowManager.Stub
dumpSessionsLocked(pw, true);
}
return;
+ } else if ("surfaces".equals(cmd)) {
+ synchronized(mWindowMap) {
+ WindowStateAnimator.SurfaceTrace.dumpAllSurfaces(pw, null);
+ }
+ return;
} else if ("displays".equals(cmd) || "d".equals(cmd)) {
synchronized(mWindowMap) {
dumpDisplayContentsLocked(pw, true);
@@ -11283,6 +11290,13 @@ public class WindowManagerService extends IWindowManager.Stub
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
+ WindowStateAnimator.SurfaceTrace.dumpAllSurfaces(pw, dumpAll ?
+ "-------------------------------------------------------------------------------"
+ : null);
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
dumpDisplayContentsLocked(pw, dumpAll);
pw.println();
if (dumpAll) {
@@ -11555,6 +11569,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
+ @Override
public void waitForAllWindowsDrawn(Runnable callback, long timeout) {
synchronized (mWindowMap) {
mWaitingForDrawnCallback = callback;
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index ff17d78ac00b..5b007d49fcfa 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -536,6 +536,9 @@ class WindowStateAnimator {
mSize.set(w, h);
Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by "
+ Debug.getCallers(3));
+ synchronized (sSurfaces) {
+ sSurfaces.add(0, this);
+ }
}
@Override
@@ -557,15 +560,17 @@ class WindowStateAnimator {
}
super.setLayer(zorder);
- sSurfaces.remove(this);
- int i;
- for (i = sSurfaces.size() - 1; i >= 0; i--) {
- SurfaceTrace s = sSurfaces.get(i);
- if (s.mLayer < zorder) {
- break;
+ synchronized (sSurfaces) {
+ sSurfaces.remove(this);
+ int i;
+ for (i = sSurfaces.size() - 1; i >= 0; i--) {
+ SurfaceTrace s = sSurfaces.get(i);
+ if (s.mLayer < zorder) {
+ break;
+ }
}
+ sSurfaces.add(i + 1, this);
}
- sSurfaces.add(i + 1, this);
}
@Override
@@ -655,7 +660,9 @@ class WindowStateAnimator {
public void destroy() {
super.destroy();
Slog.v(SURFACE_TAG, "destroy: " + this + ". Called by " + Debug.getCallers(3));
- sSurfaces.remove(this);
+ synchronized (sSurfaces) {
+ sSurfaces.remove(this);
+ }
}
@Override
@@ -663,13 +670,40 @@ class WindowStateAnimator {
super.release();
Slog.v(SURFACE_TAG, "release: " + this + ". Called by "
+ Debug.getCallers(3));
- sSurfaces.remove(this);
+ synchronized (sSurfaces) {
+ sSurfaces.remove(this);
+ }
}
- static void dumpAllSurfaces() {
- final int N = sSurfaces.size();
- for (int i = 0; i < N; i++) {
- Slog.i(TAG, "SurfaceDump: " + sSurfaces.get(i));
+ static void dumpAllSurfaces(PrintWriter pw, String header) {
+ synchronized (sSurfaces) {
+ final int N = sSurfaces.size();
+ if (N <= 0) {
+ return;
+ }
+ if (header != null) {
+ pw.println(header);
+ }
+ pw.println("WINDOW MANAGER SURFACES (dumpsys window surfaces)");
+ for (int i = 0; i < N; i++) {
+ SurfaceTrace s = sSurfaces.get(i);
+ pw.print(" Surface #"); pw.print(i); pw.print(": #");
+ pw.print(Integer.toHexString(System.identityHashCode(s)));
+ pw.print(" "); pw.println(s.mName);
+ pw.print(" mLayerStack="); pw.print(s.mLayerStack);
+ pw.print(" mLayer="); pw.println(s.mLayer);
+ pw.print(" mShown="); pw.print(s.mShown); pw.print(" mAlpha=");
+ pw.print(s.mSurfaceTraceAlpha); pw.print(" mIsOpaque=");
+ pw.println(s.mIsOpaque);
+ pw.print(" mPosition="); pw.print(s.mPosition.x); pw.print(",");
+ pw.print(s.mPosition.y);
+ pw.print(" mSize="); pw.print(s.mSize.x); pw.print("x");
+ pw.println(s.mSize.y);
+ pw.print(" mCrop="); s.mWindowCrop.printShortString(pw); pw.println();
+ pw.print(" Transform: ("); pw.print(s.mDsdx); pw.print(", ");
+ pw.print(s.mDtdx); pw.print(", "); pw.print(s.mDsdy);
+ pw.print(", "); pw.print(s.mDtdy); pw.println(")");
+ }
}
}
diff --git a/services/core/jni/com_android_server_UsbHostManager.cpp b/services/core/jni/com_android_server_UsbHostManager.cpp
index 65a28c0410f8..32c3f95636b7 100644
--- a/services/core/jni/com_android_server_UsbHostManager.cpp
+++ b/services/core/jni/com_android_server_UsbHostManager.cpp
@@ -74,9 +74,9 @@ static int usb_device_added(const char *devname, void* client_data) {
char *serial = usb_device_get_serial(device);
jstring deviceName = env->NewStringUTF(devname);
- jstring manufacturerName = env->NewStringUTF(manufacturer);
- jstring productName = env->NewStringUTF(product);
- jstring serialNumber = env->NewStringUTF(serial);
+ jstring manufacturerName = AndroidRuntime::NewStringLatin1(env, manufacturer);
+ jstring productName = AndroidRuntime::NewStringLatin1(env, product);
+ jstring serialNumber = AndroidRuntime::NewStringLatin1(env, serial);
jboolean result = env->CallBooleanMethod(thiz, method_beginUsbDeviceAdded,
deviceName, usb_device_get_vendor_id(device), usb_device_get_product_id(device),
@@ -99,7 +99,7 @@ static int usb_device_added(const char *devname, void* client_data) {
if (desc->bDescriptorType == USB_DT_CONFIG) {
struct usb_config_descriptor *config = (struct usb_config_descriptor *)desc;
char *name = usb_device_get_string(device, config->iConfiguration);
- jstring configName = env->NewStringUTF(name);
+ jstring configName = AndroidRuntime::NewStringLatin1(env, name);
env->CallVoidMethod(thiz, method_addUsbConfiguration,
config->bConfigurationValue, configName, config->bmAttributes,
@@ -110,7 +110,7 @@ static int usb_device_added(const char *devname, void* client_data) {
} else if (desc->bDescriptorType == USB_DT_INTERFACE) {
struct usb_interface_descriptor *interface = (struct usb_interface_descriptor *)desc;
char *name = usb_device_get_string(device, interface->iInterface);
- jstring interfaceName = env->NewStringUTF(name);
+ jstring interfaceName = AndroidRuntime::NewStringLatin1(env, name);
env->CallVoidMethod(thiz, method_addUsbInterface,
interface->bInterfaceNumber, interfaceName, interface->bAlternateSetting,
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 95332bc60718..59d3dc801b10 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -17,6 +17,7 @@
package com.android.server.devicepolicy;
import static android.Manifest.permission.MANAGE_CA_CERTIFICATES;
+import static android.content.pm.PackageManager.GET_UNINSTALLED_PACKAGES;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accounts.AccountManager;
@@ -4661,7 +4662,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
ActiveAdmin activeAdmin =
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
boolean isDeviceOwner = isDeviceOwner(activeAdmin.info.getPackageName());
- if (!isDeviceOwner && DEVICE_OWNER_USER_RESTRICTIONS.contains(key)) {
+ if (!isDeviceOwner && userHandle != UserHandle.USER_OWNER
+ && DEVICE_OWNER_USER_RESTRICTIONS.contains(key)) {
throw new SecurityException("Profile owners cannot set user restriction " + key);
}
boolean alreadyRestricted = mUserManager.hasUserRestriction(key, user);
@@ -4801,17 +4803,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
long id = Binder.clearCallingIdentity();
try {
- UserManager um = UserManager.get(mContext);
- if (!um.getUserInfo(userId).isManagedProfile()) {
- throw new IllegalStateException(
- "Only call this method from a managed profile.");
+ if (DBG) {
+ Slog.v(LOG_TAG, "installing " + packageName + " for "
+ + userId);
}
+ UserManager um = UserManager.get(mContext);
UserInfo primaryUser = um.getProfileParent(userId);
- if (DBG) {
- Slog.v(LOG_TAG, "installing " + packageName + " for "
- + userId);
+ // Call did not come from a managed profile
+ if (primaryUser == null) {
+ primaryUser = um.getUserInfo(userId);
}
IPackageManager pm = AppGlobals.getPackageManager();
@@ -4847,13 +4849,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
try {
UserManager um = UserManager.get(mContext);
- if (!um.getUserInfo(userId).isManagedProfile()) {
- throw new IllegalStateException(
- "Only call this method from a managed profile.");
- }
-
UserInfo primaryUser = um.getProfileParent(userId);
+ // Call did not come from a managed profile.
+ if (primaryUser == null) {
+ primaryUser = um.getUserInfo(userId);
+ }
+
IPackageManager pm = AppGlobals.getPackageManager();
List<ResolveInfo> activitiesToEnable = pm.queryIntentActivities(intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
@@ -4890,7 +4892,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
private boolean isSystemApp(IPackageManager pm, String packageName, int userId)
throws RemoteException {
- ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0, userId);
+ ApplicationInfo appInfo = pm.getApplicationInfo(packageName, GET_UNINSTALLED_PACKAGES,
+ userId);
return (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0;
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
index cc0d8df2adda..9c15f2b3b92f 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
@@ -24,10 +24,10 @@ import android.database.sqlite.SQLiteOpenHelper;
import android.hardware.soundtrigger.SoundTrigger;
import android.hardware.soundtrigger.SoundTrigger.Keyphrase;
import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
-import android.os.UserManager;
import android.text.TextUtils;
import android.util.Slog;
+import java.util.Locale;
import java.util.UUID;
/**
@@ -37,8 +37,7 @@ import java.util.UUID;
*/
public class DatabaseHelper extends SQLiteOpenHelper {
static final String TAG = "SoundModelDBHelper";
- // TODO: Set to false.
- static final boolean DBG = true;
+ static final boolean DBG = false;
private static final String NAME = "sound_model.db";
private static final int VERSION = 4;
@@ -67,11 +66,8 @@ public class DatabaseHelper extends SQLiteOpenHelper {
+ SoundModelContract.KEY_HINT_TEXT + " TEXT,"
+ SoundModelContract.KEY_USERS + " TEXT" + ")";
- private final UserManager mUserManager;
-
public DatabaseHelper(Context context) {
super(context, NAME, null, VERSION);
- mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
}
@Override
@@ -122,17 +118,20 @@ public class DatabaseHelper extends SQLiteOpenHelper {
/**
* Deletes the sound model and associated keyphrases.
*/
- public boolean deleteKeyphraseSoundModel(UUID modelUuid) {
- if (modelUuid == null) {
- Slog.w(TAG, "Model UUID must be specified for deletion");
- return false;
- }
-
+ public boolean deleteKeyphraseSoundModel(int keyphraseId, int userHandle, String bcp47Locale) {
+ // Sanitize the locale to guard against SQL injection.
+ bcp47Locale = Locale.forLanguageTag(bcp47Locale).toLanguageTag();
synchronized(this) {
- SQLiteDatabase db = getWritableDatabase();
- String soundModelClause = SoundModelContract.KEY_MODEL_UUID + "='"
- + modelUuid.toString() + "'";
+ KeyphraseSoundModel soundModel = getKeyphraseSoundModel(keyphraseId, userHandle,
+ bcp47Locale);
+ if (soundModel == null) {
+ return false;
+ }
+ // Delete all sound models for the given keyphrase and specified user.
+ SQLiteDatabase db = getWritableDatabase();
+ String soundModelClause = SoundModelContract.KEY_MODEL_UUID
+ + "='" + soundModel.uuid.toString() + "'";
try {
return db.delete(SoundModelContract.TABLE, soundModelClause, null) != 0;
} finally {
@@ -147,11 +146,15 @@ public class DatabaseHelper extends SQLiteOpenHelper {
*
* TODO: We only support one keyphrase currently.
*/
- public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId) {
+ public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, int userHandle,
+ String bcp47Locale) {
+ // Sanitize the locale to guard against SQL injection.
+ bcp47Locale = Locale.forLanguageTag(bcp47Locale).toLanguageTag();
synchronized(this) {
// Find the corresponding sound model ID for the keyphrase.
String selectQuery = "SELECT * FROM " + SoundModelContract.TABLE
- + " WHERE " + SoundModelContract.KEY_KEYPHRASE_ID + " = '" + keyphraseId + "'";
+ + " WHERE " + SoundModelContract.KEY_KEYPHRASE_ID + "= '" + keyphraseId
+ + "' AND " + SoundModelContract.KEY_LOCALE + "='" + bcp47Locale + "'";
SQLiteDatabase db = getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
@@ -160,14 +163,16 @@ public class DatabaseHelper extends SQLiteOpenHelper {
do {
int type = c.getInt(c.getColumnIndex(SoundModelContract.KEY_TYPE));
if (type != SoundTrigger.SoundModel.TYPE_KEYPHRASE) {
- Slog.w(TAG, "Ignoring sound model since it's type is incorrect");
+ if (DBG) {
+ Slog.w(TAG, "Ignoring SoundModel since it's type is incorrect");
+ }
continue;
}
String modelUuid = c.getString(
c.getColumnIndex(SoundModelContract.KEY_MODEL_UUID));
if (modelUuid == null) {
- Slog.w(TAG, "Ignoring sound model since it doesn't specify an ID");
+ Slog.w(TAG, "Ignoring SoundModel since it doesn't specify an ID");
continue;
}
@@ -176,7 +181,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
c.getColumnIndex(SoundModelContract.KEY_RECOGNITION_MODES));
int[] users = getArrayForCommaSeparatedString(
c.getString(c.getColumnIndex(SoundModelContract.KEY_USERS)));
- String locale = c.getString(
+ String modelLocale = c.getString(
c.getColumnIndex(SoundModelContract.KEY_LOCALE));
String text = c.getString(
c.getColumnIndex(SoundModelContract.KEY_HINT_TEXT));
@@ -184,28 +189,37 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// Only add keyphrases meant for the current user.
if (users == null) {
// No users present in the keyphrase.
- Slog.w(TAG, "Ignoring keyphrase since it doesn't specify users");
+ Slog.w(TAG, "Ignoring SoundModel since it doesn't specify users");
continue;
}
boolean isAvailableForCurrentUser = false;
- int currentUser = mUserManager.getUserHandle();
for (int user : users) {
- if (currentUser == user) {
+ if (userHandle == user) {
isAvailableForCurrentUser = true;
break;
}
}
if (!isAvailableForCurrentUser) {
- Slog.w(TAG, "Ignoring keyphrase since it's not for the current user");
+ if (DBG) {
+ Slog.w(TAG, "Ignoring SoundModel since user handles don't match");
+ }
continue;
+ } else {
+ if (DBG) Slog.d(TAG, "Found a SoundModel for user: " + userHandle);
}
Keyphrase[] keyphrases = new Keyphrase[1];
keyphrases[0] = new Keyphrase(
- keyphraseId, recognitionModes, locale, text, users);
- return new KeyphraseSoundModel(UUID.fromString(modelUuid),
+ keyphraseId, recognitionModes, modelLocale, text, users);
+ KeyphraseSoundModel model = new KeyphraseSoundModel(
+ UUID.fromString(modelUuid),
null /* FIXME use vendor UUID */, data, keyphrases);
+ if (DBG) {
+ Slog.d(TAG, "Found SoundModel for the given keyphrase/locale/user: "
+ + model);
+ }
+ return model;
} while (c.moveToNext());
}
Slog.w(TAG, "No SoundModel available for the given keyphrase");
@@ -218,15 +232,17 @@ public class DatabaseHelper extends SQLiteOpenHelper {
}
private static String getCommaSeparatedString(int[] users) {
- if (users == null || users.length == 0) {
+ if (users == null) {
return "";
}
- String csv = "";
- for (int user : users) {
- csv += String.valueOf(user);
- csv += ",";
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < users.length; i++) {
+ if (i != 0) {
+ sb.append(',');
+ }
+ sb.append(users[i]);
}
- return csv.substring(0, csv.length() - 1);
+ return sb.toString();
}
private static int[] getArrayForCommaSeparatedString(String text) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
index ad38b22e7a97..8ce7f74cef57 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
@@ -50,8 +50,7 @@ import java.util.UUID;
*/
public class SoundTriggerHelper implements SoundTrigger.StatusListener {
static final String TAG = "SoundTriggerHelper";
- // TODO: Set to false.
- static final boolean DBG = true;
+ static final boolean DBG = false;
/**
* Return codes for {@link #startRecognition(int, KeyphraseSoundModel,
@@ -166,8 +165,14 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
}
}
+ // Unload the previous model if the current one isn't invalid
+ // and, it's not the same as the new one, or we are already started
+ // if we are already started, we can get multiple calls to start
+ // if the underlying sound model changes, in which case we should unload and reload.
+ // The model reuse helps only in cases when we trigger and stop internally
+ // without a start recognition call.
if (mCurrentSoundModelHandle != INVALID_VALUE
- && !soundModel.uuid.equals(mCurrentSoundModelUuid)) {
+ && (!soundModel.uuid.equals(mCurrentSoundModelUuid) || mStarted)) {
Slog.w(TAG, "Unloading previous sound model");
int status = mModule.unloadSoundModel(mCurrentSoundModelHandle);
if (status != SoundTrigger.STATUS_OK) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 7c7b73236369..82b7f8b6eb52 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -446,7 +446,7 @@ public class VoiceInteractionManagerService extends SystemService {
//----------------- Model management APIs --------------------------------//
@Override
- public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId) {
+ public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId, String bcp47Locale) {
synchronized (this) {
if (mContext.checkCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES)
!= PackageManager.PERMISSION_GRANTED) {
@@ -455,9 +455,14 @@ public class VoiceInteractionManagerService extends SystemService {
}
}
+ if (bcp47Locale == null) {
+ throw new IllegalArgumentException("Illegal argument(s) in getKeyphraseSoundModel");
+ }
+
+ final int callingUid = UserHandle.getCallingUserId();
final long caller = Binder.clearCallingIdentity();
try {
- return mDbHelper.getKeyphraseSoundModel(keyphraseId);
+ return mDbHelper.getKeyphraseSoundModel(keyphraseId, callingUid, bcp47Locale);
} finally {
Binder.restoreCallingIdentity(caller);
}
@@ -495,7 +500,7 @@ public class VoiceInteractionManagerService extends SystemService {
}
@Override
- public int deleteKeyphraseSoundModel(int keyphraseId) {
+ public int deleteKeyphraseSoundModel(int keyphraseId, String bcp47Locale) {
synchronized (this) {
if (mContext.checkCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES)
!= PackageManager.PERMISSION_GRANTED) {
@@ -504,13 +509,16 @@ public class VoiceInteractionManagerService extends SystemService {
}
}
+ if (bcp47Locale == null) {
+ throw new IllegalArgumentException(
+ "Illegal argument(s) in deleteKeyphraseSoundModel");
+ }
+
+ final int callingUid = UserHandle.getCallingUserId();
final long caller = Binder.clearCallingIdentity();
boolean deleted = false;
try {
- KeyphraseSoundModel soundModel = mDbHelper.getKeyphraseSoundModel(keyphraseId);
- if (soundModel != null) {
- deleted = mDbHelper.deleteKeyphraseSoundModel(soundModel.uuid);
- }
+ deleted = mDbHelper.deleteKeyphraseSoundModel(keyphraseId, callingUid, bcp47Locale);
return deleted ? SoundTriggerHelper.STATUS_OK : SoundTriggerHelper.STATUS_ERROR;
} finally {
if (deleted) {
@@ -527,7 +535,8 @@ public class VoiceInteractionManagerService extends SystemService {
//----------------- SoundTrigger APIs --------------------------------//
@Override
- public boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId) {
+ public boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId,
+ String bcp47Locale) {
synchronized (this) {
if (mImpl == null || mImpl.mService == null
|| service.asBinder() != mImpl.mService.asBinder()) {
@@ -536,9 +545,15 @@ public class VoiceInteractionManagerService extends SystemService {
}
}
+ if (bcp47Locale == null) {
+ throw new IllegalArgumentException("Illegal argument(s) in isEnrolledForKeyphrase");
+ }
+
+ final int callingUid = UserHandle.getCallingUserId();
final long caller = Binder.clearCallingIdentity();
try {
- KeyphraseSoundModel model = mDbHelper.getKeyphraseSoundModel(keyphraseId);
+ KeyphraseSoundModel model =
+ mDbHelper.getKeyphraseSoundModel(keyphraseId, callingUid, bcp47Locale);
return model != null;
} finally {
Binder.restoreCallingIdentity(caller);
@@ -566,7 +581,8 @@ public class VoiceInteractionManagerService extends SystemService {
@Override
public int startRecognition(IVoiceInteractionService service, int keyphraseId,
- IRecognitionStatusCallback callback, RecognitionConfig recognitionConfig) {
+ String bcp47Locale, IRecognitionStatusCallback callback,
+ RecognitionConfig recognitionConfig) {
// Allow the call if this is the current voice interaction service.
synchronized (this) {
if (mImpl == null || mImpl.mService == null
@@ -575,14 +591,16 @@ public class VoiceInteractionManagerService extends SystemService {
"Caller is not the current voice interaction service");
}
- if (callback == null || recognitionConfig == null) {
+ if (callback == null || recognitionConfig == null || bcp47Locale == null) {
throw new IllegalArgumentException("Illegal argument(s) in startRecognition");
}
}
+ int callingUid = UserHandle.getCallingUserId();
final long caller = Binder.clearCallingIdentity();
try {
- KeyphraseSoundModel soundModel = mDbHelper.getKeyphraseSoundModel(keyphraseId);
+ KeyphraseSoundModel soundModel =
+ mDbHelper.getKeyphraseSoundModel(keyphraseId, callingUid, bcp47Locale);
if (soundModel == null
|| soundModel.uuid == null
|| soundModel.keyphrases == null) {
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 1a6c52f7cd9c..a71161adda37 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -80,6 +80,15 @@ public final class Call {
*/
public static final int STATE_CONNECTING = 9;
+ /**
+ * The key to retrieve the optional {@code PhoneAccount}s Telecom can bundle with its Call
+ * extras. Used to pass the phone accounts to display on the front end to the user in order to
+ * select phone accounts to (for example) place a call.
+ *
+ * @hide
+ */
+ public static final String AVAILABLE_PHONE_ACCOUNTS = "selectPhoneAccountAccounts";
+
public static class Details {
private final Uri mHandle;
private final int mHandlePresentation;
@@ -152,7 +161,7 @@ public final class Call {
/**
* @return For a {@link #STATE_DISCONNECTED} {@code Call}, the disconnect cause expressed
- * by {@link android.telecomm.DisconnectCause}.
+ * by {@link android.telecom.DisconnectCause}.
*/
public DisconnectCause getDisconnectCause() {
return mDisconnectCause;
diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java
index cae115db03a2..9be01380956a 100644
--- a/telecomm/java/android/telecom/DisconnectCause.java
+++ b/telecomm/java/android/telecom/DisconnectCause.java
@@ -85,6 +85,17 @@ public final class DisconnectCause implements Parcelable {
/**
* Creates a new DisconnectCause.
+ * @param label The localized label to show to the user to explain the disconnect.
+ * @param code The code for the disconnect cause.
+ * @param description The localized description to show to the user to explain the disconnect.
+ * @param reason The reason for the disconnect.
+ */
+ public DisconnectCause(int code, CharSequence label, CharSequence description, String reason) {
+ this(code, label, description, reason, ToneGenerator.TONE_UNKNOWN);
+ }
+
+ /**
+ * Creates a new DisconnectCause.
*
* @param code The code for the disconnect cause.
* @param label The localized label to show to the user to explain the disconnect.
diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java
index 03b38c2aaaad..d959e50dda5f 100644
--- a/telecomm/java/android/telecom/RemoteConnectionService.java
+++ b/telecomm/java/android/telecom/RemoteConnectionService.java
@@ -65,7 +65,11 @@ final class RemoteConnectionService {
parcel.getCallerDisplayName(),
parcel.getCallerDisplayNamePresentation());
// Set state after handle so that the client can identify the connection.
- connection.setState(parcel.getState());
+ if (parcel.getState() == Connection.STATE_DISCONNECTED) {
+ connection.setDisconnected(parcel.getDisconnectCause());
+ } else {
+ connection.setState(parcel.getState());
+ }
List<RemoteConnection> conferenceable = new ArrayList<>();
for (String confId : parcel.getConferenceableConnectionIds()) {
if (mConnectionById.containsKey(confId)) {
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index a91d92f01253..481e4836829f 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -306,22 +306,16 @@ public class TelecomManager {
/**
* Return the {@link PhoneAccount} which is the user-chosen default for making outgoing phone
- * calls with a specified URI scheme. This {@code PhoneAccount} will always be a member of the
- * list which is returned from calling {@link #getCallCapablePhoneAccounts()}.
+ * calls with a specified URI scheme.
* <p>
* Apps must be prepared for this method to return {@code null}, indicating that there currently
- * exists no user-chosen default {@code PhoneAccount}. In this case, apps wishing to initiate a
- * phone call must either create their {@link android.content.Intent#ACTION_CALL} or
- * {@link android.content.Intent#ACTION_DIAL} {@code Intent} with no
- * {@link TelecomManager#EXTRA_PHONE_ACCOUNT_HANDLE}, or present the user with an affordance to
- * select one of the elements of {@link #getCallCapablePhoneAccounts()}.
+ * exists no user-chosen default {@code PhoneAccount}.
* <p>
- * An {@link android.content.Intent#ACTION_CALL} or {@link android.content.Intent#ACTION_DIAL}
- * {@code Intent} with no {@link TelecomManager#EXTRA_PHONE_ACCOUNT_HANDLE} is valid, and
- * subsequent steps in the phone call flow are responsible for presenting the user with an
- * affordance, if necessary, to choose a {@code PhoneAccount}.
- *
* @param uriScheme The URI scheme.
+ * @return The {@link PhoneAccountHandle} corresponding to the user-chosen default for outgoing
+ * phone calls for a specified URI scheme.
+ *
+ * @hide
*/
public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) {
try {
@@ -371,24 +365,6 @@ public class TelecomManager {
}
/**
- * Return a list of {@link PhoneAccountHandle}s which can be used to make and receive phone
- * calls.
- *
- * @see #EXTRA_PHONE_ACCOUNT_HANDLE
- * @return A list of {@code PhoneAccountHandle} objects.
- */
- public List<PhoneAccountHandle> getCallCapablePhoneAccounts() {
- try {
- if (isServiceConnected()) {
- return getTelecomService().getCallCapablePhoneAccounts();
- }
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts", e);
- }
- return new ArrayList<>();
- }
-
- /**
* Returns the current SIM call manager. Apps must be prepared for this method to return
* {@code null}, indicating that there currently exists no user-chosen default
* {@code PhoneAccount}.
@@ -459,6 +435,8 @@ public class TelecomManager {
*
* @param uriScheme The URI scheme.
* @return A list of {@code PhoneAccountHandle} objects supporting the URI scheme.
+ *
+ * @hide
*/
public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) {
try {
@@ -471,6 +449,27 @@ public class TelecomManager {
return new ArrayList<>();
}
+
+ /**
+ * Return a list of {@link PhoneAccountHandle}s which can be used to make and receive phone
+ * calls.
+ *
+ * @see #EXTRA_PHONE_ACCOUNT_HANDLE
+ * @return A list of {@code PhoneAccountHandle} objects.
+ *
+ * @hide
+ */
+ public List<PhoneAccountHandle> getCallCapablePhoneAccounts() {
+ try {
+ if (isServiceConnected()) {
+ return getTelecomService().getCallCapablePhoneAccounts();
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts", e);
+ }
+ return new ArrayList<>();
+ }
+
/**
* Determine whether the device has more than one account registered that can make and receive
* phone calls.
@@ -483,6 +482,22 @@ public class TelecomManager {
}
/**
+ * Returns a list of all {@link PhoneAccount}s registered for the calling package.
+ *
+ * @return A list of {@code PhoneAccountHandle} objects.
+ */
+ public List<PhoneAccountHandle> getPhoneAccountsForPackage() {
+ try {
+ if (isServiceConnected()) {
+ return getTelecomService().getPhoneAccountsForPackage(mContext.getPackageName());
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e);
+ }
+ return null;
+ }
+
+ /**
* Return the {@link PhoneAccount} for a specified {@link PhoneAccountHandle}. Object includes
* resources which can be used in a user interface.
*
diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
index 77a80fe5b70f..feb09d570e19 100644
--- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl
@@ -60,6 +60,11 @@ interface ITelecomService {
List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme);
/**
+ * @see TelecomManager#getPhoneAccountsForPackage
+ */
+ List<PhoneAccountHandle> getPhoneAccountsForPackage(in String packageName);
+
+ /**
* @see TelecomManager#getPhoneAccount
*/
PhoneAccount getPhoneAccount(in PhoneAccountHandle account);
diff --git a/tests/Compatibility/Android.mk b/tests/Compatibility/Android.mk
index 5385413cb8d9..0ec4d9d5d77e 100644
--- a/tests/Compatibility/Android.mk
+++ b/tests/Compatibility/Android.mk
@@ -18,12 +18,12 @@ include $(CLEAR_VARS)
# We only want this apk build for tests.
LOCAL_MODULE_TAGS := tests
+LOCAL_JAVA_LIBRARIES := android.test.runner
# Include all test java files.
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
-LOCAL_SDK_VERSION := 8
LOCAL_PACKAGE_NAME := AppCompatibilityTest
include $(BUILD_PACKAGE)
diff --git a/tests/Compatibility/AndroidManifest.xml b/tests/Compatibility/AndroidManifest.xml
index 103ef4c8daa3..28845328eb24 100644
--- a/tests/Compatibility/AndroidManifest.xml
+++ b/tests/Compatibility/AndroidManifest.xml
@@ -24,6 +24,4 @@
android:name=".AppCompatibilityRunner"
android:targetPackage="com.android.compatibilitytest"
android:label="App Compability Test Runner" />
-
- <uses-sdk android:minSdkVersion="8"></uses-sdk>
</manifest>
diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
index a2e9117e8841..5794b2bc0c4b 100644
--- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
+++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java
@@ -147,11 +147,19 @@ public class AppCompatibility extends InstrumentationTestCase {
* during the app launch.
*/
private ProcessErrorStateInfo launchActivity(String packageName) {
+ // the recommended way to see if this is a tv or not.
+ boolean isleanback = !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)
+ && !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- Intent intent = mPackageManager.getLaunchIntentForPackage(packageName);
+ Intent intent;
+ if (isleanback) {
+ Log.d(TAG, "Leanback and relax!");
+ intent = mPackageManager.getLeanbackLaunchIntentForPackage(packageName);
+ } else {
+ intent = mPackageManager.getLaunchIntentForPackage(packageName);
+ }
// Skip if the apk does not have a launch intent.
if (intent == null) {
Log.d(TAG, "Skipping " + packageName + "; missing launch intent");
diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h
index 3fc9f815c1a9..d809c5b3003c 100644
--- a/tools/aapt/AaptAssets.h
+++ b/tools/aapt/AaptAssets.h
@@ -104,6 +104,9 @@ private:
struct AaptGroupEntry
{
public:
+ AaptGroupEntry() {}
+ AaptGroupEntry(const ConfigDescription& config) : mParams(config) {}
+
bool initFromDirName(const char* dir, String8* resType);
inline const ConfigDescription& toParams() const { return mParams; }
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 137c85ce6ef2..56d1650c3652 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -1483,7 +1483,7 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con
return NO_ERROR;
}
-status_t postProcessImage(const sp<AaptAssets>& assets,
+status_t postProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets,
ResourceTable* table, const sp<AaptFile>& file)
{
String8 ext(file->getPath().getPathExtension());
@@ -1491,7 +1491,8 @@ status_t postProcessImage(const sp<AaptAssets>& assets,
// At this point, now that we have all the resource data, all we need to
// do is compile XML files.
if (strcmp(ext.string(), ".xml") == 0) {
- return compileXmlFile(assets, file, table);
+ String16 resourceName(parseResourceName(file->getPath().getPathLeaf()));
+ return compileXmlFile(bundle, assets, resourceName, file, table);
}
return NO_ERROR;
diff --git a/tools/aapt/Images.h b/tools/aapt/Images.h
index 91b6554c02c9..a0a94f8b9d16 100644
--- a/tools/aapt/Images.h
+++ b/tools/aapt/Images.h
@@ -20,7 +20,7 @@ status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets,
status_t preProcessImageToCache(const Bundle* bundle, const String8& source, const String8& dest);
-status_t postProcessImage(const sp<AaptAssets>& assets,
+status_t postProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets,
ResourceTable* table, const sp<AaptFile>& file);
#endif
diff --git a/tools/aapt/Main.h b/tools/aapt/Main.h
index f24a023b70a1..089dde5fcb8c 100644
--- a/tools/aapt/Main.h
+++ b/tools/aapt/Main.h
@@ -62,4 +62,7 @@ int dumpResources(Bundle* bundle);
status_t writeDependencyPreReqs(Bundle* bundle, const sp<AaptAssets>& assets,
FILE* fp, bool includeRaw);
+
+android::String8 parseResourceName(const String8& pathLeaf);
+
#endif // __MAIN_H
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp
index afec5edd3f0f..a4c9dabb6be9 100644
--- a/tools/aapt/Resource.cpp
+++ b/tools/aapt/Resource.cpp
@@ -50,7 +50,7 @@ public:
// ==========================================================================
// ==========================================================================
-static String8 parseResourceName(const String8& leaf)
+String8 parseResourceName(const String8& leaf)
{
const char* firstDot = strchr(leaf.string(), '.');
const char* str = leaf.string();
@@ -781,12 +781,18 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "versionName",
bundle->getVersionName(), errorOnFailedInsert, replaceVersion)) {
return UNKNOWN_ERROR;
+ } else {
+ const XMLNode::attribute_entry* attr = root->getAttribute(
+ String16(RESOURCES_ANDROID_NAMESPACE), String16("versionName"));
+ if (attr != NULL) {
+ bundle->setVersionName(strdup(String8(attr->string).string()));
+ }
}
+ sp<XMLNode> vers = root->getChildElement(String16(), String16("uses-sdk"));
if (bundle->getMinSdkVersion() != NULL
|| bundle->getTargetSdkVersion() != NULL
|| bundle->getMaxSdkVersion() != NULL) {
- sp<XMLNode> vers = root->getChildElement(String16(), String16("uses-sdk"));
if (vers == NULL) {
vers = XMLNode::newElement(root->getFilename(), String16(), String16("uses-sdk"));
root->insertChildAt(vers, 0);
@@ -806,6 +812,14 @@ status_t massageManifest(Bundle* bundle, sp<XMLNode> root)
}
}
+ if (vers != NULL) {
+ const XMLNode::attribute_entry* attr = vers->getAttribute(
+ String16(RESOURCES_ANDROID_NAMESPACE), String16("minSdkVersion"));
+ if (attr != NULL) {
+ bundle->setMinSdkVersion(strdup(String8(attr->string).string()));
+ }
+ }
+
if (bundle->getPlatformBuildVersionCode() != "") {
if (!addTagAttribute(root, "", "platformBuildVersionCode",
bundle->getPlatformBuildVersionCode(), errorOnFailedInsert, true)) {
@@ -973,8 +987,8 @@ static ssize_t extractPlatformBuildVersion(ResXMLTree& tree, Bundle* bundle) {
static ssize_t extractPlatformBuildVersion(AssetManager& assets, Bundle* bundle) {
int32_t cookie = getPlatformAssetCookie(assets);
if (cookie == 0) {
- fprintf(stderr, "ERROR: Platform package not found\n");
- return UNKNOWN_ERROR;
+ // No platform was loaded.
+ return NO_ERROR;
}
ResXMLTree tree;
@@ -1074,7 +1088,7 @@ status_t generateAndroidManifestForSplit(Bundle* bundle, const sp<AaptAssets>& a
manifest->addChild(app);
root->addChild(manifest);
- int err = compileXmlFile(assets, root, outFile, table);
+ int err = compileXmlFile(bundle, assets, String16(), root, outFile, table);
if (err < NO_ERROR) {
return err;
}
@@ -1322,7 +1336,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
ResourceDirIterator it(layouts, String8("layout"));
while ((err=it.next()) == NO_ERROR) {
String8 src = it.getFile()->getPrintableSource();
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err == NO_ERROR) {
ResXMLTree block;
block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
@@ -1341,7 +1356,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (anims != NULL) {
ResourceDirIterator it(anims, String8("anim"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1356,7 +1372,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (animators != NULL) {
ResourceDirIterator it(animators, String8("animator"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1371,7 +1388,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (interpolators != NULL) {
ResourceDirIterator it(interpolators, String8("interpolator"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1386,7 +1404,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (transitions != NULL) {
ResourceDirIterator it(transitions, String8("transition"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1401,7 +1420,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (xmls != NULL) {
ResourceDirIterator it(xmls, String8("xml"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1416,7 +1436,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (drawables != NULL) {
ResourceDirIterator it(drawables, String8("drawable"));
while ((err=it.next()) == NO_ERROR) {
- err = postProcessImage(assets, &table, it.getFile());
+ err = postProcessImage(bundle, assets, &table, it.getFile());
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1431,7 +1451,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (colors != NULL) {
ResourceDirIterator it(colors, String8("color"));
while ((err=it.next()) == NO_ERROR) {
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err != NO_ERROR) {
hasErrors = true;
}
@@ -1447,7 +1468,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
ResourceDirIterator it(menus, String8("menu"));
while ((err=it.next()) == NO_ERROR) {
String8 src = it.getFile()->getPrintableSource();
- err = compileXmlFile(assets, it.getFile(), &table, xmlFlags);
+ err = compileXmlFile(bundle, assets, String16(it.getBaseName()),
+ it.getFile(), &table, xmlFlags);
if (err == NO_ERROR) {
ResXMLTree block;
block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true);
@@ -1463,6 +1485,22 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
err = NO_ERROR;
}
+ // Now compile any generated resources.
+ std::queue<CompileResourceWorkItem>& workQueue = table.getWorkQueue();
+ while (!workQueue.empty()) {
+ CompileResourceWorkItem& workItem = workQueue.front();
+ err = compileXmlFile(bundle, assets, workItem.resourceName, workItem.file, &table, xmlFlags);
+ if (err == NO_ERROR) {
+ assets->addResource(workItem.resPath.getPathLeaf(),
+ workItem.resPath,
+ workItem.file,
+ workItem.file->getResourceType());
+ } else {
+ hasErrors = true;
+ }
+ workQueue.pop();
+ }
+
if (table.validateLocalizations()) {
hasErrors = true;
}
@@ -1495,11 +1533,15 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
if (err < NO_ERROR) {
return err;
}
- err = compileXmlFile(assets, manifestTree, manifestFile, &table);
+ err = compileXmlFile(bundle, assets, String16(), manifestTree, manifestFile, &table);
if (err < NO_ERROR) {
return err;
}
+ if (table.modifyForCompat(bundle) != NO_ERROR) {
+ return UNKNOWN_ERROR;
+ }
+
//block.restart();
//printXMLBlock(&block);
@@ -1581,7 +1623,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil
sp<AaptFile> outManifestFile = new AaptFile(manifestFile->getSourceFile(),
manifestFile->getGroupEntry(),
manifestFile->getResourceType());
- err = compileXmlFile(assets, manifestFile,
+ err = compileXmlFile(bundle, assets, String16(), manifestFile,
outManifestFile, &table,
XML_COMPILE_ASSIGN_ATTRIBUTE_IDS
| XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES);
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 8341de6c4ba5..b8c34543c361 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -12,11 +12,14 @@
#include <androidfw/ResourceTypes.h>
#include <utils/ByteOrder.h>
+#include <utils/TypeHelpers.h>
#include <stdarg.h>
#define NOISY(x) //x
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<AaptFile>& target,
ResourceTable* table,
int options)
@@ -26,10 +29,12 @@ status_t compileXmlFile(const sp<AaptAssets>& assets,
return UNKNOWN_ERROR;
}
- return compileXmlFile(assets, root, target, table, options);
+ return compileXmlFile(bundle, assets, resourceName, root, target, table, options);
}
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<AaptFile>& target,
const sp<AaptFile>& outTarget,
ResourceTable* table,
@@ -40,10 +45,12 @@ status_t compileXmlFile(const sp<AaptAssets>& assets,
return UNKNOWN_ERROR;
}
- return compileXmlFile(assets, root, outTarget, table, options);
+ return compileXmlFile(bundle, assets, resourceName, root, outTarget, table, options);
}
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<XMLNode>& root,
const sp<AaptFile>& target,
ResourceTable* table,
@@ -76,6 +83,10 @@ status_t compileXmlFile(const sp<AaptAssets>& assets,
if (hasErrors) {
return UNKNOWN_ERROR;
}
+
+ if (table->modifyForCompat(bundle, resourceName, target, root) != NO_ERROR) {
+ return UNKNOWN_ERROR;
+ }
NOISY(printf("Input XML Resource:\n"));
NOISY(root->print());
@@ -3287,6 +3298,18 @@ ResourceTable::Item::Item(const SourcePos& _sourcePos,
}
}
+ResourceTable::Entry::Entry(const Entry& entry)
+ : RefBase()
+ , mName(entry.mName)
+ , mParent(entry.mParent)
+ , mType(entry.mType)
+ , mItem(entry.mItem)
+ , mItemFormat(entry.mItemFormat)
+ , mBag(entry.mBag)
+ , mNameIndex(entry.mNameIndex)
+ , mParentId(entry.mParentId)
+ , mPos(entry.mPos) {}
+
status_t ResourceTable::Entry::makeItABag(const SourcePos& sourcePos)
{
if (mType == TYPE_BAG) {
@@ -3372,6 +3395,17 @@ status_t ResourceTable::Entry::addToBag(const SourcePos& sourcePos,
return NO_ERROR;
}
+status_t ResourceTable::Entry::removeFromBag(const String16& key) {
+ if (mType != Entry::TYPE_BAG) {
+ return NO_ERROR;
+ }
+
+ if (mBag.removeItem(key) >= 0) {
+ return NO_ERROR;
+ }
+ return UNKNOWN_ERROR;
+}
+
status_t ResourceTable::Entry::emptyBag(const SourcePos& sourcePos)
{
status_t err = makeItABag(sourcePos);
@@ -4004,6 +4038,39 @@ sp<ResourceTable::Entry> ResourceTable::getEntry(const String16& package,
return t->getEntry(name, sourcePos, config, doSetIndex, overlay, mBundle->getAutoAddOverlay());
}
+sp<ResourceTable::ConfigList> ResourceTable::getConfigList(const String16& package,
+ const String16& type, const String16& name) const
+{
+ const size_t packageCount = mOrderedPackages.size();
+ for (size_t pi = 0; pi < packageCount; pi++) {
+ const sp<Package>& p = mOrderedPackages[pi];
+ if (p == NULL || p->getName() != package) {
+ continue;
+ }
+
+ const Vector<sp<Type> >& types = p->getOrderedTypes();
+ const size_t typeCount = types.size();
+ for (size_t ti = 0; ti < typeCount; ti++) {
+ const sp<Type>& t = types[ti];
+ if (t == NULL || t->getName() != type) {
+ continue;
+ }
+
+ const Vector<sp<ConfigList> >& configs = t->getOrderedConfigs();
+ const size_t configCount = configs.size();
+ for (size_t ci = 0; ci < configCount; ci++) {
+ const sp<ConfigList>& cl = configs[ci];
+ if (cl == NULL || cl->getName() != name) {
+ continue;
+ }
+
+ return cl;
+ }
+ }
+ }
+ return NULL;
+}
+
sp<const ResourceTable::Entry> ResourceTable::getEntry(uint32_t resID,
const ResTable_config* config) const
{
@@ -4113,3 +4180,283 @@ bool ResourceTable::getItemValue(
}
return res;
}
+
+/**
+ * Returns true if the given attribute ID comes from
+ * a platform version from or after L.
+ */
+bool ResourceTable::isAttributeFromL(uint32_t attrId) {
+ const uint32_t baseAttrId = 0x010103f7;
+ if ((attrId & 0xffff0000) != (baseAttrId & 0xffff0000)) {
+ return false;
+ }
+
+ uint32_t specFlags;
+ if (!mAssets->getIncludedResources().getResourceFlags(attrId, &specFlags)) {
+ return false;
+ }
+
+ return (specFlags & ResTable_typeSpec::SPEC_PUBLIC) != 0 &&
+ (attrId & 0x0000ffff) >= (baseAttrId & 0x0000ffff);
+}
+
+static bool isMinSdkVersionLOrAbove(const Bundle* bundle) {
+ if (bundle->getMinSdkVersion() != NULL && strlen(bundle->getMinSdkVersion()) > 0) {
+ const char firstChar = bundle->getMinSdkVersion()[0];
+ if (firstChar >= 'L' && firstChar <= 'Z') {
+ // L is the code-name for the v21 release.
+ return true;
+ }
+
+ const int minSdk = atoi(bundle->getMinSdkVersion());
+ if (minSdk >= SDK_L) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * Modifies the entries in the resource table to account for compatibility
+ * issues with older versions of Android.
+ *
+ * This primarily handles the issue of private/public attribute clashes
+ * in framework resources.
+ *
+ * AAPT has traditionally assigned resource IDs to public attributes,
+ * and then followed those public definitions with private attributes.
+ *
+ * --- PUBLIC ---
+ * | 0x01010234 | attr/color
+ * | 0x01010235 | attr/background
+ *
+ * --- PRIVATE ---
+ * | 0x01010236 | attr/secret
+ * | 0x01010237 | attr/shhh
+ *
+ * Each release, when attributes are added, they take the place of the private
+ * attributes and the private attributes are shifted down again.
+ *
+ * --- PUBLIC ---
+ * | 0x01010234 | attr/color
+ * | 0x01010235 | attr/background
+ * | 0x01010236 | attr/shinyNewAttr
+ * | 0x01010237 | attr/highlyValuedFeature
+ *
+ * --- PRIVATE ---
+ * | 0x01010238 | attr/secret
+ * | 0x01010239 | attr/shhh
+ *
+ * Platform code may look for private attributes set in a theme. If an app
+ * compiled against a newer version of the platform uses a new public
+ * attribute that happens to have the same ID as the private attribute
+ * the older platform is expecting, then the behavior is undefined.
+ *
+ * We get around this by detecting any newly defined attributes (in L),
+ * copy the resource into a -v21 qualified resource, and delete the
+ * attribute from the original resource. This ensures that older platforms
+ * don't see the new attribute, but when running on L+ platforms, the
+ * attribute will be respected.
+ */
+status_t ResourceTable::modifyForCompat(const Bundle* bundle) {
+ if (isMinSdkVersionLOrAbove(bundle)) {
+ // If this app will only ever run on L+ devices,
+ // we don't need to do any compatibility work.
+ return NO_ERROR;
+ }
+
+ const String16 attr16("attr");
+
+ const size_t packageCount = mOrderedPackages.size();
+ for (size_t pi = 0; pi < packageCount; pi++) {
+ sp<Package> p = mOrderedPackages.itemAt(pi);
+ if (p == NULL || p->getTypes().size() == 0) {
+ // Empty, skip!
+ continue;
+ }
+
+ const size_t typeCount = p->getOrderedTypes().size();
+ for (size_t ti = 0; ti < typeCount; ti++) {
+ sp<Type> t = p->getOrderedTypes().itemAt(ti);
+ if (t == NULL) {
+ continue;
+ }
+
+ const size_t configCount = t->getOrderedConfigs().size();
+ for (size_t ci = 0; ci < configCount; ci++) {
+ sp<ConfigList> c = t->getOrderedConfigs().itemAt(ci);
+ if (c == NULL) {
+ continue;
+ }
+
+ Vector<key_value_pair_t<ConfigDescription, sp<Entry> > > entriesToAdd;
+ const DefaultKeyedVector<ConfigDescription, sp<Entry> >& entries =
+ c->getEntries();
+ const size_t entryCount = entries.size();
+ for (size_t ei = 0; ei < entryCount; ei++) {
+ sp<Entry> e = entries.valueAt(ei);
+ if (e == NULL || e->getType() != Entry::TYPE_BAG) {
+ continue;
+ }
+
+ const ConfigDescription& config = entries.keyAt(ei);
+ if (config.sdkVersion >= SDK_L) {
+ // We don't need to do anything if the resource is
+ // already qualified for version 21 or higher.
+ continue;
+ }
+
+ Vector<String16> attributesToRemove;
+ const KeyedVector<String16, Item>& bag = e->getBag();
+ const size_t bagCount = bag.size();
+ for (size_t bi = 0; bi < bagCount; bi++) {
+ const Item& item = bag.valueAt(bi);
+ const uint32_t attrId = getResId(bag.keyAt(bi), &attr16);
+ if (isAttributeFromL(attrId)) {
+ attributesToRemove.add(bag.keyAt(bi));
+ }
+ }
+
+ if (attributesToRemove.isEmpty()) {
+ continue;
+ }
+
+ // Duplicate the entry under the same configuration
+ // but with sdkVersion == SDK_L.
+ ConfigDescription newConfig(config);
+ newConfig.sdkVersion = SDK_L;
+ entriesToAdd.add(key_value_pair_t<ConfigDescription, sp<Entry> >(
+ newConfig, new Entry(*e)));
+
+ // Remove the attribute from the original.
+ for (size_t i = 0; i < attributesToRemove.size(); i++) {
+ e->removeFromBag(attributesToRemove[i]);
+ }
+ }
+
+ const size_t entriesToAddCount = entriesToAdd.size();
+ for (size_t i = 0; i < entriesToAddCount; i++) {
+ if (entries.indexOfKey(entriesToAdd[i].key) >= 0) {
+ // An entry already exists for this config.
+ // That means that any attributes that were
+ // defined in L in the original bag will be overriden
+ // anyways on L devices, so we do nothing.
+ continue;
+ }
+
+ entriesToAdd[i].value->getPos()
+ .printf("using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.",
+ SDK_L,
+ String8(p->getName()).string(),
+ String8(t->getName()).string(),
+ String8(entriesToAdd[i].value->getName()).string(),
+ entriesToAdd[i].key.toString().string());
+
+ c->addEntry(entriesToAdd[i].key, entriesToAdd[i].value);
+ }
+ }
+ }
+ }
+ return NO_ERROR;
+}
+
+status_t ResourceTable::modifyForCompat(const Bundle* bundle,
+ const String16& resourceName,
+ const sp<AaptFile>& target,
+ const sp<XMLNode>& root) {
+ if (isMinSdkVersionLOrAbove(bundle)) {
+ return NO_ERROR;
+ }
+
+ if (target->getResourceType() == "" || target->getGroupEntry().toParams().sdkVersion >= SDK_L) {
+ // Skip resources that have no type (AndroidManifest.xml) or are already version qualified with v21
+ // or higher.
+ return NO_ERROR;
+ }
+
+ Vector<key_value_pair_t<sp<XMLNode>, size_t> > attrsToRemove;
+
+ Vector<sp<XMLNode> > nodesToVisit;
+ nodesToVisit.push(root);
+ while (!nodesToVisit.isEmpty()) {
+ sp<XMLNode> node = nodesToVisit.top();
+ nodesToVisit.pop();
+
+ const Vector<XMLNode::attribute_entry>& attrs = node->getAttributes();
+ const size_t attrCount = attrs.size();
+ for (size_t i = 0; i < attrCount; i++) {
+ const XMLNode::attribute_entry& attr = attrs[i];
+ if (isAttributeFromL(attr.nameResId)) {
+ attrsToRemove.add(key_value_pair_t<sp<XMLNode>, size_t>(node, i));
+ }
+ }
+
+ // Schedule a visit to the children.
+ const Vector<sp<XMLNode> >& children = node->getChildren();
+ const size_t childCount = children.size();
+ for (size_t i = 0; i < childCount; i++) {
+ nodesToVisit.push(children[i]);
+ }
+ }
+
+ if (attrsToRemove.isEmpty()) {
+ return NO_ERROR;
+ }
+
+ ConfigDescription newConfig(target->getGroupEntry().toParams());
+ newConfig.sdkVersion = SDK_L;
+
+ // Look to see if we already have an overriding v21 configuration.
+ sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()),
+ String16(target->getResourceType()), resourceName);
+ if (cl->getEntries().indexOfKey(newConfig) < 0) {
+ // We don't have an overriding entry for v21, so we must duplicate this one.
+ sp<XMLNode> newRoot = root->clone();
+ sp<AaptFile> newFile = new AaptFile(target->getSourceFile(),
+ AaptGroupEntry(newConfig), target->getResourceType());
+ String8 resPath = String8::format("res/%s/%s",
+ newFile->getGroupEntry().toDirName(target->getResourceType()).string(),
+ target->getPath().getPathLeaf().string());
+ resPath.convertToResPath();
+
+ // Add a resource table entry.
+ SourcePos(target->getSourceFile(), -1).printf(
+ "using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.",
+ SDK_L,
+ mAssets->getPackage().string(),
+ newFile->getResourceType().string(),
+ String8(resourceName).string(),
+ newConfig.toString().string());
+
+ addEntry(SourcePos(),
+ String16(mAssets->getPackage()),
+ String16(target->getResourceType()),
+ resourceName,
+ String16(resPath),
+ NULL,
+ &newConfig);
+
+ // Schedule this to be compiled.
+ CompileResourceWorkItem item;
+ item.resourceName = resourceName;
+ item.resPath = resPath;
+ item.file = newFile;
+ mWorkQueue.push(item);
+ }
+
+ const size_t removeCount = attrsToRemove.size();
+ for (size_t i = 0; i < removeCount; i++) {
+ sp<XMLNode> node = attrsToRemove[i].key;
+ size_t attrIndex = attrsToRemove[i].value;
+ const XMLNode::attribute_entry& ae = node->getAttributes()[attrIndex];
+ SourcePos(node->getFilename(), node->getStartLineNumber()).printf(
+ "removing attribute %s%s%s from <%s>",
+ String8(ae.ns).string(),
+ (ae.ns.size() == 0 ? "" : ":"),
+ String8(ae.name).string(),
+ String8(node->getElementName()).string());
+ node->removeAttribute(attrIndex);
+ }
+
+ return NO_ERROR;
+}
diff --git a/tools/aapt/ResourceTable.h b/tools/aapt/ResourceTable.h
index 3721de4af015..c548a851fb2e 100644
--- a/tools/aapt/ResourceTable.h
+++ b/tools/aapt/ResourceTable.h
@@ -12,8 +12,9 @@
#include "SourcePos.h"
#include "ResourceFilter.h"
-#include <set>
#include <map>
+#include <queue>
+#include <set>
using namespace std;
@@ -33,18 +34,24 @@ enum {
| XML_COMPILE_STRIP_WHITESPACE | XML_COMPILE_STRIP_RAW_VALUES
};
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<AaptFile>& target,
ResourceTable* table,
int options = XML_COMPILE_STANDARD_RESOURCE);
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<AaptFile>& target,
const sp<AaptFile>& outTarget,
ResourceTable* table,
int options = XML_COMPILE_STANDARD_RESOURCE);
-status_t compileXmlFile(const sp<AaptAssets>& assets,
+status_t compileXmlFile(const Bundle* bundle,
+ const sp<AaptAssets>& assets,
+ const String16& resourceName,
const sp<XMLNode>& xmlTree,
const sp<AaptFile>& target,
ResourceTable* table,
@@ -71,6 +78,14 @@ struct AccessorCookie
}
};
+// Holds the necessary information to compile the
+// resource.
+struct CompileResourceWorkItem {
+ String16 resourceName;
+ String8 resPath;
+ sp<AaptFile> file;
+};
+
class ResourceTable : public ResTable::Accessor
{
public:
@@ -92,6 +107,18 @@ public:
return mAssetsPackage;
}
+ /**
+ * Returns the queue of resources that need to be compiled.
+ * This is only used for resources that have been generated
+ * during the compilation phase. If they were just added
+ * to the AaptAssets, then they may be skipped over
+ * and would mess up iteration order for the existing
+ * resources.
+ */
+ queue<CompileResourceWorkItem>& getWorkQueue() {
+ return mWorkQueue;
+ }
+
status_t addIncludedResources(Bundle* bundle, const sp<AaptAssets>& assets);
status_t addPublic(const SourcePos& pos,
@@ -165,6 +192,12 @@ public:
size_t numLocalResources() const;
bool hasResources() const;
+ status_t modifyForCompat(const Bundle* bundle);
+ status_t modifyForCompat(const Bundle* bundle,
+ const String16& resourceName,
+ const sp<AaptFile>& file,
+ const sp<XMLNode>& root);
+
sp<AaptFile> flatten(Bundle* bundle, const sp<const ResourceFilter>& filter,
const bool isBase);
@@ -281,6 +314,9 @@ public:
: mName(name), mType(TYPE_UNKNOWN),
mItemFormat(ResTable_map::TYPE_ANY), mNameIndex(-1), mPos(pos)
{ }
+
+ Entry(const Entry& entry);
+
virtual ~Entry() { }
enum type {
@@ -311,6 +347,8 @@ public:
bool replace=false, bool isId = false,
int32_t format = ResTable_map::TYPE_ANY);
+ status_t removeFromBag(const String16& key);
+
// Index of the entry's name string in the key pool.
int32_t getNameIndex() const { return mNameIndex; }
void setNameIndex(int32_t index) { mNameIndex = index; }
@@ -520,9 +558,13 @@ private:
bool doSetIndex = false);
sp<const Entry> getEntry(uint32_t resID,
const ResTable_config* config = NULL) const;
+ sp<ConfigList> getConfigList(const String16& package,
+ const String16& type,
+ const String16& name) const;
const Item* getItem(uint32_t resID, uint32_t attrID) const;
bool getItemValue(uint32_t resID, uint32_t attrID,
Res_value* outValue);
+ bool isAttributeFromL(uint32_t attrId);
String16 mAssetsPackage;
@@ -537,6 +579,7 @@ private:
// key = string resource name, value = set of locales in which that name is defined
map<String16, map<String8, SourcePos> > mLocalizations;
+ queue<CompileResourceWorkItem> mWorkQueue;
};
#endif
diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp
index 607d419b2971..51a4154d5335 100644
--- a/tools/aapt/XMLNode.cpp
+++ b/tools/aapt/XMLNode.cpp
@@ -621,6 +621,12 @@ sp<XMLNode> XMLNode::parse(const sp<AaptFile>& file)
return state.root;
}
+XMLNode::XMLNode()
+ : mNextAttributeIndex(0x80000000)
+ , mStartLineNumber(0)
+ , mEndLineNumber(0)
+ , mUTF8(false) {}
+
XMLNode::XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace)
: mNextAttributeIndex(0x80000000)
, mFilename(filename)
@@ -810,6 +816,32 @@ status_t XMLNode::addAttribute(const String16& ns, const String16& name,
return NO_ERROR;
}
+status_t XMLNode::removeAttribute(size_t index)
+{
+ if (getType() == TYPE_CDATA) {
+ return UNKNOWN_ERROR;
+ }
+
+ if (index >= mAttributes.size()) {
+ return UNKNOWN_ERROR;
+ }
+
+ const attribute_entry& e = mAttributes[index];
+ const uint32_t key = e.nameResId ? e.nameResId : e.index;
+ mAttributeOrder.removeItem(key);
+ mAttributes.removeAt(index);
+
+ // Shift all the indices.
+ const size_t attrCount = mAttributeOrder.size();
+ for (size_t i = 0; i < attrCount; i++) {
+ size_t attrIdx = mAttributeOrder[i];
+ if (attrIdx > index) {
+ mAttributeOrder.replaceValueAt(i, attrIdx - 1);
+ }
+ }
+ return NO_ERROR;
+}
+
void XMLNode::setAttributeResID(size_t attrIdx, uint32_t resId)
{
attribute_entry& e = mAttributes.editItemAt(attrIdx);
@@ -999,6 +1031,30 @@ status_t XMLNode::assignResourceIds(const sp<AaptAssets>& assets,
return hasErrors ? UNKNOWN_ERROR : NO_ERROR;
}
+sp<XMLNode> XMLNode::clone() const {
+ sp<XMLNode> copy = new XMLNode();
+ copy->mNamespacePrefix = mNamespacePrefix;
+ copy->mNamespaceUri = mNamespaceUri;
+ copy->mElementName = mElementName;
+
+ const size_t childCount = mChildren.size();
+ for (size_t i = 0; i < childCount; i++) {
+ copy->mChildren.add(mChildren[i]->clone());
+ }
+
+ copy->mAttributes = mAttributes;
+ copy->mAttributeOrder = mAttributeOrder;
+ copy->mNextAttributeIndex = mNextAttributeIndex;
+ copy->mChars = mChars;
+ memcpy(&copy->mCharsValue, &mCharsValue, sizeof(mCharsValue));
+ copy->mComment = mComment;
+ copy->mFilename = mFilename;
+ copy->mStartLineNumber = mStartLineNumber;
+ copy->mEndLineNumber = mEndLineNumber;
+ copy->mUTF8 = mUTF8;
+ return copy;
+}
+
status_t XMLNode::flatten(const sp<AaptFile>& dest,
bool stripComments, bool stripRawValues) const
{
diff --git a/tools/aapt/XMLNode.h b/tools/aapt/XMLNode.h
index ccbf9f403116..3161f6500291 100644
--- a/tools/aapt/XMLNode.h
+++ b/tools/aapt/XMLNode.h
@@ -116,6 +116,8 @@ public:
status_t addAttribute(const String16& ns, const String16& name,
const String16& value);
+ status_t removeAttribute(size_t index);
+
void setAttributeResID(size_t attrIdx, uint32_t resId);
status_t appendChars(const String16& chars);
@@ -137,6 +139,8 @@ public:
status_t flatten(const sp<AaptFile>& dest, bool stripComments,
bool stripRawValues) const;
+ sp<XMLNode> clone() const;
+
void print(int indent=0);
private:
@@ -163,6 +167,9 @@ private:
static void XMLCALL
commentData(void *userData, const char *comment);
+ // For cloning
+ XMLNode();
+
// Creating an element node.
XMLNode(const String8& filename, const String16& s1, const String16& s2, bool isNamespace);