summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk3
-rw-r--r--CleanSpec.mk1
-rw-r--r--api/current.txt388
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java24
-rw-r--r--core/java/android/app/Activity.java37
-rw-r--r--core/java/android/app/ActivityManager.java7
-rw-r--r--core/java/android/app/ActivityManagerNative.java32
-rw-r--r--core/java/android/app/ActivityOptions.java48
-rw-r--r--core/java/android/app/ActivityThread.java25
-rw-r--r--core/java/android/app/ApplicationThreadNative.java22
-rw-r--r--core/java/android/app/BackStackRecord.java92
-rw-r--r--core/java/android/app/IActivityManager.java4
-rw-r--r--core/java/android/app/IApplicationThread.java9
-rw-r--r--core/java/android/app/Instrumentation.java15
-rw-r--r--core/java/android/app/LocalActivityManager.java5
-rw-r--r--core/java/android/app/Notification.java91
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java18
-rw-r--r--core/java/android/app/backup/IBackupManager.aidl12
-rw-r--r--core/java/android/bluetooth/IBluetooth.aidl3
-rw-r--r--core/java/android/content/ContentProvider.java5
-rw-r--r--core/java/android/content/Intent.java266
-rw-r--r--core/java/android/content/pm/LabeledIntent.aidl19
-rw-r--r--core/java/android/net/ConnectivityManager.java41
-rw-r--r--core/java/android/net/IConnectivityManager.aidl2
-rw-r--r--core/java/android/net/RssiCurve.java55
-rw-r--r--core/java/android/os/IPowerManager.aidl1
-rw-r--r--core/java/android/os/PowerManagerInternal.java7
-rw-r--r--core/java/android/os/Process.java14
-rw-r--r--core/java/android/os/UserManager.java19
-rw-r--r--core/java/android/provider/Settings.java15
-rw-r--r--core/java/android/service/trust/TrustAgentService.java29
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java3
-rw-r--r--core/java/android/text/format/Formatter.java21
-rw-r--r--core/java/android/transition/ChangeTransform.java101
-rw-r--r--core/java/android/view/GLES20Canvas.java2
-rw-r--r--core/java/android/view/HardwareLayer.java5
-rw-r--r--core/java/android/view/IWindowManager.aidl1
-rw-r--r--core/java/android/view/IWindowSession.aidl9
-rw-r--r--core/java/android/view/Surface.java10
-rw-r--r--core/java/android/view/SurfaceView.java3
-rw-r--r--core/java/android/view/ThreadedRenderer.java8
-rw-r--r--core/java/android/view/ViewGroup.java12
-rw-r--r--core/java/android/view/ViewRootImpl.java2
-rw-r--r--core/java/android/view/WindowManagerPolicy.java11
-rw-r--r--core/java/android/widget/DatePickerCalendarDelegate.java41
-rw-r--r--core/java/android/widget/DatePickerController.java7
-rw-r--r--core/java/android/widget/DateTimeView.java126
-rw-r--r--core/java/android/widget/DayPickerView.java121
-rw-r--r--core/java/android/widget/PopupWindow.java84
-rw-r--r--core/java/android/widget/SimpleMonthAdapter.java77
-rw-r--r--core/java/android/widget/TimePickerClockDelegate.java43
-rw-r--r--core/java/com/android/internal/content/ReferrerIntent.aidl19
-rw-r--r--core/java/com/android/internal/content/ReferrerIntent.java51
-rw-r--r--core/java/com/android/internal/inputmethod/InputMethodUtils.java310
-rw-r--r--core/java/com/android/internal/os/ProcessCpuTracker.java17
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl1
-rw-r--r--core/java/com/android/internal/util/StateMachine.java16
-rw-r--r--core/java/com/android/internal/widget/ILockSettings.aidl4
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java5
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtilsCache.java243
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp10
-rw-r--r--core/jni/android/graphics/NinePatch.cpp6
-rw-r--r--core/jni/android/graphics/Path.cpp6
-rw-r--r--core/jni/android/graphics/SurfaceTexture.cpp4
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp2
-rw-r--r--core/jni/android_view_HardwareLayer.cpp7
-rw-r--r--core/res/AndroidManifest.xml33
-rw-r--r--core/res/res/anim/launch_task_behind_source.xml39
-rw-r--r--core/res/res/anim/launch_task_behind_target.xml16
-rw-r--r--core/res/res/interpolator/launch_task_behind_source_scale_1.xml (renamed from core/res/res/layout/lock_to_app_checkbox.xml)21
-rw-r--r--core/res/res/interpolator/launch_task_behind_source_scale_2.xml21
-rw-r--r--core/res/res/interpolator/launch_task_behind_target_ydelta.xml21
-rw-r--r--core/res/res/layout/activity_chooser_view_list_item.xml10
-rw-r--r--core/res/res/layout/activity_list_item_2.xml8
-rw-r--r--core/res/res/layout/alert_dialog_material.xml14
-rw-r--r--core/res/res/layout/alert_dialog_progress_material.xml8
-rw-r--r--core/res/res/layout/app_not_authorized.xml39
-rw-r--r--core/res/res/layout/choose_account.xml6
-rw-r--r--core/res/res/layout/choose_account_row.xml10
-rw-r--r--core/res/res/layout/choose_type_and_account.xml59
-rw-r--r--core/res/res/layout/dialog_title_icons_material.xml6
-rw-r--r--core/res/res/layout/dialog_title_material.xml6
-rw-r--r--core/res/res/layout/locale_picker_item.xml13
-rw-r--r--core/res/res/layout/popup_menu_item_layout.xml6
-rw-r--r--core/res/res/layout/progress_dialog_material.xml10
-rw-r--r--core/res/res/layout/resolve_list_item.xml8
-rw-r--r--core/res/res/layout/resolver_list.xml15
-rw-r--r--core/res/res/layout/select_dialog_multichoice_material.xml4
-rw-r--r--core/res/res/layout/select_dialog_singlechoice_material.xml4
-rw-r--r--core/res/res/layout/simple_account_item.xml22
-rw-r--r--core/res/res/layout/simple_list_item_2_single_choice.xml2
-rw-r--r--core/res/res/layout/user_switching_dialog.xml4
-rw-r--r--core/res/res/values-af/strings.xml22
-rw-r--r--core/res/res/values-am/strings.xml22
-rw-r--r--core/res/res/values-ar/strings.xml24
-rw-r--r--core/res/res/values-bg/strings.xml22
-rw-r--r--core/res/res/values-bn-rBD/strings.xml27
-rw-r--r--core/res/res/values-ca/strings.xml25
-rw-r--r--core/res/res/values-cs/strings.xml25
-rw-r--r--core/res/res/values-da/strings.xml27
-rw-r--r--core/res/res/values-de/strings.xml27
-rw-r--r--core/res/res/values-el/strings.xml25
-rw-r--r--core/res/res/values-en-rGB/strings.xml22
-rw-r--r--core/res/res/values-en-rIN/strings.xml22
-rw-r--r--core/res/res/values-es-rUS/strings.xml25
-rw-r--r--core/res/res/values-es/strings.xml27
-rw-r--r--core/res/res/values-et-rEE/strings.xml25
-rw-r--r--core/res/res/values-eu-rES/strings.xml25
-rw-r--r--core/res/res/values-fa/strings.xml27
-rw-r--r--core/res/res/values-fi/strings.xml27
-rw-r--r--core/res/res/values-fr-rCA/strings.xml25
-rw-r--r--core/res/res/values-fr/strings.xml25
-rw-r--r--core/res/res/values-gl-rES/strings.xml25
-rw-r--r--core/res/res/values-hi/strings.xml25
-rw-r--r--core/res/res/values-hr/strings.xml25
-rw-r--r--core/res/res/values-hu/strings.xml25
-rw-r--r--core/res/res/values-hy-rAM/strings.xml28
-rw-r--r--core/res/res/values-in/strings.xml22
-rw-r--r--core/res/res/values-is-rIS/strings.xml25
-rw-r--r--core/res/res/values-it/strings.xml27
-rw-r--r--core/res/res/values-iw/strings.xml25
-rw-r--r--core/res/res/values-ja/strings.xml25
-rw-r--r--core/res/res/values-ka-rGE/strings.xml22
-rw-r--r--core/res/res/values-kk-rKZ/strings.xml25
-rw-r--r--core/res/res/values-km-rKH/strings.xml21
-rw-r--r--core/res/res/values-kn-rIN/strings.xml25
-rw-r--r--core/res/res/values-ko/strings.xml27
-rw-r--r--core/res/res/values-ky-rKG/strings.xml25
-rw-r--r--core/res/res/values-lo-rLA/strings.xml22
-rw-r--r--core/res/res/values-lt/strings.xml25
-rw-r--r--core/res/res/values-lv/strings.xml25
-rw-r--r--core/res/res/values-mcc204-mnc04/config.xml5
-rw-r--r--core/res/res/values-mcc310-mnc004/config.xml5
-rw-r--r--core/res/res/values-mcc311-mnc480/config.xml4
-rw-r--r--core/res/res/values-mk-rMK/strings.xml25
-rw-r--r--core/res/res/values-ml-rIN/strings.xml25
-rw-r--r--core/res/res/values-mn-rMN/strings.xml22
-rw-r--r--core/res/res/values-mr-rIN/strings.xml25
-rw-r--r--core/res/res/values-ms-rMY/strings.xml24
-rw-r--r--core/res/res/values-my-rMM/strings.xml22
-rw-r--r--core/res/res/values-nb/strings.xml27
-rw-r--r--core/res/res/values-ne-rNP/strings.xml22
-rw-r--r--core/res/res/values-nl/strings.xml55
-rw-r--r--core/res/res/values-pl/strings.xml27
-rw-r--r--core/res/res/values-pt-rPT/strings.xml25
-rw-r--r--core/res/res/values-pt/strings.xml13
-rw-r--r--core/res/res/values-ro/strings.xml22
-rw-r--r--core/res/res/values-ru/strings.xml25
-rw-r--r--core/res/res/values-si-rLK/strings.xml13
-rw-r--r--core/res/res/values-sk/strings.xml22
-rw-r--r--core/res/res/values-sl/strings.xml25
-rw-r--r--core/res/res/values-sr/strings.xml25
-rw-r--r--core/res/res/values-sv/strings.xml27
-rw-r--r--core/res/res/values-sw/strings.xml25
-rw-r--r--core/res/res/values-ta-rIN/strings.xml25
-rw-r--r--core/res/res/values-te-rIN/strings.xml25
-rw-r--r--core/res/res/values-th/strings.xml27
-rw-r--r--core/res/res/values-tl/strings.xml22
-rw-r--r--core/res/res/values-tr/strings.xml27
-rw-r--r--core/res/res/values-uk/strings.xml25
-rw-r--r--core/res/res/values-ur-rPK/strings.xml25
-rw-r--r--core/res/res/values-uz-rUZ/strings.xml25
-rw-r--r--core/res/res/values-vi/strings.xml22
-rw-r--r--core/res/res/values-zh-rCN/strings.xml25
-rw-r--r--core/res/res/values-zh-rHK/strings.xml25
-rw-r--r--core/res/res/values-zh-rTW/strings.xml29
-rw-r--r--core/res/res/values-zu/strings.xml22
-rw-r--r--core/res/res/values/attrs.xml15
-rw-r--r--core/res/res/values/config.xml20
-rw-r--r--core/res/res/values/dimens.xml3
-rw-r--r--core/res/res/values/dimens_material.xml4
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--core/res/res/values/strings.xml235
-rw-r--r--core/res/res/values/styles.xml4
-rw-r--r--core/res/res/values/styles_material.xml9
-rw-r--r--core/res/res/values/styles_micro.xml8
-rw-r--r--core/res/res/values/symbols.xml11
-rw-r--r--core/res/res/values/themes.xml1
-rw-r--r--core/res/res/values/themes_material.xml4
-rw-r--r--core/tests/coretests/src/android/content/pm/PackageManagerTests.java97
-rw-r--r--core/tests/inputmethodtests/src/android/os/InputMethodTest.java181
-rw-r--r--data/fonts/fallback_fonts.xml83
-rw-r--r--data/fonts/fonts.xml51
-rw-r--r--docs/html/about/about_toc.cs1
-rw-r--r--docs/html/about/versions/android-5.0-changes.jd525
-rw-r--r--docs/html/about/versions/android-5.0.jd260
-rw-r--r--docs/html/distribute/googleplay/googleplay_toc.cs6
-rw-r--r--docs/html/distribute/googleplay/guide.jd71
-rw-r--r--docs/html/distribute/images/play_dev_guide.pngbin0 -> 220901 bytes
-rw-r--r--docs/html/distribute/images/play_dev_guide_b.jpgbin0 -> 45170 bytes
-rw-r--r--docs/html/distribute/tools/promote/brand.jd34
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_back.pngbin83440 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_fore.pngbin31701 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_shadow.pngbin43499 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_back.pngbin71907 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_fore.pngbin26942 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_shadow.pngbin40335 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/thumb.pngbin7803 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_back.pngbin0 -> 611393 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_fore.pngbin0 -> 235001 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_shadow.pngbin0 -> 63218 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_back.pngbin0 -> 705724 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_fore.pngbin0 -> 71391 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_shadow.pngbin0 -> 92881 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_6/thumb.pngbin0 -> 7883 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_back.pngbin0 -> 1684450 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_fore.pngbin0 -> 71727 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_shadow.pngbin0 -> 65701 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_back.pngbin0 -> 1719295 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_fore.pngbin0 -> 64261 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_shadow.pngbin0 -> 70441 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_9/thumb.pngbin0 -> 10634 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_back.pngbin113962 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_fore.pngbin20781 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_shadow.pngbin23374 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_back.pngbin107435 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_fore.pngbin16162 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_shadow.pngbin21240 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/nexus_s/thumb.pngbin10042 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/land_back.pngbin27199 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/land_fore.pngbin28252 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/land_shadow.pngbin26575 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/port_back.pngbin26085 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/port_fore.pngbin27070 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/port_shadow.pngbin31541 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art-resources/xoom/thumb.pngbin9124 -> 0 bytes
-rw-r--r--docs/html/distribute/tools/promote/device-art.jd70
-rw-r--r--docs/html/google/auth/api-client.jd52
-rw-r--r--docs/html/jd_collections.js10
-rw-r--r--docs/html/jd_extras.js13
-rw-r--r--docs/html/tools/index.jd122
-rw-r--r--docs/html/tools/revisions/build-tools.jd11
-rw-r--r--docs/html/training/articles/security-ssl.jd35
-rw-r--r--docs/html/training/material/images/shadows-depth.pngbin18031 -> 13496 bytes
-rw-r--r--docs/html/training/material/shadows-clipping.jd32
-rw-r--r--docs/html/training/tv/start/hardware.jd77
-rw-r--r--docs/html/training/tv/start/start.jd52
-rw-r--r--docs/html/training/wearables/apps/bt-debugging.jd4
-rw-r--r--docs/html/training/wearables/apps/creating.jd5
-rw-r--r--docs/html/training/wearables/apps/index.jd2
-rw-r--r--docs/html/training/wearables/data-layer/accessing.jd17
-rw-r--r--docs/html/training/wearables/data-layer/data-items.jd8
-rw-r--r--docs/html/training/wearables/data-layer/events.jd2
-rw-r--r--docs/html/training/wearables/data-layer/index.jd2
-rw-r--r--docs/html/training/wearables/data-layer/messages.jd4
-rw-r--r--docs/html/training/wearables/notifications/creating.jd17
-rw-r--r--docs/html/training/wearables/notifications/index.jd2
-rw-r--r--docs/html/training/wearables/notifications/stacks.jd2
-rw-r--r--docs/html/training/wearables/notifications/voice-input.jd6
-rw-r--r--graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java88
-rw-r--r--graphics/java/android/graphics/drawable/Ripple.java26
-rw-r--r--graphics/java/android/graphics/drawable/RippleBackground.java44
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java218
-rw-r--r--graphics/java/android/graphics/drawable/StateListDrawable.java65
-rw-r--r--libs/hwui/AmbientShadow.cpp6
-rw-r--r--libs/hwui/Caches.h1
-rw-r--r--libs/hwui/DeferredLayerUpdater.h2
-rw-r--r--libs/hwui/DisplayList.cpp17
-rw-r--r--libs/hwui/DisplayListRenderer.cpp13
-rw-r--r--libs/hwui/DisplayListRenderer.h14
-rw-r--r--libs/hwui/RenderNode.cpp10
-rw-r--r--libs/hwui/Renderer.h1
-rw-r--r--libs/hwui/ResourceCache.cpp6
-rw-r--r--libs/hwui/ResourceCache.h8
-rw-r--r--libs/hwui/SpotShadow.cpp910
-rw-r--r--libs/hwui/SpotShadow.h34
-rw-r--r--libs/hwui/Vector.h4
-rw-r--r--libs/hwui/renderthread/CanvasContext.cpp5
-rw-r--r--libs/hwui/renderthread/CanvasContext.h2
-rw-r--r--libs/hwui/renderthread/DrawFrameTask.cpp6
-rw-r--r--libs/hwui/renderthread/DrawFrameTask.h1
-rw-r--r--location/java/android/location/GpsClock.java3
-rw-r--r--location/java/android/location/GpsMeasurement.java2
-rw-r--r--location/java/android/location/GpsMeasurementListenerTransport.java17
-rw-r--r--location/java/android/location/GpsMeasurementsEvent.java34
-rw-r--r--location/java/android/location/GpsNavigationMessage.java2
-rw-r--r--location/java/android/location/GpsNavigationMessageEvent.java33
-rw-r--r--location/java/android/location/GpsNavigationMessageListenerTransport.java18
-rw-r--r--location/java/android/location/IGpsMeasurementsListener.aidl1
-rw-r--r--location/java/android/location/IGpsNavigationMessageListener.aidl1
-rw-r--r--location/java/android/location/ILocationManager.aidl4
-rw-r--r--location/java/android/location/LocalListenerHelper.java25
-rw-r--r--location/java/android/location/LocationManager.java8
-rw-r--r--media/java/android/media/MediaHTTPConnection.java6
-rw-r--r--media/java/android/media/MediaMetadata.java29
-rw-r--r--media/java/android/media/audiofx/AudioEffect.java4
-rw-r--r--media/java/android/media/session/MediaController.java6
-rw-r--r--media/jni/android_media_ImageReader.cpp4
-rw-r--r--packages/Keyguard/res/layout/keyguard_status_view.xml2
-rw-r--r--packages/Keyguard/res/values/colors.xml2
-rw-r--r--packages/Keyguard/res/values/dimens.xml2
-rw-r--r--packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java11
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java21
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_disable_animation_cross_1.xml31
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_disable_animation_mask.xml35
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_disable_animation_root.xml (renamed from packages/SystemUI/res/anim/zen_toast_enter.xml)12
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_enable_animation_cross_1.xml40
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_enable_animation_mask.xml35
-rw-r--r--packages/SystemUI/res/anim/ic_hotspot_enable_animation_root.xml (renamed from packages/SystemUI/res/anim/zen_toast_exit.xml)12
-rw-r--r--packages/SystemUI/res/anim/ic_invert_colors_disable_animation_cross_1.xml45
-rw-r--r--packages/SystemUI/res/anim/ic_invert_colors_disable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_invert_colors_enable_animation_cross_1.xml26
-rw-r--r--packages/SystemUI/res/anim/ic_invert_colors_enable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_bottom.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_top.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrows.xml25
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_body.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_device.xml21
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_bottom.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_top.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrows.xml63
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_body.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_device.xml21
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_bottom.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_top.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrows.xml25
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device.xml21
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device_1.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_bottom.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_top.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrows.xml25
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device_1.xml2
-rw-r--r--packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_cross_1.xml45
-rw-r--r--packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_cross_1.xml26
-rw-r--r--packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_cross_1.xml45
-rw-r--r--packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_cross_1.xml26
-rw-r--r--packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_signal_location_disable_animation_cross_1.xml45
-rw-r--r--packages/SystemUI/res/anim/ic_signal_location_disable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/ic_signal_location_enable_animation_cross_1.xml26
-rw-r--r--packages/SystemUI/res/anim/ic_signal_location_enable_animation_mask.xml24
-rw-r--r--packages/SystemUI/res/anim/recents_launch_next_affiliated_task_bounce.xml42
-rw-r--r--packages/SystemUI/res/anim/recents_launch_prev_affiliated_task_bounce.xml12
-rw-r--r--packages/SystemUI/res/color/segmented_button_text_selector.xml4
-rw-r--r--packages/SystemUI/res/drawable/btn_borderless_rect.xml8
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_alarm.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_bt.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_bt_mute.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_phone.xml23
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_vol.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_audio_vol_mute.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_hotspot_disable.xml62
-rw-r--r--packages/SystemUI/res/drawable/ic_hotspot_disable_animation.xml (renamed from tests/VectorDrawableTest/res/drawable/ic_open_animation.xml)21
-rw-r--r--packages/SystemUI/res/drawable/ic_hotspot_enable.xml62
-rw-r--r--packages/SystemUI/res/drawable/ic_hotspot_enable_animation.xml (renamed from packages/SystemUI/res/drawable/zen_toast_background.xml)19
-rw-r--r--packages/SystemUI/res/drawable/ic_invert_colors_disable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_invert_colors_enable.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_invert_colors_enable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_portrait_from_auto_rotate.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_portrait_to_auto_rotate.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml25
-rw-r--r--packages/SystemUI/res/drawable/ic_ringer_audible.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_ringer_mute.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_ringer_vibrate.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_airplane_disable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_airplane_enable.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_flashlight_disable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_flashlight_enable.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_flashlight_enable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_location_disable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_location_enable.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_signal_location_enable_animation.xml3
-rw-r--r--packages/SystemUI/res/drawable/ic_zen_all.xml24
-rw-r--r--packages/SystemUI/res/drawable/ic_zen_important.xml4
-rw-r--r--packages/SystemUI/res/drawable/ic_zen_none.xml4
-rw-r--r--packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml28
-rw-r--r--packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml28
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_disable_cross_1_pathdata_interpolator.xml (renamed from tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_3.xml)6
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_disable_ic_hotspot_alpha_interpolator.xml (renamed from tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_2.xml)6
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_1.xml18
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_2.xml (renamed from tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_1.xml)6
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_enable_cross_1_pathdata_interpolator.xml (renamed from tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_1.xml)6
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_1.xml18
-rw-r--r--packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_2.xml18
-rw-r--r--packages/SystemUI/res/interpolator/recents_launch_next_affiliated_task_bounce_scale.xml20
-rw-r--r--packages/SystemUI/res/interpolator/recents_launch_prev_affiliated_task_bounce_ydelta.xml20
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request.xml42
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_buttons.xml143
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml135
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml35
-rw-r--r--packages/SystemUI/res/layout/screen_pinning_request_text_area.xml80
-rw-r--r--packages/SystemUI/res/layout/segmented_button.xml6
-rw-r--r--packages/SystemUI/res/layout/volume_panel_item.xml16
-rw-r--r--packages/SystemUI/res/layout/zen_mode_panel.xml7
-rw-r--r--packages/SystemUI/res/layout/zen_toast.xml41
-rw-r--r--packages/SystemUI/res/values-af/strings.xml16
-rw-r--r--packages/SystemUI/res/values-am/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ar/strings.xml16
-rw-r--r--packages/SystemUI/res/values-bg/strings.xml16
-rw-r--r--packages/SystemUI/res/values-bn-rBD/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ca/strings.xml16
-rw-r--r--packages/SystemUI/res/values-cs/strings.xml16
-rw-r--r--packages/SystemUI/res/values-da/strings.xml16
-rw-r--r--packages/SystemUI/res/values-de/strings.xml16
-rw-r--r--packages/SystemUI/res/values-el/strings.xml16
-rw-r--r--packages/SystemUI/res/values-en-rGB/strings.xml16
-rw-r--r--packages/SystemUI/res/values-en-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-es-rUS/strings.xml16
-rw-r--r--packages/SystemUI/res/values-es/strings.xml16
-rw-r--r--packages/SystemUI/res/values-et-rEE/strings.xml16
-rw-r--r--packages/SystemUI/res/values-eu-rES/strings.xml16
-rw-r--r--packages/SystemUI/res/values-fa/strings.xml16
-rw-r--r--packages/SystemUI/res/values-fi/strings.xml16
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml16
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-gl-rES/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hu/strings.xml16
-rw-r--r--packages/SystemUI/res/values-hy-rAM/strings.xml16
-rw-r--r--packages/SystemUI/res/values-in/strings.xml16
-rw-r--r--packages/SystemUI/res/values-is-rIS/strings.xml16
-rw-r--r--packages/SystemUI/res/values-it/strings.xml16
-rw-r--r--packages/SystemUI/res/values-iw/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ja/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ka-rGE/strings.xml16
-rw-r--r--packages/SystemUI/res/values-kk-rKZ/strings.xml16
-rw-r--r--packages/SystemUI/res/values-km-rKH/strings.xml8
-rw-r--r--packages/SystemUI/res/values-kn-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ko/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ky-rKG/strings.xml16
-rw-r--r--packages/SystemUI/res/values-lo-rLA/strings.xml16
-rw-r--r--packages/SystemUI/res/values-lt/strings.xml16
-rw-r--r--packages/SystemUI/res/values-lv/strings.xml16
-rw-r--r--packages/SystemUI/res/values-mk-rMK/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ml-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-mn-rMN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-mr-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ms-rMY/strings.xml16
-rw-r--r--packages/SystemUI/res/values-my-rMM/strings.xml16
-rw-r--r--packages/SystemUI/res/values-nb/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ne-rNP/strings.xml16
-rw-r--r--packages/SystemUI/res/values-nl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-pl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml16
-rw-r--r--packages/SystemUI/res/values-pt/strings.xml19
-rw-r--r--packages/SystemUI/res/values-ro/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ru/strings.xml16
-rw-r--r--packages/SystemUI/res/values-si-rLK/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sk/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sv/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sw/strings.xml16
-rw-r--r--packages/SystemUI/res/values-sw400dp/dimens.xml8
-rw-r--r--packages/SystemUI/res/values-sw600dp-land/dimens.xml11
-rw-r--r--packages/SystemUI/res/values-sw600dp/dimens.xml11
-rw-r--r--packages/SystemUI/res/values-ta-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-te-rIN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-th/strings.xml16
-rw-r--r--packages/SystemUI/res/values-tl/strings.xml16
-rw-r--r--packages/SystemUI/res/values-tr/strings.xml16
-rw-r--r--packages/SystemUI/res/values-uk/strings.xml16
-rw-r--r--packages/SystemUI/res/values-ur-rPK/strings.xml16
-rw-r--r--packages/SystemUI/res/values-uz-rUZ/strings.xml16
-rw-r--r--packages/SystemUI/res/values-vi/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zh-rHK/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zh-rTW/strings.xml16
-rw-r--r--packages/SystemUI/res/values-zu/strings.xml16
-rw-r--r--packages/SystemUI/res/values/colors.xml10
-rw-r--r--packages/SystemUI/res/values/config.xml6
-rw-r--r--packages/SystemUI/res/values/dimens.xml34
-rw-r--r--packages/SystemUI/res/values/internal.xml1
-rw-r--r--packages/SystemUI/res/values/strings.xml20
-rw-r--r--packages/SystemUI/res/values/styles.xml11
-rw-r--r--packages/SystemUI/src/com/android/systemui/DemoMode.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/EventLogTags.logtags2
-rw-r--r--packages/SystemUI/src/com/android/systemui/SwipeHelper.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeService.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanel.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTile.java24
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSTileView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java283
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java186
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/Constants.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java101
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/misc/DozeTrigger.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java26
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java224
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java245
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java90
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java141
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java80
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java20
-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.java34
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java65
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java153
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java15
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/ZenToast.java163
-rw-r--r--packages/SystemUI/tests/Android.mk3
-rw-r--r--packages/SystemUI/tests/AndroidManifest.xml2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotTest.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java162
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java37
-rw-r--r--policy/src/com/android/internal/policy/impl/PhoneWindowManager.java29
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java37
-rw-r--r--services/backup/java/com/android/server/backup/FullBackupJob.java4
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java327
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java21
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java226
-rw-r--r--services/core/java/com/android/server/LocationManagerService.java10
-rw-r--r--services/core/java/com/android/server/LockSettingsService.java69
-rw-r--r--services/core/java/com/android/server/LockSettingsStorage.java277
-rw-r--r--services/core/java/com/android/server/NativeDaemonConnector.java3
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java190
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityManagerService.java126
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityRecord.java17
-rwxr-xr-xservices/core/java/com/android/server/am/ActivityStack.java21
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java25
-rw-r--r--services/core/java/com/android/server/am/LockToAppRequestDialog.java141
-rw-r--r--services/core/java/com/android/server/am/PendingIntentRecord.java6
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java2
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkMonitor.java6
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java4
-rw-r--r--services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java21
-rw-r--r--services/core/java/com/android/server/input/InputWindowHandle.java1
-rw-r--r--services/core/java/com/android/server/location/GpsLocationProvider.java179
-rw-r--r--services/core/java/com/android/server/location/GpsMeasurementsProvider.java59
-rw-r--r--services/core/java/com/android/server/location/GpsNavigationMessageProvider.java60
-rw-r--r--services/core/java/com/android/server/location/GpsStatusListenerHelper.java57
-rw-r--r--services/core/java/com/android/server/location/RemoteListenerHelper.java164
-rw-r--r--services/core/java/com/android/server/notification/ConditionProviders.java32
-rw-r--r--services/core/java/com/android/server/notification/DowntimeConditionProvider.java80
-rw-r--r--services/core/java/com/android/server/notification/NextAlarmConditionProvider.java242
-rw-r--r--services/core/java/com/android/server/notification/NextAlarmTracker.java263
-rw-r--r--services/core/java/com/android/server/pm/Installer.java12
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java7
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java20
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java1
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java10
-rw-r--r--services/core/java/com/android/server/trust/TrustAgentWrapper.java9
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java9
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java28
-rw-r--r--services/core/java/com/android/server/wm/AppWindowToken.java14
-rw-r--r--services/core/java/com/android/server/wm/DragState.java1
-rw-r--r--services/core/java/com/android/server/wm/FakeWindowImpl.java3
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java12
-rw-r--r--services/core/java/com/android/server/wm/Session.java17
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java31
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java48
-rw-r--r--services/core/java/com/android/server/wm/WindowStateAnimator.java11
-rw-r--r--services/core/jni/com_android_server_input_InputWindowHandle.cpp6
-rw-r--r--services/core/jni/com_android_server_location_GpsLocationProvider.cpp1
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java29
-rw-r--r--services/java/com/android/server/SystemServer.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java330
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsDatabase.java31
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsXml.java14
-rw-r--r--telecomm/java/android/telecom/AudioState.java3
-rw-r--r--telecomm/java/android/telecom/Conference.java12
-rw-r--r--telecomm/java/android/telecom/Connection.java23
-rw-r--r--telecomm/java/android/telecom/ConnectionRequest.java3
-rw-r--r--telecomm/java/android/telecom/ConnectionService.java6
-rw-r--r--telecomm/java/android/telecom/DisconnectCause.java3
-rw-r--r--telecomm/java/android/telecom/GatewayInfo.java2
-rw-r--r--telecomm/java/android/telecom/InCallService.java10
-rw-r--r--telecomm/java/android/telecom/Phone.java35
-rw-r--r--telecomm/java/android/telecom/PhoneAccount.java197
-rw-r--r--telecomm/java/android/telecom/PhoneAccountHandle.java3
-rw-r--r--telecomm/java/android/telecom/PhoneCapabilities.java15
-rw-r--r--telecomm/java/android/telecom/RemoteConference.java3
-rw-r--r--telecomm/java/android/telecom/RemoteConnection.java3
-rw-r--r--telecomm/java/android/telecom/StatusHints.java3
-rw-r--r--telecomm/java/android/telecom/TelecomManager.java40
-rw-r--r--telecomm/java/com/android/internal/telecom/IInCallService.aidl2
-rwxr-xr-xtelephony/java/android/telephony/SubscriptionInfo.aidl (renamed from telephony/java/android/telephony/SubInfoRecord.aidl)2
-rw-r--r--telephony/java/android/telephony/SubscriptionInfo.java (renamed from telephony/java/android/telephony/SubInfoRecord.java)161
-rw-r--r--telephony/java/android/telephony/SubscriptionListener.java125
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java292
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java69
-rw-r--r--telephony/java/com/android/ims/ImsCallProfile.java19
-rw-r--r--telephony/java/com/android/ims/ImsStreamMediaProfile.java16
-rw-r--r--telephony/java/com/android/ims/internal/IImsCallSession.aidl7
-rwxr-xr-xtelephony/java/com/android/internal/telephony/ISub.aidl59
-rw-r--r--telephony/java/com/android/internal/telephony/ISubscriptionListener.aidl (renamed from core/java/com/android/internal/widget/ILockSettingsObserver.aidl)10
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl18
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl4
-rw-r--r--telephony/java/com/android/internal/telephony/TelephonyIntents.java34
-rw-r--r--tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java2
-rw-r--r--tests/VectorDrawableTest/res/anim/ic_open_animation_ball_start.xml86
-rw-r--r--tests/VectorDrawableTest/res/anim/ic_open_animation_ball_swoop.xml17
-rw-r--r--tests/VectorDrawableTest/res/anim/ic_open_animation_path_1.xml48
-rw-r--r--tests/VectorDrawableTest/res/anim/ic_open_animation_path_1_1.xml74
-rw-r--r--tests/VectorDrawableTest/res/drawable/ic_open.xml56
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_2.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_3.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatex_interpolator.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_1.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_2.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_3.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathend_interpolator_2.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathstart_interpolator_2.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_1.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_2.xml16
-rw-r--r--tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_3.xml16
-rw-r--r--tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java1
-rw-r--r--tools/aapt/AaptConfig.cpp5
-rw-r--r--tools/aapt/Bundle.h13
-rw-r--r--tools/aapt/ResourceFilter.cpp7
-rw-r--r--tools/aapt/ResourceTable.cpp17
-rw-r--r--tools/aapt/SdkConstants.h42
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-b.pngbin0 -> 215 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-bl.pngbin0 -> 397 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-br.pngbin0 -> 406 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-l.pngbin0 -> 120 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-r.pngbin0 -> 207 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-tl.pngbin0 -> 277 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow-tr.pngbin0 -> 397 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-b.pngbin0 -> 195 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-bl.pngbin0 -> 277 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-br.pngbin0 -> 282 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-l.pngbin0 -> 108 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-r.pngbin0 -> 192 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-tl.pngbin0 -> 2855 bytes
-rw-r--r--tools/layoutlib/bridge/resources/icons/shadow2-tr.pngbin0 -> 286 bytes
-rw-r--r--tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java2
-rw-r--r--tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java7
-rw-r--r--tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java5
-rw-r--r--tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java72
-rw-r--r--tools/layoutlib/bridge/src/android/view/ShadowPainter.java415
-rw-r--r--tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java205
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java17
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java5
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java8
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java113
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java47
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java86
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java5
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java1
-rw-r--r--tools/split-select/Android.mk3
-rw-r--r--tools/split-select/Rule.cpp10
-rw-r--r--tools/split-select/Rule.h1
-rw-r--r--tools/split-select/RuleGenerator.cpp36
-rw-r--r--tools/split-select/RuleGenerator_test.cpp205
-rw-r--r--tools/split-select/Rule_test.cpp107
-rw-r--r--tools/split-select/TestRules.cpp90
-rw-r--r--tools/split-select/TestRules.h66
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java39
669 files changed, 13600 insertions, 7392 deletions
diff --git a/Android.mk b/Android.mk
index b77c2ed..ed85df0 100644
--- a/Android.mk
+++ b/Android.mk
@@ -288,7 +288,6 @@ LOCAL_SRC_FILES += \
core/java/com/android/internal/view/IInputMethodSession.aidl \
core/java/com/android/internal/view/IInputSessionCallback.aidl \
core/java/com/android/internal/widget/ILockSettings.aidl \
- core/java/com/android/internal/widget/ILockSettingsObserver.aidl \
core/java/com/android/internal/widget/IRemoteViewsFactory.aidl \
core/java/com/android/internal/widget/IRemoteViewsAdapterConnection.aidl \
keystore/java/android/security/IKeyChainAliasCallback.aidl \
@@ -372,6 +371,7 @@ LOCAL_SRC_FILES += \
telephony/java/com/android/internal/telephony/ITelephony.aidl \
telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl \
telephony/java/com/android/internal/telephony/ISms.aidl \
+ telephony/java/com/android/internal/telephony/ISubscriptionListener.aidl \
telephony/java/com/android/internal/telephony/IWapPushManager.aidl \
telephony/java/com/android/internal/telephony/ISub.aidl \
telephony/java/com/android/internal/telephony/IMms.aidl \
@@ -559,6 +559,7 @@ aidl_files := \
frameworks/base/core/java/android/content/pm/ProviderInfo.aidl \
frameworks/base/core/java/android/content/pm/PackageStats.aidl \
frameworks/base/core/java/android/content/pm/PermissionGroupInfo.aidl \
+ frameworks/base/core/java/android/content/pm/LabeledIntent.aidl \
frameworks/base/core/java/android/content/ComponentName.aidl \
frameworks/base/core/java/android/content/SyncStats.aidl \
frameworks/base/core/java/android/content/ContentValues.aidl \
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 28c2172..d660224 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -224,6 +224,7 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/servic
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/inputflinger $(PRODUCT_OUT)/symbols/system/bin/inputflinger)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/RsFountainFbo_intermediates)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/telecomm/java/com/android/internal/telecomm)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/com/android/internal/widget/ILockSettingsObserver.java)
# ******************************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER
diff --git a/api/current.txt b/api/current.txt
index 476d9f5..1a882ac 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -113,9 +113,6 @@ package android {
field public static final java.lang.String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
- field public static final java.lang.String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER";
- field public static final java.lang.String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER";
- field public static final java.lang.String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION";
field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS";
field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
@@ -478,6 +475,7 @@ package android {
field public static final int dialogLayout = 16843255; // 0x10101f7
field public static final int dialogMessage = 16843251; // 0x10101f3
field public static final int dialogPreferenceStyle = 16842897; // 0x1010091
+ field public static final int dialogPreferredPadding = 16844037; // 0x1010505
field public static final int dialogTheme = 16843528; // 0x1010308
field public static final int dialogTitle = 16843250; // 0x10101f2
field public static final int digits = 16843110; // 0x1010166
@@ -3306,6 +3304,7 @@ package android.app {
method public final android.app.Activity getParent();
method public android.content.Intent getParentActivityIntent();
method public android.content.SharedPreferences getPreferences(int);
+ method public android.net.Uri getReferrer();
method public int getRequestedOrientation();
method public int getTaskId();
method public final java.lang.CharSequence getTitle();
@@ -4676,8 +4675,14 @@ package android.app {
ctor public Notification.Action.WearableExtender(android.app.Notification.Action);
method public android.app.Notification.Action.WearableExtender clone();
method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
+ method public java.lang.CharSequence getCancelLabel();
+ method public java.lang.CharSequence getConfirmLabel();
+ method public java.lang.CharSequence getInProgressLabel();
method public boolean isAvailableOffline();
method public android.app.Notification.Action.WearableExtender setAvailableOffline(boolean);
+ method public android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
+ method public android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+ method public android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
}
public static class Notification.BigPictureStyle extends android.app.Notification.Style {
@@ -7747,6 +7752,7 @@ package android.content {
field public static final java.lang.String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
field public static final java.lang.String EXTRA_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";
field public static final java.lang.String EXTRA_REFERRER = "android.intent.extra.REFERRER";
+ field public static final java.lang.String EXTRA_REFERRER_NAME = "android.intent.extra.REFERRER_NAME";
field public static final java.lang.String EXTRA_REMOTE_INTENT_TOKEN = "android.intent.extra.remote_intent_token";
field public static final java.lang.String EXTRA_REPLACEMENT_EXTRAS = "android.intent.extra.REPLACEMENT_EXTRAS";
field public static final java.lang.String EXTRA_REPLACING = "android.intent.extra.REPLACING";
@@ -7806,6 +7812,7 @@ package android.content {
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
+ field public static final int URI_ANDROID_APP_SCHEME = 2; // 0x2
field public static final int URI_INTENT_SCHEME = 1; // 0x1
}
@@ -16896,9 +16903,11 @@ package android.net {
method public boolean isDefaultNetworkActive();
method public static boolean isNetworkTypeValid(int);
method public void registerNetworkCallback(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
+ method public void releaseNetworkRequest(android.app.PendingIntent);
method public void removeDefaultNetworkActiveListener(android.net.ConnectivityManager.OnNetworkActiveListener);
method public void reportBadNetwork(android.net.Network);
method public void requestNetwork(android.net.NetworkRequest, android.net.ConnectivityManager.NetworkCallback);
+ method public void requestNetwork(android.net.NetworkRequest, android.app.PendingIntent);
method public deprecated boolean requestRouteToHost(int, int);
method public deprecated void setNetworkPreference(int);
method public static boolean setProcessDefaultNetwork(android.net.Network);
@@ -16911,6 +16920,8 @@ package android.net {
field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
field public static final java.lang.String EXTRA_IS_FAILOVER = "isFailover";
field public static final deprecated java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
+ field public static final java.lang.String EXTRA_NETWORK_REQUEST_NETWORK = "networkRequestNetwork";
+ field public static final java.lang.String EXTRA_NETWORK_REQUEST_NETWORK_REQUEST = "networkRequestNetworkRequest";
field public static final java.lang.String EXTRA_NETWORK_TYPE = "networkType";
field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
field public static final java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
@@ -22365,6 +22376,7 @@ package android.os {
field public static final java.lang.String DISALLOW_INSTALL_UNKNOWN_SOURCES = "no_install_unknown_sources";
field public static final java.lang.String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts";
field public static final java.lang.String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media";
+ field public static final java.lang.String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
field public static final java.lang.String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls";
field public static final java.lang.String DISALLOW_REMOVE_USER = "no_remove_user";
field public static final java.lang.String DISALLOW_SHARE_LOCATION = "no_share_location";
@@ -22373,6 +22385,7 @@ package android.os {
field public static final java.lang.String DISALLOW_UNMUTE_MICROPHONE = "no_unmute_microphone";
field public static final java.lang.String DISALLOW_USB_FILE_TRANSFER = "no_usb_file_transfer";
field public static final java.lang.String ENSURE_VERIFY_APPS = "ensure_verify_apps";
+ field public static final java.lang.String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
}
public abstract class Vibrator {
@@ -28082,349 +28095,16 @@ package android.system {
package android.telecom {
- public final class AudioState implements android.os.Parcelable {
- ctor public AudioState(boolean, int, int);
- ctor public AudioState(android.telecom.AudioState);
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.AudioState> CREATOR;
- field public static final int ROUTE_BLUETOOTH = 2; // 0x2
- field public static final int ROUTE_EARPIECE = 1; // 0x1
- field public static final int ROUTE_SPEAKER = 8; // 0x8
- field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4
- field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5
- field public final boolean isMuted;
- field public final int route;
- field public final int supportedRouteMask;
- }
-
- public abstract class Conference {
- ctor public Conference(android.telecom.PhoneAccountHandle);
- method public final boolean addConnection(android.telecom.Connection);
- method public final void destroy();
- method public final android.telecom.AudioState getAudioState();
- method public final int getCapabilities();
- method public final java.util.List<android.telecom.Connection> getConferenceableConnections();
- method public final java.util.List<android.telecom.Connection> getConnections();
- method public final android.telecom.DisconnectCause getDisconnectCause();
- method public final android.telecom.PhoneAccountHandle getPhoneAccountHandle();
- method public android.telecom.Connection getPrimaryConnection();
- method public final int getState();
- method public void onAudioStateChanged(android.telecom.AudioState);
- method public void onDisconnect();
- method public void onHold();
- method public void onMerge(android.telecom.Connection);
- method public void onMerge();
- method public void onPlayDtmfTone(char);
- method public void onSeparate(android.telecom.Connection);
- method public void onStopDtmfTone();
- method public void onSwap();
- method public void onUnhold();
- method public final void removeConnection(android.telecom.Connection);
- method public final void setActive();
- method public final void setCapabilities(int);
- method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
- method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setOnHold();
- }
-
- public abstract class Connection {
- ctor public Connection();
- method public static android.telecom.Connection createCanceledConnection();
- method public static android.telecom.Connection createFailedConnection(android.telecom.DisconnectCause);
- method public final void destroy();
- method public final android.net.Uri getAddress();
- method public final int getAddressPresentation();
- method public final boolean getAudioModeIsVoip();
- method public final android.telecom.AudioState getAudioState();
- method public final int getCallCapabilities();
- method public final java.lang.String getCallerDisplayName();
- method public final int getCallerDisplayNamePresentation();
- method public final android.telecom.Conference getConference();
- method public final java.util.List<android.telecom.Connection> getConferenceableConnections();
- method public final android.telecom.DisconnectCause getDisconnectCause();
- method public final int getState();
- method public final android.telecom.StatusHints getStatusHints();
- method public final boolean isRingbackRequested();
- method public void onAbort();
- method public void onAnswer();
- method public void onAudioStateChanged(android.telecom.AudioState);
- method public void onConferenceChanged();
- method public void onDisconnect();
- method public void onHold();
- method public void onPlayDtmfTone(char);
- method public void onPostDialContinue(boolean);
- method public void onReject();
- method public void onSeparate();
- method public void onStateChanged(int);
- method public void onStopDtmfTone();
- method public void onUnhold();
- method public final void setActive();
- method public final void setAddress(android.net.Uri, int);
- method public final void setAudioModeIsVoip(boolean);
- method public final void setCallCapabilities(int);
- method public final void setCallerDisplayName(java.lang.String, int);
- method public final void setConferenceableConnections(java.util.List<android.telecom.Connection>);
- method public final void setConnectionService(android.telecom.ConnectionService);
- method public final void setDialing();
- method public final void setDisconnected(android.telecom.DisconnectCause);
- method public final void setInitialized();
- method public final void setInitializing();
- method public final void setOnHold();
- method public final void setPostDialWait(java.lang.String);
- method public final void setRingbackRequested(boolean);
- method public final void setRinging();
- method public final void setStatusHints(android.telecom.StatusHints);
- method public static java.lang.String stateToString(int);
- field public static final int STATE_ACTIVE = 4; // 0x4
- field public static final int STATE_DIALING = 3; // 0x3
- field public static final int STATE_DISCONNECTED = 6; // 0x6
- field public static final int STATE_HOLDING = 5; // 0x5
- field public static final int STATE_INITIALIZING = 0; // 0x0
- field public static final int STATE_NEW = 1; // 0x1
- field public static final int STATE_RINGING = 2; // 0x2
- }
-
- public final class ConnectionRequest implements android.os.Parcelable {
- ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle);
- method public int describeContents();
- method public android.telecom.PhoneAccountHandle getAccountHandle();
- method public android.net.Uri getAddress();
- method public android.os.Bundle getExtras();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.ConnectionRequest> CREATOR;
- }
-
- public abstract class ConnectionService extends android.app.Service {
- ctor public ConnectionService();
- method public final void addConference(android.telecom.Conference);
- method public final void addExistingConnection(android.telecom.PhoneAccountHandle, android.telecom.Connection);
- method public final void conferenceRemoteConnections(android.telecom.RemoteConnection, android.telecom.RemoteConnection);
- method public final android.telecom.RemoteConnection createRemoteIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public final android.telecom.RemoteConnection createRemoteOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public final java.util.Collection<android.telecom.Connection> getAllConnections();
- method public final android.os.IBinder onBind(android.content.Intent);
- method public void onConference(android.telecom.Connection, android.telecom.Connection);
- method public android.telecom.Connection onCreateIncomingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public android.telecom.Connection onCreateOutgoingConnection(android.telecom.PhoneAccountHandle, android.telecom.ConnectionRequest);
- method public void onRemoteConferenceAdded(android.telecom.RemoteConference);
- method public void onRemoteExistingConnectionAdded(android.telecom.RemoteConnection);
- field public static final java.lang.String SERVICE_INTERFACE = "android.telecom.ConnectionService";
- }
-
- 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();
- method public java.lang.CharSequence getDescription();
- method public java.lang.CharSequence getLabel();
- method public java.lang.String getReason();
- method public int getTone();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int BUSY = 7; // 0x7
- field public static final int CANCELED = 4; // 0x4
- field public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; // 0xa
- field public static final android.os.Parcelable.Creator<android.telecom.DisconnectCause> CREATOR;
- field public static final int ERROR = 1; // 0x1
- field public static final int LOCAL = 2; // 0x2
- field public static final int MISSED = 5; // 0x5
- field public static final int OTHER = 9; // 0x9
- field public static final int REJECTED = 6; // 0x6
- field public static final int REMOTE = 3; // 0x3
- field public static final int RESTRICTED = 8; // 0x8
- field public static final int UNKNOWN = 0; // 0x0
- }
-
- public class GatewayInfo implements android.os.Parcelable {
- method public int describeContents();
- method public android.net.Uri getGatewayAddress();
- method public java.lang.String getGatewayProviderPackageName();
- method public android.net.Uri getOriginalAddress();
- method public boolean isEmpty();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.GatewayInfo> CREATOR;
- }
-
- public class PhoneAccount implements android.os.Parcelable {
- method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
- method public int describeContents();
- method public android.telecom.PhoneAccountHandle getAccountHandle();
- method public android.net.Uri getAddress();
- method public int getCapabilities();
- method public int getColor();
- method public android.graphics.drawable.Drawable getIcon(android.content.Context);
- method public android.graphics.Bitmap getIconBitmap();
- method public java.lang.String getIconPackageName();
- method public int getIconResId();
- method public java.lang.CharSequence getLabel();
- method public java.lang.CharSequence getShortDescription();
- method public android.net.Uri getSubscriptionAddress();
- method public java.util.List<java.lang.String> getSupportedUriSchemes();
- method public boolean hasCapabilities(int);
- method public boolean supportsUriScheme(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int CAPABILITY_CONNECTION_MANAGER = 1; // 0x1
- field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
- field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
- field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR;
- field public static final int NO_COLOR = -1; // 0xffffffff
- field public static final java.lang.String SCHEME_SIP = "sip";
- field public static final java.lang.String SCHEME_TEL = "tel";
- field public static final java.lang.String SCHEME_VOICEMAIL = "voicemail";
- }
-
- public static class PhoneAccount.Builder {
- ctor public PhoneAccount.Builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence);
- ctor public PhoneAccount.Builder(android.telecom.PhoneAccount);
- method public android.telecom.PhoneAccount build();
- method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
- method public android.telecom.PhoneAccount.Builder setCapabilities(int);
- method public android.telecom.PhoneAccount.Builder setColor(int);
- method public android.telecom.PhoneAccount.Builder setIconBitmap(android.graphics.Bitmap);
- method public android.telecom.PhoneAccount.Builder setIconPackageName(java.lang.String);
- method public android.telecom.PhoneAccount.Builder setIconResId(int);
- method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence);
- method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri);
- method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>);
- }
-
- public class PhoneAccountHandle implements android.os.Parcelable {
- ctor public PhoneAccountHandle(android.content.ComponentName, java.lang.String);
- method public int describeContents();
- method public android.content.ComponentName getComponentName();
- method public java.lang.String getId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccountHandle> CREATOR;
- }
-
- public final class PhoneCapabilities {
- method public static java.lang.String toString(int);
- field public static final int ADD_CALL = 16; // 0x10
- field public static final int ALL = 12543; // 0x30ff
- field public static final int DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000
- field public static final int HOLD = 1; // 0x1
- field public static final int MANAGE_CONFERENCE = 128; // 0x80
- field public static final int MERGE_CONFERENCE = 4; // 0x4
- field public static final int MUTE = 64; // 0x40
- field public static final int RESPOND_VIA_TEXT = 32; // 0x20
- field public static final int SEPARATE_FROM_CONFERENCE = 4096; // 0x1000
- field public static final int SUPPORT_HOLD = 2; // 0x2
- field public static final int SWAP_CONFERENCE = 8; // 0x8
- }
-
- public final class RemoteConference {
- method public void disconnect();
- method public final int getCallCapabilities();
- method public java.util.List<android.telecom.RemoteConnection> getConferenceableConnections();
- method public final java.util.List<android.telecom.RemoteConnection> getConnections();
- method public android.telecom.DisconnectCause getDisconnectCause();
- method public final int getState();
- method public void hold();
- method public void merge();
- method public void playDtmfTone(char);
- method public final void registerCallback(android.telecom.RemoteConference.Callback);
- method public void separate(android.telecom.RemoteConnection);
- method public void setAudioState(android.telecom.AudioState);
- method public void stopDtmfTone();
- method public void swap();
- method public void unhold();
- method public final void unregisterCallback(android.telecom.RemoteConference.Callback);
- }
-
- public static abstract class RemoteConference.Callback {
- ctor public RemoteConference.Callback();
- method public void onCapabilitiesChanged(android.telecom.RemoteConference, int);
- method public void onConferenceableConnectionsChanged(android.telecom.RemoteConference, java.util.List<android.telecom.RemoteConnection>);
- method public void onConnectionAdded(android.telecom.RemoteConference, android.telecom.RemoteConnection);
- method public void onConnectionRemoved(android.telecom.RemoteConference, android.telecom.RemoteConnection);
- method public void onDestroyed(android.telecom.RemoteConference);
- method public void onDisconnected(android.telecom.RemoteConference, android.telecom.DisconnectCause);
- method public void onStateChanged(android.telecom.RemoteConference, int, int);
- }
-
- public final class RemoteConnection {
- method public void abort();
- method public void answer();
- method public void disconnect();
- method public android.net.Uri getAddress();
- method public int getAddressPresentation();
- method public int getCallCapabilities();
- method public java.lang.CharSequence getCallerDisplayName();
- method public int getCallerDisplayNamePresentation();
- method public android.telecom.RemoteConference getConference();
- method public java.util.List<android.telecom.RemoteConnection> getConferenceableConnections();
- method public android.telecom.DisconnectCause getDisconnectCause();
- method public int getState();
- method public android.telecom.StatusHints getStatusHints();
- method public void hold();
- method public boolean isRingbackRequested();
- method public boolean isVoipAudioMode();
- method public void playDtmfTone(char);
- method public void postDialContinue(boolean);
- method public void registerCallback(android.telecom.RemoteConnection.Callback);
- method public void reject();
- method public void setAudioState(android.telecom.AudioState);
- method public void stopDtmfTone();
- method public void unhold();
- method public void unregisterCallback(android.telecom.RemoteConnection.Callback);
- }
-
- public static abstract class RemoteConnection.Callback {
- ctor public RemoteConnection.Callback();
- method public void onAddressChanged(android.telecom.RemoteConnection, android.net.Uri, int);
- method public void onCallCapabilitiesChanged(android.telecom.RemoteConnection, int);
- method public void onCallerDisplayNameChanged(android.telecom.RemoteConnection, java.lang.String, int);
- method public void onConferenceChanged(android.telecom.RemoteConnection, android.telecom.RemoteConference);
- method public void onConferenceableConnectionsChanged(android.telecom.RemoteConnection, java.util.List<android.telecom.RemoteConnection>);
- method public void onDestroyed(android.telecom.RemoteConnection);
- method public void onDisconnected(android.telecom.RemoteConnection, android.telecom.DisconnectCause);
- method public void onPostDialWait(android.telecom.RemoteConnection, java.lang.String);
- method public void onRingbackRequested(android.telecom.RemoteConnection, boolean);
- method public void onStateChanged(android.telecom.RemoteConnection, int);
- method public void onStatusHintsChanged(android.telecom.RemoteConnection, android.telecom.StatusHints);
- method public void onVoipAudioChanged(android.telecom.RemoteConnection, boolean);
- }
-
- public final class StatusHints implements android.os.Parcelable {
- ctor public StatusHints(android.content.ComponentName, java.lang.CharSequence, int, android.os.Bundle);
- method public int describeContents();
- method public android.os.Bundle getExtras();
- method public android.graphics.drawable.Drawable getIcon(android.content.Context);
- method public int getIconResId();
- method public java.lang.CharSequence getLabel();
- method public android.content.ComponentName getPackageName();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.StatusHints> CREATOR;
- }
-
public class TelecomManager {
- method public void addNewIncomingCall(android.telecom.PhoneAccountHandle, android.os.Bundle);
method public void cancelMissedCallsNotification();
- method public void clearAccounts();
- method public android.net.Uri getAdnUriForPhoneAccount(android.telecom.PhoneAccountHandle);
- method public android.telecom.PhoneAccountHandle getConnectionManager();
- method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle);
- method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage();
method public boolean handleMmi(java.lang.String);
- method public boolean handleMmi(android.telecom.PhoneAccountHandle, java.lang.String);
- method public boolean hasMultipleCallCapableAccounts();
method public boolean isInCall();
- method public void registerPhoneAccount(android.telecom.PhoneAccount);
method public void showInCallScreen(boolean);
- method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
- field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
- field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
- field public static final java.lang.String EXTRA_CONNECTION_SERVICE = "android.telecom.extra.CONNECTION_SERVICE";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecom.extra.PHONE_ACCOUNT_HANDLE";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
@@ -28744,6 +28424,7 @@ package android.telephony {
method public void downloadMultimediaMessage(android.content.Context, java.lang.String, android.net.Uri, android.os.Bundle, android.app.PendingIntent);
method public android.os.Bundle getCarrierConfigValues();
method public static android.telephony.SmsManager getDefault();
+ method public static int getDefaultSmsSubscriptionId();
method public static android.telephony.SmsManager getSmsManagerForSubscriber(int);
method public int getSubId();
method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent);
@@ -28862,13 +28543,13 @@ package android.telephony {
field public byte[] encodedScAddress;
}
- public class SubInfoRecord implements android.os.Parcelable {
+ public class SubscriptionInfo implements android.os.Parcelable {
+ method public android.graphics.Bitmap createIconBitmap(android.content.Context);
method public int describeContents();
- method public int getColor();
method public int getDataRoaming();
method public java.lang.CharSequence getDisplayName();
method public java.lang.String getIccId();
- method public android.graphics.drawable.BitmapDrawable getIcon();
+ method public int getIconTint();
method public int getMcc();
method public int getMnc();
method public int getNameSource();
@@ -28876,25 +28557,23 @@ package android.telephony {
method public int getSimSlotIndex();
method public int getSubscriptionId();
method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telephony.SubInfoRecord> CREATOR;
+ field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionInfo> CREATOR;
+ }
+
+ public class SubscriptionListener {
+ ctor public SubscriptionListener();
+ ctor public SubscriptionListener(android.os.Looper);
+ method public void onSubscriptionInfoChanged();
+ field public static final int LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED = 1; // 0x1
}
public class SubscriptionManager implements android.provider.BaseColumns {
- method public static java.util.List<android.telephony.SubInfoRecord> getActiveSubInfoList();
- method public static int getDefaultSmsSubId();
- method public static int getSlotId(int);
- method public static android.telephony.SubInfoRecord getSubInfoForSubscriber(int);
- method public static java.util.List<android.telephony.SubInfoRecord> getSubInfoUsingSlotId(int);
- method public static boolean isValidSubId(int);
- field public static final int ASK_USER_SUB_ID = -1001; // 0xfffffc17
- field public static final int DEFAULT_PHONE_ID = 2147483647; // 0x7fffffff
- field public static final int DEFAULT_SUB_ID = 2147483647; // 0x7fffffff
- field public static final int INVALID_PHONE_ID = -1000; // 0xfffffc18
- field public static final int INVALID_SLOT_ID = -1000; // 0xfffffc18
+ method public static java.util.List<android.telephony.SubscriptionInfo> getActiveSubscriptionInfoList();
+ method public static android.telephony.SubscriptionInfo getSubscriptionInfoForSubscriber(int);
+ method public static java.util.List<android.telephony.SubscriptionInfo> getSubscriptionInfoUsingSlotId(int);
+ method public static void register(android.content.Context, android.telephony.SubscriptionListener, int);
+ method public static void unregister(android.content.Context, android.telephony.SubscriptionListener);
field public static final int INVALID_SUB_ID = -1000; // 0xfffffc18
- field public static final java.lang.String MCC = "mcc";
- field public static final java.lang.String MNC = "mnc";
- field public static final int SIM_NOT_INSERTED = -1; // 0xffffffff
}
public class TelephonyManager {
@@ -33407,7 +33086,6 @@ package android.view {
method public int describeContents();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
- method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
method public deprecated void unlockCanvas(android.graphics.Canvas);
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index bc57030..0cad17d 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -127,6 +127,7 @@ public class Am extends BaseCommand {
" am screen-compat [on|off] <PACKAGE>\n" +
" am to-uri [INTENT]\n" +
" am to-intent-uri [INTENT]\n" +
+ " am to-app-uri [INTENT]\n" +
" am switch-user <USER_ID>\n" +
" am start-user <USER_ID>\n" +
" am stop-user <USER_ID>\n" +
@@ -229,6 +230,8 @@ public class Am extends BaseCommand {
"\n" +
"am to-intent-uri: print the given Intent specification as an intent: URI.\n" +
"\n" +
+ "am to-app-uri: print the given Intent specification as an android-app: URI.\n" +
+ "\n" +
"am switch-user: switch to put USER_ID in the foreground, starting\n" +
" execution of that user if it is currently stopped.\n" +
"\n" +
@@ -270,7 +273,7 @@ public class Am extends BaseCommand {
" [--efa <EXTRA_KEY> <EXTRA_FLOAT_VALUE>[,<EXTRA_FLOAT_VALUE...]]\n" +
" [--esa <EXTRA_KEY> <EXTRA_STRING_VALUE>[,<EXTRA_STRING_VALUE...]]\n" +
" (to embed a comma into a string escape it using \"\\,\")\n" +
- " [-n <COMPONENT>] [-f <FLAGS>]\n" +
+ " [-n <COMPONENT>] [-p <PACKAGE>] [-f <FLAGS>]\n" +
" [--grant-read-uri-permission] [--grant-write-uri-permission]\n" +
" [--grant-persistable-uri-permission] [--grant-prefix-uri-permission]\n" +
" [--debug-log-resolution] [--exclude-stopped-packages]\n" +
@@ -337,9 +340,11 @@ public class Am extends BaseCommand {
} else if (op.equals("screen-compat")) {
runScreenCompat();
} else if (op.equals("to-uri")) {
- runToUri(false);
+ runToUri(0);
} else if (op.equals("to-intent-uri")) {
- runToUri(true);
+ runToUri(Intent.URI_INTENT_SCHEME);
+ } else if (op.equals("to-app-uri")) {
+ runToUri(Intent.URI_ANDROID_APP_SCHEME);
} else if (op.equals("switch-user")) {
runSwitchUser();
} else if (op.equals("start-user")) {
@@ -502,6 +507,12 @@ public class Am extends BaseCommand {
if (intent == baseIntent) {
hasIntentInfo = true;
}
+ } else if (opt.equals("-p")) {
+ String str = nextArgRequired();
+ intent.setPackage(str);
+ if (intent == baseIntent) {
+ hasIntentInfo = true;
+ }
} else if (opt.equals("-f")) {
String str = nextArgRequired();
intent.setFlags(Integer.decode(str).intValue());
@@ -607,7 +618,8 @@ public class Am extends BaseCommand {
} else if (arg.indexOf(':') >= 0) {
// The argument is a URI. Fully parse it, and use that result
// to fill in any data not specified so far.
- baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME);
+ baseIntent = Intent.parseUri(arg, Intent.URI_INTENT_SCHEME
+ | Intent.URI_ANDROID_APP_SCHEME);
} else if (arg.indexOf('/') >= 0) {
// The argument is a component name. Build an Intent to launch
// it.
@@ -1549,9 +1561,9 @@ public class Am extends BaseCommand {
} while (packageName != null);
}
- private void runToUri(boolean intentScheme) throws Exception {
+ private void runToUri(int flags) throws Exception {
Intent intent = makeIntent(UserHandle.USER_CURRENT);
- System.out.println(intent.toUri(intentScheme ? Intent.URI_INTENT_SCHEME : 0));
+ System.out.println(intent.toUri(flags));
}
private class IntentReceiver extends IIntentReceiver.Stub {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 4b705dd..148527f 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -693,6 +693,7 @@ public class Activity extends ContextThemeWrapper
/*package*/ String mEmbeddedID;
private Application mApplication;
/*package*/ Intent mIntent;
+ /*package*/ String mReferrer;
private ComponentName mComponent;
/*package*/ ActivityInfo mActivityInfo;
/*package*/ ActivityThread mMainThread;
@@ -4448,6 +4449,39 @@ public class Activity extends ContextThemeWrapper
}
/**
+ * Return information about who launched this activity. If the launching Intent
+ * contains an {@link android.content.Intent#EXTRA_REFERRER Intent.EXTRA_REFERRER},
+ * that will be returned as-is; otherwise, if known, an
+ * {@link Intent#URI_ANDROID_APP_SCHEME android-app:} referrer URI containing the
+ * package name that started the Intent will be returned. This may return null if no
+ * referrer can be identified -- it is neither explicitly specified, nor is it known which
+ * application package was involved.
+ *
+ * <p>If called while inside the handling of {@link #onNewIntent}, this function will
+ * return the referrer that submitted that new intent to the activity. Otherwise, it
+ * always returns the referrer of the original Intent.</p>
+ *
+ * <p>Note that this is <em>not</em> a security feature -- you can not trust the
+ * referrer information, applications can spoof it.</p>
+ */
+ @Nullable
+ public Uri getReferrer() {
+ Intent intent = getIntent();
+ Uri referrer = intent.getParcelableExtra(Intent.EXTRA_REFERRER);
+ if (referrer != null) {
+ return referrer;
+ }
+ String referrerName = intent.getStringExtra(Intent.EXTRA_REFERRER_NAME);
+ if (referrerName != null) {
+ return Uri.parse(referrerName);
+ }
+ if (mReferrer != null) {
+ return new Uri.Builder().scheme("android-app").authority(mReferrer).build();
+ }
+ return null;
+ }
+
+ /**
* Return the name of the package that invoked this activity. This is who
* the data in {@link #setResult setResult()} will be sent to. You can
* use this information to validate that the recipient is allowed to
@@ -5868,7 +5902,7 @@ public class Activity extends ContextThemeWrapper
Application application, Intent intent, ActivityInfo info,
CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
- Configuration config, IVoiceInteractor voiceInteractor) {
+ Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
attachBaseContext(context);
mFragments.attachActivity(this, mContainer, null);
@@ -5891,6 +5925,7 @@ public class Activity extends ContextThemeWrapper
mIdent = ident;
mApplication = application;
mIntent = intent;
+ mReferrer = referrer;
mComponent = intent.getComponent();
mActivityInfo = info;
mTitle = title;
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index a285932..7a636db 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -213,6 +213,13 @@ public class ActivityManager {
public static final int BROADCAST_STICKY_CANT_HAVE_PERMISSION = -1;
/**
+ * Result for IActivityManager.broadcastIntent: trying to send a broadcast
+ * to a stopped user. Fail.
+ * @hide
+ */
+ public static final int BROADCAST_FAILED_USER_STOPPED = -2;
+
+ /**
* Type for IActivityManaqer.getIntentSender: this PendingIntent is
* for a sendBroadcast operation.
* @hide
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index bc7114b..c3028b7 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2279,6 +2279,20 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
return true;
}
+ case START_IN_PLACE_ANIMATION_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ final Bundle bundle;
+ if (data.readInt() == 0) {
+ bundle = null;
+ } else {
+ bundle = data.readBundle();
+ }
+ final ActivityOptions options = bundle == null ? null : new ActivityOptions(bundle);
+ startInPlaceAnimationOnFrontMostApplication(options);
+ reply.writeNoException();
+ return true;
+ }
+
case REQUEST_VISIBLE_BEHIND_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder token = data.readStrongBinder();
@@ -5298,6 +5312,24 @@ class ActivityManagerProxy implements IActivityManager
}
@Override
+ public void startInPlaceAnimationOnFrontMostApplication(ActivityOptions options)
+ throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ if (options == null) {
+ data.writeInt(0);
+ } else {
+ data.writeInt(1);
+ data.writeBundle(options.toBundle());
+ }
+ mRemote.transact(START_IN_PLACE_ANIMATION_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
+ @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/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index cd6a4f5..3d390bf 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -63,6 +63,12 @@ public class ActivityOptions {
public static final String KEY_ANIM_EXIT_RES_ID = "android:animExitRes";
/**
+ * Custom in-place animation resource ID.
+ * @hide
+ */
+ public static final String KEY_ANIM_IN_PLACE_RES_ID = "android:animInPlaceRes";
+
+ /**
* Bitmap for thumbnail animation.
* @hide
*/
@@ -132,11 +138,14 @@ public class ActivityOptions {
public static final int ANIM_THUMBNAIL_ASPECT_SCALE_UP = 8;
/** @hide */
public static final int ANIM_THUMBNAIL_ASPECT_SCALE_DOWN = 9;
+ /** @hide */
+ public static final int ANIM_CUSTOM_IN_PLACE = 10;
private String mPackageName;
private int mAnimationType = ANIM_NONE;
private int mCustomEnterResId;
private int mCustomExitResId;
+ private int mCustomInPlaceResId;
private Bitmap mThumbnail;
private int mStartX;
private int mStartY;
@@ -198,6 +207,30 @@ public class ActivityOptions {
return opts;
}
+ /**
+ * Creates an ActivityOptions specifying a custom animation to run in place on an existing
+ * activity.
+ *
+ * @param context Who is defining this. This is the application that the
+ * animation resources will be loaded from.
+ * @param animId A resource ID of the animation resource to use for
+ * the incoming activity.
+ * @return Returns a new ActivityOptions object that you can use to
+ * supply these options as the options Bundle when running an in-place animation.
+ * @hide
+ */
+ public static ActivityOptions makeCustomInPlaceAnimation(Context context, int animId) {
+ if (animId == 0) {
+ throw new RuntimeException("You must specify a valid animation.");
+ }
+
+ ActivityOptions opts = new ActivityOptions();
+ opts.mPackageName = context.getPackageName();
+ opts.mAnimationType = ANIM_CUSTOM_IN_PLACE;
+ opts.mCustomInPlaceResId = animId;
+ return opts;
+ }
+
private void setOnAnimationStartedListener(Handler handler,
OnAnimationStartedListener listener) {
if (listener != null) {
@@ -540,6 +573,10 @@ public class ActivityOptions {
opts.getBinder(KEY_ANIM_START_LISTENER));
break;
+ case ANIM_CUSTOM_IN_PLACE:
+ mCustomInPlaceResId = opts.getInt(KEY_ANIM_IN_PLACE_RES_ID, 0);
+ break;
+
case ANIM_SCALE_UP:
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
@@ -592,6 +629,11 @@ public class ActivityOptions {
}
/** @hide */
+ public int getCustomInPlaceResId() {
+ return mCustomInPlaceResId;
+ }
+
+ /** @hide */
public Bitmap getThumbnail() {
return mThumbnail;
}
@@ -689,6 +731,9 @@ public class ActivityOptions {
}
mAnimationStartedListener = otherOptions.mAnimationStartedListener;
break;
+ case ANIM_CUSTOM_IN_PLACE:
+ mCustomInPlaceResId = otherOptions.mCustomInPlaceResId;
+ break;
case ANIM_SCALE_UP:
mStartX = otherOptions.mStartX;
mStartY = otherOptions.mStartY;
@@ -756,6 +801,9 @@ public class ActivityOptions {
b.putBinder(KEY_ANIM_START_LISTENER, mAnimationStartedListener
!= null ? mAnimationStartedListener.asBinder() : null);
break;
+ case ANIM_CUSTOM_IN_PLACE:
+ b.putInt(KEY_ANIM_IN_PLACE_RES_ID, mCustomInPlaceResId);
+ break;
case ANIM_SCALE_UP:
b.putInt(KEY_ANIM_START_X, mStartX);
b.putInt(KEY_ANIM_START_Y, mStartY);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index cf6c049..5f21d75 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -94,6 +94,7 @@ import android.renderscript.RenderScript;
import android.security.AndroidKeyStoreProvider;
import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.RuntimeInit;
import com.android.internal.os.SamplingProfilerIntegration;
@@ -268,6 +269,7 @@ public final class ActivityThread {
IBinder token;
int ident;
Intent intent;
+ String referrer;
IVoiceInteractor voiceInteractor;
Bundle state;
PersistableBundle persistentState;
@@ -290,7 +292,7 @@ public final class ActivityThread {
LoadedApk packageInfo;
List<ResultInfo> pendingResults;
- List<Intent> pendingIntents;
+ List<ReferrerIntent> pendingIntents;
boolean startsNotResumed;
boolean isForward;
@@ -348,7 +350,7 @@ public final class ActivityThread {
}
static final class NewIntentData {
- List<Intent> intents;
+ List<ReferrerIntent> intents;
IBinder token;
public String toString() {
return "NewIntentData{intents=" + intents + " token=" + token + "}";
@@ -605,9 +607,9 @@ public final class ActivityThread {
// activity itself back to the activity manager. (matters more with ipc)
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
- IVoiceInteractor voiceInteractor, int procState, Bundle state,
+ String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
- List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
+ List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
ProfilerInfo profilerInfo) {
updateProcessState(procState, false);
@@ -617,6 +619,7 @@ public final class ActivityThread {
r.token = token;
r.ident = ident;
r.intent = intent;
+ r.referrer = referrer;
r.voiceInteractor = voiceInteractor;
r.activityInfo = info;
r.compatInfo = compatInfo;
@@ -637,13 +640,13 @@ public final class ActivityThread {
}
public final void scheduleRelaunchActivity(IBinder token,
- List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
+ List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
int configChanges, boolean notResumed, Configuration config) {
requestRelaunchActivity(token, pendingResults, pendingNewIntents,
configChanges, notResumed, config, true);
}
- public final void scheduleNewIntent(List<Intent> intents, IBinder token) {
+ public final void scheduleNewIntent(List<ReferrerIntent> intents, IBinder token) {
NewIntentData data = new NewIntentData();
data.intents = intents;
data.token = token;
@@ -2234,7 +2237,7 @@ public final class ActivityThread {
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
- r.voiceInteractor);
+ r.referrer, r.voiceInteractor);
if (customIntent != null) {
activity.mIntent = customIntent;
@@ -2421,8 +2424,7 @@ public final class ActivityThread {
}
}
- private void deliverNewIntents(ActivityClientRecord r,
- List<Intent> intents) {
+ private void deliverNewIntents(ActivityClientRecord r, List<ReferrerIntent> intents) {
final int N = intents.size();
for (int i=0; i<N; i++) {
Intent intent = intents.get(i);
@@ -2433,8 +2435,7 @@ public final class ActivityThread {
}
}
- public final void performNewIntents(IBinder token,
- List<Intent> intents) {
+ public final void performNewIntents(IBinder token, List<ReferrerIntent> intents) {
ActivityClientRecord r = mActivities.get(token);
if (r != null) {
final boolean resumed = !r.paused;
@@ -3752,7 +3753,7 @@ public final class ActivityThread {
}
public final void requestRelaunchActivity(IBinder token,
- List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
+ List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
int configChanges, boolean notResumed, Configuration config,
boolean fromServer) {
ActivityClientRecord target = null;
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index 0123e16..d1b77b9 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -36,6 +36,7 @@ import android.os.IBinder;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.content.ReferrerIntent;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -140,19 +141,21 @@ public abstract class ApplicationThreadNative extends Binder
ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
Configuration curConfig = Configuration.CREATOR.createFromParcel(data);
CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
+ String referrer = data.readString();
IVoiceInteractor voiceInteractor = IVoiceInteractor.Stub.asInterface(
data.readStrongBinder());
int procState = data.readInt();
Bundle state = data.readBundle();
PersistableBundle persistentState = data.readPersistableBundle();
List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
- List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
+ List<ReferrerIntent> pi = data.createTypedArrayList(ReferrerIntent.CREATOR);
boolean notResumed = data.readInt() != 0;
boolean isForward = data.readInt() != 0;
ProfilerInfo profilerInfo = data.readInt() != 0
? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo, voiceInteractor,
- procState, state, persistentState, ri, pi, notResumed, isForward, profilerInfo);
+ scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo, referrer,
+ voiceInteractor, procState, state, persistentState, ri, pi,
+ notResumed, isForward, profilerInfo);
return true;
}
@@ -161,7 +164,7 @@ public abstract class ApplicationThreadNative extends Binder
data.enforceInterface(IApplicationThread.descriptor);
IBinder b = data.readStrongBinder();
List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
- List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
+ List<ReferrerIntent> pi = data.createTypedArrayList(ReferrerIntent.CREATOR);
int configChanges = data.readInt();
boolean notResumed = data.readInt() != 0;
Configuration config = null;
@@ -175,7 +178,7 @@ public abstract class ApplicationThreadNative extends Binder
case SCHEDULE_NEW_INTENT_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
- List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
+ List<ReferrerIntent> pi = data.createTypedArrayList(ReferrerIntent.CREATOR);
IBinder b = data.readStrongBinder();
scheduleNewIntent(pi, b);
return true;
@@ -764,9 +767,9 @@ class ApplicationThreadProxy implements IApplicationThread {
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
- IVoiceInteractor voiceInteractor, int procState, Bundle state,
+ String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
- List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
+ List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
ProfilerInfo profilerInfo) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -776,6 +779,7 @@ class ApplicationThreadProxy implements IApplicationThread {
info.writeToParcel(data, 0);
curConfig.writeToParcel(data, 0);
compatInfo.writeToParcel(data, 0);
+ data.writeString(referrer);
data.writeStrongBinder(voiceInteractor != null ? voiceInteractor.asBinder() : null);
data.writeInt(procState);
data.writeBundle(state);
@@ -796,7 +800,7 @@ class ApplicationThreadProxy implements IApplicationThread {
}
public final void scheduleRelaunchActivity(IBinder token,
- List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
+ List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
int configChanges, boolean notResumed, Configuration config)
throws RemoteException {
Parcel data = Parcel.obtain();
@@ -817,7 +821,7 @@ class ApplicationThreadProxy implements IApplicationThread {
data.recycle();
}
- public void scheduleNewIntent(List<Intent> intents, IBinder token)
+ public void scheduleNewIntent(List<ReferrerIntent> intents, IBinder token)
throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 0092ee7..2784d44 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -38,6 +38,7 @@ import android.view.ViewTreeObserver;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
final class BackStackState implements Parcelable {
final int[] mOps;
@@ -1055,7 +1056,7 @@ final class BackStackRecord extends FragmentTransaction implements
}
private static ArrayList<View> captureExitingViews(Transition exitTransition,
- Fragment outFragment, ArrayMap<String, View> namedViews) {
+ Fragment outFragment, ArrayMap<String, View> namedViews, View nonExistentView) {
ArrayList<View> viewList = null;
if (exitTransition != null) {
viewList = new ArrayList<View>();
@@ -1064,7 +1065,10 @@ final class BackStackRecord extends FragmentTransaction implements
if (namedViews != null) {
viewList.removeAll(namedViews.values());
}
- addTargets(exitTransition, viewList);
+ if (!viewList.isEmpty()) {
+ viewList.add(nonExistentView);
+ addTargets(exitTransition, viewList);
+ }
}
return viewList;
}
@@ -1132,11 +1136,8 @@ final class BackStackRecord extends FragmentTransaction implements
namedViews = mapSharedElementsIn(state, isBack, inFragment);
removeTargets(sharedElementTransition, sharedElementTargets);
sharedElementTargets.clear();
- if (namedViews.isEmpty()) {
- sharedElementTargets.add(state.nonExistentView);
- } else {
- sharedElementTargets.addAll(namedViews.values());
- }
+ sharedElementTargets.add(state.nonExistentView);
+ sharedElementTargets.addAll(namedViews.values());
addTargets(sharedElementTransition, sharedElementTargets);
@@ -1153,6 +1154,9 @@ final class BackStackRecord extends FragmentTransaction implements
if (namedViews != null) {
enteringViews.removeAll(namedViews.values());
}
+ enteringViews.add(state.nonExistentView);
+ // We added this earlier to prevent any views being targeted.
+ enterTransition.removeTarget(state.nonExistentView);
addTargets(enterTransition, enteringViews);
}
setSharedElementEpicenter(enterTransition, state);
@@ -1293,11 +1297,8 @@ final class BackStackRecord extends FragmentTransaction implements
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());
- }
+ sharedElementTargets.add(state.nonExistentView);
+ sharedElementTargets.addAll(namedViews.values());
addTargets(sharedElementTransition, sharedElementTargets);
// Notify the start of the transition.
@@ -1310,7 +1311,7 @@ final class BackStackRecord extends FragmentTransaction implements
}
ArrayList<View> exitingViews = captureExitingViews(exitTransition, outFragment,
- namedViews);
+ namedViews, state.nonExistentView);
if (exitingViews == null || exitingViews.isEmpty()) {
exitTransition = null;
}
@@ -1388,20 +1389,69 @@ final class BackStackRecord extends FragmentTransaction implements
}
}
- private static void removeTargets(Transition transition, ArrayList<View> views) {
- int numViews = views.size();
- for (int i = 0; i < numViews; i++) {
- transition.removeTarget(views.get(i));
+ /**
+ * This method removes the views from transitions that target ONLY those views.
+ * The views list should match those added in addTargets and should contain
+ * one view that is not in the view hierarchy (state.nonExistentView).
+ */
+ public static void removeTargets(Transition transition, ArrayList<View> views) {
+ if (transition instanceof TransitionSet) {
+ TransitionSet set = (TransitionSet) transition;
+ int numTransitions = set.getTransitionCount();
+ for (int i = 0; i < numTransitions; i++) {
+ Transition child = set.getTransitionAt(i);
+ removeTargets(child, views);
+ }
+ } else if (!hasSimpleTarget(transition)) {
+ List<View> targets = transition.getTargets();
+ if (targets != null && targets.size() == views.size() &&
+ targets.containsAll(views)) {
+ // We have an exact match. We must have added these earlier in addTargets
+ for (int i = views.size() - 1; i >= 0; i--) {
+ transition.removeTarget(views.get(i));
+ }
+ }
}
}
- private static void addTargets(Transition transition, ArrayList<View> views) {
- int numViews = views.size();
- for (int i = 0; i < numViews; i++) {
- transition.addTarget(views.get(i));
+ /**
+ * This method adds views as targets to the transition, but only if the transition
+ * doesn't already have a target. It is best for views to contain one View object
+ * that does not exist in the view hierarchy (state.nonExistentView) so that
+ * when they are removed later, a list match will suffice to remove the targets.
+ * Otherwise, if you happened to have targeted the exact views for the transition,
+ * the removeTargets call will remove them unexpectedly.
+ */
+ public static void addTargets(Transition transition, ArrayList<View> views) {
+ if (transition instanceof TransitionSet) {
+ TransitionSet set = (TransitionSet) transition;
+ int numTransitions = set.getTransitionCount();
+ for (int i = 0; i < numTransitions; i++) {
+ Transition child = set.getTransitionAt(i);
+ addTargets(child, views);
+ }
+ } else if (!hasSimpleTarget(transition)) {
+ List<View> targets = transition.getTargets();
+ if (isNullOrEmpty(targets)) {
+ // We can just add the target views
+ int numViews = views.size();
+ for (int i = 0; i < numViews; i++) {
+ transition.addTarget(views.get(i));
+ }
+ }
}
}
+ private static boolean hasSimpleTarget(Transition transition) {
+ return !isNullOrEmpty(transition.getTargetIds()) ||
+ !isNullOrEmpty(transition.getTargetNames()) ||
+ !isNullOrEmpty(transition.getTargetTypes());
+ }
+
+ private static boolean isNullOrEmpty(List list) {
+ return list == null || list.isEmpty();
+ }
+
/**
* Remaps a name-to-View map, substituting different names for keys.
*
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index efcb197..6433f3f 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -456,6 +456,9 @@ public interface IActivityManager extends IInterface {
throws RemoteException;
public Bitmap getTaskDescriptionIcon(String filename) throws RemoteException;
+ public void startInPlaceAnimationOnFrontMostApplication(ActivityOptions opts)
+ throws RemoteException;
+
public boolean requestVisibleBehind(IBinder token, boolean visible) throws RemoteException;
public boolean isBackgroundVisibleBehind(IBinder token) throws RemoteException;
public void backgroundResourcesReleased(IBinder token) throws RemoteException;
@@ -781,4 +784,5 @@ public interface IActivityManager extends IInterface {
int BOOT_ANIMATION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+237;
int GET_TASK_DESCRIPTION_ICON_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+238;
int LAUNCH_ASSIST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+239;
+ int START_IN_PLACE_ANIMATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+240;
}
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index f53075c..42acbc6 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -35,6 +35,7 @@ import android.os.IBinder;
import android.os.IInterface;
import android.service.voice.IVoiceInteractionSession;
import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.content.ReferrerIntent;
import java.io.FileDescriptor;
import java.util.List;
@@ -59,14 +60,14 @@ public interface IApplicationThread extends IInterface {
void scheduleSendResult(IBinder token, List<ResultInfo> results) throws RemoteException;
void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
- IVoiceInteractor voiceInteractor, int procState, Bundle state,
+ String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state,
PersistableBundle persistentState, List<ResultInfo> pendingResults,
- List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
+ List<ReferrerIntent> pendingNewIntents, boolean notResumed, boolean isForward,
ProfilerInfo profilerInfo) throws RemoteException;
void scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults,
- List<Intent> pendingNewIntents, int configChanges,
+ List<ReferrerIntent> pendingNewIntents, int configChanges,
boolean notResumed, Configuration config) throws RemoteException;
- void scheduleNewIntent(List<Intent> intent, IBinder token) throws RemoteException;
+ void scheduleNewIntent(List<ReferrerIntent> intent, IBinder token) throws RemoteException;
void scheduleDestroyActivity(IBinder token, boolean finished,
int configChanges) throws RemoteException;
void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo,
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 60a013e..d96153a 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -45,6 +45,7 @@ import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.Window;
+import com.android.internal.content.ReferrerIntent;
import java.io.File;
import java.util.ArrayList;
@@ -1042,7 +1043,7 @@ public class Instrumentation {
activity.attach(context, aThread, this, token, 0, application, intent,
info, title, parent, id,
(Activity.NonConfigurationInstances)lastNonConfigurationInstance,
- new Configuration(), null);
+ new Configuration(), null, null);
return activity;
}
@@ -1207,7 +1208,17 @@ public class Instrumentation {
* @param intent The new intent being received.
*/
public void callActivityOnNewIntent(Activity activity, Intent intent) {
- activity.onNewIntent(intent);
+ final String oldReferrer = activity.mReferrer;
+ try {
+ try {
+ activity.mReferrer = ((ReferrerIntent)intent).mReferrer;
+ } catch (ClassCastException e) {
+ activity.mReferrer = null;
+ }
+ activity.onNewIntent(intent);
+ } finally {
+ activity.mReferrer = oldReferrer;
+ }
}
/**
diff --git a/core/java/android/app/LocalActivityManager.java b/core/java/android/app/LocalActivityManager.java
index b654a6a..873e337 100644
--- a/core/java/android/app/LocalActivityManager.java
+++ b/core/java/android/app/LocalActivityManager.java
@@ -22,6 +22,7 @@ import android.os.Binder;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
+import com.android.internal.content.ReferrerIntent;
import java.util.ArrayList;
import java.util.HashMap;
@@ -310,8 +311,8 @@ public class LocalActivityManager {
if (aInfo.launchMode != ActivityInfo.LAUNCH_MULTIPLE ||
(intent.getFlags()&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0) {
// The activity wants onNewIntent() called.
- ArrayList<Intent> intents = new ArrayList<Intent>(1);
- intents.add(intent);
+ ArrayList<ReferrerIntent> intents = new ArrayList<>(1);
+ intents.add(new ReferrerIntent(intent, mParent.getPackageName()));
if (localLOGV) Log.v(TAG, r.id + ": new intent");
mActivityThread.performNewIntents(r, intents);
r.intent = intent;
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c65f017..dfe5cf5 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1113,7 +1113,11 @@ public class Notification implements Parcelable
/** Notification action extra which contains wearable extensions */
private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
+ // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
private static final String KEY_FLAGS = "flags";
+ private static final String KEY_IN_PROGRESS_LABEL = "inProgressLabel";
+ private static final String KEY_CONFIRM_LABEL = "confirmLabel";
+ private static final String KEY_CANCEL_LABEL = "cancelLabel";
// Flags bitwise-ored to mFlags
private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
@@ -1123,6 +1127,10 @@ public class Notification implements Parcelable
private int mFlags = DEFAULT_FLAGS;
+ private CharSequence mInProgressLabel;
+ private CharSequence mConfirmLabel;
+ private CharSequence mCancelLabel;
+
/**
* Create a {@link android.app.Notification.Action.WearableExtender} with default
* options.
@@ -1139,6 +1147,9 @@ public class Notification implements Parcelable
Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
if (wearableBundle != null) {
mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
+ mInProgressLabel = wearableBundle.getCharSequence(KEY_IN_PROGRESS_LABEL);
+ mConfirmLabel = wearableBundle.getCharSequence(KEY_CONFIRM_LABEL);
+ mCancelLabel = wearableBundle.getCharSequence(KEY_CANCEL_LABEL);
}
}
@@ -1154,6 +1165,15 @@ public class Notification implements Parcelable
if (mFlags != DEFAULT_FLAGS) {
wearableBundle.putInt(KEY_FLAGS, mFlags);
}
+ if (mInProgressLabel != null) {
+ wearableBundle.putCharSequence(KEY_IN_PROGRESS_LABEL, mInProgressLabel);
+ }
+ if (mConfirmLabel != null) {
+ wearableBundle.putCharSequence(KEY_CONFIRM_LABEL, mConfirmLabel);
+ }
+ if (mCancelLabel != null) {
+ wearableBundle.putCharSequence(KEY_CANCEL_LABEL, mCancelLabel);
+ }
builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
return builder;
@@ -1163,6 +1183,9 @@ public class Notification implements Parcelable
public WearableExtender clone() {
WearableExtender that = new WearableExtender();
that.mFlags = this.mFlags;
+ that.mInProgressLabel = this.mInProgressLabel;
+ that.mConfirmLabel = this.mConfirmLabel;
+ that.mCancelLabel = this.mCancelLabel;
return that;
}
@@ -1194,6 +1217,72 @@ public class Notification implements Parcelable
mFlags &= ~mask;
}
}
+
+ /**
+ * Set a label to display while the wearable is preparing to automatically execute the
+ * action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
+ *
+ * @param label the label to display while the action is being prepared to execute
+ * @return this object for method chaining
+ */
+ public WearableExtender setInProgressLabel(CharSequence label) {
+ mInProgressLabel = label;
+ return this;
+ }
+
+ /**
+ * Get the label to display while the wearable is preparing to automatically execute
+ * the action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
+ *
+ * @return the label to display while the action is being prepared to execute
+ */
+ public CharSequence getInProgressLabel() {
+ return mInProgressLabel;
+ }
+
+ /**
+ * Set a label to display to confirm that the action should be executed.
+ * This is usually an imperative verb like "Send".
+ *
+ * @param label the label to confirm the action should be executed
+ * @return this object for method chaining
+ */
+ public WearableExtender setConfirmLabel(CharSequence label) {
+ mConfirmLabel = label;
+ return this;
+ }
+
+ /**
+ * Get the label to display to confirm that the action should be executed.
+ * This is usually an imperative verb like "Send".
+ *
+ * @return the label to confirm the action should be executed
+ */
+ public CharSequence getConfirmLabel() {
+ return mConfirmLabel;
+ }
+
+ /**
+ * Set a label to display to cancel the action.
+ * This is usually an imperative verb, like "Cancel".
+ *
+ * @param label the label to display to cancel the action
+ * @return this object for method chaining
+ */
+ public WearableExtender setCancelLabel(CharSequence label) {
+ mCancelLabel = label;
+ return this;
+ }
+
+ /**
+ * Get the label to display to cancel the action.
+ * This is usually an imperative verb like "Cancel".
+ *
+ * @return the label to display to cancel the action
+ */
+ public CharSequence getCancelLabel() {
+ return mCancelLabel;
+ }
}
}
@@ -4356,7 +4445,7 @@ public class Notification implements Parcelable
/** Notification extra which contains wearable extensions */
private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
- // Keys within EXTRA_WEARABLE_OPTIONS for wearable options.
+ // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
private static final String KEY_ACTIONS = "actions";
private static final String KEY_FLAGS = "flags";
private static final String KEY_DISPLAY_INTENT = "displayIntent";
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index d3ff79d..33cac75 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -62,13 +62,16 @@ import java.util.Collections;
import java.util.List;
/**
- * Public interface for managing policies enforced on a device. Most clients
- * of this class must have published a {@link DeviceAdminReceiver} that the user
- * has currently enabled.
+ * Public interface for managing policies enforced on a device. Most clients of this class must be
+ * registered with the system as a
+ * <a href={@docRoot}guide/topics/admin/device-admin.html">device administrator</a>. Additionally,
+ * a device administrator may be registered as either a profile or device owner. A given method is
+ * accessible to all device administrators unless the documentation for that method specifies that
+ * it is restricted to either device or profile owners.
*
* <div class="special reference">
* <h3>Developer Guides</h3>
- * <p>For more information about managing policies for device adminstration, read the
+ * <p>For more information about managing policies for device administration, read the
* <a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>
* developer guide.</p>
* </div>
@@ -2586,6 +2589,10 @@ public class DevicePolicyManager {
* <p>The application restrictions are only made visible to the target application and the
* profile or device owner.
*
+ * <p>If the restrictions are not available yet, but may be applied in the near future,
+ * the admin can notify the target application of that by adding
+ * {@link UserManager#KEY_RESTRICTIONS_PENDING} to the settings parameter.
+ *
* <p>The calling device admin must be a profile or device owner; if it is not, a security
* exception will be thrown.
*
@@ -2593,6 +2600,8 @@ public class DevicePolicyManager {
* @param packageName The name of the package to update restricted settings for.
* @param settings A {@link Bundle} to be parsed by the receiving application, conveying a new
* set of active restrictions.
+ *
+ * @see UserManager#KEY_RESTRICTIONS_PENDING
*/
public void setApplicationRestrictions(ComponentName admin, String packageName,
Bundle settings) {
@@ -3297,6 +3306,7 @@ public class DevicePolicyManager {
* <p>The settings that can be updated by a profile or device owner with this method are:
* <ul>
* <li>{@link Settings.Secure#DEFAULT_INPUT_METHOD}</li>
+ * <li>{@link Settings.Secure#INSTALL_NON_MARKET_APPS}</li>
* <li>{@link Settings.Secure#SKIP_FIRST_USE_HINTS}</li>
* </ul>
* <p>A device owner can additionally update the following settings:
diff --git a/core/java/android/app/backup/IBackupManager.aidl b/core/java/android/app/backup/IBackupManager.aidl
index 8a44c8e..0a2d4f5 100644
--- a/core/java/android/app/backup/IBackupManager.aidl
+++ b/core/java/android/app/backup/IBackupManager.aidl
@@ -291,4 +291,16 @@ interface IBackupManager {
* {@hide}
*/
void opComplete(int token);
+
+ /**
+ * Make the device's backup and restore machinery (in)active. When it is inactive,
+ * the device will not perform any backup operations, nor will it deliver data for
+ * restore, although clients can still safely call BackupManager methods.
+ *
+ * @param whichUser User handle of the defined user whose backup active state
+ * is to be adjusted.
+ * @param makeActive {@code true} when backup services are to be made active;
+ * {@code false} otherwise.
+ */
+ void setBackupServiceActive(int whichUser, boolean makeActive);
}
diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl
index 992f601..cd4535a 100644
--- a/core/java/android/bluetooth/IBluetooth.aidl
+++ b/core/java/android/bluetooth/IBluetooth.aidl
@@ -98,4 +98,7 @@ interface IBluetooth
boolean isActivityAndEnergyReportingSupported();
void getActivityEnergyInfoFromController();
BluetoothActivityEnergyInfo reportActivityInfo();
+
+ // for dumpsys support
+ String dump();
}
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 2853c58..c8f9b7d 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -515,7 +515,10 @@ public abstract class ContentProvider implements ComponentCallbacks2 {
}
// last chance, check against any uri grants
- if (context.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ final int callingUserId = UserHandle.getUserId(uid);
+ final Uri userUri = (mSingleUser && !UserHandle.isSameUser(mMyUid, uid))
+ ? maybeAddUserId(uri, callingUserId) : uri;
+ if (context.checkUriPermission(userUri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION)
== PERMISSION_GRANTED) {
return;
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index e06f034..57f6028 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1401,14 +1401,36 @@ public class Intent implements Parcelable, Cloneable {
= "android.intent.extra.ORIGINATING_URI";
/**
- * Used as a URI extra field with {@link #ACTION_INSTALL_PACKAGE} and
- * {@link #ACTION_VIEW} to indicate the HTTP referrer URI associated with the Intent
- * data field or {@link #EXTRA_ORIGINATING_URI}.
+ * This extra can be used with any Intent used to launch an activity, supplying information
+ * about who is launching that activity. This field contains a {@link android.net.Uri}
+ * object, typically an http: or https: URI of the web site that the referral came from;
+ * it can also use the {@link #URI_ANDROID_APP_SCHEME android-app:} scheme to identify
+ * a native application that it came from.
+ *
+ * <p>To retrieve this value in a client, use {@link android.app.Activity#getReferrer}
+ * instead of directly retrieving the extra. It is also valid for applications to
+ * instead supply {@link #EXTRA_REFERRER_NAME} for cases where they can only create
+ * a string, not a Uri; the field here, if supplied, will always take precedence,
+ * however.</p>
+ *
+ * @see #EXTRA_REFERRER_NAME
*/
public static final String EXTRA_REFERRER
= "android.intent.extra.REFERRER";
/**
+ * Alternate version of {@link #EXTRA_REFERRER} that supplies the URI as a String rather
+ * than a {@link android.net.Uri} object. Only for use in cases where Uri objects can
+ * not be created, in particular when Intent extras are supplied through the
+ * {@link #URI_INTENT_SCHEME intent:} or {@link #URI_ANDROID_APP_SCHEME android-app:}
+ * schemes.
+ *
+ * @see #EXTRA_REFERRER
+ */
+ public static final String EXTRA_REFERRER_NAME
+ = "android.intent.extra.REFERRER_NAME";
+
+ /**
* Used as an int extra field with {@link #ACTION_INSTALL_PACKAGE} and
* {@link} #ACTION_VIEW} to indicate the uid of the package that initiated the install
* @hide
@@ -3919,6 +3941,75 @@ public class Intent implements Parcelable, Cloneable {
*/
public static final int URI_INTENT_SCHEME = 1<<0;
+ /**
+ * Flag for use with {@link #toUri} and {@link #parseUri}: the URI string
+ * always has the "android-app:" scheme. This is a variation of
+ * {@link #URI_INTENT_SCHEME} whose format is simpler for the case of an
+ * http/https URI being delivered to a specific package name. The format
+ * is:
+ *
+ * <pre class="prettyprint">
+ * android-app://{package_id}/{scheme}/{host}/{path}{#Intent;...}</pre>
+ *
+ * <p>In this scheme, only the <code>pacakge_id</code> is required, and all
+ * other components can be included as desired. Note that this can not be
+ * used with intents that have a {@link #setSelector}, since the base intent
+ * will always have an explicit package name.</p>
+ *
+ * <p>Some examples of how this scheme maps to Intent objects:</p>
+ * <table border="2" width="85%" align="center" frame="hsides" rules="rows">
+ * <colgroup align="left" />
+ * <colgroup align="left" />
+ * <thead>
+ * <tr><th>URI</th> <th>Intent</th></tr>
+ * </thead>
+ *
+ * <tbody>
+ * <tr><td><code>android-app://com.example.app</code></td>
+ * <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
+ * <tr><td>Action: </td><td>{@link #ACTION_MAIN}</td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * </table></td>
+ * </tr>
+ * <tr><td><code>android-app://com.example.app/http/example.com</code></td>
+ * <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
+ * <tr><td>Action: </td><td>{@link #ACTION_VIEW}</td></tr>
+ * <tr><td>Data: </td><td><code>http://example.com/</code></td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * </table></td>
+ * </tr>
+ * <tr><td><code>android-app://com.example.app/http/example.com/foo?1234</code></td>
+ * <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
+ * <tr><td>Action: </td><td>{@link #ACTION_VIEW}</td></tr>
+ * <tr><td>Data: </td><td><code>http://example.com/foo?1234</code></td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * </table></td>
+ * </tr>
+ * <tr><td><code>android-app://com.example.app/<br />#Intent;action=com.example.MY_ACTION;end</code></td>
+ * <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
+ * <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * </table></td>
+ * </tr>
+ * <tr><td><code>android-app://com.example.app/http/example.com/foo?1234<br />#Intent;action=com.example.MY_ACTION;end</code></td>
+ * <td><table style="margin:0;border:0;cellpadding:0;cellspacing:0">
+ * <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
+ * <tr><td>Data: </td><td><code>http://example.com/foo?1234</code></td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * </table></td>
+ * </tr>
+ * <tr><td><code>android-app://com.example.app/<br />#Intent;action=com.example.MY_ACTION;<br />i.some_int=100;S.some_str=hello;end</code></td>
+ * <td><table border="" style="margin:0" >
+ * <tr><td>Action: </td><td><code>com.example.MY_ACTION</code></td></tr>
+ * <tr><td>Package: </td><td><code>com.example.app</code></td></tr>
+ * <tr><td>Extras: </td><td><code>some_int=(int)100<br />some_str=(String)hello</code></td></tr>
+ * </table></td>
+ * </tr>
+ * </tbody>
+ * </table>
+ */
+ public static final int URI_ANDROID_APP_SCHEME = 1<<1;
+
// ---------------------------------------------------------------------
private String mAction;
@@ -4179,8 +4270,8 @@ public class Intent implements Parcelable, Cloneable {
* the scheme and full path.
*
* @param uri The URI to turn into an Intent.
- * @param flags Additional processing flags. Either 0 or
- * {@link #URI_INTENT_SCHEME}.
+ * @param flags Additional processing flags. Either 0,
+ * {@link #URI_INTENT_SCHEME}, or {@link #URI_ANDROID_APP_SCHEME}.
*
* @return Intent The newly created Intent object.
*
@@ -4193,9 +4284,11 @@ public class Intent implements Parcelable, Cloneable {
public static Intent parseUri(String uri, int flags) throws URISyntaxException {
int i = 0;
try {
- // Validate intent scheme for if requested.
- if ((flags&URI_INTENT_SCHEME) != 0) {
- if (!uri.startsWith("intent:")) {
+ final boolean androidApp = uri.startsWith("android-app:");
+
+ // Validate intent scheme if requested.
+ if ((flags&(URI_INTENT_SCHEME|URI_ANDROID_APP_SCHEME)) != 0) {
+ if (!uri.startsWith("intent:") && !androidApp) {
Intent intent = new Intent(ACTION_VIEW);
try {
intent.setData(Uri.parse(uri));
@@ -4206,24 +4299,40 @@ public class Intent implements Parcelable, Cloneable {
}
}
- // simple case
i = uri.lastIndexOf("#");
- if (i == -1) return new Intent(ACTION_VIEW, Uri.parse(uri));
+ // simple case
+ if (i == -1) {
+ if (!androidApp) {
+ return new Intent(ACTION_VIEW, Uri.parse(uri));
+ }
// old format Intent URI
- if (!uri.startsWith("#Intent;", i)) return getIntentOld(uri);
+ } else if (!uri.startsWith("#Intent;", i)) {
+ if (!androidApp) {
+ return getIntentOld(uri);
+ } else {
+ i = -1;
+ }
+ }
// new format
Intent intent = new Intent(ACTION_VIEW);
Intent baseIntent = intent;
+ boolean explicitAction = false;
+ boolean inSelector = false;
// fetch data part, if present
- String data = i >= 0 ? uri.substring(0, i) : null;
String scheme = null;
- i += "#Intent;".length();
+ String data;
+ if (i >= 0) {
+ data = uri.substring(0, i);
+ i += 8; // length of "#Intent;"
+ } else {
+ data = uri;
+ }
// loop over contents of Intent, all name=value;
- while (!uri.startsWith("end", i)) {
+ while (i >= 0 && !uri.startsWith("end", i)) {
int eq = uri.indexOf('=', i);
if (eq < 0) eq = i-1;
int semi = uri.indexOf(';', i);
@@ -4232,6 +4341,9 @@ public class Intent implements Parcelable, Cloneable {
// action
if (uri.startsWith("action=", i)) {
intent.setAction(value);
+ if (!inSelector) {
+ explicitAction = true;
+ }
}
// categories
@@ -4261,7 +4373,11 @@ public class Intent implements Parcelable, Cloneable {
// scheme
else if (uri.startsWith("scheme=", i)) {
- scheme = value;
+ if (inSelector) {
+ intent.mData = Uri.parse(value);
+ } else {
+ scheme = value;
+ }
}
// source bounds
@@ -4272,6 +4388,7 @@ public class Intent implements Parcelable, Cloneable {
// selector
else if (semi == (i+3) && uri.startsWith("SEL", i)) {
intent = new Intent();
+ inSelector = true;
}
// extra
@@ -4297,9 +4414,11 @@ public class Intent implements Parcelable, Cloneable {
i = semi + 1;
}
- if (intent != baseIntent) {
+ if (inSelector) {
// The Intent had a selector; fix it up.
- baseIntent.setSelector(intent);
+ if (baseIntent.mPackage == null) {
+ baseIntent.setSelector(intent);
+ }
intent = baseIntent;
}
@@ -4309,6 +4428,47 @@ public class Intent implements Parcelable, Cloneable {
if (scheme != null) {
data = scheme + ':' + data;
}
+ } else if (data.startsWith("android-app:")) {
+ if (data.charAt(12) == '/' && data.charAt(13) == '/') {
+ // Correctly formed android-app, first part is package name.
+ int end = data.indexOf('/', 14);
+ if (end < 0) {
+ // All we have is a package name.
+ intent.mPackage = data.substring(14);
+ if (!explicitAction) {
+ intent.setAction(ACTION_MAIN);
+ }
+ data = "";
+ } else {
+ // Target the Intent at the given package name always.
+ String authority = null;
+ intent.mPackage = data.substring(14, end);
+ int newEnd;
+ if (end < data.length() && (newEnd=data.indexOf('/', end+1)) >= 0) {
+ // Found a scheme, remember it.
+ scheme = data.substring(end+1, newEnd);
+ end = newEnd;
+ if (end < data.length() && (newEnd=data.indexOf('/', end+1)) >= 0) {
+ // Found a authority, remember it.
+ authority = data.substring(end+1, newEnd);
+ end = newEnd;
+ }
+ }
+ if (scheme == null) {
+ // If there was no scheme, then this just targets the package.
+ if (!explicitAction) {
+ intent.setAction(ACTION_MAIN);
+ }
+ data = "";
+ } else if (authority == null) {
+ data = scheme + ":";
+ } else {
+ data = scheme + "://" + authority + data.substring(end);
+ }
+ }
+ } else {
+ data = "";
+ }
}
if (data.length() > 0) {
@@ -7084,14 +7244,53 @@ public class Intent implements Parcelable, Cloneable {
* <p>You can convert the returned string back to an Intent with
* {@link #getIntent}.
*
- * @param flags Additional operating flags. Either 0 or
- * {@link #URI_INTENT_SCHEME}.
+ * @param flags Additional operating flags. Either 0,
+ * {@link #URI_INTENT_SCHEME}, or {@link #URI_ANDROID_APP_SCHEME}.
*
* @return Returns a URI encoding URI string describing the entire contents
* of the Intent.
*/
public String toUri(int flags) {
StringBuilder uri = new StringBuilder(128);
+ if ((flags&URI_ANDROID_APP_SCHEME) != 0) {
+ if (mPackage == null) {
+ throw new IllegalArgumentException(
+ "Intent must include an explicit package name to build an android-app: "
+ + this);
+ }
+ uri.append("android-app://");
+ uri.append(mPackage);
+ String scheme = null;
+ if (mData != null) {
+ scheme = mData.getScheme();
+ if (scheme != null) {
+ uri.append('/');
+ uri.append(scheme);
+ String authority = mData.getEncodedAuthority();
+ if (authority != null) {
+ uri.append('/');
+ uri.append(authority);
+ String path = mData.getEncodedPath();
+ if (path != null) {
+ uri.append(path);
+ }
+ String queryParams = mData.getEncodedQuery();
+ if (queryParams != null) {
+ uri.append('?');
+ uri.append(queryParams);
+ }
+ String fragment = mData.getEncodedFragment();
+ if (fragment != null) {
+ uri.append('#');
+ uri.append(fragment);
+ }
+ }
+ }
+ }
+ toUriFragment(uri, null, scheme == null ? Intent.ACTION_MAIN : Intent.ACTION_VIEW,
+ mPackage, flags);
+ return uri.toString();
+ }
String scheme = null;
if (mData != null) {
String data = mData.toString();
@@ -7121,27 +7320,38 @@ public class Intent implements Parcelable, Cloneable {
uri.append("intent:");
}
- uri.append("#Intent;");
+ toUriFragment(uri, scheme, Intent.ACTION_VIEW, null, flags);
+
+ return uri.toString();
+ }
+
+ private void toUriFragment(StringBuilder uri, String scheme, String defAction,
+ String defPackage, int flags) {
+ StringBuilder frag = new StringBuilder(128);
- toUriInner(uri, scheme, flags);
+ toUriInner(frag, scheme, defAction, defPackage, flags);
if (mSelector != null) {
uri.append("SEL;");
// Note that for now we are not going to try to handle the
// data part; not clear how to represent this as a URI, and
// not much utility in it.
- mSelector.toUriInner(uri, null, flags);
+ mSelector.toUriInner(frag, mSelector.mData != null ? mSelector.mData.getScheme() : null,
+ null, null, flags);
}
- uri.append("end");
-
- return uri.toString();
+ if (frag.length() > 0) {
+ uri.append("#Intent;");
+ uri.append(frag);
+ uri.append("end");
+ }
}
- private void toUriInner(StringBuilder uri, String scheme, int flags) {
+ private void toUriInner(StringBuilder uri, String scheme, String defAction,
+ String defPackage, int flags) {
if (scheme != null) {
uri.append("scheme=").append(scheme).append(';');
}
- if (mAction != null) {
+ if (mAction != null && !mAction.equals(defAction)) {
uri.append("action=").append(Uri.encode(mAction)).append(';');
}
if (mCategories != null) {
@@ -7155,7 +7365,7 @@ public class Intent implements Parcelable, Cloneable {
if (mFlags != 0) {
uri.append("launchFlags=0x").append(Integer.toHexString(mFlags)).append(';');
}
- if (mPackage != null) {
+ if (mPackage != null && !mPackage.equals(defPackage)) {
uri.append("package=").append(Uri.encode(mPackage)).append(';');
}
if (mComponent != null) {
diff --git a/core/java/android/content/pm/LabeledIntent.aidl b/core/java/android/content/pm/LabeledIntent.aidl
new file mode 100644
index 0000000..ad96759
--- /dev/null
+++ b/core/java/android/content/pm/LabeledIntent.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
+package android.content.pm;
+
+parcelable LabeledIntent;
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index a09c6c7..1c9f4c6 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2378,17 +2378,15 @@ public class ConnectivityManager {
/**
* The lookup key for a {@link Network} object included with the intent after
- * succesfully finding a network for the applications request. Retrieve it with
+ * successfully finding a network for the applications request. Retrieve it with
* {@link android.content.Intent#getParcelableExtra(String)}.
- * @hide
*/
public static final String EXTRA_NETWORK_REQUEST_NETWORK = "networkRequestNetwork";
/**
* The lookup key for a {@link NetworkRequest} object included with the intent after
- * succesfully finding a network for the applications request. Retrieve it with
+ * successfully finding a network for the applications request. Retrieve it with
* {@link android.content.Intent#getParcelableExtra(String)}.
- * @hide
*/
public static final String EXTRA_NETWORK_REQUEST_NETWORK_REQUEST =
"networkRequestNetworkRequest";
@@ -2397,7 +2395,7 @@ public class ConnectivityManager {
/**
* Request a network to satisfy a set of {@link NetworkCapabilities}.
*
- * This function behavies identically to the version that takes a NetworkCallback, but instead
+ * This function behaves identically to the version that takes a NetworkCallback, but instead
* of {@link NetworkCallback} a {@link PendingIntent} is used. This means
* the request may outlive the calling application and get called back when a suitable
* network is found.
@@ -2418,21 +2416,46 @@ public class ConnectivityManager {
* two Intents defined by {@link Intent#filterEquals}), then it will be removed and
* replaced by this one, effectively releasing the previous {@link NetworkRequest}.
* <p>
- * The request may be released normally by calling {@link #unregisterNetworkCallback}.
+ * The request may be released normally by calling
+ * {@link #releaseNetworkRequest(android.app.PendingIntent)}.
*
* @param request {@link NetworkRequest} describing this request.
* @param operation Action to perform when the network is available (corresponds
* to the {@link NetworkCallback#onAvailable} call. Typically
- * comes from {@link PendingIntent#getBroadcast}.
- * @hide
+ * comes from {@link PendingIntent#getBroadcast}. Cannot be null.
*/
public void requestNetwork(NetworkRequest request, PendingIntent operation) {
+ checkPendingIntent(operation);
try {
mService.pendingRequestForNetwork(request.networkCapabilities, operation);
} catch (RemoteException e) {}
}
/**
+ * Removes a request made via {@link #requestNetwork(NetworkRequest, android.app.PendingIntent)}
+ * <p>
+ * This method has the same behavior as {@link #unregisterNetworkCallback} with respect to
+ * releasing network resources and disconnecting.
+ *
+ * @param operation A PendingIntent equal (as defined by {@link Intent#filterEquals}) to the
+ * PendingIntent passed to
+ * {@link #requestNetwork(NetworkRequest, android.app.PendingIntent)} with the
+ * corresponding NetworkRequest you'd like to remove. Cannot be null.
+ */
+ public void releaseNetworkRequest(PendingIntent operation) {
+ checkPendingIntent(operation);
+ try {
+ mService.releasePendingNetworkRequest(operation);
+ } catch (RemoteException e) {}
+ }
+
+ private void checkPendingIntent(PendingIntent intent) {
+ if (intent == null) {
+ throw new IllegalArgumentException("PendingIntent cannot be null.");
+ }
+ }
+
+ /**
* Registers to receive notifications about all networks which satisfy the given
* {@link NetworkRequest}. The callbacks will continue to be called until
* either the application exits or {@link #unregisterNetworkCallback} is called
@@ -2448,7 +2471,7 @@ public class ConnectivityManager {
/**
* Unregisters callbacks about and possibly releases networks originating from
* {@link #requestNetwork} and {@link #registerNetworkCallback} calls. If the
- * given {@code NetworkCallback} had previosuly been used with {@code #requestNetwork},
+ * given {@code NetworkCallback} had previously been used with {@code #requestNetwork},
* any networks that had been connected to only to satisfy that request will be
* disconnected.
*
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index a983d88..a7bbc53 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -156,6 +156,8 @@ interface IConnectivityManager
NetworkRequest pendingRequestForNetwork(in NetworkCapabilities networkCapabilities,
in PendingIntent operation);
+ void releasePendingNetworkRequest(in PendingIntent operation);
+
NetworkRequest listenForNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, in IBinder binder);
diff --git a/core/java/android/net/RssiCurve.java b/core/java/android/net/RssiCurve.java
index f653f37..8ebe9e8 100644
--- a/core/java/android/net/RssiCurve.java
+++ b/core/java/android/net/RssiCurve.java
@@ -27,8 +27,8 @@ import java.util.Objects;
* A curve defining the network score over a range of RSSI values.
*
* <p>For each RSSI bucket, the score may be any byte. Scores have no absolute meaning and are only
- * considered relative to other scores assigned by the same scorer. Networks with no score are all
- * considered equivalent and ranked below any network with a score.
+ * considered relative to other scores assigned by the same scorer. Networks with no score are
+ * treated equivalently to a network with score {@link Byte#MIN_VALUE}, and will not be used.
*
* <p>For example, consider a curve starting at -110 dBm with a bucket width of 10 and the
* following buckets: {@code [-20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]}.
@@ -52,6 +52,7 @@ import java.util.Objects;
*/
@SystemApi
public class RssiCurve implements Parcelable {
+ private static final int DEFAULT_ACTIVE_NETWORK_RSSI_BOOST = 25;
/** The starting dBm of the curve. */
public final int start;
@@ -63,6 +64,15 @@ public class RssiCurve implements Parcelable {
public final byte[] rssiBuckets;
/**
+ * The RSSI boost to give this network when active, in dBm.
+ *
+ * <p>When the system is connected to this network, it will pretend that the network has this
+ * much higher of an RSSI. This is to avoid switching networks when another network has only a
+ * slightly higher score.
+ */
+ public final int activeNetworkRssiBoost;
+
+ /**
* Construct a new {@link RssiCurve}.
*
* @param start the starting dBm of the curve.
@@ -70,12 +80,25 @@ public class RssiCurve implements Parcelable {
* @param rssiBuckets the score for each RSSI bucket.
*/
public RssiCurve(int start, int bucketWidth, byte[] rssiBuckets) {
+ this(start, bucketWidth, rssiBuckets, DEFAULT_ACTIVE_NETWORK_RSSI_BOOST);
+ }
+
+ /**
+ * Construct a new {@link RssiCurve}.
+ *
+ * @param start the starting dBm of the curve.
+ * @param bucketWidth the width of each RSSI bucket, in dBm.
+ * @param rssiBuckets the score for each RSSI bucket.
+ * @param activeNetworkRssiBoost the RSSI boost to apply when this network is active, in dBm.
+ */
+ public RssiCurve(int start, int bucketWidth, byte[] rssiBuckets, int activeNetworkRssiBoost) {
this.start = start;
this.bucketWidth = bucketWidth;
if (rssiBuckets == null || rssiBuckets.length == 0) {
throw new IllegalArgumentException("rssiBuckets must be at least one element large.");
}
this.rssiBuckets = rssiBuckets;
+ this.activeNetworkRssiBoost = activeNetworkRssiBoost;
}
private RssiCurve(Parcel in) {
@@ -84,6 +107,7 @@ public class RssiCurve implements Parcelable {
int bucketCount = in.readInt();
rssiBuckets = new byte[bucketCount];
in.readByteArray(rssiBuckets);
+ activeNetworkRssiBoost = in.readInt();
}
@Override
@@ -97,6 +121,7 @@ public class RssiCurve implements Parcelable {
out.writeInt(bucketWidth);
out.writeInt(rssiBuckets.length);
out.writeByteArray(rssiBuckets);
+ out.writeInt(activeNetworkRssiBoost);
}
/**
@@ -108,6 +133,23 @@ public class RssiCurve implements Parcelable {
* @return the score for the given RSSI.
*/
public byte lookupScore(int rssi) {
+ return lookupScore(rssi, false /* isActiveNetwork */);
+ }
+
+ /**
+ * Lookup the score for a given RSSI value.
+ *
+ * @param rssi The RSSI to lookup. If the RSSI falls below the start of the curve, the score at
+ * the start of the curve will be returned. If it falls after the end of the curve, the
+ * score at the end of the curve will be returned.
+ * @param isActiveNetwork Whether this network is currently active.
+ * @return the score for the given RSSI.
+ */
+ public byte lookupScore(int rssi, boolean isActiveNetwork) {
+ if (isActiveNetwork) {
+ rssi += activeNetworkRssiBoost;
+ }
+
int index = (rssi - start) / bucketWidth;
// Snap the index to the closest bucket if it falls outside the curve.
@@ -136,12 +178,13 @@ public class RssiCurve implements Parcelable {
return start == rssiCurve.start &&
bucketWidth == rssiCurve.bucketWidth &&
- Arrays.equals(rssiBuckets, rssiCurve.rssiBuckets);
+ Arrays.equals(rssiBuckets, rssiCurve.rssiBuckets) &&
+ activeNetworkRssiBoost == rssiCurve.activeNetworkRssiBoost;
}
@Override
public int hashCode() {
- return Objects.hash(start, bucketWidth, rssiBuckets);
+ return Objects.hash(start, bucketWidth, rssiBuckets, activeNetworkRssiBoost);
}
@Override
@@ -150,7 +193,9 @@ public class RssiCurve implements Parcelable {
sb.append("RssiCurve[start=")
.append(start)
.append(",bucketWidth=")
- .append(bucketWidth);
+ .append(bucketWidth)
+ .append(",activeNetworkRssiBoost=")
+ .append(activeNetworkRssiBoost);
sb.append(",buckets=");
for (int i = 0; i < rssiBuckets.length; i++) {
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index ec30684..16dac7d 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -49,7 +49,6 @@ interface IPowerManager
void crash(String message);
void setStayOnSetting(int val);
- void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs);
void boostScreenBrightness(long time);
// temporarily overrides the screen brightness settings to allow the user to
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java
index 14f4a83..9d78360 100644
--- a/core/java/android/os/PowerManagerInternal.java
+++ b/core/java/android/os/PowerManagerInternal.java
@@ -56,6 +56,13 @@ public abstract class PowerManagerInternal {
public abstract void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis);
/**
+ * Used by device administration to set the maximum screen off timeout.
+ *
+ * This method must only be called by the device administration policy manager.
+ */
+ public abstract void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs);
+
+ /**
* Used by the dream manager to override certain properties while dozing.
*
* @param screenState The overridden screen state, or {@link Display.STATE_UNKNOWN}
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 3ada9bb..21a9904 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -689,6 +689,20 @@ public class Process {
}
/**
+ * Tries to establish a connection to the zygote that handles a given {@code abi}. Might block and retry if the
+ * zygote is unresponsive. This method is a no-op if a connection is already open.
+ *
+ * @hide
+ */
+ public static void establishZygoteConnectionForAbi(String abi) {
+ try {
+ openZygoteSocketIfNeeded(abi);
+ } catch (ZygoteStartFailedEx ex) {
+ throw new RuntimeException("Unable to connect to zygote for abi: " + abi, ex);
+ }
+ }
+
+ /**
* Tries to open socket to Zygote process if not already open. If
* already open, does nothing. May block and retry.
*/
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 3234e77..bd6eeea 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -367,10 +367,27 @@ public class UserManager {
* <p/>Type: Boolean
* @see #setUserRestrictions(Bundle)
* @see #getUserRestrictions()
- * @hide
*/
public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam";
+ /**
+ * Application restriction key that is used to indicate the pending arrival
+ * of real restrictions for the app.
+ *
+ * <p>
+ * Applications that support restrictions should check for the presence of this key.
+ * A <code>true</code> value indicates that restrictions may be applied in the near
+ * future but are not available yet. It is the responsibility of any
+ * management application that sets this flag to update it when the final
+ * restrictions are enforced.
+ *
+ * <p/>Key for application restrictions.
+ * <p/>Type: Boolean
+ * @see android.app.admin.DevicePolicyManager#addApplicationRestriction()
+ * @see android.app.admin.DevicePolicyManager#getApplicationRestriction()
+ */
+ public static final String KEY_RESTRICTIONS_PENDING = "restrictions_pending";
+
/** @hide */
public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3;
/** @hide */
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 1ea520d..1f45f0a 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4588,13 +4588,6 @@ public final class Settings {
public static final String ANR_SHOW_BACKGROUND = "anr_show_background";
/**
- * (Experimental). If nonzero, WebView uses data reduction proxy to save network
- * bandwidth. Otherwise, WebView does not use data reduction proxy.
- * @hide
- */
- public static final String WEBVIEW_DATA_REDUCTION_PROXY = "webview_data_reduction_proxy";
-
- /**
* The {@link ComponentName} string of the service to be used as the voice recognition
* service.
*
@@ -6370,6 +6363,14 @@ public final class Settings {
"preferred_network_mode";
/**
+ * Setting to 1 will hide carrier network settings.
+ * Default is 0.
+ * @hide
+ */
+ public static final String HIDE_CARRIER_NETWORK_SETTINGS =
+ "hide_carrier_network_settings";
+
+ /**
* Name of an application package to be debugged.
*/
public static final String DEBUG_APP = "debug_app";
diff --git a/core/java/android/service/trust/TrustAgentService.java b/core/java/android/service/trust/TrustAgentService.java
index 00d60c0..d6c997f 100644
--- a/core/java/android/service/trust/TrustAgentService.java
+++ b/core/java/android/service/trust/TrustAgentService.java
@@ -94,31 +94,6 @@ public class TrustAgentService extends Service {
private static final int MSG_TRUST_TIMEOUT = 3;
/**
- * Container class for a list of configuration options and helper methods
- */
- public static final class Configuration {
- public final List<PersistableBundle> options;
- public Configuration(List<PersistableBundle> opts) {
- options = opts;
- }
-
- /**
- * Very basic method to determine if all bundles have the given feature, regardless
- * of type.
- * @param option String to search for.
- * @return true if found in all bundles.
- */
- public boolean hasOption(String option) {
- if (options == null || options.size() == 0) return false;
- final int N = options.size();
- for (int i = 0; i < N; i++) {
- if (!options.get(i).containsKey(option)) return false;
- }
- return true;
- }
- }
-
- /**
* Class containing raw data for a given configuration request.
*/
private static final class ConfigurationData {
@@ -147,7 +122,7 @@ public class TrustAgentService extends Service {
break;
case MSG_CONFIGURE:
ConfigurationData data = (ConfigurationData) msg.obj;
- boolean result = onConfigure(new Configuration(data.options));
+ boolean result = onConfigure(data.options);
try {
synchronized (mLock) {
mCallback.onConfigureCompleted(result, data.token);
@@ -212,7 +187,7 @@ public class TrustAgentService extends Service {
* @param options bundle containing all options or null if none.
* @return true if the {@link TrustAgentService} supports configuration options.
*/
- public boolean onConfigure(Configuration options) {
+ public boolean onConfigure(List<PersistableBundle> options) {
return false;
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 26e9a30..ceaf5f8 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -675,7 +675,8 @@ public abstract class WallpaperService extends Service {
com.android.internal.R.style.Animation_Wallpaper;
mInputChannel = new InputChannel();
if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
- Display.DEFAULT_DISPLAY, mContentInsets, mInputChannel) < 0) {
+ Display.DEFAULT_DISPLAY, mContentInsets, mStableInsets,
+ mInputChannel) < 0) {
Log.w(TAG, "Failed to add window while updating wallpaper surface.");
return;
}
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index b0cbcd2..b467f5a 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -110,6 +110,7 @@ public final class Formatter {
private static final int SECONDS_PER_MINUTE = 60;
private static final int SECONDS_PER_HOUR = 60 * 60;
private static final int SECONDS_PER_DAY = 24 * 60 * 60;
+ private static final int MILLIS_PER_MINUTE = 1000 * 60;
/**
* Returns elapsed time for the given millis, in the following format:
@@ -171,4 +172,24 @@ public final class Formatter {
return context.getString(com.android.internal.R.string.durationSeconds, seconds);
}
}
+
+ /**
+ * Returns elapsed time for the given millis, in the following format:
+ * 1 day 5 hrs; will include at most two units, can go down to minutes precision.
+ * @param context the application context
+ * @param millis the elapsed time in milli seconds
+ * @return the formatted elapsed time
+ * @hide
+ */
+ public static String formatShortElapsedTimeRoundingUpToMinutes(Context context, long millis) {
+ long minutesRoundedUp = (millis + MILLIS_PER_MINUTE - 1) / MILLIS_PER_MINUTE;
+
+ if (minutesRoundedUp == 0) {
+ return context.getString(com.android.internal.R.string.durationMinutes, 0);
+ } else if (minutesRoundedUp == 1) {
+ return context.getString(com.android.internal.R.string.durationMinute, 1);
+ }
+
+ return formatShortElapsedTime(context, minutesRoundedUp * MILLIS_PER_MINUTE);
+ }
}
diff --git a/core/java/android/transition/ChangeTransform.java b/core/java/android/transition/ChangeTransform.java
index 3fd28a6..a159b40 100644
--- a/core/java/android/transition/ChangeTransform.java
+++ b/core/java/android/transition/ChangeTransform.java
@@ -17,11 +17,14 @@ package android.transition;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.FloatArrayEvaluator;
import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
+import android.animation.PropertyValuesHolder;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Matrix;
+import android.graphics.Path;
+import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.Property;
import android.view.GhostView;
@@ -56,16 +59,35 @@ public class ChangeTransform extends Transition {
PROPNAME_PARENT_MATRIX,
};
- private static final Property<View, Matrix> ANIMATION_MATRIX_PROPERTY =
- new Property<View, Matrix>(Matrix.class, "animationMatrix") {
+ /**
+ * This property sets the animation matrix properties that are not translations.
+ */
+ private static final Property<PathAnimatorMatrix, float[]> NON_TRANSLATIONS_PROPERTY =
+ new Property<PathAnimatorMatrix, float[]>(float[].class, "nonTranslations") {
@Override
- public Matrix get(View object) {
+ public float[] get(PathAnimatorMatrix object) {
return null;
}
@Override
- public void set(View object, Matrix value) {
- object.setAnimationMatrix(value);
+ public void set(PathAnimatorMatrix object, float[] value) {
+ object.setValues(value);
+ }
+ };
+
+ /**
+ * This property sets the translation animation matrix properties.
+ */
+ private static final Property<PathAnimatorMatrix, PointF> TRANSLATIONS_PROPERTY =
+ new Property<PathAnimatorMatrix, PointF>(PointF.class, "translations") {
+ @Override
+ public PointF get(PathAnimatorMatrix object) {
+ return null;
+ }
+
+ @Override
+ public void set(PathAnimatorMatrix object, PointF value) {
+ object.setTranslation(value);
}
};
@@ -261,8 +283,23 @@ public class ChangeTransform extends Transition {
final View view = endValues.view;
setIdentityTransforms(view);
- ObjectAnimator animator = ObjectAnimator.ofObject(view, ANIMATION_MATRIX_PROPERTY,
- new TransitionUtils.MatrixEvaluator(), startMatrix, endMatrix);
+ final float[] startMatrixValues = new float[9];
+ startMatrix.getValues(startMatrixValues);
+ final float[] endMatrixValues = new float[9];
+ endMatrix.getValues(endMatrixValues);
+ final PathAnimatorMatrix pathAnimatorMatrix =
+ new PathAnimatorMatrix(view, startMatrixValues);
+
+ PropertyValuesHolder valuesProperty = PropertyValuesHolder.ofObject(
+ NON_TRANSLATIONS_PROPERTY, new FloatArrayEvaluator(new float[9]),
+ startMatrixValues, endMatrixValues);
+ Path path = getPathMotion().getPath(startMatrixValues[Matrix.MTRANS_X],
+ startMatrixValues[Matrix.MTRANS_Y], endMatrixValues[Matrix.MTRANS_X],
+ endMatrixValues[Matrix.MTRANS_Y]);
+ PropertyValuesHolder translationProperty = PropertyValuesHolder.ofObject(
+ TRANSLATIONS_PROPERTY, null, path);
+ ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(pathAnimatorMatrix,
+ valuesProperty, translationProperty);
final Matrix finalEndMatrix = endMatrix;
@@ -285,14 +322,13 @@ public class ChangeTransform extends Transition {
view.setTagInternal(R.id.parentMatrix, null);
}
}
- ANIMATION_MATRIX_PROPERTY.set(view, null);
+ view.setAnimationMatrix(null);
transforms.restore(view);
}
@Override
public void onAnimationPause(Animator animation) {
- ValueAnimator animator = (ValueAnimator) animation;
- Matrix currentMatrix = (Matrix) animator.getAnimatedValue();
+ Matrix currentMatrix = pathAnimatorMatrix.getMatrix();
setCurrentMatrix(currentMatrix);
}
@@ -457,4 +493,47 @@ public class ChangeTransform extends Transition {
mGhostView.setVisibility(View.VISIBLE);
}
}
+
+ /**
+ * PathAnimatorMatrix allows the translations and the rest of the matrix to be set
+ * separately. This allows the PathMotion to affect the translations while scale
+ * and rotation are evaluated separately.
+ */
+ private static class PathAnimatorMatrix {
+ private final Matrix mMatrix = new Matrix();
+ private final View mView;
+ private final float[] mValues;
+ private float mTranslationX;
+ private float mTranslationY;
+
+ public PathAnimatorMatrix(View view, float[] values) {
+ mView = view;
+ mValues = values.clone();
+ mTranslationX = mValues[Matrix.MTRANS_X];
+ mTranslationY = mValues[Matrix.MTRANS_Y];
+ setAnimationMatrix();
+ }
+
+ public void setValues(float[] values) {
+ System.arraycopy(values, 0, mValues, 0, values.length);
+ setAnimationMatrix();
+ }
+
+ public void setTranslation(PointF translation) {
+ mTranslationX = translation.x;
+ mTranslationY = translation.y;
+ setAnimationMatrix();
+ }
+
+ private void setAnimationMatrix() {
+ mValues[Matrix.MTRANS_X] = mTranslationX;
+ mValues[Matrix.MTRANS_Y] = mTranslationY;
+ mMatrix.setValues(mValues);
+ mView.setAnimationMatrix(mMatrix);
+ }
+
+ public Matrix getMatrix() {
+ return mMatrix;
+ }
+ }
}
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 1b57c24..b86455a 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -242,7 +242,7 @@ class GLES20Canvas extends HardwareCanvas {
void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint) {
layer.setLayerPaint(paint);
- nDrawLayer(mRenderer, layer.getLayer(), x, y);
+ nDrawLayer(mRenderer, layer.getLayerHandle(), x, y);
}
private static native void nDrawLayer(long renderer, long layer, float x, float y);
diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/HardwareLayer.java
index 0c2e944..a130bda 100644
--- a/core/java/android/view/HardwareLayer.java
+++ b/core/java/android/view/HardwareLayer.java
@@ -126,8 +126,8 @@ final class HardwareLayer {
mRenderer.detachSurfaceTexture(mFinalizer.get());
}
- public long getLayer() {
- return nGetLayer(mFinalizer.get());
+ public long getLayerHandle() {
+ return mFinalizer.get();
}
public void setSurfaceTexture(SurfaceTexture surface) {
@@ -153,6 +153,5 @@ final class HardwareLayer {
private static native void nUpdateRenderLayer(long layerUpdater, long displayList,
int left, int top, int right, int bottom);
- private static native long nGetLayer(long layerUpdater);
private static native int nGetTexName(long layerUpdater);
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 6aa86c7..7b20e72 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -96,6 +96,7 @@ interface IWindowManager
void overridePendingAppTransitionAspectScaledThumb(in Bitmap srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp);
+ void overridePendingAppTransitionInPlace(String packageName, int anim);
void executeAppTransition();
void setAppStartingWindow(IBinder token, String pkg, int theme,
in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 037ed28..7b13e84 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -36,15 +36,16 @@ import android.view.Surface;
*/
interface IWindowSession {
int add(IWindow window, int seq, in WindowManager.LayoutParams attrs,
- in int viewVisibility, out Rect outContentInsets,
+ in int viewVisibility, out Rect outContentInsets, out Rect outStableInsets,
out InputChannel outInputChannel);
int addToDisplay(IWindow window, int seq, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, out Rect outContentInsets,
- out InputChannel outInputChannel);
+ out Rect outStableInsets, out InputChannel outInputChannel);
int addWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs,
- in int viewVisibility, out Rect outContentInsets);
+ in int viewVisibility, out Rect outContentInsets, out Rect outStableInsets);
int addToDisplayWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs,
- in int viewVisibility, in int layerStackId, out Rect outContentInsets);
+ in int viewVisibility, in int layerStackId, out Rect outContentInsets,
+ out Rect outStableInsets);
void remove(IWindow window);
/**
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 562d138..19142b8 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -319,6 +319,7 @@ public class Surface implements Parcelable {
* @return A canvas for drawing into the surface.
*
* @throws IllegalStateException If the canvas cannot be locked.
+ * @hide
*/
public Canvas lockHardwareCanvas() {
synchronized (mLock) {
@@ -603,15 +604,6 @@ public class Surface implements Parcelable {
mHwuiRenderer = 0;
}
}
-
- @Override
- protected void finalize() throws Throwable {
- try {
- destroy();
- } finally {
- super.finalize();
- }
- }
}
private static native long nHwuiCreate(long rootNode, long surface);
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index afc804c..49be57d 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -496,7 +496,8 @@ public class SurfaceView extends View {
mLayout.type = mWindowType;
mLayout.gravity = Gravity.START|Gravity.TOP;
mSession.addToDisplayWithoutInputChannel(mWindow, mWindow.mSeq, mLayout,
- mVisible ? VISIBLE : GONE, display.getDisplayId(), mContentInsets);
+ mVisible ? VISIBLE : GONE, display.getDisplayId(), mContentInsets,
+ mStableInsets);
}
boolean realSizeChanged;
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 00a8884..5579c13 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -66,6 +66,8 @@ public class ThreadedRenderer extends HardwareRenderer {
private static final int SYNC_OK = 0;
// Needs a ViewRoot invalidate
private static final int SYNC_INVALIDATE_REQUIRED = 1 << 0;
+ // Spoiler: the reward is GPU-accelerated drawing, better find that Surface!
+ private static final int SYNC_LOST_SURFACE_REWARD_IF_FOUND = 1 << 1;
private static final String[] VISUALIZERS = {
PROFILE_PROPERTY_VISUALIZE_BARS,
@@ -336,6 +338,12 @@ public class ThreadedRenderer extends HardwareRenderer {
int syncResult = nSyncAndDrawFrame(mNativeProxy, frameTimeNanos,
recordDuration, view.getResources().getDisplayMetrics().density);
+ if ((syncResult & SYNC_LOST_SURFACE_REWARD_IF_FOUND) != 0) {
+ setEnabled(false);
+ // Invalidate since we failed to draw. This should fetch a Surface
+ // if it is still needed or do nothing if we are no longer drawing
+ attachInfo.mViewRootImpl.invalidate();
+ }
if ((syncResult & SYNC_INVALIDATE_REQUIRED) != 0) {
attachInfo.mViewRootImpl.invalidate();
}
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 654a8ed..5c433c1 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -2582,15 +2582,21 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
* Returns true if this ViewGroup should be considered as a single entity for removal
* when executing an Activity transition. If this is false, child elements will move
* individually during the transition.
+ *
* @return True if the ViewGroup should be acted on together during an Activity transition.
- * The default value is false when the background is null and true when the background
- * is not null or if {@link #getTransitionName()} is not null.
+ * The default value is true when there is a non-null background or if
+ * {@link #getTransitionName()} is not null or if a
+ * non-null {@link android.view.ViewOutlineProvider} other than
+ * {@link android.view.ViewOutlineProvider#BACKGROUND} was given to
+ * {@link #setOutlineProvider(ViewOutlineProvider)} and false otherwise.
*/
public boolean isTransitionGroup() {
if ((mGroupFlags & FLAG_IS_TRANSITION_GROUP_SET) != 0) {
return ((mGroupFlags & FLAG_IS_TRANSITION_GROUP) != 0);
} else {
- return getBackground() != null || getTransitionName() != null;
+ final ViewOutlineProvider outlineProvider = getOutlineProvider();
+ return getBackground() != null || getTransitionName() != null ||
+ (outlineProvider != null && outlineProvider != ViewOutlineProvider.BACKGROUND);
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ea0a077..5d2a24b 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -526,7 +526,7 @@ public final class ViewRootImpl implements ViewParent,
collectViewAttributes();
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(),
- mAttachInfo.mContentInsets, mInputChannel);
+ mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mInputChannel);
} catch (RemoteException e) {
mAdded = false;
mView = null;
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 673f075..b8e94ee 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -865,12 +865,15 @@ public interface WindowManagerPolicy {
* Return the insets for the areas covered by system windows. These values
* are computed on the most recent layout, so they are not guaranteed to
* be correct.
- *
+ *
* @param attrs The LayoutParams of the window.
- * @param contentInset The areas covered by system windows, expressed as positive insets
- *
+ * @param outContentInsets The areas covered by system windows, expressed as positive insets.
+ * @param outStableInsets The areas covered by stable system windows irrespective of their
+ * current visibility. Expressed as positive insets.
+ *
*/
- public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset);
+ public void getInsetHintLw(WindowManager.LayoutParams attrs, Rect outContentInsets,
+ Rect outStableInsets);
/**
* Called when layout of the windows is finished. After this function has
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index 64c81e0..cf3dbab 100644
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -183,8 +183,11 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
mHeaderYearTextView.getTextColors(), R.attr.state_selected,
headerSelectedTextColor));
- mDayPickerView = new DayPickerView(mContext, this);
+ mDayPickerView = new DayPickerView(mContext);
+ mDayPickerView.setFirstDayOfWeek(mFirstDayOfWeek);
mDayPickerView.setRange(mMinDate, mMaxDate);
+ mDayPickerView.setDay(mCurrentDate);
+ mDayPickerView.setOnDaySelectedListener(mOnDaySelectedListener);
mYearPickerView = new YearPickerView(mContext);
mYearPickerView.init(this);
@@ -333,7 +336,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
switch (viewIndex) {
case MONTH_AND_DAY_VIEW:
- mDayPickerView.onDateChanged();
+ mDayPickerView.setDay(getSelectedDay());
if (mCurrentView != viewIndex) {
mMonthAndDayLayout.setSelected(true);
mHeaderYearTextView.setSelected(false);
@@ -445,6 +448,8 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
@Override
public void setFirstDayOfWeek(int firstDayOfWeek) {
mFirstDayOfWeek = firstDayOfWeek;
+
+ mDayPickerView.setFirstDayOfWeek(firstDayOfWeek);
}
@Override
@@ -606,19 +611,12 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
}
}
- @Override
- public void onDayOfMonthSelected(int year, int month, int day) {
- mCurrentDate.set(Calendar.YEAR, year);
- mCurrentDate.set(Calendar.MONTH, month);
- mCurrentDate.set(Calendar.DAY_OF_MONTH, day);
- updatePickers();
- updateDisplay(true);
- }
-
private void updatePickers() {
for (OnDateChangedListener listener : mListeners) {
listener.onDateChanged();
}
+
+ mDayPickerView.setDay(getSelectedDay());
}
@Override
@@ -627,11 +625,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
}
@Override
- public void unregisterOnDateChangedListener(OnDateChangedListener listener) {
- mListeners.remove(listener);
- }
-
- @Override
public Calendar getSelectedDay() {
return mCurrentDate;
}
@@ -652,6 +645,22 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
}
/**
+ * Listener called when the user selects a day in the day picker view.
+ */
+ private final DayPickerView.OnDaySelectedListener
+ mOnDaySelectedListener = new DayPickerView.OnDaySelectedListener() {
+ @Override
+ public void onDaySelected(DayPickerView view, Calendar day) {
+ mCurrentDate.setTimeInMillis(day.getTimeInMillis());
+
+ updatePickers();
+ updateDisplay(true);
+
+ tryVibrate();
+ }
+ };
+
+ /**
* Class for managing state storing/restoring.
*/
private static class SavedState extends View.BaseSavedState {
diff --git a/core/java/android/widget/DatePickerController.java b/core/java/android/widget/DatePickerController.java
index ea6ec61..8f809ba 100644
--- a/core/java/android/widget/DatePickerController.java
+++ b/core/java/android/widget/DatePickerController.java
@@ -27,16 +27,9 @@ interface DatePickerController {
void onYearSelected(int year);
- void onDayOfMonthSelected(int year, int month, int day);
-
void registerOnDateChangedListener(OnDateChangedListener listener);
- void unregisterOnDateChangedListener(OnDateChangedListener listener);
-
Calendar getSelectedDay();
- void setFirstDayOfWeek(int firstDayOfWeek);
- int getFirstDayOfWeek();
-
void tryVibrate();
}
diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java
index 45d1403..443884a 100644
--- a/core/java/android/widget/DateTimeView.java
+++ b/core/java/android/widget/DateTimeView.java
@@ -32,6 +32,7 @@ import android.widget.RemoteViews.RemoteView;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
//
@@ -62,8 +63,8 @@ public class DateTimeView extends TextView {
int mLastDisplay = -1;
DateFormat mLastFormat;
- private boolean mAttachedToWindow;
private long mUpdateTimeMillis;
+ private static final ThreadLocal<ReceiverInfo> sReceiverInfo = new ThreadLocal<ReceiverInfo>();
public DateTimeView(Context context) {
super(context);
@@ -76,15 +77,21 @@ public class DateTimeView extends TextView {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- registerReceivers();
- mAttachedToWindow = true;
+ ReceiverInfo ri = sReceiverInfo.get();
+ if (ri == null) {
+ ri = new ReceiverInfo();
+ sReceiverInfo.set(ri);
+ }
+ ri.addView(this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- unregisterReceivers();
- mAttachedToWindow = false;
+ final ReceiverInfo ri = sReceiverInfo.get();
+ if (ri != null) {
+ ri.removeView(this);
+ }
}
@android.view.RemotableViewMethod
@@ -204,49 +211,86 @@ public class DateTimeView extends TextView {
}
}
- private void registerReceivers() {
- Context context = getContext();
+ void clearFormatAndUpdate() {
+ mLastFormat = null;
+ update();
+ }
- IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_TIME_TICK);
- filter.addAction(Intent.ACTION_TIME_CHANGED);
- filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
- filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
- context.registerReceiver(mBroadcastReceiver, filter);
+ private static class ReceiverInfo {
+ private final ArrayList<DateTimeView> mAttachedViews = new ArrayList<DateTimeView>();
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (Intent.ACTION_TIME_TICK.equals(action)) {
+ if (System.currentTimeMillis() < getSoonestUpdateTime()) {
+ // The update() function takes a few milliseconds to run because of
+ // all of the time conversions it needs to do, so we can't do that
+ // every minute.
+ return;
+ }
+ }
+ // ACTION_TIME_CHANGED can also signal a change of 12/24 hr. format.
+ updateAll();
+ }
+ };
- Uri uri = Settings.System.getUriFor(Settings.System.DATE_FORMAT);
- context.getContentResolver().registerContentObserver(uri, true, mContentObserver);
- }
+ private final ContentObserver mObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateAll();
+ }
+ };
- private void unregisterReceivers() {
- Context context = getContext();
- context.unregisterReceiver(mBroadcastReceiver);
- context.getContentResolver().unregisterContentObserver(mContentObserver);
- }
+ public void addView(DateTimeView v) {
+ final boolean register = mAttachedViews.isEmpty();
+ mAttachedViews.add(v);
+ if (register) {
+ register(v.getContext().getApplicationContext());
+ }
+ }
- private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_TIME_TICK.equals(action)) {
- if (System.currentTimeMillis() < mUpdateTimeMillis) {
- // The update() function takes a few milliseconds to run because of
- // all of the time conversions it needs to do, so we can't do that
- // every minute.
- return;
+ public void removeView(DateTimeView v) {
+ mAttachedViews.remove(v);
+ if (mAttachedViews.isEmpty()) {
+ unregister(v.getContext().getApplicationContext());
+ }
+ }
+
+ void updateAll() {
+ final int count = mAttachedViews.size();
+ for (int i = 0; i < count; i++) {
+ mAttachedViews.get(i).clearFormatAndUpdate();
+ }
+ }
+
+ long getSoonestUpdateTime() {
+ long result = Long.MAX_VALUE;
+ final int count = mAttachedViews.size();
+ for (int i = 0; i < count; i++) {
+ final long time = mAttachedViews.get(i).mUpdateTimeMillis;
+ if (time < result) {
+ result = time;
}
}
- // ACTION_TIME_CHANGED can also signal a change of 12/24 hr. format.
- mLastFormat = null;
- update();
+ return result;
}
- };
- private ContentObserver mContentObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- mLastFormat = null;
- update();
+ void register(Context context) {
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_TIME_TICK);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ context.registerReceiver(mReceiver, filter);
+
+ final Uri uri = Settings.System.getUriFor(Settings.System.DATE_FORMAT);
+ context.getContentResolver().registerContentObserver(uri, true, mObserver);
}
- };
+
+ void unregister(Context context) {
+ context.unregisterReceiver(mReceiver);
+ context.getContentResolver().unregisterContentObserver(mObserver);
+ }
+ }
}
diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java
index f9544d0..6cb1c9d 100644
--- a/core/java/android/widget/DayPickerView.java
+++ b/core/java/android/widget/DayPickerView.java
@@ -16,14 +16,10 @@
package android.widget;
-import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
-import android.os.Build;
import android.os.Bundle;
-import android.os.Handler;
-import android.util.AttributeSet;
import android.util.Log;
import android.util.MathUtils;
import android.view.View;
@@ -38,9 +34,7 @@ import java.util.Locale;
/**
* This displays a list of months in a calendar format with selectable days.
*/
-class DayPickerView extends ListView implements AbsListView.OnScrollListener,
- OnDateChangedListener {
-
+class DayPickerView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = "DayPickerView";
// How long the GoTo fling animation should last
@@ -49,12 +43,14 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
// How long to wait after receiving an onScrollStateChanged notification before acting on it
private static final int SCROLL_CHANGE_DELAY = 40;
- private static int LIST_TOP_OFFSET = -1; // so that the top line will be under the separator
+ // so that the top line will be under the separator
+ private static final int LIST_TOP_OFFSET = -1;
- private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
+ private final SimpleMonthAdapter mAdapter = new SimpleMonthAdapter(getContext());
+
+ private final ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(this);
- // These affect the scroll speed and feel
- private float mFriction = 1.0f;
+ private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy", Locale.getDefault());
// highlighted time
private Calendar mSelectedDay = Calendar.getInstance();
@@ -62,7 +58,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
private Calendar mMinDate = Calendar.getInstance();
private Calendar mMaxDate = Calendar.getInstance();
- private SimpleMonthAdapter mAdapter;
+ private OnDaySelectedListener mOnDaySelectedListener;
// which month should be displayed/highlighted [0-11]
private int mCurrentMonthDisplayed;
@@ -71,34 +67,27 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
// used for tracking what state listview is in
private int mCurrentScrollState = OnScrollListener.SCROLL_STATE_IDLE;
- private DatePickerController mController;
private boolean mPerformingScroll;
- private ScrollStateRunnable mScrollStateChangedRunnable = new ScrollStateRunnable(this);
-
- public DayPickerView(Context context, DatePickerController controller) {
+ public DayPickerView(Context context) {
super(context);
- init();
- setController(controller);
- }
-
- public void setController(DatePickerController controller) {
- if (mController != null) {
- mController.unregisterOnDateChangedListener(this);
- }
- mController = controller;
- mController.registerOnDateChangedListener(this);
- setUpAdapter();
setAdapter(mAdapter);
- onDateChanged();
- }
-
- public void init() {
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
setDrawSelectorOnTop(false);
-
setUpListView();
+
+ goTo(mSelectedDay, false, true, true);
+
+ mAdapter.setOnDaySelectedListener(mProxyOnDaySelectedListener);
+ }
+
+ public void setDay(Calendar day) {
+ goTo(day, false, true, true);
+ }
+
+ public void setFirstDayOfWeek(int firstDayOfWeek) {
+ mAdapter.setFirstDayOfWeek(firstDayOfWeek);
}
public void setRange(Calendar minDate, Calendar maxDate) {
@@ -113,54 +102,19 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
}
/**
- * Constrains the supplied calendar to stay within the min and max
- * calendars, returning <code>true</code> if the supplied calendar
- * was modified.
+ * Sets the listener to call when the user selects a day.
*
- * @param value The calendar to constrain
- * @param min The minimum calendar
- * @param max The maximum calendar
- * @return True if <code>value</code> was modified
- */
- private boolean constrainCalendar(Calendar value, Calendar min, Calendar max) {
- if (value.compareTo(min) < 0) {
- value.setTimeInMillis(min.getTimeInMillis());
- return true;
- }
-
- if (value.compareTo(max) > 0) {
- value.setTimeInMillis(max.getTimeInMillis());
- return true;
- }
-
- return false;
- }
-
- public void onChange() {
- setUpAdapter();
- setAdapter(mAdapter);
- }
-
- /**
- * Creates a new adapter if necessary and sets up its parameters. Override
- * this method to provide a custom adapter.
+ * @param listener The listener to call.
*/
- protected void setUpAdapter() {
- if (mAdapter == null) {
- mAdapter = new SimpleMonthAdapter(getContext(), mController);
- } else {
- mAdapter.setSelectedDay(mSelectedDay);
- mAdapter.notifyDataSetChanged();
- }
- // refresh the view with the new parameters
- mAdapter.notifyDataSetChanged();
+ public void setOnDaySelectedListener(OnDaySelectedListener listener) {
+ mOnDaySelectedListener = listener;
}
/*
* Sets all the required fields for the list view. Override this method to
* set a different list view behavior.
*/
- protected void setUpListView() {
+ private void setUpListView() {
// Transparent background on scroll
setCacheColorHint(0);
// No dividers
@@ -173,7 +127,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
setOnScrollListener(this);
setFadingEdgeLength(0);
// Make the scrolling behavior nicer
- setFriction(ViewConfiguration.getScrollFriction() * mFriction);
+ setFriction(ViewConfiguration.getScrollFriction());
}
private int getDiffMonths(Calendar start, Calendar end) {
@@ -203,7 +157,7 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
* visible
* @return Whether or not the view animated to the new location
*/
- public boolean goTo(Calendar day, boolean animate, boolean setSelected, boolean forceScroll) {
+ private boolean goTo(Calendar day, boolean animate, boolean setSelected, boolean forceScroll) {
// Set the selected day
if (setSelected) {
@@ -392,11 +346,6 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
return firstPosition + mostVisibleIndex;
}
- @Override
- public void onDateChanged() {
- goTo(mController.getSelectedDay(), false, true, true);
- }
-
/**
* Attempts to return the date that has accessibility focus.
*
@@ -529,4 +478,18 @@ class DayPickerView extends ListView implements AbsListView.OnScrollListener,
mPerformingScroll = true;
return true;
}
+
+ public interface OnDaySelectedListener {
+ public void onDaySelected(DayPickerView view, Calendar day);
+ }
+
+ private final SimpleMonthAdapter.OnDaySelectedListener
+ mProxyOnDaySelectedListener = new SimpleMonthAdapter.OnDaySelectedListener() {
+ @Override
+ public void onDaySelected(SimpleMonthAdapter adapter, Calendar day) {
+ if (mOnDaySelectedListener != null) {
+ mOnDaySelectedListener.onDaySelected(DayPickerView.this, day);
+ }
+ }
+ };
}
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 54a7940..396c0b9 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -198,54 +198,17 @@ public class PopupWindow {
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
final TypedArray a = context.obtainStyledAttributes(
- attrs, com.android.internal.R.styleable.PopupWindow, defStyleAttr, defStyleRes);
-
- mBackground = a.getDrawable(R.styleable.PopupWindow_popupBackground);
+ attrs, R.styleable.PopupWindow, defStyleAttr, defStyleRes);
+ final Drawable bg = a.getDrawable(R.styleable.PopupWindow_popupBackground);
mElevation = a.getDimension(R.styleable.PopupWindow_popupElevation, 0);
mOverlapAnchor = a.getBoolean(R.styleable.PopupWindow_overlapAnchor, false);
final int animStyle = a.getResourceId(R.styleable.PopupWindow_popupAnimationStyle, -1);
- mAnimationStyle = animStyle == com.android.internal.R.style.Animation_PopupWindow ? -1 :
- animStyle;
+ mAnimationStyle = animStyle == R.style.Animation_PopupWindow ? -1 : animStyle;
- // If this is a StateListDrawable, try to find and store the drawable to be
- // used when the drop-down is placed above its anchor view, and the one to be
- // used when the drop-down is placed below its anchor view. We extract
- // the drawables ourselves to work around a problem with using refreshDrawableState
- // that it will take into account the padding of all drawables specified in a
- // StateListDrawable, thus adding superfluous padding to drop-down views.
- //
- // We assume a StateListDrawable will have a drawable for ABOVE_ANCHOR_STATE_SET and
- // at least one other drawable, intended for the 'below-anchor state'.
- if (mBackground instanceof StateListDrawable) {
- StateListDrawable background = (StateListDrawable) mBackground;
-
- // Find the above-anchor view - this one's easy, it should be labeled as such.
- int aboveAnchorStateIndex = background.getStateDrawableIndex(ABOVE_ANCHOR_STATE_SET);
-
- // Now, for the below-anchor view, look for any other drawable specified in the
- // StateListDrawable which is not for the above-anchor state and use that.
- int count = background.getStateCount();
- int belowAnchorStateIndex = -1;
- for (int i = 0; i < count; i++) {
- if (i != aboveAnchorStateIndex) {
- belowAnchorStateIndex = i;
- break;
- }
- }
-
- // Store the drawables we found, if we found them. Otherwise, set them both
- // to null so that we'll just use refreshDrawableState.
- if (aboveAnchorStateIndex != -1 && belowAnchorStateIndex != -1) {
- mAboveAnchorBackgroundDrawable = background.getStateDrawable(aboveAnchorStateIndex);
- mBelowAnchorBackgroundDrawable = background.getStateDrawable(belowAnchorStateIndex);
- } else {
- mBelowAnchorBackgroundDrawable = null;
- mAboveAnchorBackgroundDrawable = null;
- }
- }
-
a.recycle();
+
+ setBackgroundDrawable(bg);
}
/**
@@ -346,6 +309,43 @@ public class PopupWindow {
*/
public void setBackgroundDrawable(Drawable background) {
mBackground = background;
+
+ // If this is a StateListDrawable, try to find and store the drawable to be
+ // used when the drop-down is placed above its anchor view, and the one to be
+ // used when the drop-down is placed below its anchor view. We extract
+ // the drawables ourselves to work around a problem with using refreshDrawableState
+ // that it will take into account the padding of all drawables specified in a
+ // StateListDrawable, thus adding superfluous padding to drop-down views.
+ //
+ // We assume a StateListDrawable will have a drawable for ABOVE_ANCHOR_STATE_SET and
+ // at least one other drawable, intended for the 'below-anchor state'.
+ if (mBackground instanceof StateListDrawable) {
+ StateListDrawable stateList = (StateListDrawable) mBackground;
+
+ // Find the above-anchor view - this one's easy, it should be labeled as such.
+ int aboveAnchorStateIndex = stateList.getStateDrawableIndex(ABOVE_ANCHOR_STATE_SET);
+
+ // Now, for the below-anchor view, look for any other drawable specified in the
+ // StateListDrawable which is not for the above-anchor state and use that.
+ int count = stateList.getStateCount();
+ int belowAnchorStateIndex = -1;
+ for (int i = 0; i < count; i++) {
+ if (i != aboveAnchorStateIndex) {
+ belowAnchorStateIndex = i;
+ break;
+ }
+ }
+
+ // Store the drawables we found, if we found them. Otherwise, set them both
+ // to null so that we'll just use refreshDrawableState.
+ if (aboveAnchorStateIndex != -1 && belowAnchorStateIndex != -1) {
+ mAboveAnchorBackgroundDrawable = stateList.getStateDrawable(aboveAnchorStateIndex);
+ mBelowAnchorBackgroundDrawable = stateList.getStateDrawable(belowAnchorStateIndex);
+ } else {
+ mBelowAnchorBackgroundDrawable = null;
+ mAboveAnchorBackgroundDrawable = null;
+ }
+ }
}
/**
diff --git a/core/java/android/widget/SimpleMonthAdapter.java b/core/java/android/widget/SimpleMonthAdapter.java
index 5aa78c8..ecd2912 100644
--- a/core/java/android/widget/SimpleMonthAdapter.java
+++ b/core/java/android/widget/SimpleMonthAdapter.java
@@ -20,29 +20,28 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.SimpleMonthView.OnDayClickListener;
import java.util.Calendar;
-import java.util.HashMap;
/**
* An adapter for a list of {@link android.widget.SimpleMonthView} items.
*/
-class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayClickListener {
+class SimpleMonthAdapter extends BaseAdapter {
private final Calendar mMinDate = Calendar.getInstance();
private final Calendar mMaxDate = Calendar.getInstance();
private final Context mContext;
- private final DatePickerController mController;
private Calendar mSelectedDay;
private ColorStateList mCalendarTextColors;
+ private OnDaySelectedListener mOnDaySelectedListener;
- public SimpleMonthAdapter(Context context, DatePickerController controller) {
- mContext = context;
- mController = controller;
+ private int mFirstDayOfWeek;
- init();
- setSelectedDay(mController.getSelectedDay());
+ public SimpleMonthAdapter(Context context) {
+ mContext = context;
+ mSelectedDay = Calendar.getInstance();
}
public void setRange(Calendar min, Calendar max) {
@@ -52,27 +51,34 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
notifyDataSetInvalidated();
}
+ public void setFirstDayOfWeek(int firstDayOfWeek) {
+ mFirstDayOfWeek = firstDayOfWeek;
+
+ notifyDataSetInvalidated();
+ }
+
/**
* Updates the selected day and related parameters.
*
* @param day The day to highlight
*/
public void setSelectedDay(Calendar day) {
- if (mSelectedDay != day) {
- mSelectedDay = day;
- notifyDataSetChanged();
- }
- }
+ mSelectedDay = day;
- void setCalendarTextColor(ColorStateList colors) {
- mCalendarTextColors = colors;
+ notifyDataSetChanged();
}
/**
- * Set up the gesture detector and selected time
+ * Sets the listener to call when the user selects a day.
+ *
+ * @param listener The listener to call.
*/
- protected void init() {
- mSelectedDay = Calendar.getInstance();
+ public void setOnDaySelectedListener(OnDaySelectedListener listener) {
+ mOnDaySelectedListener = listener;
+ }
+
+ void setCalendarTextColor(ColorStateList colors) {
+ mCalendarTextColors = colors;
}
@Override
@@ -111,7 +117,7 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT);
v.setLayoutParams(params);
v.setClickable(true);
- v.setOnDayClickListener(this);
+ v.setOnDayClickListener(mOnDayClickListener);
if (mCalendarTextColors != null) {
v.setTextColor(mCalendarTextColors);
@@ -148,7 +154,7 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
enabledDayRangeEnd = 31;
}
- v.setMonthParams(selectedDay, month, year, mController.getFirstDayOfWeek(),
+ v.setMonthParams(selectedDay, month, year, mFirstDayOfWeek,
enabledDayRangeStart, enabledDayRangeEnd);
v.invalidate();
@@ -159,27 +165,24 @@ class SimpleMonthAdapter extends BaseAdapter implements SimpleMonthView.OnDayCli
return mSelectedDay.get(Calendar.YEAR) == year && mSelectedDay.get(Calendar.MONTH) == month;
}
- @Override
- public void onDayClick(SimpleMonthView view, Calendar day) {
- if (day != null && isCalendarInRange(day)) {
- onDaySelected(day);
- }
- }
-
private boolean isCalendarInRange(Calendar value) {
return value.compareTo(mMinDate) >= 0 && value.compareTo(mMaxDate) <= 0;
}
- /**
- * Maintains the same hour/min/sec but moves the day to the tapped day.
- *
- * @param day The day that was tapped
- */
- private void onDaySelected(Calendar day) {
- mController.tryVibrate();
- mController.onDayOfMonthSelected(day.get(Calendar.YEAR), day.get(Calendar.MONTH),
- day.get(Calendar.DAY_OF_MONTH));
+ private final OnDayClickListener mOnDayClickListener = new OnDayClickListener() {
+ @Override
+ public void onDayClick(SimpleMonthView view, Calendar day) {
+ if (day != null && isCalendarInRange(day)) {
+ setSelectedDay(day);
+
+ if (mOnDaySelectedListener != null) {
+ mOnDaySelectedListener.onDaySelected(SimpleMonthAdapter.this, day);
+ }
+ }
+ }
+ };
- setSelectedDay(day);
+ public interface OnDaySelectedListener {
+ public void onDaySelected(SimpleMonthAdapter view, Calendar day);
}
}
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index 78ee247..7d01321 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -607,23 +607,32 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
*/
@Override
public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
- if (pickerIndex == HOUR_INDEX) {
- if (mAllowAutoAdvance && autoAdvance) {
- updateHeaderHour(newValue, false);
- setCurrentItemShowing(MINUTE_INDEX, true, false);
- mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes);
- } else {
- updateHeaderHour(newValue, true);
- }
- } else if (pickerIndex == MINUTE_INDEX){
- updateHeaderMinute(newValue, true);
- } else if (pickerIndex == AMPM_INDEX) {
- updateAmPmLabelStates(newValue);
- } else if (pickerIndex == ENABLE_PICKER_INDEX) {
- if (!isTypedTimeFullyLegal()) {
- mTypedTimes.clear();
- }
- finishKbMode();
+ switch (pickerIndex) {
+ case HOUR_INDEX:
+ if (mAllowAutoAdvance && autoAdvance) {
+ updateHeaderHour(newValue, false);
+ setCurrentItemShowing(MINUTE_INDEX, true, false);
+ mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes);
+ } else {
+ updateHeaderHour(newValue, true);
+ }
+ break;
+ case MINUTE_INDEX:
+ updateHeaderMinute(newValue, true);
+ break;
+ case AMPM_INDEX:
+ updateAmPmLabelStates(newValue);
+ break;
+ case ENABLE_PICKER_INDEX:
+ if (!isTypedTimeFullyLegal()) {
+ mTypedTimes.clear();
+ }
+ finishKbMode();
+ break;
+ }
+
+ if (mOnTimeChangedListener != null) {
+ mOnTimeChangedListener.onTimeChanged(mDelegator, getCurrentHour(), getCurrentMinute());
}
}
diff --git a/core/java/com/android/internal/content/ReferrerIntent.aidl b/core/java/com/android/internal/content/ReferrerIntent.aidl
new file mode 100644
index 0000000..7cf6774
--- /dev/null
+++ b/core/java/com/android/internal/content/ReferrerIntent.aidl
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
+package com.android.internal.content;
+
+parcelable ReferrerIntent;
diff --git a/core/java/com/android/internal/content/ReferrerIntent.java b/core/java/com/android/internal/content/ReferrerIntent.java
new file mode 100644
index 0000000..8d9a1cf
--- /dev/null
+++ b/core/java/com/android/internal/content/ReferrerIntent.java
@@ -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.
+ */
+
+package com.android.internal.content;
+
+import android.content.Intent;
+import android.os.Parcel;
+
+/**
+ * Subclass of Intent that also contains referrer (as a package name) information.
+ */
+public class ReferrerIntent extends Intent {
+ public final String mReferrer;
+
+ public ReferrerIntent(Intent baseIntent, String referrer) {
+ super(baseIntent);
+ mReferrer = referrer;
+ }
+
+ public void writeToParcel(Parcel dest, int parcelableFlags) {
+ super.writeToParcel(dest, parcelableFlags);
+ dest.writeString(mReferrer);
+ }
+
+ ReferrerIntent(Parcel in) {
+ readFromParcel(in);
+ mReferrer = in.readString();
+ }
+
+ public static final Creator<ReferrerIntent> CREATOR = new Creator<ReferrerIntent>() {
+ public ReferrerIntent createFromParcel(Parcel source) {
+ return new ReferrerIntent(source);
+ }
+ public ReferrerIntent[] newArray(int size) {
+ return new ReferrerIntent[size];
+ }
+ };
+}
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index ac915d1..183527c 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -16,6 +16,8 @@
package com.android.internal.inputmethod;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.AppOpsManager;
import android.content.ContentResolver;
import android.content.Context;
@@ -34,7 +36,9 @@ import android.view.textservice.SpellCheckerInfo;
import android.view.textservice.TextServicesManager;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
@@ -115,8 +119,8 @@ public class InputMethodUtils {
}
/**
- * @deprecated Use {@link Locale} returned from
- * {@link #getFallbackLocaleForDefaultIme(ArrayList)} instead.
+ * @deprecated Use {@link #isSystemImeThatHasSubtypeOf(InputMethodInfo, Context, boolean,
+ * Locale, boolean, String)} instead.
*/
@Deprecated
public static boolean isSystemImeThatHasEnglishKeyboardSubtype(InputMethodInfo imi) {
@@ -126,25 +130,60 @@ public class InputMethodUtils {
return containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage(), SUBTYPE_MODE_KEYBOARD);
}
+ private static boolean isSystemImeThatHasSubtypeOf(final InputMethodInfo imi,
+ final Context context, final boolean checkDefaultAttribute,
+ @Nullable final Locale requiredLocale, final boolean checkCountry,
+ final String requiredSubtypeMode) {
+ if (!isSystemIme(imi)) {
+ return false;
+ }
+ if (checkDefaultAttribute && !imi.isDefault(context)) {
+ return false;
+ }
+ if (!containsSubtypeOf(imi, requiredLocale, checkCountry, requiredSubtypeMode)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Nullable
public static Locale getFallbackLocaleForDefaultIme(final ArrayList<InputMethodInfo> imis,
final Context context) {
+ // At first, find the fallback locale from the IMEs that are declared as "default" in the
+ // current locale. Note that IME developers can declare an IME as "default" only for
+ // some particular locales but "not default" for other locales.
for (final Locale fallbackLocale : SEARCH_ORDER_OF_FALLBACK_LOCALES) {
for (int i = 0; i < imis.size(); ++i) {
- final InputMethodInfo imi = imis.get(i);
- if (isSystemIme(imi) && imi.isDefault(context) &&
- containsSubtypeOf(imi, fallbackLocale, false /* ignoreCountry */,
- SUBTYPE_MODE_KEYBOARD)) {
+ if (isSystemImeThatHasSubtypeOf(imis.get(i), context,
+ true /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD)) {
+ return fallbackLocale;
+ }
+ }
+ }
+ // If no fallback locale is found in the above condition, find fallback locales regardless
+ // of the "default" attribute as a last resort.
+ for (final Locale fallbackLocale : SEARCH_ORDER_OF_FALLBACK_LOCALES) {
+ for (int i = 0; i < imis.size(); ++i) {
+ if (isSystemImeThatHasSubtypeOf(imis.get(i), context,
+ false /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD)) {
return fallbackLocale;
}
}
}
+ Slog.w(TAG, "Found no fallback locale. imis=" + Arrays.toString(imis.toArray()));
return null;
}
- private static boolean isSystemAuxilialyImeThatHasAutomaticSubtype(InputMethodInfo imi) {
+ private static boolean isSystemAuxilialyImeThatHasAutomaticSubtype(final InputMethodInfo imi,
+ final Context context, final boolean checkDefaultAttribute) {
if (!isSystemIme(imi)) {
return false;
}
+ if (checkDefaultAttribute && !imi.isDefault(context)) {
+ return false;
+ }
if (!imi.isAuxiliaryIme()) {
return false;
}
@@ -166,98 +205,184 @@ public class InputMethodUtils {
}
}
- public static ArrayList<InputMethodInfo> getDefaultEnabledImes(
- Context context, boolean isSystemReady, ArrayList<InputMethodInfo> imis) {
- // OK to store null in fallbackLocale because isImeThatHasSubtypeOf() is null-tolerant.
- final Locale fallbackLocale = getFallbackLocaleForDefaultIme(imis, context);
+ private static final class InputMethodListBuilder {
+ // Note: We use LinkedHashSet instead of android.util.ArraySet because the enumeration
+ // order can have non-trivial effect in the call sites.
+ @NonNull
+ private final LinkedHashSet<InputMethodInfo> mInputMethodSet = new LinkedHashSet<>();
- if (!isSystemReady) {
- final ArrayList<InputMethodInfo> retval = new ArrayList<>();
+ public InputMethodListBuilder fillImes(final ArrayList<InputMethodInfo> imis,
+ final Context context, final boolean checkDefaultAttribute,
+ @Nullable final Locale locale, final boolean checkCountry,
+ final String requiredSubtypeMode) {
for (int i = 0; i < imis.size(); ++i) {
final InputMethodInfo imi = imis.get(i);
- // TODO: We should check isAsciiCapable instead of relying on fallbackLocale.
- if (isSystemIme(imi) && imi.isDefault(context) &&
- isImeThatHasSubtypeOf(imi, fallbackLocale, false /* ignoreCountry */,
- SUBTYPE_MODE_KEYBOARD)) {
- retval.add(imi);
+ if (isSystemImeThatHasSubtypeOf(imi, context, checkDefaultAttribute, locale,
+ checkCountry, requiredSubtypeMode)) {
+ mInputMethodSet.add(imi);
}
}
- return retval;
+ return this;
}
- // OK to store null in fallbackLocale because isImeThatHasSubtypeOf() is null-tolerant.
- final Locale systemLocale = getSystemLocaleFromContext(context);
- // TODO: Use LinkedHashSet to simplify the code.
- final ArrayList<InputMethodInfo> retval = new ArrayList<>();
- boolean systemLocaleKeyboardImeFound = false;
-
- // First, try to find IMEs with taking the system locale country into consideration.
- for (int i = 0; i < imis.size(); ++i) {
- final InputMethodInfo imi = imis.get(i);
- if (!isSystemIme(imi) || !imi.isDefault(context)) {
- continue;
- }
- final boolean isSystemLocaleKeyboardIme = isImeThatHasSubtypeOf(imi, systemLocale,
- false /* ignoreCountry */, SUBTYPE_MODE_KEYBOARD);
- // TODO: We should check isAsciiCapable instead of relying on fallbackLocale.
- // TODO: Use LinkedHashSet to simplify the code.
- if (isSystemLocaleKeyboardIme ||
- isImeThatHasSubtypeOf(imi, fallbackLocale, false /* ignoreCountry */,
- SUBTYPE_MODE_ANY)) {
- retval.add(imi);
+ // TODO: The behavior of InputMethodSubtype#overridesImplicitlyEnabledSubtype() should be
+ // documented more clearly.
+ public InputMethodListBuilder fillAuxiliaryImes(final ArrayList<InputMethodInfo> imis,
+ final Context context) {
+ // If one or more auxiliary input methods are available, OK to stop populating the list.
+ for (final InputMethodInfo imi : mInputMethodSet) {
+ if (imi.isAuxiliaryIme()) {
+ return this;
+ }
}
- systemLocaleKeyboardImeFound |= isSystemLocaleKeyboardIme;
- }
-
- // System locale country doesn't match any IMEs, try to find IMEs in a country-agnostic
- // way.
- if (!systemLocaleKeyboardImeFound) {
+ boolean added = false;
for (int i = 0; i < imis.size(); ++i) {
final InputMethodInfo imi = imis.get(i);
- if (!isSystemIme(imi) || !imi.isDefault(context)) {
- continue;
- }
- if (isImeThatHasSubtypeOf(imi, fallbackLocale, false /* ignoreCountry */,
- SUBTYPE_MODE_KEYBOARD)) {
- // IMEs that have fallback locale are already added in the previous loop. We
- // don't need to add them again here.
- // TODO: Use LinkedHashSet to simplify the code.
- continue;
+ if (isSystemAuxilialyImeThatHasAutomaticSubtype(imi, context,
+ true /* checkDefaultAttribute */)) {
+ mInputMethodSet.add(imi);
+ added = true;
}
- if (isImeThatHasSubtypeOf(imi, systemLocale, true /* ignoreCountry */,
- SUBTYPE_MODE_ANY)) {
- retval.add(imi);
+ }
+ if (added) {
+ return this;
+ }
+ for (int i = 0; i < imis.size(); ++i) {
+ final InputMethodInfo imi = imis.get(i);
+ if (isSystemAuxilialyImeThatHasAutomaticSubtype(imi, context,
+ false /* checkDefaultAttribute */)) {
+ mInputMethodSet.add(imi);
}
}
+ return this;
}
- // If one or more auxiliary input methods are available, OK to stop populating the list.
- for (int i = 0; i < retval.size(); ++i) {
- if (retval.get(i).isAuxiliaryIme()) {
- return retval;
- }
+ public boolean isEmpty() {
+ return mInputMethodSet.isEmpty();
}
- for (int i = 0; i < imis.size(); ++i) {
- final InputMethodInfo imi = imis.get(i);
- if (isSystemAuxilialyImeThatHasAutomaticSubtype(imi)) {
- retval.add(imi);
- }
+
+ @NonNull
+ public ArrayList<InputMethodInfo> build() {
+ return new ArrayList<>(mInputMethodSet);
}
- return retval;
}
- public static boolean isImeThatHasSubtypeOf(final InputMethodInfo imi,
- final Locale locale, final boolean ignoreCountry, final String mode) {
- if (locale == null) {
- return false;
- }
- return containsSubtypeOf(imi, locale, ignoreCountry, mode);
+ private static InputMethodListBuilder getMinimumKeyboardSetWithoutSystemLocale(
+ final ArrayList<InputMethodInfo> imis, final Context context,
+ @Nullable final Locale fallbackLocale) {
+ // Before the system becomes ready, we pick up at least one keyboard in the following order.
+ // The first user (device owner) falls into this category.
+ // 1. checkDefaultAttribute: true, locale: fallbackLocale, checkCountry: true
+ // 2. checkDefaultAttribute: false, locale: fallbackLocale, checkCountry: true
+ // 3. checkDefaultAttribute: true, locale: fallbackLocale, checkCountry: false
+ // 4. checkDefaultAttribute: false, locale: fallbackLocale, checkCountry: false
+ // TODO: We should check isAsciiCapable instead of relying on fallbackLocale.
+
+ final InputMethodListBuilder builder = new InputMethodListBuilder();
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, false /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, fallbackLocale,
+ false /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, false /* checkDefaultAttribute */, fallbackLocale,
+ false /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ Slog.w(TAG, "No software keyboard is found. imis=" + Arrays.toString(imis.toArray())
+ + " fallbackLocale=" + fallbackLocale);
+ return builder;
+ }
+
+ private static InputMethodListBuilder getMinimumKeyboardSetWithSystemLocale(
+ final ArrayList<InputMethodInfo> imis, final Context context,
+ @Nullable final Locale systemLocale, @Nullable final Locale fallbackLocale) {
+ // Once the system becomes ready, we pick up at least one keyboard in the following order.
+ // Secondary users fall into this category in general.
+ // 1. checkDefaultAttribute: true, locale: systemLocale, checkCountry: true
+ // 2. checkDefaultAttribute: true, locale: systemLocale, checkCountry: false
+ // 3. checkDefaultAttribute: true, locale: fallbackLocale, checkCountry: true
+ // 4. checkDefaultAttribute: true, locale: fallbackLocale, checkCountry: false
+ // 5. checkDefaultAttribute: false, locale: fallbackLocale, checkCountry: true
+ // 6. checkDefaultAttribute: false, locale: fallbackLocale, checkCountry: false
+ // TODO: We should check isAsciiCapable instead of relying on fallbackLocale.
+
+ final InputMethodListBuilder builder = new InputMethodListBuilder();
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
+ false /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, true /* checkDefaultAttribute */, fallbackLocale,
+ false /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, false /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ builder.fillImes(imis, context, false /* checkDefaultAttribute */, fallbackLocale,
+ false /* checkCountry */, SUBTYPE_MODE_KEYBOARD);
+ if (!builder.isEmpty()) {
+ return builder;
+ }
+ Slog.w(TAG, "No software keyboard is found. imis=" + Arrays.toString(imis.toArray())
+ + " systemLocale=" + systemLocale + " fallbackLocale=" + fallbackLocale);
+ return builder;
+ }
+
+ public static ArrayList<InputMethodInfo> getDefaultEnabledImes(final Context context,
+ final boolean isSystemReady, final ArrayList<InputMethodInfo> imis) {
+ final Locale fallbackLocale = getFallbackLocaleForDefaultIme(imis, context);
+ if (!isSystemReady) {
+ // When the system is not ready, the system locale is not stable and reliable. Hence
+ // we will pick up IMEs that support software keyboard based on the fallback locale.
+ // Also pick up suitable IMEs regardless of the software keyboard support.
+ // (e.g. Voice IMEs)
+ return getMinimumKeyboardSetWithoutSystemLocale(imis, context, fallbackLocale)
+ .fillImes(imis, context, true /* checkDefaultAttribute */, fallbackLocale,
+ true /* checkCountry */, SUBTYPE_MODE_ANY)
+ .build();
+ }
+
+ // When the system is ready, we will primarily rely on the system locale, but also keep
+ // relying on the fallback locale as a last resort.
+ // Also pick up suitable IMEs regardless of the software keyboard support (e.g. Voice IMEs),
+ // then pick up suitable auxiliary IMEs when necessary (e.g. Voice IMEs with "automatic"
+ // subtype)
+ final Locale systemLocale = getSystemLocaleFromContext(context);
+ return getMinimumKeyboardSetWithSystemLocale(imis, context, systemLocale, fallbackLocale)
+ .fillImes(imis, context, true /* checkDefaultAttribute */, systemLocale,
+ true /* checkCountry */, SUBTYPE_MODE_ANY)
+ .fillAuxiliaryImes(imis, context)
+ .build();
}
/**
- * @deprecated Use {@link #isSystemIme(InputMethodInfo)} and
- * {@link InputMethodInfo#isDefault(Context)} and
- * {@link #isImeThatHasSubtypeOf(InputMethodInfo, Locale, boolean, String))} instead.
+ * @deprecated Use {@link #isSystemImeThatHasSubtypeOf(InputMethodInfo, Context, boolean,
+ * Locale, boolean, String)} instead.
*/
@Deprecated
public static boolean isValidSystemDefaultIme(
@@ -285,22 +410,25 @@ public class InputMethodUtils {
}
public static boolean containsSubtypeOf(final InputMethodInfo imi,
- final Locale locale, final boolean ignoreCountry, final String mode) {
+ @Nullable final Locale locale, final boolean checkCountry, final String mode) {
+ if (locale == null) {
+ return false;
+ }
final int N = imi.getSubtypeCount();
for (int i = 0; i < N; ++i) {
final InputMethodSubtype subtype = imi.getSubtypeAt(i);
- if (ignoreCountry) {
- final Locale subtypeLocale = new Locale(getLanguageFromLocaleString(
- subtype.getLocale()));
- if (!subtypeLocale.getLanguage().equals(locale.getLanguage())) {
- continue;
- }
- } else {
+ if (checkCountry) {
// TODO: Use {@link Locale#toLanguageTag()} and
// {@link Locale#forLanguageTag(languageTag)} instead.
if (!TextUtils.equals(subtype.getLocale(), locale.toString())) {
continue;
}
+ } else {
+ final Locale subtypeLocale = new Locale(getLanguageFromLocaleString(
+ subtype.getLocale()));
+ if (!subtypeLocale.getLanguage().equals(locale.getLanguage())) {
+ continue;
+ }
}
if (mode == SUBTYPE_MODE_ANY || TextUtils.isEmpty(mode) ||
mode.equalsIgnoreCase(subtype.getMode())) {
@@ -465,19 +593,9 @@ public class InputMethodUtils {
return applicableSubtypes;
}
- private static List<InputMethodSubtype> getEnabledInputMethodSubtypeList(
- Context context, InputMethodInfo imi, List<InputMethodSubtype> enabledSubtypes,
- boolean allowsImplicitlySelectedSubtypes) {
- if (allowsImplicitlySelectedSubtypes && enabledSubtypes.isEmpty()) {
- enabledSubtypes = InputMethodUtils.getImplicitlyApplicableSubtypesLocked(
- context.getResources(), imi);
- }
- return InputMethodSubtype.sort(context, 0, imi, enabledSubtypes);
- }
-
/**
* Returns the language component of a given locale string.
- * TODO: Use {@link Locale#toLanguageTag()} and {@link Locale#forLanguageTag(languageTag)}
+ * TODO: Use {@link Locale#toLanguageTag()} and {@link Locale#forLanguageTag(String)}
*/
public static String getLanguageFromLocaleString(String locale) {
final int idx = locale.indexOf('_');
diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java
index 86f580d..b5338df 100644
--- a/core/java/com/android/internal/os/ProcessCpuTracker.java
+++ b/core/java/com/android/internal/os/ProcessCpuTracker.java
@@ -23,8 +23,11 @@ import android.os.Process;
import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Slog;
+
import com.android.internal.util.FastPrintWriter;
+import libcore.io.IoUtils;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
@@ -325,7 +328,12 @@ public class ProcessCpuTracker {
mBaseIdleTime = idletime;
}
- mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats);
+ final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
+ try {
+ mCurPids = collectStats("/proc", -1, mFirst, mCurPids, mProcStats);
+ } finally {
+ StrictMode.setThreadPolicy(savedPolicy);
+ }
final float[] loadAverages = mLoadAverageData;
if (Process.readProcFile("/proc/loadavg", LOAD_AVERAGE_FORMAT,
@@ -847,12 +855,7 @@ public class ProcessCpuTracker {
} catch (java.io.FileNotFoundException e) {
} catch (java.io.IOException e) {
} finally {
- if (is != null) {
- try {
- is.close();
- } catch (java.io.IOException e) {
- }
- }
+ IoUtils.closeQuietly(is);
StrictMode.setThreadPolicy(savedPolicy);
}
return null;
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 57472f8..a3c0db4 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -42,5 +42,6 @@ oneway interface IStatusBar
void toggleRecentApps();
void preloadRecentApps();
void cancelPreloadRecentApps();
+ void showScreenPinningRequest();
}
diff --git a/core/java/com/android/internal/util/StateMachine.java b/core/java/com/android/internal/util/StateMachine.java
index d26f79e..7ad3470 100644
--- a/core/java/com/android/internal/util/StateMachine.java
+++ b/core/java/com/android/internal/util/StateMachine.java
@@ -1940,13 +1940,19 @@ public class StateMachine {
* @param args
*/
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- pw.println(getName() + ":");
- pw.println(" total records=" + getLogRecCount());
+ pw.println(this.toString());
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(getName() + ":\n");
+ sb.append(" total records=" + getLogRecCount() + "\n");
for (int i = 0; i < getLogRecSize(); i++) {
- pw.printf(" rec[%d]: %s\n", i, getLogRec(i).toString());
- pw.flush();
+ sb.append(" rec[" + i + "]: " + getLogRec(i).toString() + "\n");
}
- pw.println("curState=" + getCurrentState().getName());
+ sb.append("curState=" + getCurrentState().getName());
+ return sb.toString();
}
/**
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index c70841b..9501f92 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -16,8 +16,6 @@
package com.android.internal.widget;
-import com.android.internal.widget.ILockSettingsObserver;
-
/** {@hide} */
interface ILockSettings {
void setBoolean(in String key, in boolean value, in int userId);
@@ -34,6 +32,4 @@ interface ILockSettings {
boolean havePattern(int userId);
boolean havePassword(int userId);
void removeUser(int userId);
- void registerObserver(in ILockSettingsObserver observer);
- void unregisterObserver(in ILockSettingsObserver observer);
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index d6885da..3ccced5 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -207,8 +207,9 @@ public class LockPatternUtils {
private ILockSettings getLockSettings() {
if (mLockSettingsService == null) {
- mLockSettingsService = LockPatternUtilsCache.getInstance(
- ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings")));
+ ILockSettings service = ILockSettings.Stub.asInterface(
+ ServiceManager.getService("lock_settings"));
+ mLockSettingsService = service;
}
return mLockSettingsService;
}
diff --git a/core/java/com/android/internal/widget/LockPatternUtilsCache.java b/core/java/com/android/internal/widget/LockPatternUtilsCache.java
deleted file mode 100644
index 624f67c..0000000
--- a/core/java/com/android/internal/widget/LockPatternUtilsCache.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.os.IBinder;
-import android.os.RemoteException;
-import android.util.ArrayMap;
-
-/**
- * A decorator for {@link ILockSettings} that caches the key-value responses in memory.
- *
- * Specifically, the return values of {@link #getString(String, String, int)},
- * {@link #getLong(String, long, int)} and {@link #getBoolean(String, boolean, int)} are cached.
- */
-public class LockPatternUtilsCache implements ILockSettings {
-
- private static final String HAS_LOCK_PATTERN_CACHE_KEY
- = "LockPatternUtils.Cache.HasLockPatternCacheKey";
- private static final String HAS_LOCK_PASSWORD_CACHE_KEY
- = "LockPatternUtils.Cache.HasLockPasswordCacheKey";
-
- private static LockPatternUtilsCache sInstance;
-
- private final ILockSettings mService;
-
- /** Only access when holding {@code mCache} lock. */
- private final ArrayMap<CacheKey, Object> mCache = new ArrayMap<>();
-
- /** Only access when holding {@link #mCache} lock. */
- private final CacheKey mCacheKey = new CacheKey();
-
-
- public static synchronized LockPatternUtilsCache getInstance(ILockSettings service) {
- if (sInstance == null) {
- sInstance = new LockPatternUtilsCache(service);
- }
- return sInstance;
- }
-
- // ILockSettings
-
- private LockPatternUtilsCache(ILockSettings service) {
- mService = service;
- try {
- service.registerObserver(mObserver);
- } catch (RemoteException e) {
- // Not safe to do caching without the observer. System process has probably died
- // anyway, so crashing here is fine.
- throw new RuntimeException(e);
- }
- }
-
- public void setBoolean(String key, boolean value, int userId) throws RemoteException {
- invalidateCache(key, userId);
- mService.setBoolean(key, value, userId);
- putCache(key, userId, value);
- }
-
- public void setLong(String key, long value, int userId) throws RemoteException {
- invalidateCache(key, userId);
- mService.setLong(key, value, userId);
- putCache(key, userId, value);
- }
-
- public void setString(String key, String value, int userId) throws RemoteException {
- invalidateCache(key, userId);
- mService.setString(key, value, userId);
- putCache(key, userId, value);
- }
-
- public long getLong(String key, long defaultValue, int userId) throws RemoteException {
- Object value = peekCache(key, userId);
- if (value instanceof Long) {
- return (long) value;
- }
- long result = mService.getLong(key, defaultValue, userId);
- putCache(key, userId, result);
- return result;
- }
-
- public String getString(String key, String defaultValue, int userId) throws RemoteException {
- Object value = peekCache(key, userId);
- if (value instanceof String) {
- return (String) value;
- }
- String result = mService.getString(key, defaultValue, userId);
- putCache(key, userId, result);
- return result;
- }
-
- public boolean getBoolean(String key, boolean defaultValue, int userId) throws RemoteException {
- Object value = peekCache(key, userId);
- if (value instanceof Boolean) {
- return (boolean) value;
- }
- boolean result = mService.getBoolean(key, defaultValue, userId);
- putCache(key, userId, result);
- return result;
- }
-
- @Override
- public void setLockPattern(String pattern, int userId) throws RemoteException {
- invalidateCache(HAS_LOCK_PATTERN_CACHE_KEY, userId);
- mService.setLockPattern(pattern, userId);
- putCache(HAS_LOCK_PATTERN_CACHE_KEY, userId, pattern != null);
- }
-
- @Override
- public boolean checkPattern(String pattern, int userId) throws RemoteException {
- return mService.checkPattern(pattern, userId);
- }
-
- @Override
- public void setLockPassword(String password, int userId) throws RemoteException {
- invalidateCache(HAS_LOCK_PASSWORD_CACHE_KEY, userId);
- mService.setLockPassword(password, userId);
- putCache(HAS_LOCK_PASSWORD_CACHE_KEY, userId, password != null);
- }
-
- @Override
- public boolean checkPassword(String password, int userId) throws RemoteException {
- return mService.checkPassword(password, userId);
- }
-
- @Override
- public boolean checkVoldPassword(int userId) throws RemoteException {
- return mService.checkVoldPassword(userId);
- }
-
- @Override
- public boolean havePattern(int userId) throws RemoteException {
- Object value = peekCache(HAS_LOCK_PATTERN_CACHE_KEY, userId);
- if (value instanceof Boolean) {
- return (boolean) value;
- }
- boolean result = mService.havePattern(userId);
- putCache(HAS_LOCK_PATTERN_CACHE_KEY, userId, result);
- return result;
- }
-
- @Override
- public boolean havePassword(int userId) throws RemoteException {
- Object value = peekCache(HAS_LOCK_PASSWORD_CACHE_KEY, userId);
- if (value instanceof Boolean) {
- return (boolean) value;
- }
- boolean result = mService.havePassword(userId);
- putCache(HAS_LOCK_PASSWORD_CACHE_KEY, userId, result);
- return result;
- }
-
- @Override
- public void removeUser(int userId) throws RemoteException {
- mService.removeUser(userId);
- }
-
- @Override
- public void registerObserver(ILockSettingsObserver observer) throws RemoteException {
- mService.registerObserver(observer);
- }
-
- @Override
- public void unregisterObserver(ILockSettingsObserver observer) throws RemoteException {
- mService.unregisterObserver(observer);
- }
-
- @Override
- public IBinder asBinder() {
- return mService.asBinder();
- }
-
- // Caching
-
- private Object peekCache(String key, int userId) {
- synchronized (mCache) {
- // Safe to reuse mCacheKey, because it is not stored in the map.
- return mCache.get(mCacheKey.set(key, userId));
- }
- }
-
- private void putCache(String key, int userId, Object value) {
- synchronized (mCache) {
- // Create a new key, because this will be stored in the map.
- mCache.put(new CacheKey().set(key, userId), value);
- }
- }
-
- private void invalidateCache(String key, int userId) {
- synchronized (mCache) {
- // Safe to reuse mCacheKey, because it is not stored in the map.
- mCache.remove(mCacheKey.set(key, userId));
- }
- }
-
- private final ILockSettingsObserver mObserver = new ILockSettingsObserver.Stub() {
- @Override
- public void onLockSettingChanged(String key, int userId) throws RemoteException {
- invalidateCache(key, userId);
- }
- };
-
- private static final class CacheKey {
- String key;
- int userId;
-
- public CacheKey set(String key, int userId) {
- this.key = key;
- this.userId = userId;
- return this;
- }
-
- public CacheKey copy() {
- return new CacheKey().set(key, userId);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof CacheKey))
- return false;
- CacheKey o = (CacheKey) obj;
- return userId == o.userId && key.equals(o.key);
- }
-
- @Override
- public int hashCode() {
- return key.hashCode() ^ userId;
- }
- }
-}
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 70cf9a8..d7eef6e 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -17,7 +17,7 @@
#include <jni.h>
-#include <Caches.h>
+#include <ResourceCache.h>
#if 0
#define TRACE_BITMAP(code) code
@@ -365,8 +365,8 @@ static jobject Bitmap_copy(JNIEnv* env, jobject, jlong srcHandle,
static void Bitmap_destructor(JNIEnv* env, jobject, jlong bitmapHandle) {
SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
#ifdef USE_OPENGL_RENDERER
- if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().resourceCache.destructor(bitmap);
+ if (android::uirenderer::ResourceCache::hasInstance()) {
+ android::uirenderer::ResourceCache::getInstance().destructor(bitmap);
return;
}
#endif // USE_OPENGL_RENDERER
@@ -376,9 +376,9 @@ static void Bitmap_destructor(JNIEnv* env, jobject, jlong bitmapHandle) {
static jboolean Bitmap_recycle(JNIEnv* env, jobject, jlong bitmapHandle) {
SkBitmap* bitmap = reinterpret_cast<SkBitmap*>(bitmapHandle);
#ifdef USE_OPENGL_RENDERER
- if (android::uirenderer::Caches::hasInstance()) {
+ if (android::uirenderer::ResourceCache::hasInstance()) {
bool result;
- result = android::uirenderer::Caches::getInstance().resourceCache.recycle(bitmap);
+ result = android::uirenderer::ResourceCache::getInstance().recycle(bitmap);
return result ? JNI_TRUE : JNI_FALSE;
}
#endif // USE_OPENGL_RENDERER
diff --git a/core/jni/android/graphics/NinePatch.cpp b/core/jni/android/graphics/NinePatch.cpp
index cf23771..be62fdd 100644
--- a/core/jni/android/graphics/NinePatch.cpp
+++ b/core/jni/android/graphics/NinePatch.cpp
@@ -21,7 +21,7 @@
#include <androidfw/ResourceTypes.h>
#include <utils/Log.h>
-#include <Caches.h>
+#include <ResourceCache.h>
#include "Paint.h"
#include "Canvas.h"
@@ -80,9 +80,9 @@ public:
static void finalize(JNIEnv* env, jobject, jlong patchHandle) {
int8_t* patch = reinterpret_cast<int8_t*>(patchHandle);
#ifdef USE_OPENGL_RENDERER
- if (android::uirenderer::Caches::hasInstance()) {
+ if (android::uirenderer::ResourceCache::hasInstance()) {
Res_png_9patch* p = (Res_png_9patch*) patch;
- android::uirenderer::Caches::getInstance().resourceCache.destructor(p);
+ android::uirenderer::ResourceCache::getInstance().destructor(p);
return;
}
#endif // USE_OPENGL_RENDERER
diff --git a/core/jni/android/graphics/Path.cpp b/core/jni/android/graphics/Path.cpp
index 9d3e74b..30ce58d 100644
--- a/core/jni/android/graphics/Path.cpp
+++ b/core/jni/android/graphics/Path.cpp
@@ -27,7 +27,7 @@
#include "SkPath.h"
#include "SkPathOps.h"
-#include <Caches.h>
+#include <ResourceCache.h>
#include <vector>
#include <map>
@@ -39,8 +39,8 @@ public:
static void finalizer(JNIEnv* env, jobject clazz, jlong objHandle) {
SkPath* obj = reinterpret_cast<SkPath*>(objHandle);
#ifdef USE_OPENGL_RENDERER
- if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().resourceCache.destructor(obj);
+ if (android::uirenderer::ResourceCache::hasInstance()) {
+ android::uirenderer::ResourceCache::getInstance().destructor(obj);
return;
}
#endif
diff --git a/core/jni/android/graphics/SurfaceTexture.cpp b/core/jni/android/graphics/SurfaceTexture.cpp
index eea16f1..eaca6d2 100644
--- a/core/jni/android/graphics/SurfaceTexture.cpp
+++ b/core/jni/android/graphics/SurfaceTexture.cpp
@@ -121,7 +121,7 @@ class JNISurfaceTextureContext : public GLConsumer::FrameAvailableListener
public:
JNISurfaceTextureContext(JNIEnv* env, jobject weakThiz, jclass clazz);
virtual ~JNISurfaceTextureContext();
- virtual void onFrameAvailable();
+ virtual void onFrameAvailable(const BufferItem& item);
private:
static JNIEnv* getJNIEnv(bool* needsDetach);
@@ -177,7 +177,7 @@ JNISurfaceTextureContext::~JNISurfaceTextureContext()
}
}
-void JNISurfaceTextureContext::onFrameAvailable()
+void JNISurfaceTextureContext::onFrameAvailable(const BufferItem& /* item */)
{
bool needsDetach = false;
JNIEnv* env = getJNIEnv(&needsDetach);
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 9bdc6b5..b023ebd 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -828,7 +828,7 @@ static jint android_view_GLES20Canvas_drawRenderNode(JNIEnv* env,
static void android_view_GLES20Canvas_drawLayer(JNIEnv* env, jobject clazz,
jlong rendererPtr, jlong layerPtr, jfloat x, jfloat y) {
DisplayListRenderer* renderer = reinterpret_cast<DisplayListRenderer*>(rendererPtr);
- Layer* layer = reinterpret_cast<Layer*>(layerPtr);
+ DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
renderer->drawLayer(layer, x, y);
}
diff --git a/core/jni/android_view_HardwareLayer.cpp b/core/jni/android_view_HardwareLayer.cpp
index aa674de..1ffff03 100644
--- a/core/jni/android_view_HardwareLayer.cpp
+++ b/core/jni/android_view_HardwareLayer.cpp
@@ -81,12 +81,6 @@ static void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject
layer->updateTexImage();
}
-static jlong android_view_HardwareLayer_getLayer(JNIEnv* env, jobject clazz,
- jlong layerUpdaterPtr) {
- DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
- return reinterpret_cast<jlong>( layer->backingLayer() );
-}
-
static jint android_view_HardwareLayer_getTexName(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
@@ -111,7 +105,6 @@ static JNINativeMethod gMethods[] = {
(void*) android_view_HardwareLayer_setSurfaceTexture },
{ "nUpdateSurfaceTexture", "(J)V", (void*) android_view_HardwareLayer_updateSurfaceTexture },
- { "nGetLayer", "(J)J", (void*) android_view_HardwareLayer_getLayer },
{ "nGetTexName", "(J)I", (void*) android_view_HardwareLayer_getTexName },
#endif
};
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index ffe2b60..b03103e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1269,26 +1269,31 @@
android:description="@string/permdesc_use_sip"
android:label="@string/permlab_use_sip" />
- <!-- Protects the ability to register any PhoneAccount with
+ <!-- @SystemApi Protects the ability to register any PhoneAccount with
PhoneAccount#CAPABILITY_SIM_SUBSCRIPTION. This capability indicates that the PhoneAccount
- corresponds to a device SIM. -->
+ corresponds to a device SIM.
+ @hide -->
<permission android:name="android.permission.REGISTER_SIM_SUBSCRIPTION"
android:permissionGroup="android.permission-group.PHONE_CALLS"
android:protectionLevel="system|signature"
android:description="@string/permdesc_register_sim_subscription"
android:label="@string/permlab_register_sim_subscription" />
- <!-- Protects the ability to register any PhoneAccount with
- PhoneAccount#CAPABILITY_CALL_PROVIDER. -->
+ <!-- @SystemApi Protects the ability to register any PhoneAccount with
+ PhoneAccount#CAPABILITY_CALL_PROVIDER.
+ @hide -->
<permission android:name="android.permission.REGISTER_CALL_PROVIDER"
android:permissionGroup="android.permission-group.PHONE_CALLS"
+ android:protectionLevel="system|signature"
android:description="@string/permdesc_register_call_provider"
android:label="@string/permlab_register_call_provider" />
- <!-- Protects the ability to register any PhoneAccount with
- PhoneAccount#CAPABILITY_CONNECTION_MANAGER -->
+ <!-- @SystemApi Protects the ability to register any PhoneAccount with
+ PhoneAccount#CAPABILITY_CONNECTION_MANAGER
+ @hide -->
<permission android:name="android.permission.REGISTER_CONNECTION_MANAGER"
android:permissionGroup="android.permission-group.PHONE_CALLS"
+ android:protectionLevel="system|signature"
android:description="@string/permdesc_connection_manager"
android:label="@string/permlab_connection_manager" />
@@ -2935,7 +2940,7 @@
android:label="@string/managed_profile_label">
</activity-alias>
<activity android:name="com.android.internal.app.HeavyWeightSwitcherActivity"
- android:theme="@style/Theme.Material.Dialog"
+ android:theme="@style/Theme.Material.Light.Dialog"
android:label="@string/heavy_weight_switcher_title"
android:finishOnCloseSystemDialogs="true"
android:excludeFromRecents="true"
@@ -2955,7 +2960,7 @@
<activity android:name="android.accounts.ChooseAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@android:style/Theme.Material.Dialog"
+ android:theme="@style/Theme.Material.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
@@ -2963,14 +2968,14 @@
<activity android:name="android.accounts.ChooseTypeAndAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@android:style/Theme.Material.Dialog"
+ android:theme="@style/Theme.Material.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
<activity android:name="android.accounts.ChooseAccountTypeActivity"
android:excludeFromRecents="true"
- android:theme="@android:style/Theme.Material.Dialog"
+ android:theme="@style/Theme.Material.Light.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
@@ -2978,19 +2983,19 @@
<activity android:name="android.accounts.CantAddAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@android:style/Theme.Material.Dialog.NoActionBar"
+ android:theme="@style/Theme.Material.Light.Dialog.NoActionBar"
android:process=":ui">
</activity>
<activity android:name="android.accounts.GrantCredentialsPermissionActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@android:style/Theme.Material.DialogWhenLarge"
+ android:theme="@style/Theme.Material.Light.DialogWhenLarge"
android:process=":ui">
</activity>
<activity android:name="android.content.SyncActivityTooManyDeletes"
- android:theme="@android:style/Theme.Holo.Dialog"
+ android:theme="@style/Theme.Material.Light.Dialog"
android:label="@string/sync_too_many_deletes"
android:process=":ui">
</activity>
@@ -3009,7 +3014,7 @@
</activity>
<activity android:name="com.android.internal.app.NetInitiatedActivity"
- android:theme="@style/Theme.Holo.Dialog.Alert"
+ android:theme="@style/Theme.Material.Light.Dialog.Alert"
android:excludeFromRecents="true"
android:process=":ui">
</activity>
diff --git a/core/res/res/anim/launch_task_behind_source.xml b/core/res/res/anim/launch_task_behind_source.xml
index cd3e30a..a715705 100644
--- a/core/res/res/anim/launch_task_behind_source.xml
+++ b/core/res/res/anim/launch_task_behind_source.xml
@@ -22,38 +22,27 @@
<alpha android:fromAlpha="1.0" android:toAlpha="0.6"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@interpolator/accelerate_cubic"
- android:duration="133"/>
+ android:interpolator="@interpolator/linear_out_slow_in"
+ android:duration="417"/>
- <translate android:fromYDelta="0" android:toYDelta="10%"
- android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@interpolator/accelerate_cubic"
- android:duration="350"/>
-
- <scale android:fromXScale="1.0" android:toXScale="0.9"
- android:fromYScale="1.0" android:toYScale="0.9"
+ <scale android:fromXScale="1.0" android:toXScale="0.918"
+ android:fromYScale="1.0" android:toYScale="0.918"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
android:pivotX="50%p" android:pivotY="50%p"
- android:interpolator="@interpolator/fast_out_slow_in"
- android:duration="350" />
+ android:interpolator="@interpolator/launch_task_behind_source_scale_1"
+ android:duration="417" />
<alpha android:fromAlpha="1.0" android:toAlpha="1.6666666666"
android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@interpolator/decelerate_cubic"
- android:startOffset="433"
- android:duration="133"/>
-
- <translate android:fromYDelta="0%" android:toYDelta="-8.8888888888%"
- android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@interpolator/decelerate_cubic"
- android:startOffset="433"
- android:duration="350"/>
+ android:interpolator="@interpolator/linear"
+ android:startOffset="500"
+ android:duration="167"/>
- <scale android:fromXScale="1.0" android:toXScale="1.1111111111"
- android:fromYScale="1.0" android:toYScale="1.1111111111"
+ <scale android:fromXScale="1.0" android:toXScale="1.08932461873638"
+ android:fromYScale="1.0" android:toYScale="1.08932461873638"
android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
android:pivotX="50%p" android:pivotY="50%p"
- android:interpolator="@interpolator/decelerate_cubic"
- android:startOffset="433"
- android:duration="350" />
+ android:interpolator="@interpolator/launch_task_behind_source_scale_2"
+ android:startOffset="500"
+ android:duration="317" />
</set> \ No newline at end of file
diff --git a/core/res/res/anim/launch_task_behind_target.xml b/core/res/res/anim/launch_task_behind_target.xml
index 358511f..805918b 100644
--- a/core/res/res/anim/launch_task_behind_target.xml
+++ b/core/res/res/anim/launch_task_behind_target.xml
@@ -20,15 +20,15 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="top">
- <translate android:fromYDelta="110%" android:toYDelta="66%"
+ <translate android:fromYDelta="110%" android:toYDelta="70%"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@interpolator/decelerate_quint"
+ android:interpolator="@interpolator/launch_task_behind_target_ydelta"
android:startOffset="50"
- android:duration="300" />
+ android:duration="333" />
- <translate android:fromYDelta="0%" android:toYDelta="167%"
+ <translate android:fromYDelta="0%" android:toYDelta="50%"
android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@interpolator/accelerate_quint"
- android:startOffset="433"
- android:duration="300" />
-</set> \ No newline at end of file
+ android:interpolator="@interpolator/fast_out_linear_in"
+ android:startOffset="467"
+ android:duration="317" />
+</set>
diff --git a/core/res/res/layout/lock_to_app_checkbox.xml b/core/res/res/interpolator/launch_task_behind_source_scale_1.xml
index 890507b..7e295d8 100644
--- a/core/res/res/layout/lock_to_app_checkbox.xml
+++ b/core/res/res/interpolator/launch_task_behind_source_scale_1.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
-/* //device/apps/common/res/layout/alert_dialog.xml
-**
+/*
** Copyright 2014, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,20 +16,6 @@
** limitations under the License.
*/
-->
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="15dip"
- android:paddingBottom="0dip"
- android:paddingStart="12dip"
- android:paddingEnd="25dip"
- >
-
- <CheckBox
- android:id="@+id/lock_to_app_checkbox"
- style="?android:attr/textAppearanceMedium"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />
-</FrameLayout>
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.541795,0 0.2,1 1,1" />
diff --git a/core/res/res/interpolator/launch_task_behind_source_scale_2.xml b/core/res/res/interpolator/launch_task_behind_source_scale_2.xml
new file mode 100644
index 0000000..1601fd0
--- /dev/null
+++ b/core/res/res/interpolator/launch_task_behind_source_scale_2.xml
@@ -0,0 +1,21 @@
+<?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.
+*/
+-->
+
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.220434,0 0.833333,1 1,1" />
diff --git a/core/res/res/interpolator/launch_task_behind_target_ydelta.xml b/core/res/res/interpolator/launch_task_behind_target_ydelta.xml
new file mode 100644
index 0000000..96b539f
--- /dev/null
+++ b/core/res/res/interpolator/launch_task_behind_target_ydelta.xml
@@ -0,0 +1,21 @@
+<?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.
+*/
+-->
+
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.3,0 0,1 1,1" />
diff --git a/core/res/res/layout/activity_chooser_view_list_item.xml b/core/res/res/layout/activity_chooser_view_list_item.xml
index af70234..66e400a 100644
--- a/core/res/res/layout/activity_chooser_view_list_item.xml
+++ b/core/res/res/layout/activity_chooser_view_list_item.xml
@@ -17,11 +17,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item"
android:layout_width="match_parent"
- android:layout_height="?android:attr/dropdownListPreferredItemHeight"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:minWidth="196dip"
- android:background="?android:attr/activatedBackgroundIndicator"
+ android:background="?attr/activatedBackgroundIndicator"
android:orientation="vertical" >
<LinearLayout
@@ -42,7 +42,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:textAppearance="?android:attr/textAppearanceLargePopupMenu"
+ android:textAppearance="?attr/textAppearanceLargePopupMenu"
android:duplicateParentState="true"
android:singleLine="true"
android:ellipsize="marquee"
diff --git a/core/res/res/layout/activity_list_item_2.xml b/core/res/res/layout/activity_list_item_2.xml
index a5a4cf9..608e986 100644
--- a/core/res/res/layout/activity_list_item_2.xml
+++ b/core/res/res/layout/activity_list_item_2.xml
@@ -17,9 +17,9 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceListItemSmall"
+ android:minHeight="?attr/listPreferredItemHeight"
+ android:textAppearance="?attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:drawablePadding="14dip"
- android:paddingStart="16dip"
- android:paddingEnd="16dip" />
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd" />
diff --git a/core/res/res/layout/alert_dialog_material.xml b/core/res/res/layout/alert_dialog_material.xml
index 5627a2c..29bfaa7 100644
--- a/core/res/res/layout/alert_dialog_material.xml
+++ b/core/res/res/layout/alert_dialog_material.xml
@@ -31,9 +31,9 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical|start"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_top_material">
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material">
<ImageView android:id="@+id/icon"
android:layout_width="32dip"
android:layout_height="32dip"
@@ -74,13 +74,13 @@
style="@style/TextAppearance.Material.Subhead"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_top_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material" />
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material"
+ android:paddingEnd="?attr/dialogPreferredPadding" />
<Space android:id="@+id/textSpacerNoButtons"
android:visibility="gone"
android:layout_width="0dp"
- android:layout_height="@dimen/alert_dialog_padding_top_material" />
+ android:layout_height="@dimen/dialog_padding_top_material" />
</LinearLayout>
</ScrollView>
<View android:id="@+id/scrollIndicatorDown"
diff --git a/core/res/res/layout/alert_dialog_progress_material.xml b/core/res/res/layout/alert_dialog_progress_material.xml
index d005a44..9c21540 100644
--- a/core/res/res/layout/alert_dialog_progress_material.xml
+++ b/core/res/res/layout/alert_dialog_progress_material.xml
@@ -18,10 +18,10 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_top_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
- android:paddingBottom="@dimen/alert_dialog_padding_top_material">
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingBottom="@dimen/dialog_padding_top_material">
<ProgressBar
android:id="@+id/progress"
style="?attr/progressBarStyleHorizontal"
diff --git a/core/res/res/layout/app_not_authorized.xml b/core/res/res/layout/app_not_authorized.xml
index 2188511..339b24e 100644
--- a/core/res/res/layout/app_not_authorized.xml
+++ b/core/res/res/layout/app_not_authorized.xml
@@ -26,30 +26,33 @@
<TextView android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start|center_vertical"
- android:paddingTop="16dip"
- android:paddingBottom="16dip"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material"
+ android:paddingEnd="?attr/dialogPreferredPadding"
android:text="@string/error_message_change_not_allowed"
- />
+ style="@style/TextAppearance.Material.Subhead" />
- <!-- Horizontal divider line -->
- <View android:layout_height="1dip"
- android:layout_width="match_parent"
- android:background="?android:attr/dividerHorizontal" />
-
- <!-- Alert dialog style buttons along the bottom. -->
- <LinearLayout android:id="@+id/button_bar"
- style="?android:attr/buttonBarStyle"
+ <LinearLayout android:id="@+id/buttonPanel"
+ style="?attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:measureWithLargestChild="true">
- <Button android:id="@android:id/button1"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:layoutDirection="locale"
+ android:orientation="horizontal"
+ android:paddingStart="12dp"
+ android:paddingEnd="12dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:gravity="bottom">
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
android:layout_weight="1"
+ android:visibility="invisible" />
+ <Button android:id="@+id/button1"
+ style="?attr/buttonBarNegativeButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:text="@android:string/yes"
android:onClick="onCancelButtonClicked" />
</LinearLayout>
diff --git a/core/res/res/layout/choose_account.xml b/core/res/res/layout/choose_account.xml
index 45a944e..e13dd26 100644
--- a/core/res/res/layout/choose_account.xml
+++ b/core/res/res/layout/choose_account.xml
@@ -21,11 +21,11 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:paddingStart="16dip"
- android:paddingEnd="16dip">
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding">
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/list"
+ android:id="@id/list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1"
diff --git a/core/res/res/layout/choose_account_row.xml b/core/res/res/layout/choose_account_row.xml
index c4247b6..71537fb 100644
--- a/core/res/res/layout/choose_account_row.xml
+++ b/core/res/res/layout/choose_account_row.xml
@@ -18,8 +18,8 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:orientation="horizontal" >
<ImageView android:id="@+id/account_row_icon"
@@ -31,8 +31,8 @@
android:id="@+id/account_row_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?android:attr/textAppearanceListItem"
android:gravity="center_vertical"
- android:minHeight="?android:attr/listPreferredItemHeight" />
+ android:minHeight="?attr/listPreferredItemHeight" />
-</LinearLayout> \ No newline at end of file
+</LinearLayout>
diff --git a/core/res/res/layout/choose_type_and_account.xml b/core/res/res/layout/choose_type_and_account.xml
index bf06054..79f3f1a 100644
--- a/core/res/res/layout/choose_type_and_account.xml
+++ b/core/res/res/layout/choose_type_and_account.xml
@@ -26,45 +26,52 @@
<TextView android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="start|center_vertical"
- android:paddingTop="16dip"
- android:paddingBottom="16dip"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
- />
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ style="@style/TextAppearance.Material.Subhead" />
- <!-- List of accounts, with "Add new account" as the last item -->
- <ListView android:id="@android:id/list"
+ <FrameLayout android:id="@+id/contentPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawSelectorOnTop="false"
android:layout_weight="1"
- android:scrollbarAlwaysDrawVerticalTrack="true"
- android:choiceMode="singleChoice" />
-
- <!-- Horizontal divider line -->
- <View android:layout_height="1dip"
- android:layout_width="match_parent"
- android:background="?android:attr/dividerHorizontal" />
+ android:minHeight="48dp">
+ <ListView android:id="@id/list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:drawSelectorOnTop="false"
+ android:layout_weight="1"
+ android:scrollbarAlwaysDrawVerticalTrack="true"
+ android:choiceMode="singleChoice" />
+ </FrameLayout>
- <!-- Alert dialog style buttons along the bottom. -->
- <LinearLayout android:id="@+id/button_bar"
- style="?android:attr/buttonBarStyle"
+ <LinearLayout android:id="@+id/buttonPanel"
+ style="?attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:measureWithLargestChild="true">
- <Button android:id="@android:id/button1"
- style="?android:attr/buttonBarButtonStyle"
- android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:layoutDirection="locale"
+ android:orientation="horizontal"
+ android:paddingStart="12dp"
+ android:paddingEnd="12dp"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:gravity="bottom">
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
android:layout_weight="1"
+ android:visibility="invisible" />
+ <Button android:id="@+id/button1"
+ style="?attr/buttonBarNegativeButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
android:text="@android:string/no"
android:onClick="onCancelButtonClicked" />
- <Button android:id="@android:id/button2"
- style="?android:attr/buttonBarButtonStyle"
+ <Button android:id="@+id/button2"
+ style="?attr/buttonBarPositiveButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_weight="1"
android:text="@android:string/yes"
android:onClick="onOkButtonClicked" />
</LinearLayout>
diff --git a/core/res/res/layout/dialog_title_icons_material.xml b/core/res/res/layout/dialog_title_icons_material.xml
index 21396da..62af096 100644
--- a/core/res/res/layout/dialog_title_icons_material.xml
+++ b/core/res/res/layout/dialog_title_icons_material.xml
@@ -28,9 +28,9 @@ enabled.
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_material">
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingTop="?attr/dialogPreferredPadding">
<ImageView android:id="@+id/left_icon"
android:layout_width="32dip"
android:layout_height="32dip"
diff --git a/core/res/res/layout/dialog_title_material.xml b/core/res/res/layout/dialog_title_material.xml
index fcf6164..339d569 100644
--- a/core/res/res/layout/dialog_title_material.xml
+++ b/core/res/res/layout/dialog_title_material.xml
@@ -29,9 +29,9 @@ enabled.
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="viewStart"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_top_material" />
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material" />
<FrameLayout
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="1"
diff --git a/core/res/res/layout/locale_picker_item.xml b/core/res/res/layout/locale_picker_item.xml
index 94c9baf..defdd4d 100644
--- a/core/res/res/layout/locale_picker_item.xml
+++ b/core/res/res/layout/locale_picker_item.xml
@@ -19,15 +19,14 @@
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="center_vertical"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:paddingStart="16dp"
+ android:minHeight="?attr/listPreferredItemHeight"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:paddingEnd="16dp">
+ android:paddingBottom="8dp">
<TextView android:id="@+id/locale"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- />
-</LinearLayout >
+ android:textAppearance="?android:attr/textAppearanceListItem" />
+</LinearLayout>
diff --git a/core/res/res/layout/popup_menu_item_layout.xml b/core/res/res/layout/popup_menu_item_layout.xml
index 452f85d..0bc636f 100644
--- a/core/res/res/layout/popup_menu_item_layout.xml
+++ b/core/res/res/layout/popup_menu_item_layout.xml
@@ -16,7 +16,7 @@
<com.android.internal.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="?android:attr/dropdownListPreferredItemHeight"
+ android:layout_height="?attr/dropdownListPreferredItemHeight"
android:minWidth="196dip"
android:paddingEnd="16dip">
@@ -37,7 +37,7 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
- android:textAppearance="?android:attr/textAppearanceLargePopupMenu"
+ android:textAppearance="?attr/textAppearanceLargePopupMenu"
android:singleLine="true"
android:duplicateParentState="true"
android:ellipsize="marquee"
@@ -50,7 +50,7 @@
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_alignParentStart="true"
- android:textAppearance="?android:attr/textAppearanceSmallPopupMenu"
+ android:textAppearance="?attr/textAppearanceSmallPopupMenu"
android:singleLine="true"
android:duplicateParentState="true"
android:textAlignment="viewStart" />
diff --git a/core/res/res/layout/progress_dialog_material.xml b/core/res/res/layout/progress_dialog_material.xml
index 54af106..2417965 100644
--- a/core/res/res/layout/progress_dialog_material.xml
+++ b/core/res/res/layout/progress_dialog_material.xml
@@ -25,10 +25,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingTop="@dimen/alert_dialog_padding_top_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
- android:paddingBottom="@dimen/alert_dialog_padding_top_material">
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingTop="@dimen/dialog_padding_top_material"
+ android:paddingEnd="?attr/dialogPreferredPadding"
+ android:paddingBottom="@dimen/dialog_padding_top_material">
<ProgressBar
android:id="@id/progress"
@@ -36,7 +36,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:max="10000"
- android:layout_marginEnd="@dimen/alert_dialog_padding_material" />
+ android:layout_marginEnd="?attr/dialogPreferredPadding" />
<TextView
android:id="@+id/message"
diff --git a/core/res/res/layout/resolve_list_item.xml b/core/res/res/layout/resolve_list_item.xml
index 37c4270..2933a6a 100644
--- a/core/res/res/layout/resolve_list_item.xml
+++ b/core/res/res/layout/resolve_list_item.xml
@@ -32,8 +32,8 @@
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="start|center_vertical"
- android:layout_marginStart="16dp"
- android:layout_marginEnd="16dp"
+ android:layout_marginStart="?attr/listPreferredItemPaddingStart"
+ android:layout_marginEnd="?attr/listPreferredItemPaddingEnd"
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
android:scaleType="fitCenter" />
@@ -41,8 +41,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="start|center_vertical"
android:orientation="vertical"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_gravity="start|center_vertical">
diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml
index 727f9c6..9ae3aec 100644
--- a/core/res/res/layout/resolver_list.xml
+++ b/core/res/res/layout/resolver_list.xml
@@ -23,23 +23,21 @@
android:maxWidth="@dimen/resolver_max_width"
android:maxCollapsedHeight="192dp"
android:maxCollapsedHeightSmall="56dp"
- android:id="@id/contentPanel"
- >
+ android:id="@id/contentPanel">
<TextView android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alwaysShow="true"
android:minHeight="56dp"
- android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textAppearance="?attr/textAppearanceMedium"
android:gravity="start|center_vertical"
- android:paddingStart="16dp"
- android:paddingEnd="16dp"
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:background="@color/white"
- android:elevation="8dp"
- />
+ android:elevation="8dp" />
<ListView
android:layout_width="match_parent"
@@ -50,8 +48,7 @@
android:background="@color/white"
android:elevation="8dp"
android:nestedScrollingEnabled="true"
- android:divider="@null"
- />
+ android:divider="@null" />
<TextView android:id="@+id/empty"
android:layout_width="match_parent"
diff --git a/core/res/res/layout/select_dialog_multichoice_material.xml b/core/res/res/layout/select_dialog_multichoice_material.xml
index e5b5b62..9cfbbb3 100644
--- a/core/res/res/layout/select_dialog_multichoice_material.xml
+++ b/core/res/res/layout/select_dialog_multichoice_material.xml
@@ -23,8 +23,8 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:checkMarkGravity="start"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/select_dialog_singlechoice_material.xml b/core/res/res/layout/select_dialog_singlechoice_material.xml
index a9e603d..4f8672f 100644
--- a/core/res/res/layout/select_dialog_singlechoice_material.xml
+++ b/core/res/res/layout/select_dialog_singlechoice_material.xml
@@ -23,8 +23,8 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:checkMarkGravity="start"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/simple_account_item.xml b/core/res/res/layout/simple_account_item.xml
index e7b746c..29e42af 100644
--- a/core/res/res/layout/simple_account_item.xml
+++ b/core/res/res/layout/simple_account_item.xml
@@ -18,13 +18,13 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="?attr/listPreferredItemHeight"
android:gravity="center_vertical"
- android:paddingStart="16dip"
- android:paddingEnd="?android:attr/scrollbarSize">
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
+ android:paddingEnd="?attr/scrollbarSize">
<ImageView
- android:id="@+android:id/icon"
+ android:id="@id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
@@ -36,20 +36,20 @@
android:layout_marginTop="6dip"
android:layout_marginBottom="6dip"
android:layout_weight="1">
- <TextView android:id="@+android:id/title"
+ <TextView android:id="@id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="none"
- android:textAppearance="?android:attr/textAppearanceListItem" />
- <TextView android:id="@+android:id/summary"
+ android:textAppearance="?attr/textAppearanceListItem" />
+ <TextView android:id="@id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_below="@android:id/title"
- android:layout_alignStart="@android:id/title"
+ android:layout_below="@id/title"
+ android:layout_alignStart="@id/title"
android:singleLine="true"
android:ellipsize="none"
- android:textAppearance="?android:attr/textAppearanceListItemSecondary"
- android:textColor="?android:attr/textColorSecondary"/>
+ android:textAppearance="?attr/textAppearanceListItemSecondary"
+ android:textColor="?attr/textColorSecondary"/>
</RelativeLayout>
</LinearLayout>
diff --git a/core/res/res/layout/simple_list_item_2_single_choice.xml b/core/res/res/layout/simple_list_item_2_single_choice.xml
index 940c6b8..6cdb88b 100644
--- a/core/res/res/layout/simple_list_item_2_single_choice.xml
+++ b/core/res/res/layout/simple_list_item_2_single_choice.xml
@@ -19,7 +19,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
- android:paddingStart="16dip"
+ android:paddingStart="?attr/listPreferredItemPaddingStart"
android:paddingEnd="12dip"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:background="@color/transparent">
diff --git a/core/res/res/layout/user_switching_dialog.xml b/core/res/res/layout/user_switching_dialog.xml
index 8617e5d..496783a 100644
--- a/core/res/res/layout/user_switching_dialog.xml
+++ b/core/res/res/layout/user_switching_dialog.xml
@@ -21,7 +21,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
- android:paddingStart="@dimen/alert_dialog_padding_material"
- android:paddingEnd="@dimen/alert_dialog_padding_material"
+ android:paddingStart="?attr/dialogPreferredPadding"
+ android:paddingEnd="?attr/dialogPreferredPadding"
android:paddingTop="24dp"
android:paddingBottom="24dp" />
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 7598aa3..0dd5cc3 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minute"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekondes"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Laat die program toe om die kaslêerstelsel te lees en skryf."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"maak en/of ontvang SIP-oproepe"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Laat die program toe om SIP-oproepe te maak en te ontvang."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registreer nuwe telekommunikasie-SIM-verbindings"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Laat die program toe om nuwe telekommunikasie-SIM-verbindings te registreer."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registreer nuwe telekommunikasieverbindings"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Laat die program toe om nuwe telekommunikasieverbindings te registreer."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"bestuur telekom-verbindings"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Laat die program toe om telekom-verbindings te bestuur."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"beleef interaksie met inoproep-skerm"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Om hierdie skerm te ontspeld, raak en hou tegelyk Terug en Oorsig."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Om hierdie skerm te ontspeld, raak en hou Oorsig."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skerm is vasgespeld. Jou organisasie laat nie toe dat dit ontspeld word nie."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Gebruik skermvasspeld?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Skermvasspeld sluit die skerm in \'n enkele aansig vas.\n\nOm dit te ontspeld, raak en hou tegelyk Terug en Oorsig."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Skermvasspeld sluit die skerm in \'n enkele aansig vas.\n\nOm dit te ontspeld, raak en hou Oorsig."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEE, DANKIE"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"BEGIN"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skerm vasgespeld"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skerm ontspeld"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vra PIN voordat jy ontspeld"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vra wagwoord voordat jy ontspeld"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Om batteryleeftyd te help verbeter, verminder batterybespaarder jou toestel se werkverrigting en beperk vibrasie en die meeste agtergronddata. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer nie tensy jy hulle oopmaak.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel laai."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Totdat jou ontspantyd om <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> eindig"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Tot jou aftyd verby is"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Vir een minuut (tot <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Vir %1$d minute (tot <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Onbepaalde tyd"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Vou in"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Tot die volgende wekker om <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Tot die volgende wekker"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index da4136d..4cc1096 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"መሸጎጫ ስርዓተ ፋይል ለማንበብ እና ለመፃፍ ለመተግበሪያው ይፈቅዳሉ።"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"የSIP ጥሪዎችን ያድርጉ/ይቀበሉ"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"መተግበሪያው የSIP ጥሪዎችን እንዲያደር እና እንዲቀበል ያስችላል።"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"አዲስ የቴሌኮም ግንኙነቶችን መዝግብ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"መተግበሪያው አዲስ የቴሌኮም ሲም ግንኙነቶችን እንዲመዘግብ ያስችለዋል።"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"አዲስ የቴሌኮም ግንኙነቶችን መዝግብ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"መተግበሪያው አዲስ የቴሌኮም ግንኙነቶችን እንዲመዘግብ ያስችለዋል።"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"የቴሌኮም ግንኙነቶችን ያቀናብራል"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"መተግበሪያው የቴሌኮም ግንኙነቶችን እንዲያቀናብር ያስችለዋል።"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ከውስጠ-ጥሪ ማያ ገጽ ጋር መስተጋብር ይፈጥራል"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ይህን ማያ ገጽ ለመንቀል ተመለስን እና አጠቃላይ እይታን በተመሳሳይ ይንኳቸውና ይያዟቸው።"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ይህን ማያ ገጽ ለመንቀል አጠቃላይ እይታን ይንኩትና ይያዙት።"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ማያ ገጽ ተሰክቷል። መንቀል በድርጅትዎ አይፈቀድም።"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"ማያ ገጽ መሰካትን ይጠቀሙ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ማያ ገጽ መሰካትን ማሳያውን በነጠላ እይታ ውስጥ ይቆልፈዋል።\n\nለመንቀል ተመለስን እና አጠቃላይ እይታን በተመሳሳይ ይንኳቸውና ይያዟቸው።"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ማያ ገጽ መሰካት ማሳያውን በአንዲት እይታ ውስጥ ይቆልፈዋል።\n\nለመንቀል አጠቃላይ እይታን ይንኩትና ይያዙት።"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ከመንቀል በፊት ፒን ጠይቅ"</string>
@@ -1783,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"የእርስዎ የማይገኙበት ጊዜ እስከሚያበቃ ድረስ"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ለአንድ ደቂቃ (እስከ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g> ድረስ)"</item>
<item quantity="other" msgid="2787867221129368935">"ለ%1$d ደቂቃዎች (እስከ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g> ድረስ)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"እስከ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ድረስ"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"ያለገደብ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ሰብስብ"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"በ<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ላይ እስከሚቀጥለው ማንቂያ ድረስ"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"እስከሚቀጥለው ማንቂያ ድረስ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 8439432..f241662 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"للسماح للتطبيق بقراءة نظام ملفات ذاكرة التخزين المؤقت والكتابة به."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"‏إجراء/تلقي مكالمات SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"‏للسماح للتطبيق بإجراء مكالمات SIP وتلقيها."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"‏تسجيل اتصالات SIM اللاسلكية الجديدة"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"‏للسماح للتطبيق بتسجيل اتصالات SIM اللاسلكية الجديدة."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"تسجيل الاتصالات اللاسلكية الجديدة"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"للسماح للتطبيق بتسجيل الاتصالات اللاسلكية الجديدة."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"إدارة الاتصالات اللاسلكية"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"للسماح للتطبيق بإدارة الاتصالات اللاسلكية."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"التفاعل مع الشاشة أثناء الاتصال"</string>
@@ -1771,18 +1769,14 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"رجوع\" و\"نظرة عامة\" في آن واحد مع الاستمرار."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"نظرة عامة\" مع الاستمرار."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"الشاشة مثبتة. لا تسمح منظمتك بإلغاء التثبيت."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"هل تريد استخدام تثبيت الشاشة؟"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"يؤدي تثبيت الشاشة إلى تأمين الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، المس \"رجوع\" و\"نظرة عامة\" في آن واحد مع الاستمرار."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"يؤدي تثبيت الشاشة إلى قفل الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، يمكنك لمس \"نظرة عامة\" مع الاستمرار."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"المطالبة برقم التعريف الشخصي قبل إزالة التثبيت"</string>
<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="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_line_one" msgid="8762708714645352010">"حتى انتهاء وقت التعطل"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"لمدة دقيقة واحدة (حتى <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"‏لمدة %1$d من الدقائق (حتى <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"حتى <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"إلى أجل غير مسمى"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"تصغير"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"حتى التنبيه التالي في <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"حتى التنبيه التالي"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index c2f7a8f..b0a25e9 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Разрешава на приложението да чете и записва във файловата система на кеша."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"извършване/получаване на обаждания чрез SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Разрешава на приложението да извършва и получава обаждания чрез SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистриране на нови телекомуникационни връзки за SIM карти"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Разрешава на приложението да регистрира новите телекомуникационни връзки за SIM карти."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистриране на нови телекомуникационни връзки"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Разрешава на приложението да регистрира новите телекомуникационни връзки."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"управление на телекомуникационните връзки"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Разрешава на приложението да управлява телекомуникационните връзки."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"взаимодействие с екрана за обаждане"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"За да освободите екрана, докоснете и задръжте едновременно бутона за връщане назад и този за общ преглед."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"За да освободите този екран, докоснете и задръжте бутона „Общ преглед“."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Екранът е фиксиран. Освобождаването не е разрешено от организацията ви."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Да се използва ли функцията за фиксиране на екрана?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Фиксирането на екрана заключва дисплея в един изглед.\n\nЗа да го освободите, докоснете и задръжте едновременно бутона за връщане назад и този за общ преглед."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Фиксирането на екрана заключва дисплея в един изглед.\n\nЗа да го освободите, докоснете и задръжте бутона „Общ преглед“."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Запитване за ПИН код преди освобождаване"</string>
@@ -1783,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"До приключването на почивката ви"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"За една минута (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"За %1$d минути (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"За неопределено време"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Свиване"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"До следващия будилник в <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"До следващия будилник"</string>
</resources>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 9c6a344..8c6a9b7 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ঘন্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ঘন্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> সেকেন্ড"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ক্যাশে ফাইল সিস্টেম পড়তে ও লিখতে অ্যাপ্লিকেশানকে অনুমতি দেয়৷"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP কল করুন/গ্রহণ করুন"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"অ্যাপ্লিকেশানকে SIP কল করতে ও গ্রহণ করতে অনুমতি দেয়।"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"নতুন টেলিকম SIM সংযোগগুলির নিবন্ধন"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"অ্যাপ্লিকেশানটিকে নতুন টেলিকম SIM সংযোগগুলি নিবন্ধিত করতে অনুমোদিত করে৷"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"নতুন টেলিকম সংযোগগুলির নিবন্ধন"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"নতুন টেলিকম সংযোগ নিবন্ধিত করতে অ্যাপ্লিকেশানটিকে অনুমোদিত করে৷"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"টেলিকম সংযোগগুলি পরিচালনা করুন"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"টেলিকম সংযোগগুলি পরিচালনা করতে  অ্যাপ্লিকেশানটিকে অনুমোদিত করে৷"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"কলে-থাকা স্ক্রীণের সাথে ইন্টারঅ্যাক্ট করে"</string>
@@ -1295,7 +1293,7 @@
<string name="wifi_p2p_invitation_sent_title" msgid="1318975185112070734">"আমন্ত্রণ পাঠানো হয়েছে"</string>
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"সংযুক্ত হওয়ার আমন্ত্রণ"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"থেকে:"</string>
- <string name="wifi_p2p_to_message" msgid="248968974522044099">"প্রতি:"</string>
+ <string name="wifi_p2p_to_message" msgid="248968974522044099">"প্রাপক:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"প্রয়োজনীয় PINটি লিখুন:"</string>
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ট্যাবলেটটি যখন <xliff:g id="DEVICE_NAME">%1$s</xliff:g> এ সংযুক্ত হবে তখন এটি Wi-Fi থেকে সাময়িকভাবে সংযোগ বিচ্ছিন্ন হবে"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন\' এবং \'এক নজরে\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"এই স্ক্রীনটিকে আনপিন করতে, \'এক নজরে\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"স্ক্রীন পিন করা আছে। আপনার প্রতিষ্ঠান এটিকে পিনমুক্ত করার অনুমতি দেয়নি।"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"স্ক্রীন পিন করা ব্যবহার করবেন?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\nআনপিন করার জন্য, \'ফিরুন\' এবং \'এক নজরে\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\n আনপিন করার জন্য, \'এক নজরে\' স্পর্শ করুন এবং ধরে রাখুন৷"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"আনপিন করার আগে PIN চান"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"এক মিনিটের জন্য (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> পর্যন্ত)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d মিনিটের জন্য (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> পর্যন্ত)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> পর্যন্ত"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"অনির্দিষ্টভাবে"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"সঙ্কুচিত করুন"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 0ab84cd..93c8389 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuts"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permet que l\'aplicació llegeixi el sistema de fitxers de la memòria cau i que hi escrigui."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Fer i rebre trucades de SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permet que l\'aplicació pugui fer i rebre trucades de SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrar connexions SIM de telecomunicacions noves"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permet que l\'aplicació registri connexions SIM de telecomunicacions noves."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrar connexions de telecomunicacions noves"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permet que l\'aplicació registri connexions de telecomunicacions noves."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gestionar les connexions de telecomunicacions"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permet que l\'aplicació gestioni les connexions de telecomunicacions."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interaccionar amb la pantalla de la trucada"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Per anul·lar la fixació d\'aquesta pantalla, mantén premudes les opcions Enrere i Visió general alhora."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Per anul·lar la fixació d\'aquesta pantalla, mantén premuda l\'opció Visió general."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"S\'ha fixat la pantalla. La teva organització no permet anul·lar-ne la fixació."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Vols fixar aquesta pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premudes les opcions Enrere i Visió general alhora."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premuda l\'opció Visió general."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRÀCIES"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INICIA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Fixació de la pantalla anul·lada"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Demana el codi PIN abans d\'anul·lar la fixació"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demana la contrasenya abans d\'anul·lar la fixació"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Per tal d\'augmentar la durada de la bateria, la funció d\'estalvi de bateria redueix el rendiment del dispositiu i en limita la vibració i la majoria de dades en segon pla. És possible que el correu electrònic, la missatgeria i la resta d\'aplicacions que se sincronitzen amb freqüència no s\'actualitzin llevat que les obris.\n\nL\'estalvi de bateria es desactiva automàticament mentre el dispositiu s\'està carregant."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Fins que no finalitzi la inactivitat a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>."</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Durant 1 minut (fins a les <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Durant %1$d minuts (fins a les <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Fins a les <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidament"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Replega"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 10782fe..68e5f1c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Umožňuje aplikaci číst a zapisovat do souborového systému mezipaměti."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"uskutečňování/příjem volání SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Povolí aplikaci uskutečňovat a přijímat volání SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrování nových komunikačních připojení přes SIM kartu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Umožňuje aplikaci registrovat nová telekomunikační připojení přes SIM kartu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrování nových telekomunikačních připojení"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Umožňuje aplikaci registrovat nová telekomunikační připojení."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"správa telekomunikačních připojení"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Umožňuje aplikaci spravovat telekomunikační připojení."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakce s obrazovkou příchozího hovoru"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Chcete-li tuto obrazovku uvolnit, klepněte současně na možnosti Zpět a Přehled a podržte je."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Chcete-li tuto obrazovku uvolnit, klepněte na možnost Přehled a podržte ji."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Obrazovka je připnuta. Vaše organizace uvolnění zakázala."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Použít připnutí obrazovky?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Připnutím obrazovky uzamknete displej v jednom zobrazení.\n\nChcete-li obrazovku uvolnit, klepněte současně na možnosti Zpět a Přehled a podržte je."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Připnutím obrazovky uzamknete displej v jednom zobrazení.\n\nChcete-li obrazovku uvolnit, klepněte na možnost Přehled a podržte ji."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NE, DĚKUJI"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"SPUSTIT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka připnuta"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka uvolněna"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Před uvolněním požádat o kód PIN"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Před uvolněním požádat o heslo"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Za účelem zvýšení životnosti baterie spořič baterie sníží výkon vašeho zařízení a omezí vibrace a většinu dat na pozadí. E-mail, zprávy a další aplikace, které používají synchronizaci, nemusejí být aktualizovány, dokud je nespustíte.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Dokud v <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> neskončí pozastavení"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Jednu minutu (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d min (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Na dobu neurčitou"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sbalit"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 980eff7..08b9aa5 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Tillader, at appen kan læse og skrive i cachefilsystemet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"foretage/modtage SIP-opkald"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillader, at appen foretager og modtager SIP-opkald."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrere nye telefon-SIM-forbindelser"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Tillader, at appen registrerer nye telefon-SIM-forbindelser."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrere nye telefonforbindelser"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Tillader, at appen registrerer nye telefonforbindelser."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"administrere telefonforbindelser"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Tillader, at appen administrerer telefonforbindelser."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interager med skærmen under opkald"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Hvis du vil frigøre dette skærmbillede, skal du trykke på Tilbage og Oversigt på samme tid og holde fingeren nede."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Hvis du vil frigøre dette skærmbillede, skal du trykke på Oversigt og holde fingeren nede."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skærmen er fastgjort. Frigørelse er ikke tilladt af din organisation."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Vil du bruge Bliv i app?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Skærmfastholdelse låser skærmbilledet i en enkelt visning.\n\nDu frigør det ved at trykke på Tilbage og Oversigt på samme tid og holde fingeren nede."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Skærmfastholdelse låser skærmbilledet i en enkelt visning.\n\nDu frigør det ved at trykke på Oversigt og holde fingeren nede."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEJ TAK"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skærmen blev fastgjort"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skærmen blev frigjort"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Bed om pinkode inden frigørelse"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Bed om oplåsningsmønster ved deaktivering"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Bed om adgangskode inden frigørelse"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"For at forbedre batteriets levetid reducerer batterisparefunktionen enhedens ydeevne og begrænser vibrationer og de fleste baggrundsdata. E-mail, beskeder og andre apps, der benytter synkronisering, opdateres ikke, medmindre du åbner dem.\n\nBatterisparefunktionen deaktiveres automatisk, når enheden oplades."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"For at forbedre batteriets levetid reducerer batterisparefunktionen enhedens ydeevne og begrænser vibrationer og de fleste baggrundsdata. E-mail, chat og andre apps, der benytter synkronisering, opdateres ikke, medmindre du åbner dem.\n\nBatterisparefunktionen deaktiveres automatisk, når enheden oplades."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Indtil din nedetid slutter kl. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"I ét minut (indtil <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"I %1$d minutter (indtil <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Indtil <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Uendeligt"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 3f242c3..135a7a63 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> Min."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ermöglicht der App Lese- und Schreibzugriff auf das Cache-Dateisystem"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-Anrufe tätigen/empfangen"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ermöglicht der App das Tätigen und Empfangen von SIP-Anrufen"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"Neue SIM-Telekommunikationsverbindungen registrieren"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Gestattet der App die Registrierung neuer SIM-Telekommunikationsverbindungen"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"Neue Telekommunikationsverbindungen registrieren"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Gestattet der App die Registrierung neuer Telekommunikationsverbindungen"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"Telekommunikationsverbindungen verwalten"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Gestattet der App die Verwaltung der Telekommunikationsverbindungen"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"Mit Anrufbildschirm interagieren"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Um die Fixierung dieses Bildschirms aufzuheben, berühren und halten Sie gleichzeitig \"Zurück\" und \"Übersicht\"."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Um die Fixierung dieses Bildschirms aufzuheben, berühren und halten Sie \"Übersicht\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Der Bildschirm ist fixiert. Sie sind nicht berechtigt, diese Einstellung zu beenden."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Bildschirmfixierung verwenden?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Mit der Bildschirmfixierung wird die Anzeige in einer einzelnen Ansicht gesperrt.\n\nUm die Fixierung aufzuheben, berühren und halten Sie gleichzeitig \"Zurück\" und \"Übersicht\"."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Mit der Bildschirmfixierung wird die Anzeige in einer einzelnen Ansicht gesperrt.\n\nUm die Fixierung aufzuheben, berühren und halten Sie \"Übersicht\"."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"Nein danke"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"Starten"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Bildschirm fixiert"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Bildschirm gelöst"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vor dem Beenden nach PIN fragen"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vor dem Beenden nach Entsperrungsmuster fragen"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vor dem Beenden nach Passwort fragen"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Der Energiesparmodus hilft, den Akku zu schonen, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion und die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail-, SMS/MMS- und andere Apps, die die Synchronisierungsfunktion benötigen, werden möglicherweise nicht aktualisiert, bis Sie sie öffnen.\n\nDer Energiesparmodus endet automatisch, wenn Ihr Gerät aufgeladen wird."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Der Energiesparmodus hilft, den Akku zu schonen, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion und die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail-, Chat- und andere Apps, die die Synchronisierungsfunktion benötigen, werden möglicherweise nicht aktualisiert, bis Sie sie öffnen.\n\nDer Energiesparmodus endet automatisch, wenn Ihr Gerät aufgeladen wird."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Bis zum Ende der Downtime um <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1 Minute (bis <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d Minuten (bis <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Bis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Unbegrenzt"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Minimieren"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index c9465c0..eacd3eb 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> λ. <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> λ <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Επιτρέπει στην εφαρμογή την ανάγνωση και την εγγραφή του συστήματος αρχείων προσωρινής μνήμης."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"πραγματοποίηση/λήψη κλήσεων SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Επιτρέπει στην εφαρμογή να πραγματοποιεί και να λαμβάνει κλήσεις SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"εγγραφή νέων συνδέσεων τηλεπικοινωνιών"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων τηλεπικοινωνιών."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"διαχείριση των συνδέσεων τηλεπικοινωνιών"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Επιτρέπει στην εφαρμογή να διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"αλληλεπίδραση με την οθόνη κατά τη διάρκεια κλήσης"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, πατήστε παρατεταμένα \"Επιστροφή\" και \"Επισκόπηση\" ταυτόχρονα."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα \"Επισκόπηση\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Η οθόνη καρφιστώθηκε. Το ξεκαρφίτσωμα δεν επιτρέπεται από τον οργανισμό σας."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Χρήση καρφιτσώματος οθόνης;"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Το καρφίτσωμα οθόνης κλειδώνει την οθόνη σε μία προβολή.\n\nΓια να την ξεκαρφιτσώσετε, αγγίξτε παρατεταμένα \"Επιστροφή\" και \"Επισκόπηση\" ταυτόχρονα."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Το καρφίτσωμα οθόνης κλειδώνει την οθόνη σε μία προβολή.\n\nΓια να την ξεκαρφιτσώσετε, αγγίξτε παρατεταμένα \"Επισκόπηση\"."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Να γίνεται ερώτηση για το PIN, πριν από το ξεκαρφίτσωμα"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Για ένα λεπτό (έως τις <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Για %1$d λεπτά (έως τις <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Έως τις <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Επ\' αόριστον"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Σύμπτυξη"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 85b7be7..d5fcbe2 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Allows the app to read and write the cache file system."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"make/receive SIP calls"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Allows the app to make and receive SIP calls."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"register new telecom SIM connections"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Allows the app to register new telecom SIM connections."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"register new telecom connections"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Allows the app to register new telecom connections."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"manage telecom connections"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Allows the app to manage telecom connections."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interact with in-call screen"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"To unpin this screen, touch and hold Back and Overview at the same time."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"To unpin this screen, touch and hold Overview."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Screen is pinned. Unpinning isn\'t allowed by your organisation."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Use screen pinning?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Back and Overview at the same time."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Overview."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, THANKS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"To help improve battery life, battery saver reduces your device’s performance and limits vibration and most background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Until your downtime ends at <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Until your downtime ends"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"For one minute (until <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"For %1$d minutes (until <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinitely"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Until next alarm at <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Until next alarm"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 85b7be7..d5fcbe2 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Allows the app to read and write the cache file system."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"make/receive SIP calls"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Allows the app to make and receive SIP calls."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"register new telecom SIM connections"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Allows the app to register new telecom SIM connections."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"register new telecom connections"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Allows the app to register new telecom connections."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"manage telecom connections"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Allows the app to manage telecom connections."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interact with in-call screen"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"To unpin this screen, touch and hold Back and Overview at the same time."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"To unpin this screen, touch and hold Overview."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Screen is pinned. Unpinning isn\'t allowed by your organisation."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Use screen pinning?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Back and Overview at the same time."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Overview."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, THANKS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"To help improve battery life, battery saver reduces your device’s performance and limits vibration and most background data. Email, messaging and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Until your downtime ends at <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Until your downtime ends"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"For one minute (until <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"For %1$d minutes (until <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Until <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinitely"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Until next alarm at <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Until next alarm"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1467ad6..e2764ad 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite que la aplicación lea y escriba el sistema de archivos almacenado en caché."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"realizar/recibir llamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación realice y reciba llamadas SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"Registrar nuevas conexiones SIM de telecomunicaciones"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que la aplicación registre nuevas conexiones SIM de telecomunicaciones."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"Registrar nuevas conexiones de telecomunicaciones"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que la aplicación registre las conexiones de telecomunicaciones nuevas."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"administrar conexiones de telecomunicaciones"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que la aplicación administre las conexiones de telecomunicaciones."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar con la pantalla de llamada"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Para dejar de fijar esta pantalla, mantén presionados los botones para volver y Recientes al mismo tiempo."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para dejar de fijar esta pantalla, mantén presionado el botón Recientes."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"La pantalla está fija. La organización no permite dejar de fijar la pantalla."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"¿Utilizar función para fijar la pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionados los botones para volver y Recientes al mismo tiempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionado el botón Recientes."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRACIAS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fija"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla no fija"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar PIN para quitar fijación"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para quitar fijación"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Para ayudar a mejorar la duración de la batería, la función de ahorro de batería reduce el rendimiento del dispositivo y limita la vibración y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo electrónico y mensajería, no se actualicen a menos que las abras.\n\nEl ahorro de batería se desactiva automáticamente cuando el dispositivo se está cargando."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Hasta que termine el tiempo de inactividad a la(s) <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Durante 1 minuto; hasta la(s) <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>"</item>
<item quantity="other" msgid="2787867221129368935">"Durante %1$d minutos; hasta la(s) <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Hasta la(s) <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidamente"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index ca92f71..4c72e3d 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite que la aplicación lea y escriba el sistema de archivos almacenado en caché."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"hacer/recibir llamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación haga y reciba llamadas SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registras conexiones de SIM de telecomunicaciones nuevas"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que la aplicación registre conexiones de SIM de telecomunicaciones nuevas."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrar conexiones de telecomunicaciones nuevas"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que la aplicación registre conexiones de telecomunicaciones nuevas."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"administrar conexiones de telecomunicaciones"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que la aplicación administre las conexiones de telecomunicaciones."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar con la pantalla de llamada"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Para desactivar esta pantalla, mantén pulsados los botones de retroceso y Visión general al mismo tiempo."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para desactivar esta pantalla, mantén pulsado Visión general."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Se ha activado la pantalla. Tu organización no puede desactivarla."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"¿Quieres fijar esta pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsados los botones de retroceso y Visión general al mismo tiempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsado el botón Visión general."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRACIAS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fijada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"La pantalla ya no está fija"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar PIN para desactivar"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar patrón de desbloqueo para desactivar"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para desactivar"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reduce el rendimiento del dispositivo y limita la vibración y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de energía se desactiva automáticamente cuando el dispositivo se carga."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reduce el rendimiento del dispositivo y limita la vibración y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y envío de mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de energía se desactiva automáticamente cuando el dispositivo se carga."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Hasta que el tiempo de inactividad finalice el <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Durante un minuto (hasta las <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Durante %1$d minutos (hasta las <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Hasta las <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidamente"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index ccd08c6..7bc7324 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Võimaldab rakendusel vahemälu failisüsteemi lugeda ja kirjutada."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-kõnede tegemine/vastuvõtmine"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Lubab rakendusel teha ja vastu võtta SIP-kõnesid."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"uute telekommunikatsiooni SIM-kaardi ühenduste registreerimine"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Lubab rakendusel registreerida uusi telekommunikatsiooni SIM-kaartide ühendusi."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"uute telekommunikatsiooni ühenduste registreerimine"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Lubab rakendusel registreerida uusi telekommunikatsiooni ühendusi."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikatsiooni ühenduste haldamine"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Lubab rakendusel hallata telekommunikatsiooni ühendusi."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ekraani Kõne pooleli kasutamine"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Ekraanikuva vabastamiseks puudutage pikalt samal ajal nuppe Tagasi ja Ülevaade."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ekraanikuva vabastamiseks puudutage pikalt nuppu Ülevaade."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekraan on kinnitatud. Teie organisatsioon ei luba vabastamist."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Kas kasutada ekraanikuva kinnitamist?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ekraanikuva kinnitamine lukustab ekraani ühele vaatele.\n\nVabastamiseks puudutage pikalt samal ajal nuppe Tagasi ja Ülevaade."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ekraanikuva kinnitamine lukustab ekraani ühele vaatele.\n\nVabastamiseks puudutage pikalt nuppu Ülevaade."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"TÄNAN, EI"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"KÄIVITA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekraan on kinnitatud"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekraan on vabastatud"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Enne vabastamist küsi PIN-koodi"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Enne vabastamist küsi parooli"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Aku kestuse parandamiseks vähendab akusäästja teie seadme jõudlust ja piirab vibratsiooni ning suuremat osa taustaandmetest. E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui te need avate.\n\nAkusäästja lülitatakse seadme laadimise ajal automaatselt välja."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Kuni seisakuaja lõppemiseni kell <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Üheks minutiks (kuni <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d minutiks (kuni <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Kuni <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Määramata ajaks"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Ahendamine"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 2b168b3..c98f5b1 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Cachearen fitxategi-sistema irakurtzea eta bertan idaztea baimentzen die aplikazioei."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Egin/Jaso SIP deiak"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP deiak egitea eta jasotzea baimentzen die aplikazioei."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"erregistratu telekomunikabideekiko SIM konexio berriak"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Telekomunikabideekiko SIM konexio berriak erregistratzea baimentzen die aplikazioei."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"erregistratu telekomunikabideekiko konexio berriak"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Telekomunikabideekiko konexio berriak erregistratzea baimentzen die aplikazioei."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"Kudeatu telekomunikabideekiko konexioak"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Telekomunikabideekiko konexioak kudeatzea baimentzen die aplikazioei."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"Deiak abian direnean pantaila erabiltzea"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Aingura kentzeko, eduki ukituta Atzera eta Ikuspegi orokorra botoiak aldi berean."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Aingura kentzeko, eduki ukituta Ikuspegi orokorra botoia."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Pantaila ainguratu da. Erakundeak ez du aingura kentzea onartzen."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Pantaila ainguratzeko aukera erabili nahi duzu?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pantaila ainguratzen denean, bistaratutakoa ikuspegi bakarrean blokeatzen da.\n\nAingura kentzeko, eduki ukituta Atzera eta Ikuspegi orokorra botoiak aldi berean."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pantaila ainguratzen denean, bistaratutakoa ikuspegi bakarrean blokeatzen da.\n\nAingura kentzeko, eduki ukituta Ikuspegi orokorra botoia."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"EZ, ESKERRIK ASKO"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"HASI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantaila ainguratu da"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Aingura kendu zaio pantailari"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Eskatu PIN kodea aingura kendu aurretik"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Eskatu pasahitza aingura kendu aurretik"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Bateriak gehiago iraun dezan, bateria aurrezteko aukerak gailuaren errendimendua murrizten du, eta dardara eta atzeko planoko datu gehienak mugatzen ditu. Baliteke posta elektronikoa, mezuak eta sinkronizatzen diren beste aplikazio batzuk ez eguneratzea, ireki ezean.\n\nBateria aurrezteko aukera automatikoki desaktibatzen da gailua kargatzen ari denean."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> arte iraungo du jarduerarik gabeko aldiak"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Minutu batez (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> arte)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d minutuz (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> arte)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> arte"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Mugagabea"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Tolestu"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 584abe6..cf3d2be 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string>
@@ -663,7 +665,7 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"دسترسی به تنظیمات بلوتوث"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"‏به برنامه اجازه می‎دهد تا رایانهٔ لوحی بلوتوث محلی را پیکربندی کرده، دستگاه‌های راه دور را شناسایی کرده و با آن‌ها جفت شود."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"‏به برنامه اجازه می‎دهد تا تلفن بلوتوث محلی را پیکربندی کند و دستگاه‌های راه دور را پیدا کند و با آن‌ها جفت شود."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"اجازه ارتباط با بلوتوث از طریق برنامه"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"اجازه مرتبط‌سازی بلوتوث از طریق برنامه"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور مرتبط شود."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"به برنامه امکان می‌دهد بدون تعامل کاربر با دستگاه‌های راه دور مرتبط شود."</string>
<string name="permlab_bluetoothMap" msgid="6372198338939197349">"‏دسترسی به اطلاعات MAP بلوتوث"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"‏به برنامه اجازه می‎دهد تا سیستم فایل حافظهٔ پنهان را بخواند و بنویسد."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"‏تماس گرفتن/دریافت تماس از طریق SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"‏به برنامه اجازه می‌دهد تماس‌های SIP بگیرد یا دریافت کند."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ثبت ارتباطات سیم کارت مخابراتی جدید"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"به برنامه اجازه می‌دهد ارتباطات سیم کارت مخابراتی جدیدی ثبت کند."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ثبت ارتباطات مخابراتی جدید"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"به برنامه اجازه می‌دهد ارتباطات مخابراتی جدیدی ثبت کند."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"مدیریت ارتباطات مخابراتی"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"به برنامه امکان می‌دهد ارتباطات مخابراتی را مدیریت کند."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"تعامل با صفحه‌نمایش هنگام تماس"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"برای برداشتن پین این صفحه، هم‌زمان «بازگشت» و «نمای کلی» را لمس کنید و نگه دارید."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"برای برداشتن پین این صفحه، «نمای کلی» را لمس کنید و نگه دارید."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"صفحه پین شده است. سازمان شما برداشتن پین را غیرمجاز کرده است."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"از پین کردن صفحه استفاده شود؟"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"پین کردن صفحه، نمایشگر را در یک نمای واحد قفل می‌کند.\n\nبرای برداشتن پین، هم‌زمان «بازگشت» و «نمای کلی» را لمس کنید و نگه دارید."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"پین کردن صفحه، نمایشگر را در یک نمای واحد قفل می‌کند.\n\nبرای برداشتن پین، «نمای کلی» را لمس کنید و نگه دارید."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"درخواست کد پین قبل از برداشتن پین"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"به مدت یک دقیقه (تا <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"‏به مدت %1$d دقیقه (تا <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"تا <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"نامحدود"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"کوچک کردن"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 1913af6..f41e947 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Antaa sovelluksen lukea välimuistin tiedostojärjestelmää ja kirjoittaa siihen."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"soita/vastaanota SIP-puheluja"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Sallii sovelluksen soittaa ja vastaanottaa SIP-puheluja."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rekisteröidä uusia tietoliikenne-SIM-yhteyksiä"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Antaa sovelluksen rekisteröidä uusia tietoliikenne-SIM-yhteyksiä."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rekisteröidä uusia tietoliikenneyhteyksiä"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Antaa sovelluksen rekisteröidä uusia tietoliikenneyhteyksiä."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"tietoliikenneyhteyksien hallinta"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Antaa sovelluksen hallita tietoliikenneyhteyksiä."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"Vuorovaikutteinen puhelunäyttö"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Poista näytön kiinnitys painamalla Edellinen- ja Viimeisimmät-kohtaa samanaikaisesti pitkään."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Poista näytön kiinnitys painamalla Viimeisimmät-kohtaa pitkään."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Näyttö on kiinnitetty. Irrottaminen ei ole sallittu organisaatiossasi."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Käytetäänkö näytön kiinnitystä?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Näytön kiinnitys lukitsee näytön yhteen näkymään.\n\nVoit poistaa kiinnityksen painamalla Edellinen- ja Viimeisimmät-kohtaa samanaikaisesti pitkään."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Näytön lukitus lukitsee näytön yhteen näkymään.\n\nVoit poistaa kiinnityksen painamalla Viimeisimmät-kohtaa pitkään."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"EI KIITOS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ALOITA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Näyttö kiinnitetty"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Näyttö irrotettu"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pyydä PIN-koodi ennen irrotusta"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pyydä lukituksenpoistokuvio ennen irrotusta"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pyydä salasana ennen irrotusta"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Akunsäästötoiminto heikentää laitteen suorituskykyä ja rajoittaa värinää ja useimpia taustatietoja akun iän pidentämiseksi. Sähköposti, viestitys ja muut synkronointia edellyttävät sovellukset eivät ehkä päivity, ellet käynnistä niitä.\n\nAkunsäästö kytkeytyy automaattisesti pois laitteen akun latauksen ajaksi."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Akunsäästötoiminto heikentää laitteen suorituskykyä ja rajoittaa värinää ja useimpia taustatietoja akun iän pidentämiseksi. Sähköposti, pikaviestit ja muut synkronointia edellyttävät sovellukset eivät ehkä päivity, ellet käynnistä niitä.\n\nAkunsäästö kytkeytyy automaattisesti pois laitteen akun latauksen ajaksi."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Käyttökatkos päättyy klo <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Yksi minuutti (kunnes kello on <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d minuuttia (kunnes kello on <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Kunnes kello on <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Toistaiseksi"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Kutista"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 134e7d6..aa049f2 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permet à l\'application d\'obtenir des droits en lecture et en écriture pour le système de fichiers du cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"faire et recevoir des appels SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Autorise l\'application à effectuer et à recevoir des appels SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"enregistrer de nouvelles connexions de télécommunication à l\'aide de la carte SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication à l\'aide de la carte SIM"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gérer les connexions de télécommunication"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permettre à l\'application de gérer les connexions de télécommunication"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir avec l\'écran d\'appel"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Pour annuler l\'épinglage de cet écran, appuyez de manière prolongée sur Retour et Aperçu simultanément."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pour annuler l\'épinglage, appuyez de manière prolongée sur Aperçu."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"L\'écran est épinglé. Votre organisation n\'autorise pas l\'annulation d\'épinglage."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Utiliser l\'épinglage d\'écran?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur Retour et Aperçu simultanément."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur Aperçu."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NON, MERCI"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"COMMENCER"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Demander le NIP avant d\'annuler l\'épinglage"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Pour optimiser l\'autonomie de la pile, l\'économiseur d\'énergie réduit les performances de votre appareil et limite les données en arrière-plan. Vous devrez peut-être ouvrir manuellement les applications de courriel, de messagerie et les autres applications synchronisées pour les mettre à jour.\n\nL\'économiseur d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Jusqu\'à ce que le temps d\'arrêt se termine à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Pendant une minute (jusqu\'à <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indéfiniment"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 95b4e6f..5dec636 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permet à l\'application d\'obtenir des droits en lecture/écriture concernant le système de fichiers du cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"effectuer/recevoir des appels SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Autorise l\'application à effectuer et à recevoir des appels SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"enregistrer de nouvelles connexions SIM de télécommunication"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permettre à l\'application d\'enregistrer de nouvelles connexions SIM de télécommunication"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"enregistrer de nouvelles connexions de télécommunication"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permettre à l\'application d\'enregistrer de nouvelles connexions de télécommunication"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gérer les connexions de télécommunication"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permettre à l\'application de gérer les connexions de télécommunication"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"contrôler l\'écran d\'appel"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Pour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Aperçu\"."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Aperçu\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"L\'écran est épinglé. L\'annulation de l\'épinglage n\'est pas autorisée par votre organisation."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Utiliser l\'épinglage d\'écran ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Aperçu\"."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur \"Aperçu\"."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NON, MERCI"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ACTIVER"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé."</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé."</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Demander le code PIN avant d\'annuler l\'épinglage"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Pour optimiser l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances de votre appareil et limite les données en arrière-plan. Vous devrez peut-être ouvrir manuellement vos applications d\'e-mail, de messagerie instantanée et autres applications synchronisées pour les mettre à jour.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque votre appareil est en charge."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Jusqu\'à ce que le temps d\'arrêt se termine à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Pendant une minute (jusqu\'à <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indéfiniment"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index 362867e..d02f560 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> segundos"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite á aplicación ler e escribir no sistema de ficheiros da caché."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"facer/recibir chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que a aplicación faga e reciba chamadas SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rexistrar novas conexións SIM de telecomunicacións"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que a aplicación rexistre novas conexións SIM de telecomunicacións."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rexistrar novas conexións de telecomunicacións"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que a aplicación rexistre novas conexións de telecomunicacións."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"xestionar conexións de telecomunicacións"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que a aplicación xestione conexións de telecomunicacións."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactuar cunha pantalla de chamada"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Para soltar a pantalla, mantén premido Atrás e Visión xeral ao mesmo tempo."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para soltar a pantalla, mantén premido Visión xeral."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"A pantalla está fixada. A túa organización non permite desactivar a pantalla."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Queres usar a fixación de pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"A fixación de pantalla bloquea a pantalla nunha única vista.\n\nPara soltar a pantalla, mantén premido Atrás e Visión xeral ao mesmo tempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A fixación de pantalla bloquea a pantalla nunha única vista.\n\nPara soltar a pantalla, mantén premido e Visión xeral."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NON, GRAZAS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"SI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla desactivada"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar un PIN antes de soltar a pantalla"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar un contrasinal antes de soltar a pantalla"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Para axudar a mellorar a duración da batería, o aforro de batería reduce o rendemento do dispositivo e restrinxe a vibración e a maioría dos datos en segundo plano. É posible que o correo, as mensaxes e outras aplicacións que se sincronizan con frecuencia, non se actualicen a menos que as abras.\n\nO aforro de batería desactívase automaticamente durante a carga do dispositivo."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Ata que remate o tempo de inactividade ás <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Durante un minuto (ata as <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Durante %1$d minutos (ata as <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Ata as <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidamente"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index c9766e1..bf5f7e7 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ऐप्स को संचय फ़ाइल सिस्‍टम पढ़ने और लिखने देता है."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कॉल करें/प्राप्‍त करें"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ऐप्स को SIP कॉल करने और प्राप्‍त करने देती है."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नए टेलिकॉम सिम कनेक्‍शन पंजीकृत करें"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ऐप को नए टेलिकॉम सिम कनेक्‍शन पंजीकृत करने देती है."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नए टेलिकॉम कनेक्‍शन पंजीकृत करें"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ऐप को नए टेलिकॉम कनेक्शन पंजीकृत करने देती है."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"टेलीकॉम कनेक्शन प्रबंधित करें"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ऐप को टेलीकॉम कनेक्शन प्रबंधित करने देती है."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"इन-कॉल स्क्रीन से सहभागिता करें"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"इस स्क्रीन को अनपिन करने के लिए, एक ही समय में वापस जाएं और अवलोकन को स्पर्श करके रखें."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"इस स्क्रीन को अनपिन करने के लिए, अवलोकन को स्पर्श करके रखें."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"स्‍क्रीन पिन की गई है. आपके संगठन के द्वारा अनपिन करने की अनुमति नहीं है."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"स्‍क्रीन पिन करने का उपयोग करें?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"स्क्रीन पिनिंग एकल दृश्य में डिस्प्ले को लॉक कर देती है.\n\nअनपिन करने के लिए, एक ही समय में वापस जाएं और अवलोकन स्पर्श करके रखें."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"स्क्रीन पिनिंग एकल दृश्य में डिस्प्ले को लॉक कर देती है.\n\nअनपिन करने के लिए, अवलोकन को स्पर्श करके रखें."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करने से पहले पिन के लिए पूछें"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"एक मिनट के लिए (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> तक)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d मिनट के लिए (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> तक)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> तक"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"अनिश्चित समय तक"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करें"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 530b735..a9ab2e4 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Aplikaciji omogućuje čitanje i pisanje u datotečnom sustavu privremene memorije."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"upućivanje/primanje SIP poziva"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Aplikacija može upućivati i primati SIP pozive."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registriranje novih telekomunikacijskih SIM veza"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Aplikaciji omogućuje registriranje novih telekomunikacijskih SIM veza."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registriranje novih telekomunikacijskih veza"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Aplikaciji omogućuje registriranje novih telekomunikacijskih veza."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"upravljanje telekomunikacijskim vezama"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Aplikaciji omogućuje upravljanje telekomunikacijskim vezama."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcija sa zaslonom tijekom poziva"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Da biste otkvačili ovaj zaslon, istovremeno dodirnite i zadržite Natrag i Pregled."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Da biste otkvačili ovaj zaslon, dodirnite i zadržite Pregled."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Zaslon je pričvršćen. Vaša organizacija ne dopušta otkvačivanje."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Želite li upotrijebiti prikvačivanje?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Prikvačivanje zaslona blokira zaslon na jednom prikazu.\n\nDa biste otkvačili zaslon, istovremeno dodirnite i zadržite Natrag i Pregled."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Prikvačivanje zaslona blokira zaslon na jednom prikazu.\n\nDa biste otkvačili zaslon, dodirnite i zadržite Pregled."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NE, HVALA"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"POKRENI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pričvršćen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je otkvačen"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Traži PIN radi otkvačivanja"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Traži zaporku radi otkvačivanja"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Da bi se produljilo trajanje baterije, ušteda baterije smanjuje rad uređaja i ograničava vibraciju i većinu pozadinskih podataka. Aplikacije za e-poštu, slanje poruka i ostalo koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nUšteda baterije isključuje se automatski dok se uređaj puni."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Dok razdoblje zastoja ne završi u <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Jednu minutu (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d min (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Neodređeno"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sažmi"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 934b4db..8814e2d 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Lehetővé teszi az alkalmazás számára a gyorsítótár-fájlrendszer olvasását és írását."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-hívások indítása/fogadása"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP-hívások indításának és fogadásának engedélyezése az alkalmazás számára."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"új telekommunikációs SIM kapcsolatok regisztrálása"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Engedélyezi az alkalmazásnak új telekommunikációs SIM kapcsolatok regisztrálását."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"új telekommunikációs kapcsolatok regisztrálása"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Engedélyezi az alkalmazásnak új telekommunikációs kapcsolatok regisztrálását."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikációs kapcsolatok kezelése"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Engedélyezi az alkalmazásnak a telekommunikációs kapcsolatok kezelését."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakció a hívás közbeni képernyővel"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés lehetőséget egyszerre."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"A képernyő rögzítésének feloldásához tartsa lenyomva az Áttekintés lehetőséget."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"A képernyő rögzítve van. Szervezete nem engedélyezi a rögzítés feloldását."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Rögzíti a képernyőt?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"A képernyőrögzítés lezárja a kijelzőt egyetlen nézetben.\n\nA feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget egyszerre."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A képernyőrögzítés lezárja a kijelzőt egyetlen nézetben.\n\nA feloldáshoz tartsa lenyomva az Áttekintés lehetőséget."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"KÖSZÖNÖM, NEM"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INDÍT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Képernyő rögzítve"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Képernyő rögzítése feloldva"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"PIN kód kérése a rögzítés feloldásához"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Jelszó kérése a rögzítés feloldásához"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Az akkumulátor üzemidejének növeléséhez az akkumulátorkímélő mód csökkenti az eszköz teljesítményét, valamint korlátozza a rezgést és a legtöbb háttéradatot. Előfordulhat, hogy az e-mailek, az üzenetküldő programok és más alkalmazások, amelyek a szinkronizálás funkciót használják, nem frissülnek addig, amíg meg nem nyitja őket.\n\nAz akkumulátorkímélő mód automatikusan kikapcsol, amikor az eszköz töltődik."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Amíg az állásidő véget nem ér ekkor: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Egy percre (eddig: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d percre (eddig: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Eddig: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Határozatlan ideig"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Összecsukás"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 86faca3..4871252 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Թույլ է տալիս հավելվածին գրել և կարդալ քեշ ֆայլային համակարգը:"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"կատարել կամ ստանալ SIP զանգեր"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ծրագրին թույլ է տալիս կատարել և ստանալ SIP զանգեր:"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"գրանցել նոր հեռահաղորդակցության SIM կապեր"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Հավելվածին թույլ է տալիս գրանցել հեռահաղորդակցության նոր SIM կապեր:"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"գրանցել նոր հեռահաղորդակցության կապեր"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Հավելվածին թույլ է տալիս գրանցել հեռահաղորդակցության նոր կապեր:"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"կառավարել հեռահաղորդակցության կապերը"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Հավելվածին թույլ է տալիս կառավարել հեռահաղորդակցության կապերը:"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"փոխազդել մուտքային զանգի էկրանին"</string>
@@ -1239,8 +1237,7 @@
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> ծրագիրը (գործընթաց <xliff:g id="PROCESS">%2$s</xliff:g>) խախտել է իր ինքնահարկադրված Խիստ ռեժիմ քաղաքականությունը:"</string>
<string name="smv_process" msgid="5120397012047462446">"<xliff:g id="PROCESS">%1$s</xliff:g> գործընթացը խախտել է իր ինքնահարկադրված Խիստ ռեժիմ քաղաքականությունը:"</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Android-ը նորացվում է..."</string>
- <!-- no translation found for android_start_title (8418054686415318207) -->
- <skip />
+ <string name="android_start_title" msgid="8418054686415318207">"Android-ը մեկնարկում է…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"Օպտիմալացվում է հավելված <xliff:g id="NUMBER_0">%1$d</xliff:g>-ը <xliff:g id="NUMBER_1">%2$d</xliff:g>-ից:"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Հավելվածները մեկնարկում են:"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Բեռնումն ավարտվում է:"</string>
@@ -1772,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Այս էկրան ապամրացնելու համար միաժամանակ հպեք և պահեք Հետ և Համատեսք կոճակները:"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Այս էկրանն ապամրացնելու համար հպեք և պահեք Համատեսքի կոճակը:"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Էկրանն ամրացված է: Ապամրացումը չի թույլատրվում ձեր կազմակերպության կողմից:"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Օգտագործե՞լ էկրանի ամրացումը:"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Էկրանի ամրացումը կողպում է էկրանը ընթացիկ տեսքով:\n\nԱպամրացնելու համար միաժամանակ հպեք և պահեք Հետ և Համատեսք կոճակները:"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Էկրանի ամրացումը կողպում է էկրանը տվյալ պահի տեսքով:\n\nԱպամրացնելու համար հպեք և պահեք Համատեսքի կոճակին:"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ապաամրացնելուց առաջ հարցնել PIN-կոդը"</string>
@@ -1784,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"Մինչև ձեր ժամանակն ավարտվի"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Մեկ րոպե (մինչև <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d րոպե (մինչև <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,6 +1795,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Մինչև <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Անորոշ ժամանակով"</string>
- <!-- no translation found for toolbar_collapse_description (2821479483960330739) -->
- <skip />
+ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Թաքցնել"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Մինչև հաջորդ զգուշացումը՝ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Մինչև հաջորդ զգուշացումը"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 0ff8eae..ff59614 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Mengizinkan apl membaca dan menulis pada sistem file cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"lakukan/terima panggilan SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Izinkan aplikasi melakukan dan menerima panggilan SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"daftarkan sambungan SIM telekomunikasi baru"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Izinkan aplikasi untuk mendaftarkan sambungan SIM telekomunikasi baru."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"daftarkan sambungan telekomunikasi baru"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Izinkan aplikasi untuk mendaftarkan sambungan telekomunikasi baru."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"kelola sambungan telekomunikasi"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Mengizinkan aplikasi untuk mengelola sambungan telekomunikasi."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"berinteraksi dengan layar dalam panggilan"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Untuk melepas pin layar ini, sentuh lama tombol Kembali dan Ringkasan secara bersamaan."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Untuk melepas pin layar ini, sentuh lama tombol Ringkasan."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Layar disematkan. Pelepasan sematan tidak diizinkan oleh organisasi Anda."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Gunakan penyematan layar?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh lama tombol Kembali dan Ringkasan secara bersamaan."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh lama tombol Ringkasan."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"TIDAK, TERIMA KASIH"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"MULAI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Layar disematkan"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Layar dicopot sematannya"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Meminta PIN sebelum melepas sematan"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Meminta sandi sebelum melepas sematan"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Guna membantu meningkatkan masa pakai baterai, penghemat baterai mengurangi kinerja perangkat dan membatasi getaran serta sebagian besar data latar belakang. Email, perpesanan, dan aplikasi lain yang bergantung pada sinkronisasi mungkin tidak akan diperbarui kecuali Anda membukanya.\n\nPenghemat baterai dinonaktifkan secara otomatis saat perangkat diisi daya."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Hingga waktu perbaikan Anda berakhir pukul <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Hingga waktu henti berakhir"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Selama semenit (hingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Selama %1$d menit (hingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Hingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Tidak ditentukan"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Ciutkan"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Hingga alarm berikutnya pukul <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Hingga alarm berikutnya"</string>
</resources>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 5f15cb8..3f43bd4 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mín."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Leyfir forriti að lesa og skrifa í skráakerfi skyndiminnis."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"hringja/svara SIP-símtölum"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Leyfir forritinu að hringja og svara SIP-símtölum."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"skrá nýjar símatengingar fyrir SIM-kort"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Leyfir forritinu að skrá nýjar símatengingar fyrir SIM-kort."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"skrá nýjar símatengingar"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Leyfir forritinu að skrá nýjar símatengingar."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"stjórna símatengingum"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Leyfir forritinu að stjórna símatengingum."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"eiga samskipti við símtalsskjá"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Til að taka lásinn af þessari skjámynd skaltu halda inni Til baka og Yfirliti samtímis."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Til að taka lásinn af þessari skjámynd skaltu halda inni Yfirliti."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skjárinn er festur. Póstskipanin þín leyfir ekki að hann sé losaður."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Nota skjáfestingu?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Skjáfesting læsir skjánum á valinni skjámynd.\n\nTil að losa skaltu halda inni Til baka og Yfirliti samtímis."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Skjáfesting læsir skjánum á valinni skjámynd.\n\nTil að losa skaltu halda inni Yfirliti."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEI, TAKK"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"BYRJA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skjár festur"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skjár opnaður"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Biðja um PIN-númer til að losa"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Biðja um aðgangsorð til að losa"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Til að auka endingu rafhlöðunnar dregur rafhlöðusparnaður úr afköstum tækisins og takmarkar titring og flest bakgrunnsgögn. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu verði uppfærð fyrr en þú opnar þau.\n\nSjálfkrafa er slökkt á rafhlöðusparnaði þegar tækið er í hleðslu."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Þangað til niðritíma lýkur, <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Í eina mínútu (til <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Í %1$d mín. (til <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Án tímatakmarkana"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Minnka"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index a102e4b..f343245 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuti"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuto"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuti"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondi"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondo"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secondi"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Consente all\'applicazione di leggere e scrivere il filesystem nella cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"fare/ricevere chiamate SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Consente all\'app di effettuare e ricevere chiamate SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrazione di nuove connessioni SIM di telecomunicazione"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Consente all\'app di registrare nuove connessioni SIM di telecomunicazione."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrazione di nuove connessioni di telecomunicazione"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Consente all\'app di registrare nuove connessioni di telecomunicazione."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gestisci connessioni di telecomunicazione"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Consente all\'app di gestire connessioni di telecomunicazione."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interazione con lo schermo durante una chiamata"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Per sbloccare questa schermata, tocca e tieni premute contemporaneamente le opzioni Indietro e Panoramica."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Per sbloccare questa schermata, tocca e tieni premuta l\'opzione Panoramica."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"La schermata è bloccata. La tua organizzazione non ne consente lo sblocco."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Utilizzare il blocco su schermo?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Il blocco su schermo blocca il display in un\'unica visualizzazione.\n\nPer sbloccare, tocca e tieni premute contemporaneamente le opzioni Indietro e Panoramica."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Il blocco su schermo blocca il display in un\'unica visualizzazione.\n\nPer sbloccare, tocca e tieni premuta l\'opzione Panoramica."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRAZIE"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"AVVIA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Schermata bloccata"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Schermata sbloccata"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Richiedi il PIN prima di sbloccare"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Richiedi sequenza di sblocco prima di sbloccare"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Richiedi password prima di sbloccare"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Per aumentare la durata della batteria, la funzione Risparmio energetico riduce le prestazioni del dispositivo e limita vibrazione e gran parte dei dati in background. App di email, messaggi e altre app basate sulla sincronizzazione potrebbero non essere aggiornate se non le apri.\n\nIl risparmio energetico si disattiva automaticamente quando il dispositivo è in carica."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Per aumentare la durata della batteria, la funzione Risparmio energetico riduce le prestazioni del dispositivo e limita vibrazione e gran parte dei dati in background. App di email, messaggistica e altre app basate sulla sincronizzazione potrebbero non essere aggiornate se non le apri.\n\nIl risparmio energetico si disattiva automaticamente quando il dispositivo è in carica."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Fino al termine del periodo di inattività previsto per le <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Per un minuto (fino alle ore <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Per %1$d minuti (fino alle ore <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Fino alle ore <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Sempre"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Comprimi"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 71961b5..6553440 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"שעה <xliff:g id="HOURS">%1$d</xliff:g> ‏<xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> שעות <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> ‏<xliff:g id="SECONDS">%2$d</xliff:g> שנ\'"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> שנ\' <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> שניות"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"מאפשר לאפליקציה לקרוא ולכתוב במערכת הקבצים של הקבצים השמורים."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"‏ביצוע/קבלה של שיחות SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"‏אפשר לאפליקציה לבצע ולקבל שיחות SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"‏רשום חיבורי Telecom SIM חדשים"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"‏מאפשר לאפליקציה לרשום חיבורי Telecom SIM חדשים."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"‏רשום חיבורי Telecom חדשים"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"מאפשר לאפליקציה לרשום חיבורי תקשורת חדשים."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ניהול חיבורי תקשורת"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"מאפשר לאפליקציה לנהל חיבורי תקשורת."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"צור אינטראקציה עם מסך שיחה נכנסת"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"כדי לבטל את הקפאת המסך הזה, גע בו-זמנית נגיעה ממושכת ב\'הקודם\' ו\'סקירה\'."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"כדי לבטל את הקפאת המסך הזה, גע נגיעה ממושכת ב\'סקירה\'."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"המסך מוצמד. הארגון אוסר לבטל את הצמדתו."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"להשתמש בהצמדת מסך?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"הקפאת המסך נועלת את התצוגה.\n\nכדי לבטל את ההקפאה, גע בו-זמנית נגיעה ממושכת ב\'הקודם\' ו\'סקירה\'."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"הקפאת המסך נועלת את התצוגה.\n\nכדי לבטל את ההקפאה, גע נגיעה ממושכת ב\'סקירה\'."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"בקש קוד אימות לפני ביטול הצמדה"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"למשך דקה אחת (עד <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"‏למשך %1$d דקות (עד <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"עד <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"ללא הגבלה"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"כווץ"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 388e8f1..f766f5e 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"キャッシュファイルシステムの読み書きをアプリに許可します。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP通話の発着信"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP通話の発着信をアプリに許可します。"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"新しい通信SIM接続の登録"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"アプリに新しい通信SIM接続の登録を許可します。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"新しい通信接続の登録"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"新しい通信接続の登録をアプリに許可します。"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"通信接続の管理"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"通信接続の管理をアプリに許可します。"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"通話画面とのインタラクション"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"この画面の固定を解除するには[戻る]と[最近]を同時に押し続けます。"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"この画面の固定を解除するには[最近]を押し続けます。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"画面が固定されています。会社/組織により解除は許可されていません。"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"画面固定を使用しますか?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"画面の固定では、1つの画面が表示されたままになります。\n\n解除するには、[戻る]と[最近]を同時に押し続けます。"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"画面の固定では、1つの画面が表示されたままになります。\n\n解除するには、[最近]を押し続けます。"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"オフライン再生を解除する前にPINの入力を求める"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"オフライン再生を解除する前にパスワードの入力を求める"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンス、バイブレーション、ほとんどのバックグラウンドデータを制限します。同期を使用するメールやメッセージなどのアプリは起動しないと更新されない場合があります。\n\nバッテリーセーバーは、端末の充電中は自動的にOFFになります。"</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>にダウンロードが終わるまで"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1分間(<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>まで)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d分間(<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>まで)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>まで"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"制限なし"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"折りたたむ"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index fbf3671..883a949 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"აპებს აძლევს ქეშირებული სისტემური ფაილების წაკითხვისა და მათში ჩანაწერების გაკეთების საშუალებას."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ზარების წამოწყება/მიღება"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ნებას რთავს აპს განახორციელოს და მიიღოს SIP ზარები."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ტელეკომის ახალი SIM კავშირების რეგისტრაცია"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"აპს ტელეკომის ახალი SIM კავშირების რეგისტრაცია შეეძლება."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ტელეკომის ახალი კავშირების რეგისტრაცია"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"აპს ტელეკომის ახალი კავშირების რეგისტრაცია შეეძლება."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ტელეკომის კავშირების მართვა"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"აპს ტელეკომის კავშირების მართვა შეეძლება."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ინტერაქცია საუბრის რეჟიმის ეკრანთან"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"მიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ამ ეკრანისთვის მიმაგრების გასაუქმებლად შეეხეთ და არ აუშვათ ღილაკებს „გადახედვა“."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ეკრანი დაფიქსირებული. ფიქსაციის მოხსნა თქვენო ორგანიზაციის მიერ ნებადართული არ არის."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"გსურთ ეკრანის ფიქსაციის გამოყენება?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ეკრანის მიმაგრება მხოლოდ ერთ ამჟამინდელ ხედს აჩვენებს.\n\nმიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ეკრანის მიმაგრება მხოლოდ ერთ ამჟამინდელ ხედს აჩვენებს.\n\nმიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ფიქსაციის მოხსნამდე PIN-ის მოთხოვნა"</string>
@@ -1783,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"სანამ ავარიული პაუზა დასრულდებდეს"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ერთი წუთის განმავლობაში (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>-მდე)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d წუთის განმავლობაში (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>-მდე)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-მდე"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"სამუდამოდ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"აკეცვა"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"შემდეგ მაღვიძარამდე <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>-ში"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"შემდეგ მაღვიძარამდე"</string>
</resources>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index b4a322c..5a80dc6 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Қолданбаға кэш файлдық жүйесін оқуға және оған жазуға рұқсат береді."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP қоңырауларын шалу/қабылдау"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Қолданбаға SIP қоңырауларын шалуға және қабылдауға рұқсат етеді."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"жаңа телекоммуникациялық SIM байланыстарын тіркеу"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Қолданбаға жаңа телекоммуникациялық SIM байланыстарын тіркеуге рұқсат етеді."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"жаңа телекоммуникациялық байланыстарды тіркеу"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Қолданбаға жаңа телекоммуникациялық байланыстарды тіркеуге рұқсат етеді."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"телекоммуникациялық байланыстарды басқару"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Қолданбаға телекоммуникациялық байланыстарды басқаруға рұқсат етеді."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"қоңыраудағы экранмен өзара әрекеттесу"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Осы экранды босату үшін «Кері» және «Шолу» пәрмендерін бір уақытта түртіп, ұстап тұрыңыз."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Осы экранды босату үшін «Шолу» пәрменін түртіп, ұстап тұрыңыз."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Экран түйрелген. Босатуға ұйымыңыз рұқсат етпейді."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Экранды түйреуді пайдалану керек пе?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Экранды бекіту дисплейді бір көріністе бекітеді.\n\nБосату үшін «Кері» және «Шолу» пәрмендерін бір уақытта түртіп, ұстап тұрыңыз."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Экранды бекіту дисплейді бір көріністе бекітеді.\n\nБосату үшін «Шолу» пәрменін түртіп, ұстап тұрыңыз."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Босату алдында PIN кодын сұрау"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Бір минут бойы (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> дейін)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d минут бойы (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> дейін)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дейін"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Белгісіз уақыт бойы"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Тасалау"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 94f7f01..7c98e2f 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -34,6 +34,7 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string>
+ <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string>
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string>
@@ -716,14 +717,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ឲ្យ​កម្មវិធី​អាន និង​សរសេរ​ប្រព័ន្ធ​ឯកសារ​ឃ្លាំង​សម្ងាត់។"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"បង្កើត/ទទួល ការ​ហៅ SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"​ឲ្យ​​កម្មវិធី បង្កើត និង​ទទួល​ការ​ហៅ SIP ។"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ចុះ​ឈ្មោះ​ការ​ភ្ជាប់​ស៊ី​ម​ទូរគមនាគមន៍​ថ្មី"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"អនុញ្ញាត​ឲ្យ​កម្មវិធី​ចុះ​ឈ្មោះ​​​ជា​មួយ​ស៊ី​ម​ទូរគមនាគមន៍​ថ្មី"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ចុះ​ឈ្មោះ​ការ​ភ្ជាប់​ទូរគមនាគមន៍​ថ្មី"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ឲ្យ​កម្មវិធី​ចុះ​ឈ្មោះ​ការ​ភ្ជាប់​ទូរគមនាគមន៍​ថ្មី។"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"គ្រប់គ្រង​ការ​ភ្ជាប់​ទូរគមនាគមន៍"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ឲ្យ​កម្មវិធី​គ្រប់គ្រង​ការ​ភ្ជាប់​ទូរគមនាគមន៍។"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ទាក់ទង​ជា​មួយ​អេក្រង់​ហៅ​ចូល"</string>
@@ -1773,11 +1770,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ដើម្បី​មិន​ភ្ជាប់​អេក្រង់​នេះ ប៉ះ ហើយ​សង្កត់​ថយក្រោយ និង​ទិដ្ឋភាព​នៅ​ពេល​តែ​មួយ។"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ដើម្បី​មិន​ភ្ជាប់​អេក្រង់​នេះ ប៉ះ ហើយ​សង្កត់​ទិដ្ឋភាព។"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"អេក្រង់​ត្រូវ​បាន​ភ្ជាប់។ ការ​ផ្ដាច់​មិន​​ត្រូវ​បាន​អនុញ្ញាត​ដោយ​ស្ថាប័ន​របស់​អ្នក។"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"ប្រើ​ការ​ភ្ជាប់​អេក្រង់?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ការ​ភ្ជាប់​អេក្រង់​ចាក់​សោ​ការ​បង្ហាញ​ក្នុង​ទិដ្ឋភាព​តែ​មួយ។\n\nដើម្បី​មិន​ភ្ជាប់ ប៉ះ ហើយ​សង្កត់​ថយក្រោយ និង​ទិដ្ឋភាព​នៅ​ពេល​តែ​មួយ។"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ការ​ភ្ជាប់​អេក្រង់​ចាក់​សោ​ការ​បង្ហាញ​ក្នុង​ទិដ្ឋភាព​តែ​មួយ។\n\nដើម្បី​មិន​ភ្ជាប់ ប៉ះ ហើយ​សង្កត់​ទិដ្ឋភាព។"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"សួរ​រក​កូដ PIN មុន​ពេល​ផ្ដាច់"</string>
@@ -1785,6 +1777,7 @@
<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_line_one" msgid="8762708714645352010">"រហូត​ដល់​ម៉ោង​រាប់​ថយក្រោយ​ចប់"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"សម្រាប់​មួយ​នាទី (រហូត​ដល់ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"សម្រាប់ %1$d នាទី​ (រហូត​ដល់ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1804,4 +1797,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"រហូត​ដល់ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"គ្មាន​​កំណត់"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"បង្រួម"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"រហូត​ដល់​ការ​ជូន​ដំណឹង​បន្ទាប់​នៅ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"រហូត​ការ​ជូន​ដំណឹង​បន្ទាប់"</string>
</resources>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index f8a668b..ba4817d 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷಗಳು"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿಷಗಳು"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ಕ್ಯಾಷ್‌ ಫೈಲ್‌ ವ್ಯವಸ್ಥೆಯನ್ನು ಓದಲು ಮತ್ತು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್‌‌ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ಕರೆಗಳನ್ನು ಮಾಡಿ/ಸ್ವೀಕರಿಸಿ"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸ್ವೀಕರಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಿಮ್‌ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ಹೊಸ ಟೆಲಿಕಾಮ್ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಾಯಿಸಿ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ಹೊಸ ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನೋಂದಣಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ಟೆಲಿಕಾಂ ಸಂಪರ್ಕಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ಒಳ-ಕರೆ ಪರದೆಯ ಮೂಲಕ ಸಂವಹನ ನಡೆಸಿ"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ಈ ಪರದೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲು, ‘ಹಿಂದೆ’ ಮತ್ತು ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ಈ ಪರದೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲು, ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ಪರದೆ ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ. ಅನ್‌ಪಿನ್‌ ಮಾಡಲು ನಿಮ್ಮ ಸಂಸ್ಥೆ ಅವಕಾಶ ಮಾಡಿಕೊಟ್ಟಿಲ್ಲ."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"ಸ್ಕ್ರೀನ್‌ ಪಿನ್ನಿಂಗ್‌ ಬಳಸುವುದೇ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್‌ಪಿನ್ ಮಾಡಲು, ‘ಹಿಂದೆ’ ಮತ್ತು ‘ಸಮಗ್ರ ನೋಟ’ ಎರಡೂ ಬಟನ್‌ ಅನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್‌ಪಿನ್ ಮಾಡಲು, ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ಅನ್‌ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಪಿನ್‌ ಕೇಳಿ"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ಒಂದು ನಿಮಿಷದವರೆಗೆ (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> ವರೆಗೆ)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d ನಿಮಿಷಗಳವರೆಗೆ (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> ವರೆಗೆ)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ವರೆಗೆ"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"ಅನಿರ್ದಿಷ್ಟವಾಗಿ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ಸಂಕುಚಿಸು"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 89a74b6..b67ff6e 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"앱이 캐시 파일 시스템을 읽고 쓸 수 있도록 허용합니다."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP 통화 발신/수신"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"앱에서 SIP 통화를 발신 및 수신하도록 허용"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"새로운 통신 SIM 연결 등록"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"앱이 새 통신 SIM 연결을 등록할 수 있게 허용합니다."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"새로운 통신 연결 등록"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"앱이 새 통신 연결을 등록할 수 있게 허용합니다."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"통신 연결 관리"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"앱이 통신 연결을 관리할 수 있게 허용합니다."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"통화 화면과 상호작용"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"화면을 고정 해제하려면 \'뒤로\'와 \'최근 사용\'을 동시에 길게 터치합니다."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"화면을 고정 해제하려면 \'최근 사용\'을 길게 터치합니다."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"화면이 고정되었습니다. 소속된 조직에서 고정 해제를 허용하지 않습니다."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"화면을 고정하시겠습니까?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"화면을 고정하면 단일 보기에서 디스플레이를 잠급니다.\n\n고정 해제하려면 \'뒤로\'와 \'최근 사용\'을 동시에 길게 터치합니다."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"화면을 고정하면 단일 보기에서 디스플레이를 잠급니다.\n\n고정 해제하려면 \'최근 사용\'을 길게 터치합니다."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"고정 해제 이전에 PIN 요청"</string>
<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="battery_saver_description" msgid="2510530476513605742">"배터리 수명을 개선하기 위해 배터리 절약에서는 기기의 성능을 줄이고 진동과 대부분의 백그라운드 데이터를 제한합니다. 동기화가 필요한 이메일, 채팅 메시지, 기타 앱은 열어야 업데이트됩니다.\n\n기기를 충전하는 중에는 배터리 절약이 자동으로 사용 중지됩니다."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>에 정지가 종료될 때까지"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1분(<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>까지)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d분(<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>까지)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>까지"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"무제한"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"접기"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index df87e82..67bb85c 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -40,6 +40,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с. <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> саат <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
@@ -926,14 +928,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Колдонмого кэш файл тутумун окуу жана жазуу мүмкүнчүлүгүн берет."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP чалууларын жасоо/кабыл алуу"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Колдонмонун SIP чалууларын жасап жана кабыл алуусуна жол ачат."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"жаңы телеком SIM туташууларын каттоо"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Колдонмого жаңы телеком SIM туташууларын каттоо мүмкүнчүлүгүн берет."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"жаңы телеком туташууларын каттоо"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Колдонмого жаңы телеком туташууларын каттоо мүмкүнчүлүгүн берет."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"телеком туташууларын башкаруу"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Колдонмого телеком туташууларын башкаруу мүмкүнчүлүгүн берет."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"чалуу экраны менен байланыштыруу"</string>
@@ -2251,11 +2249,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Бул экранды бошотуу үчүн Артка жана Көз жүгүртүүнү чогуу басып, кармап туруңуз."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Бул экранды бошотуу үчүн Көз жүгүртүүнү басып, кармап туруңуз."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Экран кадалды. Уюмуңуздун уруксатысыз бошото албайсыз."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Экран кадалсынбы?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Экран кадоосу дисплейди жалгыз көрүнүш менен бекитет.\n\nБошотуу үчүн Артка жана Көз жүгүртүүнү чогуу басып, кармап туруңуз."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Экран кадоосу дисплейди жалгыз көрүнүш менен бекитет.\n\n Бошотуу үчүн Көз жүгүртүүнү басып, кармап туруңуз."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Бошотуудан мурун PIN суралсын"</string>
@@ -2263,6 +2256,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Бошотуудан мурун сырсөз суралсын"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Батарея өмүрүн узартууга жардамдашуу үчүн, батарея үнөмдөгүч түзмөгүңүздүн өндүрүмдүүлүгүн азайтып, дирилдөөнү жана көпчүлүк фон дайындарын чектейт. Email, билдирүү жазуу жана башка шайкештирүүгө көз каранды колдонмолор, аларды ачмайыңызча жаңыртылбашы мүмкүн.\n\nТүзмөгүңүз кубатталып жатканда батарея үнөмдөгүч автоматтык түрдө өчөт."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Иштебей турган абал <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> аяктамайынча"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Бир мүнөткө (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> чейин)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d мүнөткө (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> чейин)"</item>
@@ -2282,4 +2277,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> чейин"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Белгисиз"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Жыйнап коюу"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index daed8b6..4549586 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ອະນຸຍາດໃຫ້ແອັບຯ ອ່ານ ແລະຂຽນ ລະບົບໄຟລ໌ແຄດ."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"ຮັບສາຍ/ໂທອອກ ຜ່ານ SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"ອະນຸຍາດ​ໃຫ້ແອັບຯ​ສາມາດ​ຮັບສາຍ ແລະໂທອອກ​ຜ່ານ SIP ໄດ້"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ລົງ​ທະ​ບຽນ SIM ການ​ເຊື່ອມ​ຕໍ່​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມ​ໃໝ່"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"​ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບຯ​ລົງ​ທະ​ບຽນ SIM ​ການ​ເຊື່ອມ​ຕໍ່​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມ​ໃໝ່."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ລົງ​ທະ​ບຽນການ​ເຊື່ອມ​ຕໍ່​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມໃໝ່"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"​ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບຯ​ລົງ​ທະ​ບຽນການ​ເຊື່ອມ​ຕໍ່​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມໃໝ່​."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ຈັດ​ການ​ການ​ເຊື່ອມ​ຕໍ່​​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມ"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"​ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບຯ​ຈັດ​ການ​ການ​ເຊື່ອມ​ຕໍ່​​ໂທ​ລະ​ຄົມ​ມະ​ນາ​ຄົມ."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ໂຕ້​ຕອບ​ກັບ​ໜ້າ​ຈໍ​ການ​ໂທ"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ເພື່ອ​ຖອດ​ການ​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ນີ້, ສຳ​ຜັດປຸ່ມ ​ກັບ​ຄືນ ແລະ ພາບ​ຮວມ ຄ້າງ​ໄວ້​ພ້ອມ​ກັນ."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ເພື່ອ​ຖອດ​ການ​ປັກ​ໝຸດໜ້າ​ຈໍ​ນີ້, ສຳ​ຜັດ​ປຸ່ມ ພາບ​ຮວມ ຄ້າງ​ໄວ້."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ໜ້າ​ຈໍ​ຖືກ​ປັກ​ໝຸດ​ໄວ້. ​ອົງ​ກອນ​ຂອງ​ທ່ານບໍ່​​ອະ​ນຸ​ຍາດ​ໃຫ້​ຍົກ​ເລີກ​ການ​ປັກ​ໝຸດ​ໄດ້."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"ໃຊ້​ການ​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ບໍ່?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"​ການ​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ຈະ​ເຮັດ​ໃຫ້​ການສະແດງ​ຜົນນັ້ນ​ລັອກ​ຢູ່​ໃນ​ມຸມມອງ​ດຽວ.\n\n​ເພື່ອ​ຖອດ​ການ​ປັກ​ໝຸດ, ສຳ​ຜັດປຸ່ມ ​ກັບ​ຄືນ ແລະ ພາບ​ຮວມ ຄ້າງ​ໄວ້​ພ້ອມ​ກັນ."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ການ​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ຈະ​ເຮັດ​ໃຫ້​ໃຫ້​ການແດງ​ຜົນນັ້ນ​ລັອກ​ຢູ່​ໃນ​ມຸມມອງ​ດຽວ.\n\n​ເພື່ອ​ຖອດ​ການ​ປັກ​ໝຸດ, ສຳ​ຜັດ​ປຸ່ມ ພາບ​ຮວມ ຄ້າງ​ໄວ້."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"​ຖາມ​ຫາ PIN ກ່ອນ​ຍົກ​ເລີກ​ການປັກ​ໝຸດ"</string>
@@ -1783,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"​ຈົນ​ກວ່າ​ເວ​ລາ​ປິດ​ເຮັດ​ວຽກ​ຂອງ​ທ່ານ​ສິ້ນ​ສຸດ​ລົງ"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"​ເປັນ​ເວ​ລາ 1 ນາ​ທີ (ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"​ເປັນ​ເວ​ລາ %1$d ​ນາ​ທີ (ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"ຈົນ​ຮອດ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"ຢ່າງ​ບໍ່​ມີ​ກຳນົດ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ຫຍໍ້"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"​ຈົນ​ກວ່າ​ໂມງ​ປຸກ​ຄັ້ງ​ຕໍ່​ໄປ​ໃນ​ເວ​ລາ <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"​ຈົນ​ກວ່າ​ໂມງ​ປຸກ​ຄັ້ງຕໍ່​ໄປ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index ad841ea..d8758eb 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Leidžiama programai skaityti talpyklos failų sistemą ir į ją rašyti."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"skambinti / priimti SIP skambučius"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Leidžiama programai skambinti ir priimti SIP skambučius."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registruoti naujus telekomunikacijų SIM ryšius"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Programai leidžiama registruoti naujus telekomunikacijų SIM ryšius."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registruoti naujus telekomunikacijų ryšius"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Programai leidžiama registruoti naujus telekomunikacijų ryšius."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"tvarkyti telekomunikacijų ryšius"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Programai leidžiama tvarkyti telekomunikacijų ryšius."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"sąveika su gaunamojo skambučio ekranu"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Jei norite atsegti šį ekraną, vienu metu palieskite ir palaikykite „Atgal“ ir „Apžvalga“."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Jei norite atsegti šį ekraną, palieskite ir palaikykite „Apžvalga“."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekranas yra prisegtas. Jūsų organizacija neleidžia jo atsegti."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Naudoti ekrano prisegimo funkciją?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Prisegus ekraną jis bus užrakintas viename rodinyje.\n\nJei norite atsegti, vienu metu palieskite ir palaikykite „Atgal“ ir „Apžvalga“."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Prisegus ekraną jis bus užrakintas viename rodinyje.\n\nJei norite atsegti, palieskite ir palaikykite „Apžvalga“."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NE, AČIŪ"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ĮJUNGTI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrano prisegtas"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekranas atsegtas"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Prašyti PIN kodo prieš atsegant"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Prašyti slaptažodžio prieš atsegant"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Siekiant pailginti akumuliatoriaus veikimo laiką, Akumuliatoriaus tausojimo priemonė sumažina įrenginio našumą ir apriboja vibravimą bei daugumą foninių duomenų. El. paštas, pranešimų siuntimas ir kitos programos, kurios veikia sinchronizavimo pagrindu, gali nebūti atnaujintos, nebent jas atidarysite.\n\nKraunant įrenginį Akumuliatoriaus tausojimo priemonė automatiškai išjungiama."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Kol jūsų prastova baigsis <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Vieną minutę (iki <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d min. (iki <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Iki <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Neapibrėžta"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sutraukti"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index f9587bd..156dc94 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ļauj lietotnei lasīt un rakstīt kešatmiņas failu sistēmā."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP zvanu veikšana/saņemšana"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ļauj lietotnei veikt un saņemt SIP zvanus."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"reģistrēt jaunus telekomunikāciju SIM savienojumus"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ļauj lietotnei reģistrēt jaunus telekomunikāciju SIM savienojumus."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"reģistrēt jaunus telekomunikāciju savienojumus"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ļauj lietotnei reģistrēt jaunus telekomunikāciju savienojumus."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telekomunikācijas savienojumu pārvaldība"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Ļauj lietotnei pārvaldīt telekomunikācijas savienojumus."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"Mijiedarboties ar zvana laikā rādītu ekrānu"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Lai atspraustu šo ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Lai atspraustu šo ekrānu, pieskarieties pogai “Pārskats” un turiet to."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekrāns ir piesprausts. Jūsu organizācija nav atļāvusi atspraušanu."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Vai izmantot ekrāna piespraušanu?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, pieskarieties pogai “Pārskats” un turiet to."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NĒ, PALDIES"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"SĀKT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrāns ir piesprausts"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekrāns ir atsprausts"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pirms atspraušanas pieprasīt PIN"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pirms atspraušanas pieprasīt paroli"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Lai paildzinātu akumulatora darbības laiku, akumulatora enerģijas taupīšanas režīmā tiks pazemināta ierīces veiktspēja, samazināta vibrācija un ierobežota liela daļa fona datu. E-pasta, ziņojumapmaiņas un citas lietotnes, kas regulāri tiek sinhronizētas, tiks atjauninātas tikai tad, ja tās atvērsiet.\n\nIerīces uzlādes laikā akumulatora jaudas taupīšana tiek izslēgta automātiski."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Līdz beigsies dīkstāve (<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>)"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Vienu minūti (līdz <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d minūtes (līdz <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Līdz <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Uz nenoteiktu laiku"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Sakļaut"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mcc204-mnc04/config.xml b/core/res/res/values-mcc204-mnc04/config.xml
index d7484e1..0e67669 100644
--- a/core/res/res/values-mcc204-mnc04/config.xml
+++ b/core/res/res/values-mcc204-mnc04/config.xml
@@ -38,4 +38,9 @@
1. Lenient threshold
-->
<integer name="config_LTE_RSRP_threshold_type">0</integer>
+
+ <string-array translatable="false" name="config_sms_convert_destination_number_support">
+ <item>true;BAE0000000000000</item>
+ <item>false</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values-mcc310-mnc004/config.xml b/core/res/res/values-mcc310-mnc004/config.xml
index 423e250..6a34a3d 100644
--- a/core/res/res/values-mcc310-mnc004/config.xml
+++ b/core/res/res/values-mcc310-mnc004/config.xml
@@ -34,4 +34,9 @@
</string-array>
<bool name="config_auto_attach_data_on_creation">false</bool>
+
+ <string-array translatable="false" name="config_sms_convert_destination_number_support">
+ <item>true</item>
+ </string-array>
+
</resources>
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index 8cb2928..2022d12 100644
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -56,4 +56,8 @@
1. Lenient threshold
-->
<integer name="config_LTE_RSRP_threshold_type">0</integer>
+
+ <string-array translatable="false" name="config_sms_convert_destination_number_support">
+ <item>true</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index d01a18b..fc50a51 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Дозволува апликацијата да чита и да пишува кеш систем на датотеки."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"остварувај/примај повици преку СИП"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Дозволува апликацијата да остварува и прима повици преку СИП."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистрира нови телекомуникациски врски преку СИМ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Дозволува апликацијата да регистрира нови телекомуникациски врски преку СИМ."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистрира нови телекомуникациски врски"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Дозволува апликацијата да регистрира нови телекомуникациски врски."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"управува со телекомуникациски врски"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Дозволува апликацијата да управува со телекомуникациски врски."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"комуницирај со екран на дојдовен повик"</string>
@@ -1773,11 +1771,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"За да го откачите екранот, допрете и задржете Назад и Краток преглед во исто време."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"За да го откачите екранот, допрете и задржете Краток преглед."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Екранот е закачен. Откачување не е дозволено од вашата организација."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Да се употреби закачување на екранот?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Закачувањето на екранот го заклучува екранот во еден приказ.\n\nЗа откачување, допрете и задржете Назад и Краток преглед во исто време."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Закачувањето на екранот го заклучува екранот во еден приказ.\n\nЗа откачување, допрете и задржете Краток преглед."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Прашај за ПИН пред откачување"</string>
@@ -1785,6 +1778,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Една минута (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d минути (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1804,4 +1799,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Неодредено време"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Собери"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index d20da0a..1c271d1 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ്"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> സെക്കൻഡ്"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"കാഷെ ഫയൽ സിസ്‌റ്റം റീഡുചെയ്യുന്നതിനും റൈറ്റുചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP കോളുകൾ വിളിക്കുക/സ്വീകരിക്കുക"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP കോളുകൾ വിളിക്കാനും സ്വീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"പുതിയ ടെലികോം SIM കണക്ഷനുകൾ രജിസ്‌റ്റർ ചെയ്യുക"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"പുതിയ ടെലികോം SIM കണക്ഷനുകൾ രജിസ്‌റ്റർ ചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"പുതിയ ടെലികോം കണക്ഷനുകൾ രജിസ്‌റ്റർ ചെയ്യുക"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"പുതിയ ടെലികോം കണക്ഷനുകൾ രജിസ്‌റ്റർ ചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ടെലികോം കണക്ഷനുകൾ നിയന്ത്രിക്കുക"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ടെലികോം കണക്ഷനുകൾ നിയന്ത്രിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ഇൻ-കോൾ സ്‌ക്രീനുമായി സംവദിക്കുക"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ഈ സ്‌ക്രീൻ അൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'കാഴ്ച\' എന്നിവ ഒരേ സമയം സ്‌പർശിച്ച് പിടിക്കുക."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ഈ സ്‌ക്രീൻ അൺപിൻ ചെയ്യാൻ, കാഴ്ച സ്‌പർശിച്ച് പിടിക്കുക."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"സ്ക്രീൻ പിൻ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ ഓർഗനൈസേഷൻ അൺപിൻ ചെയ്യൽ അനുവദിക്കുന്നില്ല."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"സ്ക്രീൻ പിൻ ചെയ്യൽ ഉപയോഗിക്കണോ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"സ്‌ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്‌ചയിൽ ഡി‌സ്‌പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'കാഴ്ച\' എന്നിവ ഒരേ സമയം സ്‌പർശിച്ച് പിടിക്കുക."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"സ്‌ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്‌ചയിൽ ഡി‌സ്‌പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ, കാഴ്ച സ്‌പർശിച്ച് പിടിക്കുക."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് പിൻ ആവശ്യപ്പെടുക"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for zen_mode_duration_minutes_summary:other (2787867221129368935) -->
<plurals name="zen_mode_duration_hours_summary">
@@ -1800,4 +1795,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> വരെ"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"അവ്യക്തം"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ചുരുക്കുക"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 7132604..44974fd 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> минут"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> секунд"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Апп нь кеш файлсистемийг унших бичих боломжтой."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP дуудлага хийх/хүлээн авах"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Апп-д SIP дуудлага хийх болон хүлээн авахыг зөвшөөрөх."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"шинэ телеком SIM холболтуудыг бүртгэх"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Апп-д шинэ телеком SIM холболтуудыг бүртгэхийг зөвшөөрнө."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"шинэ телеком холболтуудыг бүртгэх"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Апп-д шинэ телеком холболтуудыг бүртгэхийг зөвшөөрнө."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"телеком холболтуудыг удирдах."</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Апп-д телеком холболтуудыг удирдахыг зөвшөөрнө."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"дуудлагын дэлгэцтэй харьцах"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Энэ дэлгэцийг цуцлахын тулд Буцах болон Тойм харагдацыг зэрэг хүрч барина."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Энэ дэлгэцийг цуцлахын тулд Тойм харагдацанд хүрч барина."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Дэлгэцийг тогтоосон. Дэлгэц суллахыг таны байгууллага зөвшөөрөөгүй."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Дэлгэц тогтоогчийг ашиглах уу?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Дэлгэц тогтоогч нь дэлгэцийг нэг янзын харагдацаар түгжинэ.\n\nЦуцлахын тулд Буцах болон Тойм харагдацанд зэрэг хүрч барина."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Дэлгэц тогтоогч нь дэлгэцийг нэгэн янзын харагдацаар түгжинэ.\n\nЦуцлахын тулд Тойм харагдацанд хүрч барина."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Тогтоосныг суллахаас өмнө PIN асуух"</string>
@@ -1783,6 +1776,7 @@
<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_line_one" msgid="8762708714645352010">"Сул зогсолт дуусах хүртэл"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Нэг минутын турш (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> хүртэл)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d минутын турш (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> хүртэл)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> хүртэл"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Тодорхойгүй"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Хумих"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> дахь дараагийн анхааруулга хүртэл"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Дараагийн анхааруулга хүртэл"</string>
</resources>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 13347e7..00cee9d 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनिटे"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंद"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"कॅशे filesystem वाचण्यासाठी आणि लिहिण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कॉल करा/प्राप्त करा"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"अॅपला SIP कॉल करण्‍याची आणि प्राप्त करण्‍याची अनुमती देते."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नवीन टेलिकॉम सिम कनेक्शनची नोंदणी करा"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"नवीन टेलिकॉम सिम कनेक्शनची नोंदणी करण्यासाठी अॅपला अनुमती देते."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नवीन टेलिकॉम कनेक्शनची नोंदणी करा"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"नवीन टेलिकॉम कनेक्शनची नोंदणी करण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"टेलिकॉम कनेक्शन व्यवस्थापित करा"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"टेलिकॉम कनेक्शन व्यवस्थापित करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"कॉल-मधील स्‍क्रीनशी परस्‍परसंवाद करा"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ही स्क्रीन अनपिन करण्यासाठी, एकाच वेळी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ही स्क्रीन अनपिन करण्यासाठी, विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"स्क्रीन पिन केली आहे. आपल्या संस्थेद्वारे अनपिन करण्यास अनुमती नाही."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"स्क्रीन पिन करणे वापरायचे?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"स्क्रीन पिन करणे एका एकल दृश्यामधील प्रदर्शन लॉक करते.\n\nअनपिन करण्यासाठी, एकाच वेळी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"स्क्रीन पिन करणे एका एकल दृश्यामधील प्रदर्शन लॉक करते.\n\nअनपिन करण्यासाठी, विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करण्‍यापूर्वी पिन साठी विचारा"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"एका मिनिटासाठी (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> पर्यंत)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d मिनिटांसाठी (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> पर्यंत)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> पर्यंत"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"अनिश्‍चितपणे"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करा"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index e65fe3f..20433fa 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Membenarkan apl membaca dan menulis cache sistem fail."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"buat/terima panggilan SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Membenarkan apl membuat dan menerima panggilan SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"daftar sambungan SIM telekom baharu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Membenarkan apl mendaftarkan sambungan SIM telekom baharu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"daftar sambungan telekom baharu"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Membenarkan apl mendaftarkan sambungan telekom baharu."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"urus sambungan telekomunikasi"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Membenarkan apl mengurus sambungan telekomunikasi."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"berinteraksi dengan skrin dalam panggilan"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Untuk menyahsemat skrin ini, sentuh dan tahan Kembali serta Ikhtisar pada masa yang sama."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Untuk menyahsemat skrin ini, sentuh dan tahan Ikhtisar."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skrin disemat. Menyahsemat tidak dibenarkan oleh organisasi anda."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Gunakan penyematan skrin?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Penyematan skrin mengunci paparan dalam pandangan tunggal.\n\nUntuk menyahsemat, sentuh dan tahan Kembali serta Ikhtisar pada masa yang sama."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Penyematan skrin mengunci paparan dalam pandangan tunggal.\n\nUntuk menyahsemat, sentuh dan tahan Ikhtisar."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"TIDAK, TERIMA KASIH"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"MULA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skrin disemat"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skrin dinyahsemat"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Minta PIN sebelum menyahsemat"</string>
@@ -1783,9 +1776,10 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Minta kata laluan sebelum menyahsemat"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Untuk membantu memperbaik hayat bateri, penjimat bateri mengurangkan prestasi peranti anda dan menghadkan getaran serta kebanyakan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung pada penyegerakan mungkin tidak dikemas kini melainkan anda membuka apl tersebut.\n\nPenjimat bateri dimatikan secara automatik semasa peranti anda mengecas."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Sehingga waktu gendala anda berakhir pada <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Sehingga waktu gendala anda berakhir"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Selama satu minit (sehingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
- <item quantity="other" msgid="2787867221129368935">"Selaman %1$d minit (sehingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
+ <item quantity="other" msgid="2787867221129368935">"Selama %1$d minit (sehingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary">
<item quantity="one" msgid="597194865053253679">"Selama satu jam (sehingga <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Sehingga <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Selama-lamanya"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Runtuhkan"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Sehingga penggera seterusnya pada <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Sehingga penggera seterusnya"</string>
</resources>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 86b310d..b823344 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"appအား ဖိုင်စနစ်၏ကက်ရှကို ဖတ် နှင့် ရေး ခွင့်ပြုသည်။"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်/လက်ခံရန်"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်နှင့် လက်ခံနိုင်ရန် app ကို ခွင့်ပြုပါ။"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"တယ်လီကွမ် ဆင်းမ် ချိတ်ဆက်မှုများကို မှတ်ပုံတင်ပါ"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"appအား တယ်လီကွမ် ဆင်းမ် ချိတ်ဆက်မှုကို မှတ်ပုံတင်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"တယ်လီကွမ် တယ်လီကွမ် ချိတ်ဆက်မှု အသစ်များကို မှတ်ပုံတင်ပါ"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"appအား တယ်လီကွမ် ချိတ်ဆက်မှု အသစ်များကို မှတ်ပုံတင်ခွင့် ပြုသည်။"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"တယ်လီကွမ် ဆက်သွယ်မှုများကို စီမံရန်"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"appအား တယ်လီကွမ် ဆက်သွယ်မှုများကို စီမံခွင့် ပြုပါ။"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ခေါ်ဆိုမှု-အဝင် မျက်နှာပြင်နဲ့ တုံ့ပြန်လုပ်ကိုင်ရန်"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန် ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"မျက်နှာပြင်ကို ပင်ထိုးထားသည်။ ပင်ထိုးထားမှု ဖြုတ်ခြင်းကို သင့် အဖွဲ့အစည်းက ခွင့် မပြုပါ။"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"မျက်နှာပြင် ပင်ထိုးမှုကို သုံးမလား?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ပင်မဖြုတ်မီမှာ PIN ကို မေးကြည့်ရန်"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ပင်မဖြုတ်မီမှာ စကားဝှက်ကို မေးကြည့်ရန်"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန်အတွက်၊ ဘက်ထရီချွေတာရေးအပိုင်းမှ သင့် စက်ပစ္စည်း၏ဆောင်ရွက်ချက်များကို လျော့ချပေးပြီး တုန်ခါမှုနှင့် နောက်ခံအချက်အလက်အများစုကို ကန့်သတ်ပေးသည်။ အီးမေး၊ စာပို့ခြင်း နှင့် တခြားapp များကို သင်ဖွင့်မထားပါက အချိန်နှင့်တပြေးညီ ညှိမပေးပါ။ \n\n စက်ပစ္စည်း အားသွင်းနေစဉ် ဘက်ထရီချွေတာရေးအပိုင်းသည် အလိုအလျောက်ပင် အလုပ်မလုပ်ပါ။"</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"သင်၏ စက်ရပ်ချိန် <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> မှာ ပြီးဆုံးသည့် အထိ။"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"သင့်ကျချိန်အဆုံးအထိ"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"တစ်မိနစ်ကြာ (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>အထိ)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d မိနစ်ကြာ (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>အထိ)"</item>
@@ -1800,4 +1794,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>အထိ"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"အကန့်အသတ်မရှိစွာ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ခေါက်ရန်"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"နောက်ထပ် <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> ၌နိုးစက်အထိ"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"နောက်ထပ်နိုးစက်အထိ"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a59a30a..415e8fe 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Lar appen lese og skrive til det bufrede filsystemet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"foreta/motta SIP-anrop"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillater at appen utfører og mottar SIP-anrop."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrere nye tilkoblinger for telekom-SIM-kort"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Lar appen registrere nye telekom-tilkoblinger for SIM-kort."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrere nye telekom-tilkoblinger"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Lar appen registrere nye telekom-tilkoblinger."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"administrere telekom-tilkoblinger"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Lar appen administrere telekom-tilkoblinger."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"samhandle med skjermen for innkommende anrop"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Hvis du vil avslutte én-appsmodusen for denne skjermen, trykker og holder du på Tilbake og Oversikt samtidig."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Hvis du vil avslutte én-appsmodusen for denne skjermen, trykker og holder du på Oversikt."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skjermen er festet. Løsning er ikke tillatt av organisasjonen din."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Vil du bruke én-appsmodus?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Én-appsmodus låser skjermen til én bestemt side.\n\nHvis du vil avslutte modusen, trykker og holder du på Tilbake og Oversikt samtidig."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Én-appsmodus låser skjermen til én bestemt side.\n\nHvis du vil avslutte modusen, trykker og holder du på Oversikt."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEI TAKK"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skjermen er festet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skjermen er løsnet"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Krev PIN-kode for å løsne apper"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Krev bruk av opplåsningsmønster for å løsne apper"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Krev passord for å løsne apper"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Batterisparing reduserer enhetens ytelse og begrenser vibrering og de fleste bakgrunnsdata for å forbedre batterilevetiden. Det kan hende E-post, Meldinger og andre apper som er avhengige av synkronisering, ikke oppdateres med mindre du åpner dem.\n\nBatterisparing slås automatisk av når enheten lades."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Batterisparing reduserer enhetens ytelse og begrenser vibrering og de fleste bakgrunnsdata for å forbedre batterilevetiden. Det kan hende apper for e-post og nettprat samt andre som er avhengige av synkronisering, ikke oppdateres med mindre du åpner dem.\n\nBatterisparing slås automatisk av når enheten lades."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Til hviletiden din ender kl. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"I ett minutt (til <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"I %1$d minutter (til <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Til <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"På ubestemt tid"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index f1502f8..177cf06 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घण्टा <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घण्टा <xliff:g id="MINUTES">%2$d</xliff:g> मिनेट"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकेन्ड"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"केस फाइल प्रणालीलाई पढ्न र लेख्‍नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP कलहरू प्राप्त/बनाउन"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP कलहरू बनाउन र प्राप्त गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"नयाँ दूरसंचार सिम जडानहरू दर्ता गर्नुहोस्"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"अनुप्रयोगलाई नयाँ दूरसंचार SIM जडानहरू दर्ता गर्न अनुमति दिन्छ।"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"नयाँ दूरसंचार जडानहरू दर्ता गर्नुहोस्"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"अनुप्रयोगलाई नयाँ दूरसंचार सम्पर्क दर्ता गर्न अनुमति दिन्छ।"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"दूरसंचार जडान व्यवस्थापन गर्नुहोस्"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"अनुप्रयोगलाई टेलिकम जडान व्यवस्थापन गर्न अनुमति दिन्छ।"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"आगमन कल स्क्रिन संग अन्तर्क्रिया गर्नुहोस्"</string>
@@ -1779,11 +1777,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"यस पर्दालाई अनपिन गर्न एकै समय फिर्ता र सारांशलाई छोई पक्डिनुहोस्।"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"यस पर्दालाई अनपिन गर्न सारांशलाई छुनुहोस् र पक्डनुहोस्।"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"स्क्रिन अनपिन हुँदैछ। अनपिन गर्ने तपाईँको संगठन द्वारा समर्थित छैन।"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"स्क्रिन पिन गर्ने प्रयोग गर्नुहुन्छ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"पर्दा पिन गर्नाले एकल दृश्यमा प्रदर्शन बन्द हुन्छ।\n\nअनपिन गर्न, छुनुहोस् र पछाडि पकड्नुहोस् र सोही समयमा सारांशलाई हेर्नुहोस्।"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"पर्दा पिन गर्नाले एकल दृश्यमा प्रदर्शन बन्द हुन्छ।\n\nअनपिन गर्न, छुनुहोस् र सारांश पकड्नुहोस्।"</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"होइन, धन्यवाद"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रिन पिन गरियो"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रिन अनपिन गरियो"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"पिन निकाल्नुअघि PIN सोध्नुहोस्"</string>
@@ -1791,6 +1784,7 @@
<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_line_one" msgid="8762708714645352010">"तपाईँको डाउनटाइम समाप्त नभए सम्म"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"एक मिनेटको लागि (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> सम्म)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d मिनेटको लागि (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> सम्म)"</item>
@@ -1810,4 +1804,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> सम्म"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"अनिश्चित"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त पार्नुहोस्"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> मा अर्को अलार्म सम्म"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"अर्को अलार्म सम्म"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1454f6b..0f126d0 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuten"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seconden"</string>
@@ -281,7 +283,7 @@
<string name="permlab_receiveMms" msgid="1821317344668257098">"tekstberichten (MMS) ontvangen"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"Hiermee kan de app MMS-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar uw apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"noodberichten ontvangen"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Hiermee kan de app berichten over noodsituaties ontvangen en verwerken. Deze rechten zijn alleen beschikbaar voor systeemapps."</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Hiermee kan de app berichten over noodsituaties ontvangen en verwerken. Deze toestemming is alleen beschikbaar voor systeemapps."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"infodienstberichten lezen"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Toestaan dat de app infodienstberichten leest die worden ontvangen op uw apparaat. Infodienstberichten worden verzonden naar bepaalde locaties om u te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van uw apparaat verstoren wanneer een infodienstbericht wordt ontvangen."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"SMS-berichten verzenden"</string>
@@ -317,7 +319,7 @@
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"activiteitstacks beheren"</string>
<string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Hiermee kan de app de activiteitstacks waarin andere apps worden uitgevoerd, toevoegen, verwijderen en aanpassen. Schadelijke apps kunnen de werking van andere apps verstoren."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"elke activiteit starten"</string>
- <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Toestaan dat de app elke activiteit start, ongeacht rechtenbeveiliging of geëxporteerde status."</string>
+ <string name="permdesc_startAnyActivity" msgid="997823695343584001">"Toestaan dat de app elke activiteit start, ongeacht toestemmingsbeveiliging of geëxporteerde status."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"schermcompatibiliteit instellen"</string>
<string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Toestaan dat de app de schermcompatibiliteitsmodus van andere apps beheert. Schadelijke apps kunnen het gedrag van andere apps verstoren."</string>
<string name="permlab_setDebugApp" msgid="3022107198686584052">"foutopsporing in apps inschakelen"</string>
@@ -351,7 +353,7 @@
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"huidige appgegevens ophalen"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"De houder kan hiermee persoonlijke gegevens ophalen over de applicatie die momenteel op de voorgrond wordt weergegeven."</string>
<string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"alle startende apps bijhouden en beheren"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Hiermee kan de app de manier bijhouden en beheren waarop het systeem activiteiten start. Schadelijke apps kunnen het systeem volledig in gevaar brengen. Deze machtiging is alleen voor ontwikkeling vereist, nooit voor normaal gebruik."</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Hiermee kan de app de manier bijhouden en beheren waarop het systeem activiteiten start. Schadelijke apps kunnen het systeem volledig in gevaar brengen. Deze toestemming is alleen voor ontwikkeling vereist, nooit voor normaal gebruik."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"melding verzenden dat pakket is verwijderd"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Hiermee kan de app een melding verzenden dat een app-pakket is verwijderd. Schadelijke apps kunnen dit gebruiken om andere actieve apps af te sluiten."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"melding over ontvangen SMS-bericht verzenden"</string>
@@ -441,7 +443,7 @@
<string name="permlab_getPackageSize" msgid="7472921768357981986">"opslagruimte van app meten"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Hiermee kan de app de bijbehorende code, gegevens en cachegrootten ophalen."</string>
<string name="permlab_installPackages" msgid="2199128482820306924">"apps rechtstreeks installeren"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"Hiermee kan de app nieuwe of bijgewerkte Android-pakketten installeren. Schadelijke apps kunnen hiermee nieuwe apps toevoegen met willekeurig belangrijke rechten."</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Hiermee kan de app nieuwe of bijgewerkte Android-pakketten installeren. Schadelijke apps kunnen hiermee nieuwe apps toevoegen met willekeurig belangrijke machtigingen."</string>
<string name="permlab_clearAppCache" msgid="7487279391723526815">"alle cachegegevens van app verwijderen"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Hiermee kan de app opslagruimte op de tablet vrij maken door bestanden te verwijderen uit de cachemappen van andere apps. Hierdoor worden andere apps mogelijk langzamer gestart, omdat ze gegevens opnieuw moeten ophalen."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Hiermee kan de app opslagruimte op de telefoon vrij maken door bestanden te verwijderen uit de cachemappen van andere apps. Hierdoor worden andere apps mogelijk langzamer gestart, omdat ze gegevens opnieuw moeten ophalen."</string>
@@ -455,14 +457,14 @@
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"vertrouwde inloggegevens beheren"</string>
<string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Hiermee kan de app CA-certificaten installeren en verwijderen als vertrouwde inloggegevens."</string>
<string name="permlab_bindJobService" msgid="3637568367978271086">"geplande achtergrondwerkzaamheden van de app uitvoeren"</string>
- <string name="permdesc_bindJobService" msgid="3473288460524119838">"Met dit recht kan het Android-systeem de app op de achtergrond uitvoeren wanneer dit wordt gevraagd."</string>
+ <string name="permdesc_bindJobService" msgid="3473288460524119838">"Met deze toestemming kan het Android-systeem de app op de achtergrond uitvoeren wanneer dit wordt gevraagd."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"lezen/schrijven naar bronnen van diag"</string>
<string name="permdesc_diagnostic" msgid="6608295692002452283">"Hiermee kan de app lezen en schrijven naar elke bron die hoort bij de diagnostische groep, zoals bestanden in /dev. Hierdoor kan de systeemstabiliteit en -veiligheid worden beïnvloed. Dit mag ALLEEN worden gebruikt voor hardwarespecifieke diagnostiek door de fabrikant of provider."</string>
<string name="permlab_changeComponentState" msgid="6335576775711095931">"componenten van apps in- of uitschakelen"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Hiermee kan de app wijzigen of een component van een andere app wel of niet is ingeschakeld. Schadelijke apps kunnen dit gebruiken om belangrijke tabletfuncties uit te schakelen. U moet voorzichtig omgaan met deze rechten, aangezien het mogelijk is dat onderdelen van apps onbruikbaar, inconsistent of instabiel worden."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Hiermee kan de app wijzigen of een component van een andere app wel of niet is ingeschakeld. Schadelijke apps kunnen dit gebruiken om belangrijke telefoonfuncties uit te schakelen. U moet voorzichtig omgaan met deze rechten, aangezien het mogelijk is dat onderdelen van apps onbruikbaar, inconsistent of instabiel worden."</string>
- <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"rechten verlenen of intrekken"</string>
- <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Toestaan dat een app specifieke rechten aan zichzelf of andere apps verleent of deze intrekt. Schadelijke apps kunnen dit gebruiken om toegang te krijgen tot functies waartoe u de apps geen toegang heeft gegeven."</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Hiermee kan de app wijzigen of een component van een andere app wel of niet is ingeschakeld. Schadelijke apps kunnen dit gebruiken om belangrijke tabletfuncties uit te schakelen. U moet voorzichtig omgaan met deze toestemming, aangezien het mogelijk is dat onderdelen van apps onbruikbaar, inconsistent of instabiel worden."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Hiermee kan de app wijzigen of een component van een andere app wel of niet is ingeschakeld. Schadelijke apps kunnen dit gebruiken om belangrijke telefoonfuncties uit te schakelen. U moet voorzichtig omgaan met deze toestemming, aangezien het mogelijk is dat onderdelen van apps onbruikbaar, inconsistent of instabiel worden."</string>
+ <string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"machtigingen verlenen of intrekken"</string>
+ <string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Toestaan dat een app specifieke machtigingen aan zichzelf of andere apps verleent of deze intrekt. Schadelijke apps kunnen dit gebruiken om toegang te krijgen tot functies waartoe u de apps geen toegang heeft gegeven."</string>
<string name="permlab_setPreferredApplications" msgid="8463181628695396391">"voorkeursapps instellen"</string>
<string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Hiermee kan de app uw voorkeursapps aanpassen. Schadelijke apps kunnen de apps die worden uitgevoerd zonder uw medeweten wijzigen om uw bestaande apps te imiteren en privégegevens van u te verzamelen."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"systeeminstellingen aanpassen"</string>
@@ -575,8 +577,8 @@
<string name="permdesc_vibrate" msgid="6284989245902300945">"Hiermee kan de app de trilstand beheren."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"zaklamp bedienen"</string>
<string name="permdesc_flashlight" msgid="6522284794568368310">"Hiermee kan de app de zaklamp bedienen."</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"voorkeuren en rechten voor USB-apparaten beheren"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"Hiermee kan de app voorkeuren en rechten voor USB-apparaten beheren."</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"voorkeuren en machtigingen voor USB-apparaten beheren"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Hiermee kan de app voorkeuren en machtigingen voor USB-apparaten beheren."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"MTP-protocol implementeren"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Staat toegang tot de kernel van de MTP-driver toe voor het implementeren van het MTP-USB-protocol."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"hardware testen"</string>
@@ -595,7 +597,7 @@
<string name="permlab_checkinProperties" msgid="7855259461268734914">"toegang tot checkin-eigenschappen"</string>
<string name="permdesc_checkinProperties" msgid="4024526968630194128">"Hiermee beschikt de app over lees-/schrijftoegang tot eigenschappen die door de checkin-service zijn geüpload. Niet voor gebruik door normale apps."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"widgets kiezen"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"Hiermee kan de app het systeem laten weten welke widgets door welke app kunnen worden gebruikt. Een app met deze rechten kan andere apps toegang verlenen tot persoonlijke gegevens. Dit wordt niet gebruikt door normale apps."</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Hiermee kan de app het systeem laten weten welke widgets door welke app kunnen worden gebruikt. Een app met deze toestemming kan andere apps toegang verlenen tot persoonlijke gegevens. Dit wordt niet gebruikt door normale apps."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"telefoonstatus wijzigen"</string>
<string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Hiermee kan de app de telefoonfuncties van het apparaat beheren. Een app met deze toestemming kan schakelen tussen netwerken, kan de radio van de telefoon in- en uitschakelen en dergelijke acties uitvoeren zonder dat u hiervan op de hoogte wordt gesteld."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"telefoonstatus en -identiteit lezen"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Hiermee kan de app het cachebestandssysteem lezen en schrijven."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP-oproepen plaatsen/ontvangen"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Toestaan dat de app SIP-oproepen plaatst en ontvangt."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"nieuwe telecom-sim-verbindingen registreren"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Hiermee kan de app nieuwe telecom-sim-verbindingen registreren."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"nieuwe telecomverbindingen registreren"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Hiermee kan de app nieuwe telecomverbindingen registreren."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telecomverbindingen beheren"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Hiermee kan de app telecomverbindingen beheren."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interactie met scherm in actieve oproep"</string>
@@ -1035,8 +1033,8 @@
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"Hiermee kan de app berichten toevoegen aan de inbox van uw voicemail."</string>
<string name="permlab_readVoicemail" msgid="8415201752589140137">"voicemail lezen"</string>
<string name="permdesc_readVoicemail" msgid="8926534735321616550">"Hiermee kan de app uw voicemails lezen."</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"geolocatierechten voor browser aanpassen"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Hiermee kan de app de geolocatierechten van de browser aanpassen. Schadelijke apps kunnen dit gebruiken om locatiegegevens te verzenden naar willekeurige websites."</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"geolocatiemachtigingen voor browser aanpassen"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Hiermee kan de app de geolocatiemachtigingen van de browser aanpassen. Schadelijke apps kunnen dit gebruiken om locatiegegevens te verzenden naar willekeurige websites."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"pakketten controleren"</string>
<string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Hiermee kan de app controleren of een pakket kan worden geïnstalleerd."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"koppelen aan pakketcontroleprogramma"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Blijf \'Terug\' en \'Overzicht\' tegelijk aanraken om dit scherm los te maken."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Blijf \'Overzicht\' aanraken om dit scherm los te maken."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Scherm is vastgezet. Losmaken is niet toegestaan door uw organisatie."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Scherm vastzetten?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Met scherm vastzetten wordt het beeldscherm vergrendeld op één weergave.\n\nBlijf \'Terug\' en \'Overzicht\' tegelijk aanraken om het scherm los te maken."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Met scherm vastzetten wordt het beeldscherm vergrendeld op één weergave.\n\nBlijf \'Overzicht\' aanraken om het scherm los te maken."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEE, BEDANKT"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Scherm vastgezet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Scherm losgemaakt"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vragen om pincode voordat items worden losgemaakt"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vragen om ontgrendelingspatroon voordat items worden losgemaakt"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vragen om wachtwoord voordat items worden losgemaakt"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Accubesparing beperkt de prestaties van uw apparaat, de trilfunctie en de meeste achtergrondgegevens om de accuduur te verlengen.\n\nAccubesparing wordt automatisch uitgeschakeld wanneer uw apparaat wordt opgeladen."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Accubesparing beperkt de prestaties van uw apparaat, de trilfunctie en de meeste achtergrondgegevens om de accuduur te verlengen. Uw e-mail, online berichten en andere apps die gebruik maken van synchronisatie worden niet geüpdatet totdat u deze opent.\n\nAccubesparing wordt automatisch uitgeschakeld wanneer uw apparaat wordt opgeladen."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Totdat uw downtime eindigt om <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Eén minuut (tot <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d minuten (tot <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Tot <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Voor onbepaalde tijd"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Samenvouwen"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 7e97987..d81f0f0 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Pozwala aplikacji na odczyt i zapis w systemie plików pamięci podręcznej."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"wykonywanie/odbieranie połączeń SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Pozwala aplikacji na wykonywanie i odbieranie połączeń SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"rejestrowanie nowych połączeń telekomunikacyjnych SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Zezwala aplikacji na rejestrowanie nowych połączeń telekomunikacyjnych SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"rejestrowanie nowych połączeń telekomunikacyjnych"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Zezwala aplikacji na rejestrowanie nowych połączeń telekomunikacyjnych."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"zarządzanie połączeniami telekomunikacyjnymi"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Zezwala aplikacji na zarządzanie połączeniami telekomunikacyjnymi."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcje z ekranem połączenia"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Aby odpiąć ten ekran, naciśnij i przytrzymaj jednocześnie Wstecz i Przegląd."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Aby odpiąć ten ekran, naciśnij i przytrzymaj Przegląd."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekran jest przypięty. Ustawienia organizacji nie pozwalają go odpiąć."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Przypiąć ekran?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Przypięcie ekranu powoduje zablokowanie wyświetlacza w jednym widoku.\n\nAby odpiąć ekran, naciśnij i przytrzymaj jednocześnie Wstecz i Przegląd."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Przypięcie ekranu powoduje zablokowanie wyświetlacza w jednym widoku.\n\nAby odpiąć ekran, naciśnij i przytrzymaj Przegląd."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NIE, DZIĘKUJĘ"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"TAK"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran przypięty"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran odpięty"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Aby odpiąć, poproś o PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Aby odpiąć, poproś o wzór odblokowania"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Aby odpiąć, poproś o hasło"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza aktywność urządzenia, w tym wibracje i przetwarzanie większości danych w tle. Poczta, SMS i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza aktywność urządzenia, w tym wibracje i przetwarzanie większości danych w tle. Poczta, czat i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Do zakończenia przestoju o <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Przez minutę (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Przez %1$d min (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Na czas nieokreślony"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zwiń"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index acdd6f8..7df167b 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite à aplicação ler e escrever no sistema de ficheiros da cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"efetuar/receber chamadas SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que a aplicação efetue e receba chamadas SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registar novas ligações SIM de telecomunicações"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite que a aplicação registe novas ligações SIM de telecomunicações."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registar novas ligações de telecomunicações"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite que a aplicação registe novas ligações de telecomunicação."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gerir ligações de telecomunicação"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite que a aplicação faça a gestão das ligações de telecomunicação."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagir com o ecrã durante uma chamada"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Para soltar este ecrã, toque sem soltar em Retroceder e Visão geral em simultâneo."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para soltar este ecrã, toque sem soltar em Visão geral."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"O ecrã está fixo. A sua entidade não o(a) autoriza a soltá-lo."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Pretende utilizar a fixação do ecrã?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"A fixação do ecrã bloqueia o ecrã numa vista única.\n\nPara soltar, toque sem soltar em Retroceder e Visão geral em simultâneo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A fixação do ecrã bloqueia o ecrã numa vista única.\n\nPara soltar, toque sem soltar em Visão geral."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NÃO, OBRIGADO"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ecrã fixo"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ecrã solto"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de soltar"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir palavra-passe antes de soltar"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Para ajudar a melhorar a duração da bateria, a poupança de bateria reduz o desempenho do dispositivo e limita a vibração e a maior parte dos dados de segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização não podem ser atualizados, exceto se os abrir.\n\nA poupança de bateria desliga-se automaticamente quando o dispositivo estiver a carregar."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Até o período de inatividade terminar às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Durante um minuto (até às <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidamente"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Reduzir"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 6c77afb..34caf99 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -1772,11 +1774,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Para liberar esta tela, toque e mantenha pressionados \"Voltar\" e \"Visão geral\" ao mesmo tempo."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para liberar esta tela, toque e mantenha pressionado \"Visão geral\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"A tela está fixada. A liberação não é permitida por sua organização."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Usar fixação de tela?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"A fixação de tela bloqueia a tela em uma visualização única.\n\nPara liberar a tela, toque e mantenha pressionados \"Voltar\" e \"Visão geral\" ao mesmo tempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A fixação de tela bloqueia a tela em uma visualização única.\n\nPara liberar a tela, toque e mantenha pressionado \"Visão geral\"."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NÃO, OBRIGADO"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Tela liberada"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de liberar"</string>
@@ -1784,6 +1781,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir senha antes de liberar"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Para ajudar a melhorar a vida útil da bateria, a economia de bateria reduz o desempenho do dispositivo e restringe a vibração e a maioria dos dados em segundo plano. É possível que apps de e-mail, mensagens, entre outros que dependem de sincronização não sejam atualizados a menos que sejam abertos.\n\nA economia de bateria é desativada automaticamente quando o dispositivo estiver carregando."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Até o período de inatividade terminar às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<!-- no translation found for zen_mode_duration_minutes_summary:one (3177683545388923234) -->
<!-- no translation found for zen_mode_duration_minutes_summary:other (2787867221129368935) -->
<!-- no translation found for zen_mode_duration_hours_summary:one (597194865053253679) -->
@@ -1801,4 +1800,8 @@
<string name="zen_mode_forever" msgid="4316804956488785559">"Indefinidamente"</string>
<!-- no translation found for toolbar_collapse_description (2821479483960330739) -->
<skip />
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index a602257..5f47938 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> (de) min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Permite aplicaţiei să scrie şi să citească sistemul de fişiere cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"efectuarea/primirea apelurilor SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Permite aplicației să efectueze și să primească apeluri SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"se înregistrează conexiuni noi de telecomunicații pentru SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Permite aplicației să înregistreze conexiuni noi de telecomunicații pentru SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"se înregistrează conexiuni noi de telecomunicații"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Permite aplicației să înregistreze conexiuni noi de telecomunicații."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"gestionarea conexiunilor de telecomunicații"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Permite aplicației să gestioneze conexiuni de telecomunicații."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interacțiune cu ecranul în timpul unui apel"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Pentru a anula fixarea pe ecran, apăsați lung, simultan, pe Înapoi și pe Vizualizare generală."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pentru a anula fixarea pe ecran, apăsați lung pe Vizualizare generală."</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="4120623404152035221">"Fixarea pe ecran blochează afișarea într-o singură vizualizare.\n\nPentru a anula fixarea, apăsați lung, simultan, pe Înapoi și pe Vizualizare generală."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Fixarea pe ecran blochează afișarea într-o singură vizualizare.\n\nPentru a anula fixarea, apăsați lung pe Vizualizare generală."</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>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Fixarea ecranului anulată"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicită codul PIN înainte de a anula fixarea"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicită parola înainte de a anula fixarea"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Pentru a ajuta la îmbunătățirea duratei bateriei, modul Economisirea bateriei reduce performanțele dispozitivului și limitează vibrațiile și majoritatea datelor de fundal. Mesajele prin e-mail și alte aplicații care se bazează pe sincronizare nu se vor actualiza dacă nu le deschideți.\n\nEconomisirea baterie se dezactivează automat când dispozitivul se încarcă."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Până când inactivitatea dvs. se încheie la <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Până la finalizarea perioadei de inactivitate"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Timp de un minut (până la <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Timp de %1$d (de) minute (până la <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Până la <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Nedefinit"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Restrângeți"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Până la alarma următoare, la <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Până la alarma următoare"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 3f67e8f..7ee4604 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Приложение сможет выполнять чтение и запись в файловую систему кеша."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"Входящие и исходящие вызовы SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Разрешить вызовы по протоколу SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"регистрация новых SIM-карт"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Регистрация новых SIM-карт."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"регистрация новых операторов связи"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Регистрация новых операторов связи."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"управление подключениями"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Управление сетевыми подключениями."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"Управление экраном во время разговора"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Чтобы открепить экран, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\" одновременно."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Чтобы открепить экран, нажмите и удерживайте кнопку \"Обзор\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Блокировка включена. Ее отключение запрещено правилами организации."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Использовать блокировку в приложении?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Функция блокировки в приложении позволяет зафиксировать текущий экран.\n\nЧтобы снять блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\" одновременно."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Функция блокировки в приложении позволяет зафиксировать текущий экран.\n\nЧтобы снять блокировку, нажмите и удерживайте кнопку \"Обзор\"."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Запрашивать PIN-код для отключения блокировки"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"На 1 мин. (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"На %1$d мин. (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Бессрочно"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Свернуть"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index 75347d5..d686a64 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
<string name="durationMinutes" msgid="3134226679883579347">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
<string name="durationSeconds" msgid="8050088505238241405">"තත් <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
@@ -1773,11 +1775,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"මෙම තීරයේ ඇමුණුම ඉවත් කිරීමට, Back සහ Overview එකම වේලාවේ ස්පර්ශ කර අල්ලා සිටින්න."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"මෙම තීරයේ ඇමුණුම ඉවත් කිරීමට, Overview ස්පර්ශ කර අල්ලා සිටින්න."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"තිරය අගුළු දමා ඇත. ඔබගේ සංවිධානය විසින් අගුළු ඇරීමට ඉඩ නොදෙයි."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"තිරය අගුළු දැමීම භාවිත කරනවාද?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"තනි පෙනුම තුළ දර්ශනය තීර ඇමුණුමෙන් අගුළු දමයි.\n\nඇමුණුම ඉවත් කිරීමට, Back සහ Overview එකම වේලාවේ ස්පර්ශ කර අල්ලා සිටින්න."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"තනි පෙනුම තුළ දර්ශනය තීර ඇමුණුමෙන් අගුළු දමයි.\n\nඇමුණුම ඉවත් කිරීමට, Overview ස්පර්ශ කර අල්ලා සිටින්න."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ගැලවීමට පෙර PIN විමසන්න"</string>
@@ -1785,6 +1782,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"මිනිත්තු එකක් සඳහා (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> තෙක්)"</item>
<item quantity="other" msgid="2787867221129368935">"මිනිත්තු %1$d සඳහා (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> තෙක්)"</item>
@@ -1804,4 +1803,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> තෙක්"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"අනියත ආකාරයට"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"හකුළන්න"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 5567ccd..a8c31eb 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Umožňuje aplikácii čítať a zapisovať do súborového systému vyrovnávacej pamäte."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"uskutočňovanie/príjem hovorov SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Umožňuje aplikácii uskutočňovať a prijímať hovory SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrácia nových pripojení telekomunikačnej siete SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Povoľuje aplikácii registrovať nové pripojenia telekomunikačnej siete SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrácia nových pripojení telekomunikačnej siete"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Povoľuje aplikácii registrovať nové pripojenia telekomunikačnej siete."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"správa pripojení telefonických sietí"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Povoľuje aplikácii spravovať pripojenia telekomunikačnej siete."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcia s obrazovkou hovoru"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Ak chcete uvoľniť túto obrazovku, súčasne klepnite na tlačidlá Späť a Prehľad a podržte ich."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ak chcete uvoľniť túto obrazovku, klepnite na tlačidlo Prehľad a podržte ho."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Obrazovka je pripnutá. Uvoľnenie vaša organizácia nepovoľuje."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Použiť pripnutie k obrazovke?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pripnutie obrazovky uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, súčasne klepnite na tlačidlá Späť a Prehľad a podržte ich."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripnutie obrazovky uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, klepnite na tlačidlo Prehľad a podržte ho."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NIE, ĎAKUJEM"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"SPUSTIŤ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka bola pripnutá"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka bola uvoľnená"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pred uvoľnením požiadať o číslo PIN"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred uvoľnením požiadať o heslo"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Na predĺženie výdrže batérie šetrič batérie znižuje výkonnosť zariadenia a obmedzuje vibrácie a prenos údajov na pozadí. E-mail, správy a ďalšie aplikácie, ktoré používajú synchronizáciu, sa možno nebudú aktualizovať, dokiaľ ich neotvoríte.\n\nPri nabíjaní zariadenia sa šetrič batérie automaticky vypne."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Dokým o <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> neskončí výpadok"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Kým skončí vaša odstávka"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Na minútu (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Na %1$d min. (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Natrvalo"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Zbaliť"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Do ďalšieho budíka o <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Do ďalšieho budíka"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 0af2557..246de04 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Aplikaciji omogoča branje in pisanje v datotečni sistem predpomnilnika."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"opravljanje/sprejemanje klicev SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Aplikaciji omogoča opravljanje in sprejemanje klicev SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registriranje novih telekomunikacijskih povezav s kartico SIM"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Aplikaciji omogoča registriranje novih telekomunikacijskih povezav s kartico SIM."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registriranje novih telekomunikacijskih povezav"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Aplikaciji omogoča registriranje novih telekomunikacijskih povezav."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"upravljanje telekomunikacijskih povezav"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Aplikaciji omogoča upravljanje telekomunikacijskih povezav."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcija z zaslonom pri klicu"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Če želite odpeti ta zaslon, se hkrati dotaknite tipk Nazaj in Pregled ter ju pridržite."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Če želite odpeti ta zaslon, se dotaknite tipke Pregled in jo pridržite."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Zaslon je pripet. Vaša organizacija ne dovoli odpenjanja."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Želite uporabljati pripenjanje zaslona?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se hkrati dotaknite tipk Nazaj in Pregled ter ju pridržite."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se dotaknite tipke Pregled in jo pridržite."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NE, HVALA"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ZAŽENI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pripet"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je odpet"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pred odpenjanjem vprašaj za PIN"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred odpenjanjem vprašaj za geslo"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Varčevanje z energijo akumulatorja poveča čas delovanja akumulatorja, tako da zmanjša zmogljivost delovanja naprave in omeji vibriranje ter prenos večine podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo se samodejno izklopi med polnjenjem akumulatorja naprave."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Do konca prekinitve delovanja ob <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Eno minuto (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Toliko minut: %1$d (do <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Za nedoločen čas"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Strni"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 801d3cc..e554734 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Дозвољава апликацији да чита систем датотека кеша и уписује податке у њега."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"упућивање/пријем SIP позива"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Омогућава апликацији да упућује и прима SIP позиве."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"региструје нове везе са телекомуникационим мрежама преко SIM картице"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Дозвољава апликацији да региструје нове везе са телекомуникационим мрежама преко SIM картице."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"региструје нове везе са телекомуникационим мрежама"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Дозвољава апликацији да региструје нове везе са телекомуникационим мрежама."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"управљање везама са телекомуникационим мрежама"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Дозвољава апликацији да управља везама са телекомуникационим мрежама."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"комуницирај са екраном током позива"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Да бисте откачили овај екран, истовремено додирните и задржите Назад и Преглед."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Да бисте откачили овај екран, додирните и задржите Преглед."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Екран је закачен. Ваша организација не дозвољава откачињање."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Желите ли да користите качење екрана?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Качење екрана закључава екран и задржава исти приказ.\n\nДа бисте га откачили, истовремено додирните и задржите Назад и Преглед."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Качење екрана закључава екран и задржава исти приказ.\n\nДа бисте га откачили, додирните и задржите Преглед."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Тражи PIN пре откачињања"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Један минут (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d минута (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Бесконачно"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Скупи"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 7c63a4f..f8338df 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuter"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekunder"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Tillåter att appen läser och skriver till cachefilsystemet."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"gör/ta emot SIP-anrop"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Tillåter att appen gör och tar emot SIP-anrop."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrera nya telekommunikationsanslutningar för SIM-kortet"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Tillåter att appen registrerar nya telekommunikationsanslutningar för SIM-kortet."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"registrera nya telekommunikationsanslutningar"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Tillåter att appen registrerar nya telekommunikationsanslutningar."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"hantera telekommunikationsanslutningar"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Tillåter att appen hanterar telekommunikationsanslutningar."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interagera med skärmen för inkommande samtal"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Om du vill lossa skärmen trycker du länge på Tillbaka och Översikt samtidigt."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Om du vill lossa skämen trycker du länge på Översikt."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skärmen är fäst. Din organisation tillåter inte att du avslutar läget."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Fäst skärmen?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"När du fäster skärmen blir den låst i en viss vy.\n\nOm du vill lossa den trycker du länge på Tillbaka och Översikt samtidigt."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"När du fäster skärmen blir den låst i en viss vy.\n\nOm du vill lossa den trycker du länge på Översikt."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"NEJ TACK"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"STARTA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skärmen är fäst"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skärmen är inte längre fäst"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Be om pinkod innan skärmen slutar fästas"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Be om upplåsningsmönster innan skärmen slutar fästas"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Be om lösenord innan skärmen slutar fästas"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre, och vibration samt den mesta användningen av bakgrundsdata begränsas. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre, och vibration samt den mesta användningen av bakgrundsdata begränsas. Det kan hända att appar för e-post, chatt och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Tills avbrottstiden är slut <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"I en minut (till kl. <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"I %1$d minuter (till kl. <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Till kl. <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"För alltid"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Komprimera"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 3bf0466..a12707c 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string>
<string name="durationMinutes" msgid="3134226679883579347">"Dakika <xliff:g id="MINUTES">%1$d</xliff:g>"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string>
<string name="durationSeconds" msgid="8050088505238241405">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Huruhusu programu kusoma na kuandika mfumo wa faili wa akiba."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"piga/pokea simu za SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ruhusu programu ipige na kupokea simu za SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"andikisha miunganisho mipya ya SIM ya mawasiliano ya simu"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Huruhusu programu kuandikisha miunganisho mipya ya SIM ya mawasiliano ya simu."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"andikisha miunganisho mipya ya mawasiliano ya simu"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Huruhusu programu kuandikisha miunganisho mipya ya mawasiliano ya simu."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"dhibiti miunganisho ya mawasiliano ya simu"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Huruhusu programu kudhibiti miunganisho ya mawasiliano ya simu."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"wezesha mwingiliano na skrini ya simu inayoingia"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Ili ubanue skrini hii, gusa na ushikilie Nyuma na Muhtasari kwa wakati mmoja."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ili ubanue skrini hii, gusa na ushikilie Muhtasari."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skrini imebandikwa. Ubanduaji hauruhusiwi na shirika lako."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Ungependa kutumia ubandikaji skrini?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ubandikaji skrini hufunga skrini kwenye onyesho moja.\n\nIli uibanue, gusa na ushikilie Nyuma na Muhtasari kwa wakati mmoja."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ubandikaji skrini hufunga skrini kwenye onyesho moja. \n\nIli uibanue, gusa na ushikilie Muhtasari."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"HAPANA, ASANTE"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ANZA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skrini imebandikwa"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Skrini imebanduliwa"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Omba PIN kabla hujabandua"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Omba nenosiri kabla hujabandua"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Ili kusaidia kuokoa muda wa matumizi wa betri, kiokoa betri hupunguza utendaji wa kifaa chako na kuzuia kutetema na data nyingi ya chinichini. Barua pepe, kutuma ujumbe na programu zingine zinazotegemea usawazishaji huenda hazitasasisha usipozifungua.\n\nKiokoa betri hujizima kiotomatiki kifaa chako kikianza kuchajiwa."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Hadi <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> wakati wa kutotenda kazi kwa kifaa chako unapoisha"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Kwa dakika moja (hadi <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Kwa dakika %1$d (hadi <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Hadi <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Bila kikomo"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Kunja"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 1306712..5e55f1b 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ம.நே. <xliff:g id="MINUTES">%2$d</xliff:g> நிமி."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> மநே <xliff:g id="MINUTES">%2$d</xliff:g> நிமி"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமிடங்கள்"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> வினாடிகள்"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"தற்காலிகச் சேமிப்பு கோப்பு அமைப்பைப் படிக்க மற்றும் எழுத, பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP அழைப்புகளைச் செய்தல்/பெறுதல்"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP அழைப்புகளைச் செய்ய/பெற, பயன்பாட்டை அனுமதிக்கிறது."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்தல்"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"புதிய நிறுவன சிம் இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"புதிய நிறுவன இணைப்புகளைப் பதிவுசெய்தல்"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"புதிய தொலைத்தொடர்பு இணைப்புகளைப் பதிவுசெய்ய, பயன்பாட்டை அனுமதிக்கும்."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகி"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"தொலைத்தொடர்பு இணைப்புகளை நிர்வகிக்க, பயன்பாட்டை அனுமதிக்கும்."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"உள்வரும் அழைப்பிற்கான திரையுடன் ஊடாடுதல்"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"இந்தத் திரையை விலக்க, பின் மற்றும் மேலோட்டப் பார்வையை ஒரே நேரத்தில் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"இந்தத் திரையை விலக்க, மேலோட்டப் பார்வையைத் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"திரை பின் செய்யப்பட்டது. பின்னை அகற்ற உங்கள் நிறுவனம் ஆதரிக்கவில்லை."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"திரையை பின் செய்தலைப் பயன்படுத்தவா?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"திரை பொருத்துதல், ஒரே காட்சியில் தோன்றுமாறு திரையைப் பூட்டும்.\n\nஅதை விலக்க, பின் மற்றும் மேலோட்டப் பார்வையை ஒரே நேரத்தில் தொட்டுப் பிடித்திருக்கவும்."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"திரை பொருத்துதல், ஒரே காட்சியில் தோன்றுமாறு திரையைப் பூட்டும்.\n\nஅதை விலக்க, மேலோட்டப் பார்வையைத் தொட்டுப் பிடித்திருக்கவும்."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"அகற்றும் முன் PINஐக் கேள்"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ஒரு நிமிடத்திற்கு (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> வரை)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d நிமிடங்களுக்கு (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> வரை)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> வரை"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"வரையறையற்றது"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"சுருக்கு"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index d33ee75..de434ca 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమిషాలు"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> సెకన్లు"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"కాష్ ఫైల్‌సిస్టమ్‌ను చదవడానికి మరియు వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP కాల్‌లను చేయడానికి/స్వీకరించడానికి"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP కాల్‌లను చేయడానికి మరియు స్వీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడం"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"కొత్త టెలికామ్ SIM కనెక్షన్‌లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడం"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"కొత్త టెలికామ్ కనెక్షన్‌లను నమోదు చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"టెలికామ్ కనెక్షన్‌లను నిర్వహించడం"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"టెలికామ్ కనెక్షన్‌లను నిర్వహించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ఇన్-కాల్ స్క్రీన్‌తో పరస్పర చర్య చేయడం"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"ఈ స్క్రీన్‌ను అన్‌పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్‌లను ఒకేసారి నొక్కి, ఉంచండి."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ఈ స్క్రీన్‌ని అన్‌పిన్ చేయడానికి, అవలోకనం నొక్కి, ఉంచండి."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"స్క్రీన్ పిన్ చేయబడింది. మీ సంస్థలో అన్‌పిన్ చేయడానికి అనుమతి లేదు."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"స్క్రీన్ పిన్నింగ్‌ను ఉపయోగించాలా?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్‌ప్లేను లాక్ చేస్తుంది.\n\nఅన్‌పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్‌లను ఒకేసారి నొక్కి, ఉంచండి."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్‌ప్లేను లాక్ చేస్తుంది.\n\nఅన్‌పిన్ చేయడానికి, అవలోకనం నొక్కి, ఉంచండి."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"అన్‌పిన్ చేయడానికి ముందు పిన్‌ కోసం అడుగు"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ఒక నిమిషం పాటు (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> వరకు)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d నిమిషాల పాటు (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> వరకు)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> వరకు"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"నిరవధికంగా"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"కుదించండి"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index a788389..a4e2662 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"อนุญาตให้แอปพลิเคชันอ่านและเขียนระบบไฟล์แคช"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"โทร/รับสาย SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"อนุญาตให้แอปโทรและรับสาย SIP"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"ลงทะเบียนการเชื่อมต่อซิมโทรคมนาคมใหม่"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"อนุญาตให้แอปลงทะเบียนการเชื่อมต่อซิมโทรคมนาคมใหม่"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"ลงทะเบียนการเชื่อมต่อโทรคมนาคมใหม่"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"อนุญาตให้แอปลงทะเบียนการเชื่อมต่อโทรคมนาคมใหม่"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"จัดการการเชื่อมต่อโทรคมนาคม"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"อนุญาตให้แอปจัดการการเชื่อมต่อโทรคมนาคม"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"โต้ตอบกับหน้าจอขณะกำลังใช้สาย"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"หากต้องการเลิกตรึงหน้าจอนี้ แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้พร้อมกัน"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"หากต้องการเลิกตรึงหน้าจอ แตะ \"ภาพรวม\" ค้างไว้"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ตรึงหน้าจอแล้ว องค์กรของคุณไม่อนุญาตให้เลิกตรึง"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"ใช้การตรึงหน้าจอไหม"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"การตรึงหน้าจอล็อกหน้าจอให้อยู่ในมุมมองเดียว\n\nหากต้องการเลิกตรึง ให้แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้พร้อมกัน"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"การตรึงหน้าจอล็อกหน้าจอให้อยู่ในมุมมองเดียว\n\nหากต้องการเลิกตรึง ให้แตะ \"ภาพรวม\" ค้างไว้"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ขอ PIN ก่อนเลิกตรึง"</string>
<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="battery_saver_description" msgid="2510530476513605742">"เพื่อให้สามารถใช้แบตเตอรี่ได้ยาวนานขึ้น โหมดประหยัดแบตเตอรี่จะลดการทำงานและการสั่นของอุปกรณ์ รวมถึงการใช้ข้อมูลแบ็กกราวด์เกือบทั้งหมด อีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์อาจไม่อัปเดตจนกว่าคุณจะเปิดใช้\n\nโหมดประหยัดแบตเตอรี่จะปิดอัตโนมัติเมื่อมีการชาร์จอุปกรณ์"</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"จนกว่าจะสิ้นสุดช่วงเวลาที่เครื่องไม่ทำงานในเวลา <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1 นาที (จนถึงเวลา <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d นาที (จนถึงเวลา <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"จนถึงเวลา <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"ไม่มีกำหนด"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"ยุบ"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index dd0db37..7bc0367 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> (na) min"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Pinapayagan ang app na basahin at isulat ang cache filesystem."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"magsagawa/tumanggap ng mga tawag sa SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Pinapayagan ang app na magsagawa at makatanggap ng mga tawag sa SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"magrehistro ng mga bagong koneksyon sa SIM ng telecom"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Pinapayagan ang app na magrehistro ng mga bagong koneksyon sa SIM ng telecom."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"magrehistro ng mga bagong koneksyon sa telecom"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Pinapayagan ang app na magrehistro ng mga bagong koneksyon sa telecom."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"papamahalaan ang mga koneksyon sa telecom"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Pinapayagan ang app na mamahala ng mga koneksyon sa telecom."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"makipag-ugnayan sa in-call na screen"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Upang i-unpin ang screen na ito, pindutin nang matagal ang Bumalik at Overview nang sabay-sabay."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Upang i-unpin ang screen na ito, pindutin nang matagal ang Overview."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Naka-pin ang screen. Hindi pinapayagan ng iyong organisasyon ang pag-a-unpin."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Gamitin ang pagpi-pin ng screen?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Nila-lock ng pagpi-pin ng screen ang display sa iisang view.\n\nUpang i-unpin, pindutin nang matagal ang Bumalik at Overview nang sabay-sabay."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Nila-lock ng pagpi-pin ng screen ang display sa iisang view.\n\nUpang i-unpin, pindutin nang matagal ang Overview."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"HINDI, SALAMAT NA LANG"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"SIMULAN"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Naka-pin ang screen"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Naka-unpin ang screen"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Humingi ng PIN bago mag-unpin"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Humingi ng password bago mag-unpin"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Upang makatulong na mas mapatagal ang baterya, binabawasan ng battery saver ang pagganap ng iyong device at nililimitahan ang pag-vibrate at ang karamihan ng data ng background. Hindi maaaring ma-update ang email, pagmemensahe at iba pang mga app na umaasa sa pagsi-sync maliban kung bubuksan mo ang mga ito.\n\nAwtomatikong mao-off ang battery saver kapag nagcha-charge ang iyong device."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Hanggang sa matapos ang iyong downtime nang <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Hanggang magtapos ang iyong downtime"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Sa loob ng isang minuto (hanggang <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Sa loob ng %1$d (na) minuto (hanggang <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Hanggang <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Walang tiyak na katapusan"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"I-collapse"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Hanggang sa susunod na alarma sa <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Hanggang sa susunod na alarma"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index a828baa..0a1ab7d 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Uygulamaya, önbellek dosya sisteminde okuma ve yazma yapma izni verir."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP çağrıları yapma/alma"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Uygulamanın SIP çağrıları yapmasına ve almasına izin verir."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"yeni telekomünikasyon SIM bağlantılarını kaydettir"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Uygulamanın yeni telekomünikasyon SIM bağlantıları kaydettirmesine izin verir."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"yeni telekomünikasyon bağlantıları kaydettir"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Uygulamanın yeni telekomünikasyon bağlantıları kaydettirmesine izin verir."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telekomunikasyon bağlantılarını yönet"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Uygulamanın telekomünikasyon bağlantılarını yönetmesine izin verir."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"çağrı ekranıyla etkileşimde bulunma"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Bu ekranın sabitlemesini kaldırmak için Geri ve Genel Bakış\'a aynı anda dokunup basılı tutun."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Bu ekranın sabitlemesini kaldırmak için Genel Bakış\'a dokunup basılı tutun."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekran sabitlendi. Kuruluşunuz sabitlemenin kaldırılmasına izin vermiyor."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Ekran sabitleme kullanılsın mı?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ekran sabitleme özelliği, ekranı tek bir görünüme kilitler.\n\nSabitlemeyi kaldırmak için Geri ve Genel Bakış\'a aynı anda dokunup basılı tutun."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ekran sabitleme özelliği, ekranı tek bir görünüme kilitler.\n\nSabitlemeyi kaldırmak için Genel Bakış\'a dokunup basılı tutun."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"HAYIR, TEŞEKKÜRLER"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"BAŞLAT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran sabitlendi"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran sabitlemesi kaldırıldı"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Sabitlemeyi kaldırmadan önce PIN\'i sor"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sabitlemeyi kaldırmadan önce kilit açma desenini sor"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Sabitlemeyi kaldırmadan önce şifre sor"</string>
- <string name="battery_saver_description" msgid="2510530476513605742">"Pil tasarrufu, pilin ömrünü uzatmaya yardımcı olmak amacıyla cihazınızın performansını düşürür ve arka plan verilerini sınırlar. E-posta, mesajlaşma ve senkronizasyona dayalı diğer uygulamalar siz açmadığınız müddetçe güncellenemez. \n\nPil tasarrufu, cihaz şarj olurken otomatik olarak kapanır."</string>
+ <string name="battery_saver_description" msgid="2510530476513605742">"Pil tasarrufu, pilin ömrünü uzatmaya yardımcı olmak amacıyla cihazınızın performansını düşürür ve arka plan verilerini sınırlar. E-posta, anlık mesajlaşma ve senkronizasyona dayalı diğer uygulamalar siz açmadığınız müddetçe güncellenemez. \n\nPil tasarrufu, cihaz şarj olurken otomatik olarak kapanır."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Kesinti süreniz <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> saatinde sona erene kadar"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Bir dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d dakika için (şu saate kadar: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Şu saate kadar: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Süresiz"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Daralt"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 2c038ed..831a03e 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Дозволяє програмі читати з файлової системи кеш-пам’яті та писати в неї."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"здійснювати й отримувати дзвінки через протокол SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Додаток зможе здійснювати й отримувати дзвінки через протокол SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"реєструвати нові телекомунікаційні з’єднання SIM-карт"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Додаток може реєструвати нові телекомунікаційні з’єднання SIM-карт."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"реєструвати нові телекомунікаційні з’єднання"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Додаток може реєструвати нові телекомунікаційні з’єднання."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"керування телекомунікаційними з’єднаннями"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Додаток може керувати телекомунікаційними з’єднаннями."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"взаємодіяти з екраном вхідного дзвінка"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Щоб відкріпити екран, одночасно натисніть і утримуйте кнопки \"Назад\" та \"Огляд\"."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Щоб відкріпити екран, натисніть і утримуйте кнопку \"Огляд\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Екран закріплено. Ваша організація заборонила відкріплювати його."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Увімкнути функцію закріплення екрана?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Функція закріплення екрана блокує дисплей, показуючи один екран.\n\nЩоб відкріпити екран, одночасно натисніть і утримуйте кнопки \"Назад\" та \"Огляд\"."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Функція закріплення екрана блокує дисплей, показуючи один екран.\n\nЩоб відкріпити екран, натисніть і утримуйте кнопку \"Огляд\"."</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Запитувати PIN-код перед відкріпленням"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Одну хвилину (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d хв (до <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"До <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Без обмежень"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Згорнути"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 20ab47e..75e6317 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> سیکنڈ"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"ایپ کو کیش فائل سسٹم پڑھنے اور لکھنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"‏SIP کالز کریں/موصول کریں"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"‏ایپ کو SIP کالز کرنے اور موصول کرنے کی اجازت دیتا ہے۔"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"‏نئے ٹیلی کام SIM کنکشنز رجسٹر کریں"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"‏ایپ کو نئے ٹیلی کام SIM کنکشنز کو رجسٹر کرنے کی اجازت دیتی ہے۔"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"نئے ٹیلی کام کنکشنز رجسٹر کریں"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"ایپ کو نئے ٹیلی کام کنکشنز کو رجسٹر کرنے کی اجازت دیتی ہے۔"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"ٹیلی کام کنکشنز کا نظم کریں"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"ایپ کو ٹیلی کام کنکشنز کا نظم کرنے کی اجازت دیتی ہے۔"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"درون کال اسکرین کے ساتھ تعامل کریں"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"اس اسکرین سے پن ہٹانے کیلئے، واپس جائیں اور مجموعی جائزہ کو ایک ساتھ ٹچ کریں اور دبا کر رکھیں۔"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"اس اسکرین سے پن ہٹانے کیلئے، مجموعی جائزہ کو ٹچ کریں اور دبا کر رکھیں۔"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"اسکرین کو پن کر دیا گیا ہے۔ آپ کی تنظیم کی جانب سے پن ہٹانے کی اجازت نہیں ہے۔"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"اسکرین پننگ کا استعمال کریں؟"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"اسکرین پن کرنا ڈسپلے کو ایک منظر میں مقفل کر دیتا ہے۔\n\nپن ہٹانے کیلئے، واپس جائیں اور مجموعی جائزہ کو ایک ساتھ ٹچ کریں اور دبا کر رکھیں۔"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"اسکرین پن کرنا ڈسپلے کو ایک منظر میں مقفل کر دیتا ہے۔\n\nپن ہٹانے کیلئے، مجموعی جائزہ کو ٹچ کریں اور دبا کر رکھیں۔"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"‏پن ہٹانے سے پہلے PIN طلب کریں"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"ایک منٹ کیلئے (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> تک)"</item>
<item quantity="other" msgid="2787867221129368935">"‏%1$d منٹ کیلئے (<xliff:g id="FORMATTEDTIME">%2$s</xliff:g> تک)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> تک"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"غیر متعینہ"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"سکیڑیں"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 997b316..27622e4 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> daqiqa"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> soniya"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ilova kesh fayl tizimini o‘qishi va unga yozishi mumkin."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP qo‘ng‘iroqlarini amalga oshirish/qabul qilish"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ilovaga SIP qo‘ng‘iroqlarini amalga oshirish va qabul qilish uchun ruxsat beradi."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"yangi SIM kartali telekommunikatsiya aloqalarini ro‘yxatga olish"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ilovaga yangi SIM kartali telekommunikatsiya aloqalarini ro‘yxatga olish uchun ruxsat beradi."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"yangi telekommunikatsiya aloqalarini ro‘yxatga olish"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ilovaga yangi telekommunikatsiya aloqalarini ro‘yxatga olish uchun ruxsat beradi."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"telekommunikatsiya aloqalarini boshqarish"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Ilovaga telekommunikatsiya aloqalarini boshqarish uchun ruxsat beradi."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"suhbat vaqtida ekranni boshqarish"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Ushbu ekrandan chiqish uchun “Orqaga” va “Umumiy nazar” tugmalarini bir vaqtda bosib turing."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ushbu ekrandan chiqish uchun “Umumiy nazar” tugmasini bosib turing."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekran qadab qo‘yildi. Uni bo‘shatishga tashkilotingiz ruxsat bermagan."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Ekranni qadab qo‘yish funksiyasidan foydalanilsinmi?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ekranni qadab qo‘yish funksiyasi ekranni faqat bitta narsa ko‘rinadigan bo‘lib qulflaydi.\n\nUndan chiqish uchun “Orqaga” va “Umumiy nazar” tugmalarini bir vaqtda bosib turing."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ekranni qadab qo‘yish funksiyasi ekranni faqat bitta narsa ko‘rinadigan bo‘lib qulflaydi.\n\nUndan chiqish uchun “Umumiy nazar” tugmasini bosib turing."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"YO‘Q, KERAK EMAS"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"ISHGA TUSHIRISH"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran qadab qo‘yildi"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran bo‘shatildi"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Bo‘shatishdan oldin PIN kod so‘ralsin"</string>
@@ -1783,6 +1776,8 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Bo‘shatishdan oldin parol so‘ralsin"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi va orqa fonda internetdan foydalanishni cheklaydi. Sinxronlanib turishi lozim bo‘lgan e-pochta, xabar almashinuv va boshqa ilovalar esa ishga tushirilmaguncha yangilanmaydi.\n\nQurilmani quvvat oldirish uchun energiya manbayiga ulashingiz bilanoq, quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Tanaffus vaqti tugaguncha – <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Bir daqiqa (ushbu vaqtgacha: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d daqiqa (ushbu vaqtgacha: <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Ushbu vaqtgacha: <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Uzluksiz ravishda"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Yig‘ish"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 178272d..ed7c492 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Cho phép ứng dụng đọc và ghi hệ thống tệp bộ nhớ cache."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"thực hiện/nhận các cuộc gọi qua SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Cho phép ứng dụng thực hiện và nhận các cuộc gọi qua SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"đăng ký kết nối SIM viễn thông mới"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Cho phép ứng dụng đăng ký kết nối SIM viễn thông mới."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"đăng ký kết nối viễn thông mới"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Cho phép ứng dụng đăng ký kết nối viễn thông mới."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"quản lý kết nối viễn thông"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Cho phép ứng dụng quản lý kết nối viễn thông."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"tương tác với màn hình trong cuộc gọi"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Để bỏ khóa màn hình này, chạm và giữ Quay lại và Tổng quan cùng lúc."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Để bỏ khóa màn hình này, chạm và giữ Tổng quan."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Màn hình đã được ghim. Tổ chức của bạn không cho phép bỏ ghim."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Sử dụng ghim màn hình?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Khóa màn hình sẽ khóa hiển thị trong một chế độ xem.\n\nĐể bỏ khóa, chạm và giữ Quay lại và Tổng quan cùng lúc."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Khóa màn hình sẽ khóa hiển thị trong một chế độ xem.\n\nĐể bỏ khóa, chạm và giữ Tổng quan."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"KHÔNG, CẢM ƠN"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"BẮT ĐẦU"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Đã ghim màn hình"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Đã bỏ ghim màn hình"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Hỏi mã PIN trước khi bỏ ghim"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Hỏi mật khẩu trước khi bỏ ghim"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Để giúp tăng tuổi thọ pin, trình tiết kiệm pin sẽ giảm hiệu suất thiết bị của bạn và hạn chế chế rung và hầu hết dữ liệu nền. Email, nhắn tin và các ứng dụng khác dựa trên đồng bộ hóa không thể cập nhật trừ khi bạn mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Cho tới khi thời gian ngừng hoạt động của bạn kết thúc vào <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Cho đến khi thời gian ngừng hoạt động kết thúc"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Trong một phút (cho đến <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Trong %1$d phút (cho đến <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Cho đến <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Không giới hạn"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Thu gọn"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Cho đến lần báo thức tiếp theo vào <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Cho đến lần báo thức tiếp theo"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 10ad4b8..f04ecf6 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"允许应用读取和写入缓存文件系统。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"拨打/接听SIP电话"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允许该应用拨打和接听SIP电话。"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"注册新的电信 SIM 卡连接"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允许该应用注册新的电信 SIM 卡连接。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"注册新的电信网络连接"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允许该应用注册新的电信网络连接。"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"管理电信网络连接"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"允许该应用管理电信网络连接。"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"与通话屏幕互动"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"要取消固定此屏幕,请同时触摸并按住“返回”和“概览”按钮。"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"要取消固定此屏幕,请触摸并按住概览按钮。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"屏幕处于固定状态。您所属的单位不允许取消固定。"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"要固定屏幕吗?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"固定屏幕后,设备会一直显示某一个屏幕。\n\n要取消固定屏幕,请同时触摸并按住“返回”和“概览”按钮。"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"固定屏幕后,设备会一直显示某一个屏幕。\n\n要取消固定屏幕,请触摸并按住概览按钮。"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消时要求输入PIN码"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1 分钟(到<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d 分钟(到<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"到<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"无限期"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收起"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index ee458f2..87d5172 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"允許應用程式讀取及寫入快取檔案系統。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"撥打/接聽 SIP 電話"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允許應用程式撥打及接聽 SIP 電話。"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"註冊新的電訊 SIM 卡連接"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允許應用程式註冊新的電訊 SIM 卡連接。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"註冊新的電訊連接"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允許應用程式註冊新的電訊連接。"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"管理電訊連接"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"允許應用程式管理電訊連接。"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"與通話畫面互動"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"如要取消固定這個畫面,請同時輕觸並按住 [返回] 和 [概覽]。"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"如要取消固定這個畫面,請輕觸並按住 [概覽]。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"螢幕已固定,而您的機構不允許取消固定。"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"使用螢幕固定功能?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"螢幕鎖定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請同時輕觸並按住 [返回] 和 [概覽]。"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"螢幕鎖定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請輕觸並按住 [概覽]。"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消固定時必須輸入 PIN"</string>
@@ -1783,6 +1776,8 @@
<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>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"需時 1 分鐘 (完成時間:<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"需時 %1$d 分鐘 (完成時間 <xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"完成時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"無限期"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index fdffb7c..9f6e525 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"允許應用程式讀取及寫入快取檔案系統。"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"撥打/接聽 SIP 通話"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"允許應用程式撥打及接聽 SIP 通話。"</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"註冊新的電信 SIM 卡連線"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"允許應用程式註冊新的電信 SIM 卡連線。"</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"註冊新的電信連線"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"允許應用程式註冊新的電信連線。"</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"管理電信連線"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"允許應用程式管理電信連線。"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"與通話螢幕互動"</string>
@@ -1541,7 +1539,7 @@
<string name="storage_sd_card" msgid="3282948861378286745">"SD 卡"</string>
<string name="storage_usb" msgid="3017954059538517278">"USB 儲存裝置"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"編輯"</string>
- <string name="data_usage_warning_title" msgid="1955638862122232342">"資料用量警告"</string>
+ <string name="data_usage_warning_title" msgid="1955638862122232342">"數據用量警告"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"輕觸即可查看使用量和設定。"</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"已達到 2G-3G 數據流量上限"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"已達到 4G 數據流量上限"</string>
@@ -1771,18 +1769,15 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"如要取消固定這個畫面,請同時輕觸並按住返回按鈕和總覽按鈕。"</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"如要取消固定這個畫面,請輕觸並按住總覽按鈕。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"螢幕已固定,且貴機構不允許取消固定。"</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"使用螢幕固定功能?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"螢幕固定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請同時輕觸並按住返回按鈕和總覽按鈕。"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"螢幕固定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請輕觸並按住總覽按鈕。"</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>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消固定時必須輸入 PIN"</string>
<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="battery_saver_description" msgid="2510530476513605742">"節約耗電量功能會降低裝置的效能,並限制震動和大多數背景資料,藉此延長電池續航力。此外,電子郵件、聊天工具和其他需要使用同步功能的應用程式若未開啟,將不會自動更新。\n\n當您為裝置充電時,節約耗電量功能會自動關閉。"</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"直到 <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> 停機時間結束"</string>
+ <!-- no translation found for downtime_condition_line_one (8762708714645352010) -->
+ <skip />
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"1 分鐘 (結束時間:<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"%1$d 分鐘 (結束時間:<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1797,8 @@
<string name="zen_mode_until" msgid="7336308492289875088">"結束時間:<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"無限期"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string>
+ <!-- no translation found for zen_mode_next_alarm_summary (5915140424683747372) -->
+ <skip />
+ <!-- no translation found for zen_mode_next_alarm_line_one (5537042951553420916) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 2ac1433..39789bd 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -34,6 +34,8 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> amaminithi"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> iminithi"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> amaminithi"</string>
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
<string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> amasekhondi"</string>
<string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> isekhondi"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> amasekhondi"</string>
@@ -716,14 +718,10 @@
<string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Ivumela uhlelo lokusebenza ukuthi ifunde futhi ibhale isistimu yokufayila amafayela esikhashana."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"yenza/thola amakholi we-SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Ivumela uhlelo lokusebenza ukwenza nokuthola amakholi we-SIP."</string>
- <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
- <skip />
- <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
- <skip />
- <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
- <skip />
- <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
- <skip />
+ <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"bhalisa uxhumo le-SIM le-telecom olusha"</string>
+ <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Ivumela uhlelo lokusebenza ukubhalisa uxhumo olusha le-telecom."</string>
+ <string name="permlab_register_call_provider" msgid="108102120289029841">"bhalisa uxhumo olusha le-telecom"</string>
+ <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Ivumela uhlelo lokusebenza ukubhalisa uxhumo olusha le-telecom."</string>
<string name="permlab_connection_manager" msgid="1116193254522105375">"phatha ukuxhumana kwezokuxhumana kwefoni"</string>
<string name="permdesc_connection_manager" msgid="5925480810356483565">"Ivumela uhlelo lokusebenza ukuthi luphathe ukuxhumana kwezokuxhumana kwefoni."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"hlanganyela neskrini esingaphakathi kwekholi"</string>
@@ -1771,11 +1769,6 @@
<string name="lock_to_app_toast" msgid="7570091317001980053">"Ukuze ususe ukuphina kulesi sikrini, thinta uphinde ubambe i-Emuva ne-Buka konke ngesikhathi esisodwa."</string>
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe Buka konke."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Isikrini siphiniwe. Ukususa ukuphina akuvumelekile inhlangano yakho."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Sebenzisa ukuphina isikrini?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ukuphina isikrini kukhiyela isibonisi ekubukeni okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe i-Ngemuva ne-Buka konke ngesikhathi esisodwa."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ukuphina isikrini kukhiya isikrini ngokubuka okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe Buka konke."</string>
- <string name="lock_to_app_negative" msgid="2259143719362732728">"CHA, NGIYABONGA"</string>
- <string name="lock_to_app_positive" msgid="7085139175671313864">"QALA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Isikrini siphiniwe"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"Isikrini sisuswe ukuphina"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Cela iphinikhodi ngaphambi kokuphina"</string>
@@ -1783,6 +1776,7 @@
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Cela iphasiwedi ngaphambi kokususa ukuphina"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Ukuze usize ukwenza kangcono impilo yebhethri, isilondolozi sebhethri sehlisa ukusebenza kwedivayisi yakho futhi sikhawulela ukudlidliza nedatha eningi yangasemuva. I-imeyili, imilayezo, nezinye izinhlelo zokusebenza ezincike ekuvumelaniseni kungenzeka zingabuyekezi ngaphandle kokuthi uzivule.\n\nIsilondolozi sebhethri sivaleka ngokuzenzakalelayo uma idivayisi yakho ishaja."</string>
<string name="downtime_condition_summary" msgid="8761776337475705749">"Kuze kuphele isikhathi sakho ngo-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="downtime_condition_line_one" msgid="8762708714645352010">"Kuze kuphele isikhathi sakho sokuphumula"</string>
<plurals name="zen_mode_duration_minutes_summary">
<item quantity="one" msgid="3177683545388923234">"Okweminithi elilodwa (kuze kube ngu-<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
<item quantity="other" msgid="2787867221129368935">"Okwamaminithi angu-%1$d (kuze kube ngu-<xliff:g id="FORMATTEDTIME">%2$s</xliff:g>)"</item>
@@ -1802,4 +1796,6 @@
<string name="zen_mode_until" msgid="7336308492289875088">"Kuze kube ngu-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_forever" msgid="4316804956488785559">"Unaphakade"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Goqa"</string>
+ <string name="zen_mode_next_alarm_summary" msgid="5915140424683747372">"Kuze kube yi-alamu elandelayo ngo-<xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
+ <string name="zen_mode_next_alarm_line_one" msgid="5537042951553420916">"Kuze kube yi-alamu elandelayo"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 67ba27da..4f8acdb 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -908,12 +908,14 @@
<!-- Theme to use for dialogs spawned from this theme. -->
<attr name="dialogTheme" format="reference" />
- <!-- Window decor layout to use in dialog mode with icons -->
+ <!-- Window decor layout to use in dialog mode with icons. -->
<attr name="dialogTitleIconsDecorLayout" format="reference" />
- <!-- Window decor layout to use in dialog mode with custom titles -->
+ <!-- Window decor layout to use in dialog mode with custom titles. -->
<attr name="dialogCustomTitleDecorLayout" format="reference" />
- <!-- Window decor layout to use in dialog mode with title only -->
+ <!-- Window decor layout to use in dialog mode with title only. -->
<attr name="dialogTitleDecorLayout" format="reference" />
+ <!-- Preferred padding for dialog content. -->
+ <attr name="dialogPreferredPadding" format="dimension" />
<!-- Theme to use for alert dialogs spawned from this theme. -->
<attr name="alertDialogTheme" format="reference" />
@@ -4804,6 +4806,13 @@
<attr name="autoMirrored"/>
</declare-styleable>
+ <!-- Represents a single state inside a StateListDrawable. -->
+ <declare-styleable name="StateListDrawableItem">
+ <!-- Reference to a drawable resource to use for the state. If not
+ given, the drawable must be defined by the first child tag. -->
+ <attr name="drawable" />
+ </declare-styleable>
+
<!-- Transition used to animate between states with keyframe IDs. -->
<declare-styleable name="AnimatedStateListDrawableItem">
<!-- Reference to a drawable resource to use for the frame. If not
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 52ef4f9..e4641ce 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -467,6 +467,8 @@
<bool name="config_allowTheaterModeWakeFromKey">false</bool>
<!-- If this is true, allow wake from theater mode from motion. -->
<bool name="config_allowTheaterModeWakeFromMotion">false</bool>
+ <!-- If this is true, allow wake from theater mode from motion. -->
+ <bool name="config_allowTheaterModeWakeFromMotionWhenNotDreaming">false</bool>
<!-- If this is true, allow wake from theater mode from lid switch. -->
<bool name="config_allowTheaterModeWakeFromLidSwitch">false</bool>
<!-- If this is true, allow wake from theater mode when docked. -->
@@ -776,7 +778,7 @@
This needs to match the constants in
policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
-->
- <integer name="config_longPressOnHomeBehavior">1</integer>
+ <integer name="config_longPressOnHomeBehavior">0</integer>
<!-- Control the behavior when the user double-taps the home button.
0 - Nothing
@@ -1919,4 +1921,20 @@
<!-- Show the next-alarm as a zen exit condition if it occurs in the next n hours. -->
<integer name="config_next_alarm_condition_lookahead_threshold_hrs">12</integer>
+
+ <!-- This config is used to check if the carrier requires converting destination
+ number before sending out a SMS.
+ Formats for this configuration as below:
+ [true or false][;optional gid]
+ The logic to pick up the configuration:
+ (1) If the "config_sms_convert_destination_number_support" array has no gid
+ special item, the last one will be picked
+ (2) If the "config_sms_convert_destination_number_support" array has gid special
+ item and it matches the current sim's gid, it will be picked.
+ (3) If the "config_sms_convert_destination_number_support" array has gid special
+ item but it doesn't match the current sim's gid, the last one without gid
+ will be picked -->
+ <string-array translatable="false" name="config_sms_convert_destination_number_support">
+ <item>false</item>
+ </string-array>
</resources>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 71f66ba..13e3be5 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -123,6 +123,9 @@
be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_minor">95%</item>
+ <!-- Default padding for dialogs. -->
+ <dimen name="dialog_padding">16dp</dimen>
+
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_width">64dp</dimen>
<!-- The width of the big icons in notifications. -->
diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml
index 515922d..4a2119b 100644
--- a/core/res/res/values/dimens_material.xml
+++ b/core/res/res/values/dimens_material.xml
@@ -91,6 +91,6 @@
<!-- Default rounded corner for controls -->
<dimen name="control_corner_material">2dp</dimen>
- <dimen name="alert_dialog_padding_material">24dp</dimen>
- <dimen name="alert_dialog_padding_top_material">18dp</dimen>
+ <dimen name="dialog_padding_material">24dp</dimen>
+ <dimen name="dialog_padding_top_material">18dp</dimen>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index c0a5ab2..c661c33 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2599,5 +2599,6 @@
<public type="attr" name="collapseContentDescription"/>
<public type="attr" name="accessibilityTraversalBefore" />
<public type="attr" name="accessibilityTraversalAfter" />
+ <public type="attr" name="dialogPreferredPadding" />
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index c5bd495..d6bc38f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -61,6 +61,9 @@
<!-- [CHAR_LIMIT=10] Suffix added to signify duration in minutes -->
<string name="durationMinutes"><xliff:g id="minutes">%1$d</xliff:g> mins</string>
+ <!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute -->
+ <string name="durationMinute"><xliff:g id="minutes">%1$d</xliff:g> min</string>
+
<!-- [CHAR_LIMIT=10] Suffix added to signify duration of one minute with seconds -->
<string name="durationMinuteSeconds"><xliff:g id="minutes">%1$d</xliff:g> min
<xliff:g id="seconds">%2$d</xliff:g> secs</string>
@@ -323,6 +326,8 @@
<!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
<string name="low_memory" product="watch">Watch storage is full. Delete some files to free space.</string>
<!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
+ <string name="low_memory" product="tv">TV storage is full. Delete some files to free space.</string>
+ <!-- If MMS discovers there isn't much space left on the device, it will show a toast with this message. -->
<string name="low_memory" product="default">Phone storage is full. Delete some files to free space.</string>
<!-- SSL CA cert notification --> <skip />
@@ -345,6 +350,8 @@
<!-- Title for the Phone Options dialog to lock the screen, turn off the phone etc. -->
<string name="power_dialog" product="tablet">Tablet options</string>
<!-- Title for the Phone Options dialog to lock the screen, turn off the phone etc. -->
+ <string name="power_dialog" product="tv">TV options</string>
+ <!-- Title for the Phone Options dialog to lock the screen, turn off the phone etc. -->
<string name="power_dialog" product="default">Phone options</string>
<!-- Button to turn on silent mode, within the Phone Options dialog -->
<string name="silent_mode">Silent mode</string>
@@ -369,6 +376,9 @@
<!-- Shutdown Confirmation Dialog. When the user chooses to power off the phone, there will
be a confirmation dialog. This is the message. -->
<string name="shutdown_confirm" product="tablet">Your tablet will shut down.</string>
+ <!-- Shutdown Confirmation Dialog. When the user chooses to power off the TV, there will
+ be a confirmation dialog. This is the message. -->
+ <string name="shutdown_confirm" product="tv">Your TV will shut down.</string>
<!-- Shutdown Confirmation Dialog. When the user chooses to power off the watch, there will
be a confirmation dialog. This is the message. -->
<string name="shutdown_confirm" product="watch">Your watch will shut down.</string>
@@ -405,6 +415,8 @@
<!-- Title of the Global Actions Dialog -->
<string name="global_actions" product="tablet">Tablet options</string>
<!-- Title of the Global Actions Dialog -->
+ <string name="global_actions" product="tv">TV options</string>
+ <!-- Title of the Global Actions Dialog -->
<string name="global_actions" product="default">Phone options</string>
<!-- label for item that locks the phone in the phone options dialog -->
@@ -742,6 +754,10 @@
messages stored on your tablet or SIM card. This allows the app to read all
SMS messages, regardless of content or confidentiality.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readSms" product="tv">Allows the app to read SMS
+ messages stored on your TV or SIM card. This allows the app to read all
+ SMS messages, regardless of content or confidentiality.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_readSms" product="default">Allows the app to read SMS
messages stored on your phone or SIM card. This allows the app to read all
SMS messages, regardless of content or confidentiality.</string>
@@ -753,6 +769,10 @@
to SMS messages stored on your tablet or SIM card. Malicious apps
may delete your messages.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_writeSms" product="tv">Allows the app to write
+ to SMS messages stored on your TV or SIM card. Malicious apps
+ may delete your messages.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_writeSms" product="default">Allows the app to write
to SMS messages stored on your phone or SIM card. Malicious apps
may delete your messages.</string>
@@ -1074,6 +1094,10 @@
its own input events (key presses, etc.) to other apps. Malicious
apps may use this to take over the tablet.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_injectEvents" product="tv">Allows the app to deliver
+ its own input events (key presses, etc.) to other apps. Malicious
+ apps may use this to take over the TV.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_injectEvents" product="default">Allows the app to deliver
its own input events (key presses, etc.) to other apps. Malicious
apps may use this to take over the phone.</string>
@@ -1213,6 +1237,8 @@
<string name="permlab_persistentActivity">make app always run</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_persistentActivity" product="tablet">Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the tablet.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_persistentActivity" product="tv">Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the TV.</string>
<string name="permdesc_persistentActivity" product="default">Allows the app to make parts of itself persistent in memory. This can limit memory available to other apps slowing down the phone.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1250,6 +1276,10 @@
by deleting files in the cache directories of other applications. This may cause other
applications to start up more slowly as they need to re-retrieve their data.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_clearAppCache" product="tv">Allows the app to free TV storage
+ by deleting files in the cache directories of other applications. This may cause other
+ applications to start up more slowly as they need to re-retrieve their data.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_clearAppCache" product="default">Allows the app to free phone storage
by deleting files in the cache directories of other applications. This may cause other
applications to start up more slowly as they need to re-retrieve their data.</string>
@@ -1267,6 +1297,11 @@
information about what you are doing with the tablet, potentially
including personal or private information.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readLogs" product="tv">Allows the app to read from the
+ system\'s various log files. This allows it to discover general
+ information about what you are doing with the TV, potentially
+ including personal or private information.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_readLogs" product="default">Allows the app to read from the
system\'s various log files. This allows it to discover general
information about what you are doing with the phone, potentially
@@ -1309,6 +1344,12 @@
possible to get app components into an unusable, inconsistent, or unstable state.
</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_changeComponentState" product="tv">Allows the app to change whether a
+ component of another app is enabled or not. Malicious apps may use this
+ to disable important TV capabilities. Care must be used with this permission, as it is
+ possible to get app components into an unusable, inconsistent, or unstable state.
+ </string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_changeComponentState" product="default">Allows the app to change whether a
component of another app is enabled or not. Malicious apps may use this
to disable important phone capabilities. Care must be used with this permission, as it is
@@ -1356,6 +1397,11 @@
This can make it take longer to start the tablet and allow the
app to slow down the overall tablet by always running.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_receiveBootCompleted" product="tv">Allows the app to
+ have itself started as soon as the system has finished booting.
+ This can make it take longer to start the TV and allow the
+ app to slow down the overall tablet by always running.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_receiveBootCompleted" product="default">Allows the app to
have itself started as soon as the system has finished booting.
This can make it take longer to start the phone and allow the
@@ -1369,6 +1415,11 @@
may make the tablet slow or unstable by causing it to use too much memory.
</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_broadcastSticky" product="tv">Allows the app to
+ send sticky broadcasts, which remain after the broadcast ends. Excessive use
+ may make the TV slow or unstable by causing it to use too much memory.
+ </string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_broadcastSticky" product="default">Allows the app to
send sticky broadcasts, which remain after the broadcast ends. Excessive
use may make the phone slow or unstable by causing it to use too
@@ -1384,6 +1435,13 @@
data, and malicious apps may share contact data without your
knowledge.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readContacts" product="tv">Allows the app to read
+ data about your contacts stored on your TV, including the frequency
+ with which you\'ve called, emailed, or communicated in other ways with
+ specific individuals. This permission allows apps to save your contact
+ data, and malicious apps may share contact data without your
+ knowledge.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_readContacts" product="default">Allows the app to
read data about your contacts stored on your phone, including the
frequency with which you\'ve called, emailed, or communicated in other ways
@@ -1400,6 +1458,12 @@
with specific contacts. This permission allows apps to delete contact
data.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_writeContacts" product="tv">Allows the app to
+ modify the data about your contacts stored on your TV, including the
+ frequency with which you\'ve called, emailed, or communicated in other ways
+ with specific contacts. This permission allows apps to delete contact
+ data.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_writeContacts" product="default">Allows the app to
modify the data about your contacts stored on your phone, including the
frequency with which you\'ve called, emailed, or communicated in other ways
@@ -1414,6 +1478,11 @@
This permission allows apps to save your call log data, and malicious apps
may share call log data without your knowledge.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readCallLog" product="tv">Allows the app to read
+ your TV\'s call log, including data about incoming and outgoing calls.
+ This permission allows apps to save your call log data, and malicious apps
+ may share call log data without your knowledge.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_readCallLog" product="default">Allows the app to read
your phone\'s call log, including data about incoming and outgoing calls.
This permission allows apps to save your call log data, and malicious apps
@@ -1425,6 +1494,9 @@
<string name="permdesc_writeCallLog" product="tablet">Allows the app to modify your tablet\'s call log, including data about incoming and outgoing calls.
Malicious apps may use this to erase or modify your call log.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_writeCallLog" product="tv">Allows the app to modify your TV\'s call log, including data about incoming and outgoing calls.
+ Malicious apps may use this to erase or modify your call log.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_writeCallLog" product="default">Allows the app to modify your phone\'s call log, including data about incoming and outgoing calls.
Malicious apps may use this to erase or modify your call log.</string>
@@ -1472,12 +1544,16 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_readCalendar">read calendar events plus confidential information</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-
<string name="permdesc_readCalendar" product="tablet">Allows the app to read
all calendar events stored on your tablet, including those of friends or
co-workers. This may allow the app to share or save your calendar data,
regardless of confidentiality or sensitivity.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_readCalendar" product="tv">Allows the app to read
+ all calendar events stored on your TV, including those of friends or
+ co-workers. This may allow the app to share or save your calendar data,
+ regardless of confidentiality or sensitivity.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_readCalendar" product="default">Allows the app to
read all calendar events stored on your phone, including those of friends
or co-workers. This may allow the app to share or save your calendar data,
@@ -1486,17 +1562,23 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_writeCalendar">add or modify calendar events and send email to guests without owners\' knowledge</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
-
-<string name="permdesc_writeCalendar" product="tablet">Allows the app to
- add, remove, change events that you can modify on your tablet, including
- those of friends or co-workers. This may allow the app to send messages
- that appear to come from calendar owners, or modify events without the
- owners\' knowledge.</string>
-<string name="permdesc_writeCalendar" product="default">Allows the app to
- add, remove, change events that you can modify on your phone, including
- those of friends or co-workers. This may allow the app to send messages
- that appear to come from calendar owners, or modify events without the
- owners\' knowledge.</string>
+ <string name="permdesc_writeCalendar" product="tablet">Allows the app to
+ add, remove, change events that you can modify on your tablet, including
+ those of friends or co-workers. This may allow the app to send messages
+ that appear to come from calendar owners, or modify events without the
+ owners\' knowledge.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_writeCalendar" product="tv">Allows the app to
+ add, remove, change events that you can modify on your TV, including
+ those of friends or co-workers. This may allow the app to send messages
+ that appear to come from calendar owners, or modify events without the
+ owners\' knowledge.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_writeCalendar" product="default">Allows the app to
+ add, remove, change events that you can modify on your phone, including
+ those of friends or co-workers. This may allow the app to send messages
+ that appear to come from calendar owners, or modify events without the
+ owners\' knowledge.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1632,21 +1714,30 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_brick" product="tablet">permanently disable tablet</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_brick" product="tv">permanently disable TV</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_brick" product="default">permanently disable phone</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_brick" product="tablet">Allows the app to
disable the entire tablet permanently. This is very dangerous.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_brick" product="tv">Allows the app to
+ disable the entire TV permanently. This is very dangerous.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_brick" product="default">Allows the app to
disable the entire phone permanently. This is very dangerous.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_reboot" product="tablet">force tablet reboot</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_reboot" product="tv">force TV reboot</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_reboot" product="default">force phone reboot</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_reboot" product="tablet">Allows the app to force the tablet to reboot.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_reboot" product="tv">Allows the app to force the TV to reboot.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_reboot" product="default">Allows the app to force the phone to reboot.</string>
@@ -1741,6 +1832,8 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_performCdmaProvisioning" product="tablet">directly start CDMA tablet setup</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_performCdmaProvisioning" product="tv">directly start CDMA TV setup</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_performCdmaProvisioning" product="default">directly start CDMA phone setup</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_performCdmaProvisioning">Allows the app to start CDMA provisioning.
@@ -1794,10 +1887,14 @@
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_wakeLock" product="tablet">prevent tablet from sleeping</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_wakeLock" product="tv">prevent TV from sleeping</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_wakeLock" product="default">prevent phone from sleeping</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_wakeLock" product="tablet">Allows the app to prevent the tablet from going to sleep.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_wakeLock" product="tv">Allows the app to prevent the TV from going to sleep.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_wakeLock" product="default">Allows the app to prevent the phone from going to sleep.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1805,17 +1902,24 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_transmitIr" product="tablet">Allows the app to use the tablet\'s infrared transmitter.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_transmitIr" product="tv">Allows the app to use the TV\'s infrared transmitter.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_transmitIr" product="default">Allows the app to use the phone\'s infrared transmitter.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_devicePower" product="tablet">power tablet on or off</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permlab_devicePower" product="tv">power TV on or off</string>
+ <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_devicePower" product="default">power phone on or off</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_devicePower" product="tablet">Allows the app to turn the
tablet on or off.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_devicePower" product="tv">Allows the app to turn the
+ TV on or off.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_devicePower" product="default">Allows the app to turn the phone on or off.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1830,6 +1934,10 @@
allowing complete access to the tablet hardware. Only available
when a tablet is running in manufacturer test mode.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_factoryTest" product="tv">Run as a low-level manufacturer test,
+ allowing complete access to the TV hardware. Only available
+ when a TV is running in manufacturer test mode.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_factoryTest" product="default">Run as a low-level manufacturer test,
allowing complete access to the phone hardware. Only available
when a phone is running in manufacturer test mode.</string>
@@ -1856,6 +1964,8 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_setTime" product="tablet">Allows the app to change the tablet\'s clock time.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_setTime" product="tv">Allows the app to change the TV\'s clock time.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_setTime" product="default">Allows the app to change the phone\'s clock time.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1863,6 +1973,8 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_setTimeZone" product="tablet">Allows the app to change the tablet\'s time zone.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_setTimeZone" product="tv">Allows the app to change the TV\'s time zone.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_setTimeZone" product="default">Allows the app to change the phone\'s time zone.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
@@ -1877,6 +1989,10 @@
the list of accounts known by the tablet. This may include any accounts
created by applications you have installed.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_getAccounts" product="tv">Allows the app to get
+ the list of accounts known by the TV. This may include any accounts
+ created by applications you have installed.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_getAccounts" product="default">Allows the app to get
the list of accounts known by the phone. This may include any accounts
created by applications you have installed.</string>
@@ -1958,6 +2074,10 @@
<string name="permdesc_changeWifiMulticastState" product="tablet">Allows the app to receive
packets sent to all devices on a Wi-Fi network using multicast addresses,
not just your tablet. It uses more power than the non-multicast mode.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_changeWifiMulticastState" product="tv">Allows the app to receive
+ packets sent to all devices on a Wi-Fi network using multicast addresses,
+ not just your TV. It uses more power than the non-multicast mode.</string>
<string name="permdesc_changeWifiMulticastState" product="default">Allows the app to receive
packets sent to all devices on a Wi-Fi network using multicast addresses,
not just your phone. It uses more power than the non-multicast mode.</string>
@@ -1969,6 +2089,10 @@
configure the local Bluetooth tablet, and to discover and pair with remote
devices.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bluetoothAdmin" product="tv">Allows the app to
+ configure the local Bluetooth TV, and to discover and pair with remote
+ devices.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_bluetoothAdmin" product="default">Allows the app to configure
the local Bluetooth phone, and to discover and pair with remote devices.</string>
@@ -1978,6 +2102,9 @@
<string name="permdesc_bluetoothPriv" product="tablet">Allows the app to
pair with remote devices without user interaction.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bluetoothPriv" product="tv">Allows the app to
+ pair with remote devices without user interaction.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_bluetoothPriv" product="default">Allows the app to
pair with remote devices without user interaction.</string>
@@ -1986,6 +2113,8 @@
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_bluetoothMap" product="tablet">Allows the app to access Bluetooth MAP data.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bluetoothMap" product="tv">Allows the app to access Bluetooth MAP data.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_bluetoothMap" product="default">Allows the app to access Bluetooth MAP data.</string>
<string name="permlab_accessWimaxState">connect and disconnect from WiMAX</string>
@@ -1996,6 +2125,8 @@
<string name="permlab_changeWimaxState">Change WiMAX state</string>
<string name="permdesc_changeWimaxState" product="tablet">Allows the app to
connect the tablet to and disconnect the tablet from WiMAX networks.</string>
+ <string name="permdesc_changeWimaxState" product="tv">Allows the app to
+ connect the TV to and disconnect the TV from WiMAX networks.</string>
<string name="permdesc_changeWimaxState" product="default">Allows the app to
connect the phone to and disconnect the phone from WiMAX networks.</string>
@@ -2005,6 +2136,9 @@
<string name="permdesc_scoreNetworks" product="tablet">Allows the app to
rank networks and influence which networks the tablet should prefer.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_scoreNetworks" product="tv">Allows the app to
+ rank networks and influence which networks the TV should prefer.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_scoreNetworks" product="default">Allows the app to
rank networks and influence which networks the phone should prefer.</string>
@@ -2015,6 +2149,10 @@
configuration of Bluetooth on the tablet, and to make and accept
connections with paired devices.</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
+ <string name="permdesc_bluetooth" product="tv">Allows the app to view the
+ configuration of Bluetooth on the TV, and to make and accept
+ connections with paired devices.</string>
+ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permdesc_bluetooth" product="default">Allows the app to view the
configuration of the Bluetooth on the phone, and to make and accept
connections with paired devices.</string>
@@ -2219,6 +2357,10 @@
typed when unlocking the screen, and lock the tablet or erase all the tablet\'s
data if too many incorrect passwords are typed.</string>
<!-- Description of policy access to watch user login attempts -->
+ <string name="policydesc_watchLogin" product="TV">Monitor the number of incorrect passwords
+ typed when unlocking the screen, and lock the TV or erase all the TV\'s
+ data if too many incorrect passwords are typed.</string>
+ <!-- Description of policy access to watch user login attempts -->
<string name="policydesc_watchLogin" product="default">Monitor the number of incorrect passwords
typed. when unlocking the screen, and lock the phone or erase all the phone\'s
data if too many incorrect passwords are typed.</string>
@@ -2235,6 +2377,8 @@
<!-- Description of policy access to wipe the user's data -->
<string name="policydesc_wipeData" product="tablet">Erase the tablet\'s data without warning by performing a factory data reset.</string>
<!-- Description of policy access to wipe the user's data -->
+ <string name="policydesc_wipeData" product="tv">Erase the TV\'s data without warning by performing a factory data reset.</string>
+ <!-- Description of policy access to wipe the user's data -->
<string name="policydesc_wipeData" product="default">Erase the phone\'s data without warning by performing a factory data reset.</string>
<string name="policylab_setGlobalProxy">Set the device global proxy</string>
<!-- Description of policy access to wipe the user's data -->
@@ -2542,6 +2686,8 @@
<!-- Shown in the lock screen when there is no SIM card. -->
<string name="lockscreen_missing_sim_message" product="tablet">No SIM card in tablet.</string>
<!-- Shown in the lock screen when there is no SIM card. -->
+ <string name="lockscreen_missing_sim_message" product="tv">No SIM card in TV.</string>
+ <!-- Shown in the lock screen when there is no SIM card. -->
<string name="lockscreen_missing_sim_message" product="default">No SIM card in phone.</string>
<!-- Shown in the lock screen to ask the user to insert a SIM card. -->
<string name="lockscreen_missing_sim_instructions">Insert a SIM card.</string>
@@ -2622,6 +2768,15 @@
<!-- For the unlock screen, informational message shown in dialog when user is almost at the limit
where they will be locked out and may have to enter an alternate username/password to unlock the phone -->
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv">
+ You have incorrectly drawn your unlock pattern <xliff:g id="number">%d</xliff:g> times.
+ After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
+ you will be asked to unlock your TV using your Google signin.\n\n
+ Try again in <xliff:g id="number">%d</xliff:g> seconds.
+ </string>
+
+ <!-- For the unlock screen, informational message shown in dialog when user is almost at the limit
+ where they will be locked out and may have to enter an alternate username/password to unlock the phone -->
<string name="lockscreen_failed_attempts_almost_glogin" product="default">
You have incorrectly drawn your unlock pattern <xliff:g id="number">%d</xliff:g> times.
After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
@@ -2639,6 +2794,14 @@
<!-- For the unlock screen, informational message shown in dialog when user is almost at the limit
where the device will be wiped. -->
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv">
+ You have incorrectly attempted to unlock the TV <xliff:g id="number">%d</xliff:g> times.
+ After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
+ the TV will be reset to factory default and all user data will be lost.
+ </string>
+
+ <!-- For the unlock screen, informational message shown in dialog when user is almost at the limit
+ where the device will be wiped. -->
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default">
You have incorrectly attempted to unlock the phone <xliff:g id="number">%d</xliff:g> times.
After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
@@ -2654,6 +2817,13 @@
<!-- For the unlock screen, informational message shown in dialog when user has exceeded the
maximum attempts and the device will now be wiped -->
+ <string name="lockscreen_failed_attempts_now_wiping" product="tv">
+ You have incorrectly attempted to unlock the TV <xliff:g id="number">%d</xliff:g> times.
+ The TV will now be reset to factory default.
+ </string>
+
+ <!-- For the unlock screen, informational message shown in dialog when user has exceeded the
+ maximum attempts and the device will now be wiped -->
<string name="lockscreen_failed_attempts_now_wiping" product="default">
You have incorrectly attempted to unlock the phone <xliff:g id="number">%d</xliff:g> times.
The phone will now be reset to factory default.
@@ -3007,6 +3177,13 @@
applications with web browsing capabilities.</string>
<!-- Description of an application permission, listed so the user can choose whether
they want to allow the application to do this. -->
+ <string name="permdesc_writeHistoryBookmarks" product="tv">Allows the
+ app to modify the Browser\'s history or bookmarks stored on your TV.
+ This may allow the app to erase or modify Browser data. Note: this
+ permission may note be enforced by third-party browsers or other
+ applications with web browsing capabilities.</string>
+ <!-- Description of an application permission, listed so the user can choose whether
+ they want to allow the application to do this. -->
<string name="permdesc_writeHistoryBookmarks" product="default">Allows the
app to modify the Browser\'s history or bookmarks stored on your phone.
This may allow the app to erase or modify Browser data. Note:
@@ -3640,6 +3817,7 @@
<string name="wifi_p2p_show_pin_message">PIN: </string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet">The tablet will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="device_name">%1$s</xliff:g></string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tv">The TV will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="device_name">%1$s</xliff:g></string>
<string name="wifi_p2p_frequency_conflict_message" product="default">The phone will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="device_name">%1$s</xliff:g></string>
<!-- Name of the dialog that lets the user choose an accented character to insert -->
@@ -4349,6 +4527,10 @@
is connected to a headphone or other wired audio output jack. [CHAR LIMIT=50] -->
<string name="default_audio_route_name" product="tablet">Tablet</string>
+ <!-- Name of the default audio route for tablets when nothing
+ is connected to a headphone or other wired audio output jack. [CHAR LIMIT=50] -->
+ <string name="default_audio_route_name" product="tv">TV</string>
+
<!-- Name of the default audio route when nothing is connected to
a headphone or other wired audio output jack. [CHAR LIMIT=50] -->
<string name="default_audio_route_name" product="default">Phone</string>
@@ -4499,6 +4681,12 @@
the tablet will be reset to factory default and all user data will be lost.
</string>
<!-- Message shown when user is almost at the limit of password attempts where the device will be wiped. -->
+ <string name="kg_failed_attempts_almost_at_wipe" product="tv">
+ You have incorrectly attempted to unlock the TV <xliff:g id="number">%d</xliff:g> times.
+ After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
+ the TV will be reset to factory default and all user data will be lost.
+ </string>
+ <!-- Message shown when user is almost at the limit of password attempts where the device will be wiped. -->
<string name="kg_failed_attempts_almost_at_wipe" product="default">
You have incorrectly attempted to unlock the phone <xliff:g id="number">%d</xliff:g> times.
After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
@@ -4510,6 +4698,11 @@
The tablet will now be reset to factory default.
</string>
<!-- Message shown in dialog when user has exceeded the maximum attempts and the device will now be wiped -->
+ <string name="kg_failed_attempts_now_wiping" product="tv">
+ You have incorrectly attempted to unlock the TV <xliff:g id="number">%d</xliff:g> times.
+ The TV will now be reset to factory default.
+ </string>
+ <!-- Message shown in dialog when user has exceeded the maximum attempts and the device will now be wiped -->
<string name="kg_failed_attempts_now_wiping" product="default">
You have incorrectly attempted to unlock the phone <xliff:g id="number">%d</xliff:g> times.
The phone will now be reset to factory default.
@@ -4524,6 +4717,14 @@
</string>
<!-- Message shown in dialog when user is almost at the limit where they will be
locked out and may have to enter an alternate username/password to unlock the phone -->
+ <string name="kg_failed_attempts_almost_at_login" product="tv">
+ You have incorrectly drawn your unlock pattern <xliff:g id="number">%d</xliff:g> times.
+ After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
+ you will be asked to unlock your TV using an email account.\n\n
+ Try again in <xliff:g id="number">%d</xliff:g> seconds.
+ </string>
+ <!-- Message shown in dialog when user is almost at the limit where they will be
+ locked out and may have to enter an alternate username/password to unlock the phone -->
<string name="kg_failed_attempts_almost_at_login" product="default">
You have incorrectly drawn your unlock pattern <xliff:g id="number">%d</xliff:g> times.
After <xliff:g id="number">%d</xliff:g> more unsuccessful attempts,
@@ -4853,16 +5054,6 @@
<string name="lock_to_app_toast_accessible">To unpin this screen, touch and hold Overview.</string>
<!-- Notify user that they are locked in lock-to-app mode -->
<string name="lock_to_app_toast_locked">Screen is pinned. Unpinning isn\'t allowed by your organization.</string>
- <!-- Lock-to-app dialog title. -->
- <string name="lock_to_app_title">Use screen pinning?</string>
- <!-- Lock-to-app dialog description. -->
- <string name="lock_to_app_description">Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Back and Overview at the same time.</string>
- <!-- Lock-to-app dialog description when in accessibility mode. -->
- <string name="lock_to_app_description_accessible">Screen pinning locks the display in a single view.\n\nTo unpin, touch and hold Overview.</string>
- <!-- Lock-to-app negative response. -->
- <string name="lock_to_app_negative">NO, THANKS</string>
- <!-- Lock-to-app positive response. -->
- <string name="lock_to_app_positive">START</string>
<!-- Starting lock-to-app indication. -->
<string name="lock_to_app_start">Screen pinned</string>
<!-- Exting lock-to-app indication. -->
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index dd87139..5a59afe 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -43,6 +43,10 @@ please see styles_device_defaults.xml.
<item name="shadowRadius">2.75</item>
</style>
+ <style name="DialogWindowTitleBackground">
+ <item name="background">@drawable/title_bar</item>
+ </style>
+
<style name="DialogWindowTitle">
<item name="maxLines">1</item>
<item name="scrollHorizontally">true</item>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index cc3ded5..e04d901 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -1128,6 +1128,15 @@ please see styles_device_defaults.xml.
<item name="textAlignment">viewStart</item>
</style>
+ <style name="DialogWindowTitleBackground.Material">
+ <item name="background">@null</item>
+ <item name="paddingStart">?attr/dialogPreferredPadding</item>
+ <item name="paddingEnd">?attr/dialogPreferredPadding</item>
+ <item name="paddingTop">@dimen/dialog_padding_top_material</item>
+ </style>
+
+ <style name="DialogWindowTitleBackground.Material.Light" />
+
<style name="DialogWindowTitle.Material">
<item name="maxLines">1</item>
<item name="scrollHorizontally">true</item>
diff --git a/core/res/res/values/styles_micro.xml b/core/res/res/values/styles_micro.xml
index 0c854d3..cf90b39 100644
--- a/core/res/res/values/styles_micro.xml
+++ b/core/res/res/values/styles_micro.xml
@@ -25,6 +25,14 @@
<item name="taskOpenExitAnimation">@null</item>
<item name="taskCloseEnterAnimation">@null</item>
<item name="taskCloseExitAnimation">@anim/slide_out_micro</item>
+ <item name="wallpaperOpenEnterAnimation">@null</item>
+ <item name="wallpaperOpenExitAnimation">@anim/slide_out_micro</item>
+ <item name="wallpaperCloseEnterAnimation">@anim/slide_in_micro</item>
+ <item name="wallpaperCloseExitAnimation">@null</item>
+ <item name="wallpaperIntraOpenEnterAnimation">@null</item>
+ <item name="wallpaperIntraOpenExitAnimation">@anim/slide_out_micro</item>
+ <item name="wallpaperIntraCloseEnterAnimation">@anim/slide_in_micro</item>
+ <item name="wallpaperIntraCloseExitAnimation">@null</item>
</style>
<style name="AlertDialog.Micro" parent="AlertDialog.Holo.Light">
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6e881a7..e1584cd 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -574,6 +574,7 @@
<java-symbol type="string" name="durationHourMinutes" />
<java-symbol type="string" name="durationHourMinute" />
<java-symbol type="string" name="durationMinutes" />
+ <java-symbol type="string" name="durationMinute" />
<java-symbol type="string" name="durationMinuteSeconds" />
<java-symbol type="string" name="durationMinuteSecond" />
<java-symbol type="string" name="durationSeconds" />
@@ -667,13 +668,6 @@
<java-symbol type="string" name="lock_to_app_toast" />
<java-symbol type="string" name="lock_to_app_toast_accessible" />
<java-symbol type="string" name="lock_to_app_toast_locked" />
- <java-symbol type="string" name="lock_to_app_title" />
- <java-symbol type="string" name="lock_to_app_description" />
- <java-symbol type="string" name="lock_to_app_description_accessible" />
- <java-symbol type="string" name="lock_to_app_negative" />
- <java-symbol type="string" name="lock_to_app_positive" />
- <java-symbol type="layout" name="lock_to_app_checkbox" />
- <java-symbol type="id" name="lock_to_app_checkbox" />
<java-symbol type="string" name="lock_to_app_start" />
<java-symbol type="string" name="lock_to_app_exit" />
<java-symbol type="string" name="lock_to_app_unlock_pin" />
@@ -1582,6 +1576,7 @@
<java-symbol type="bool" name="config_allowTheaterModeWakeFromPowerKey" />
<java-symbol type="bool" name="config_allowTheaterModeWakeFromKey" />
<java-symbol type="bool" name="config_allowTheaterModeWakeFromMotion" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromMotionWhenNotDreaming" />
<java-symbol type="bool" name="config_allowTheaterModeWakeFromLidSwitch" />
<java-symbol type="bool" name="config_allowTheaterModeWakeFromDock" />
<java-symbol type="bool" name="config_allowTheaterModeWakeFromWindowLayout" />
@@ -1810,6 +1805,7 @@
<java-symbol type="anim" name="lock_screen_behind_enter_wallpaper" />
<java-symbol type="anim" name="lock_screen_behind_enter_fade_in" />
<java-symbol type="anim" name="lock_screen_wallpaper_exit" />
+ <java-symbol type="anim" name="launch_task_behind_source" />
<java-symbol type="bool" name="config_alwaysUseCdmaRssi" />
<java-symbol type="dimen" name="status_bar_icon_size" />
@@ -2104,6 +2100,7 @@
<java-symbol type="layout" name="simple_account_item" />
<java-symbol type="id" name="scrollIndicatorUp" />
<java-symbol type="id" name="scrollIndicatorDown" />
+ <java-symbol type="array" name="config_sms_convert_destination_number_support" />
<!-- From SignalStrength -->
<java-symbol type="integer" name="config_LTE_RSRP_threshold_type" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index d983440..4ba6c0b 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -210,6 +210,7 @@ please see themes_device_defaults.xml.
<item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons</item>
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title</item>
+ <item name="dialogPreferredPadding">@dimen/dialog_padding</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Dialog.Alert</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 5640fc1..b320ae5 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -178,6 +178,7 @@ please see themes_device_defaults.xml.
<item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons_material</item>
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title_material</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title_material</item>
+ <item name="dialogPreferredPadding">@dimen/dialog_padding_material</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Material.Dialog.Alert</item>
@@ -529,6 +530,7 @@ please see themes_device_defaults.xml.
<item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons_material</item>
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title_material</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title_material</item>
+ <item name="dialogPreferredPadding">@dimen/dialog_padding_material</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Material.Light.Dialog.Alert</item>
@@ -1001,6 +1003,7 @@ please see themes_device_defaults.xml.
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Material</item>
+ <item name="windowTitleBackgroundStyle">@style/DialogWindowTitleBackground.Material</item>
<item name="windowBackground">@drawable/dialog_background_material</item>
<item name="windowElevation">@dimen/floating_window_z</item>
<item name="windowIsFloating">true</item>
@@ -1117,6 +1120,7 @@ please see themes_device_defaults.xml.
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Material.Light</item>
+ <item name="windowTitleBackgroundStyle">@style/DialogWindowTitleBackground.Material.Light</item>
<item name="windowBackground">@drawable/dialog_background_material</item>
<item name="windowElevation">@dimen/floating_window_z</item>
<item name="windowIsFloating">true</item>
diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
index 3a80309..dc43a2f 100644
--- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
+++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java
@@ -16,19 +16,20 @@
package android.content.pm;
-import static android.system.OsConstants.*;
-
-import com.android.frameworks.coretests.R;
-import com.android.internal.content.PackageHelper;
+import static android.system.OsConstants.S_IFDIR;
+import static android.system.OsConstants.S_IFMT;
+import static android.system.OsConstants.S_IRGRP;
+import static android.system.OsConstants.S_IROTH;
+import static android.system.OsConstants.S_IRWXU;
+import static android.system.OsConstants.S_ISDIR;
+import static android.system.OsConstants.S_IXGRP;
+import static android.system.OsConstants.S_IXOTH;
import android.app.PackageInstallObserver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.KeySet;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageParser.PackageParserException;
import android.content.res.Resources;
@@ -57,16 +58,17 @@ import android.system.StructStat;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
import android.util.Log;
+import com.android.frameworks.coretests.R;
+import com.android.internal.content.PackageHelper;
+
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -79,9 +81,7 @@ public class PackageManagerTests extends AndroidTestCase {
public final long WAIT_TIME_INCR = 5 * 1000;
- private static final String APP_LIB_DIR_PREFIX = "/data/app-lib/";
-
- private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec/";
+ private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";
private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO;
@@ -128,7 +128,11 @@ public class PackageManagerTests extends AndroidTestCase {
private boolean doneFlag = false;
- public void packageInstalled(String packageName, Bundle extras, int returnCode) {
+ @Override
+ public void onPackageInstalled(String basePackageName, int returnCode, String msg,
+ Bundle extras) {
+ Log.d(TAG, "onPackageInstalled: code=" + returnCode + ", msg=" + msg + ", extras="
+ + extras);
synchronized (this) {
this.returnCode = returnCode;
doneFlag = true;
@@ -410,10 +414,12 @@ public class PackageManagerTests extends AndroidTestCase {
String appInstallPath = new File(dataDir, "app").getPath();
String drmInstallPath = new File(dataDir, "app-private").getPath();
File srcDir = new File(info.sourceDir);
- String srcPath = srcDir.getParent();
+ String srcPath = srcDir.getParentFile().getParent();
File publicSrcDir = new File(info.publicSourceDir);
- String publicSrcPath = publicSrcDir.getParent();
+ String publicSrcPath = publicSrcDir.getParentFile().getParent();
long pkgLen = new File(info.sourceDir).length();
+ String expectedLibPath = new File(new File(info.sourceDir).getParentFile(), "lib")
+ .getPath();
int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen);
if (rLoc == INSTALL_LOC_INT) {
@@ -436,12 +442,11 @@ public class PackageManagerTests extends AndroidTestCase {
}
} else {
assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
- assertEquals(srcPath, appInstallPath);
- assertEquals(publicSrcPath, appInstallPath);
+ assertEquals(appInstallPath, srcPath);
+ assertEquals(appInstallPath, publicSrcPath);
assertStartsWith("Native library should point to shared lib directory",
- new File(APP_LIB_DIR_PREFIX, info.packageName).getPath(),
- info.nativeLibraryDir);
- assertDirOwnerGroupPerms(
+ expectedLibPath, info.nativeLibraryDir);
+ assertDirOwnerGroupPermsIfExists(
"Native library directory should be owned by system:system and 0755",
Process.SYSTEM_UID, Process.SYSTEM_UID,
S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
@@ -451,13 +456,13 @@ public class PackageManagerTests extends AndroidTestCase {
// Make sure the native library dir is not a symlink
final File nativeLibDir = new File(info.nativeLibraryDir);
- assertTrue("Native library dir should exist at " + info.nativeLibraryDir,
- nativeLibDir.exists());
- try {
- assertEquals("Native library dir should not be a symlink",
- info.nativeLibraryDir, nativeLibDir.getCanonicalPath());
- } catch (IOException e) {
- fail("Can't read " + nativeLibDir.getPath());
+ if (nativeLibDir.exists()) {
+ try {
+ assertEquals("Native library dir should not be a symlink",
+ info.nativeLibraryDir, nativeLibDir.getCanonicalPath());
+ } catch (IOException e) {
+ fail("Can't read " + nativeLibDir.getPath());
+ }
}
} else if (rLoc == INSTALL_LOC_SD) {
if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
@@ -500,9 +505,13 @@ public class PackageManagerTests extends AndroidTestCase {
}
}
- private void assertDirOwnerGroupPerms(String reason, int uid, int gid, int perms, String path) {
- final StructStat stat;
+ private void assertDirOwnerGroupPermsIfExists(String reason, int uid, int gid, int perms,
+ String path) {
+ if (!new File(path).exists()) {
+ return;
+ }
+ final StructStat stat;
try {
stat = Os.lstat(path);
} catch (ErrnoException e) {
@@ -3007,7 +3016,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchNoCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3017,7 +3026,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchNoCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3027,7 +3036,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchSomeCerts1() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3037,7 +3046,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchSomeCerts2() throws Exception {
replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3047,7 +3056,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchMoreCerts() throws Exception {
replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3058,7 +3067,7 @@ public class PackageManagerTests extends AndroidTestCase {
@LargeTest
public void testReplaceMatchMoreCertsReplaceSomeCerts() throws Exception {
InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
try {
int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
installFromRawResource("install.apk", APP1_CERT1, rFlags, false,
@@ -3098,7 +3107,7 @@ public class PackageManagerTests extends AndroidTestCase {
*/
public void testUpgradeKSWithWrongKey() throws Exception {
replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sb_ua, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3107,7 +3116,7 @@ public class PackageManagerTests extends AndroidTestCase {
*/
public void testUpgradeKSWithWrongSigningKey() throws Exception {
replaceCerts(R.raw.keyset_sa_ub, R.raw.keyset_sa_ub, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3139,7 +3148,7 @@ public class PackageManagerTests extends AndroidTestCase {
*/
public void testMultipleUpgradeKSWithSigningKey() throws Exception {
replaceCerts(R.raw.keyset_sau_ub, R.raw.keyset_sa_ua, true, true,
- PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
+ PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE);
}
/*
@@ -3732,7 +3741,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1_CERT2;
int rapk1 = SHARED1_CERT1;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3744,7 +3753,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1_CERT2;
int rapk2 = SHARED2_CERT1;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3756,7 +3765,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3768,7 +3777,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3780,7 +3789,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1;
int rapk1 = SHARED1_CERT1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
@@ -3792,7 +3801,7 @@ public class PackageManagerTests extends AndroidTestCase {
int apk2 = SHARED2_CERT1;
int rapk2 = SHARED2_CERT1_CERT2;
boolean fail = true;
- int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
+ int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
index 577dd64..1557918 100644
--- a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
+++ b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
@@ -33,6 +33,7 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
public class InputMethodTest extends InstrumentationTestCase {
private static final boolean IS_AUX = true;
@@ -46,84 +47,104 @@ public class InputMethodTest extends InstrumentationTestCase {
private static final Locale LOCALE_EN_IN = new Locale("en", "IN");
private static final Locale LOCALE_HI = new Locale("hi");
private static final Locale LOCALE_JA_JP = new Locale("ja", "JP");
+ private static final Locale LOCALE_ZH_CN = new Locale("zh", "CN");
+ private static final Locale LOCALE_ZH_TW = new Locale("zh", "TW");
private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
private static final String SUBTYPE_MODE_VOICE = "voice";
@SmallTest
public void testVoiceImes() throws Exception {
// locale: en_US
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US, IS_SYSTEM_READY,
- "DummyDefaultAutoVoiceIme", "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US, IS_SYSTEM_READY,
- "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1",
- "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_US,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_US,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
+ "DummyNonDefaultAutoVoiceIme1");
// locale: en_GB
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB, IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB, IS_SYSTEM_READY,
- "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1",
- "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_EN_GB,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_EN_GB,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
+ "DummyNonDefaultAutoVoiceIme1");
// locale: ja_JP
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP, !IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme");
- assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP, IS_SYSTEM_READY,
- "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
- assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP, IS_SYSTEM_READY,
- "DummyNonDefaultAutoVoiceIme0", "DummyNonDefaultAutoVoiceIme1",
- "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
+ !IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme");
+ assertDefaultEnabledImes(getImesWithDefaultVoiceIme(), LOCALE_JA_JP,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyDefaultAutoVoiceIme");
+ assertDefaultEnabledImes(getImesWithoutDefaultVoiceIme(), LOCALE_JA_JP,
+ IS_SYSTEM_READY, "DummyDefaultEnKeyboardIme", "DummyNonDefaultAutoVoiceIme0",
+ "DummyNonDefaultAutoVoiceIme1");
}
@SmallTest
public void testKeyboardImes() throws Exception {
// locale: en_US
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_US, !IS_SYSTEM_READY,
- "com.android.apps.inputmethod.latin");
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_US, IS_SYSTEM_READY,
- "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rUS"), LOCALE_EN_US,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.latin",
+ "com.android.apps.inputmethod.voice");
// locale: en_GB
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_GB, !IS_SYSTEM_READY,
- "com.android.apps.inputmethod.latin");
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_GB, IS_SYSTEM_READY,
- "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rGB"), LOCALE_EN_GB,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.latin",
+ "com.android.apps.inputmethod.voice");
// locale: en_IN
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_IN, !IS_SYSTEM_READY,
- "com.android.apps.inputmethod.latin");
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_EN_IN, IS_SYSTEM_READY,
- "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin",
- "com.android.apps.inputmethod.hindi");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("en-rIN"), LOCALE_EN_IN,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.hindi",
+ "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
// locale: hi
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_HI, !IS_SYSTEM_READY,
- "com.android.apps.inputmethod.latin");
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_HI, IS_SYSTEM_READY,
- "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin",
- "com.android.apps.inputmethod.hindi");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("hi"), LOCALE_HI,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.hindi",
+ "com.android.apps.inputmethod.latin", "com.android.apps.inputmethod.voice");
// locale: ja_JP
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_JA_JP, !IS_SYSTEM_READY,
- "com.android.apps.inputmethod.latin");
- assertDefaultEnabledImes(getSamplePreinstalledImes(), LOCALE_JA_JP, IS_SYSTEM_READY,
- "com.android.apps.inputmethod.voice", "com.android.apps.inputmethod.latin",
- "com.android.apps.inputmethod.japanese");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("ja-rJP"), LOCALE_JA_JP,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.japanese",
+ "com.android.apps.inputmethod.voice");
+
+ // locale: zh_CN
+ assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rCN"), LOCALE_ZH_CN,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.pinyin",
+ "com.android.apps.inputmethod.voice");
+
+ // locale: zh_TW
+ // Note: In this case, no IME is suitable for the system locale. Hence we will pick up a
+ // fallback IME regardless of the "default" attribute.
+ assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
+ !IS_SYSTEM_READY, "com.android.apps.inputmethod.latin");
+ assertDefaultEnabledImes(getSamplePreinstalledImes("zh-rTW"), LOCALE_ZH_TW,
+ IS_SYSTEM_READY, "com.android.apps.inputmethod.latin",
+ "com.android.apps.inputmethod.voice");
}
@SmallTest
public void testParcelable() throws Exception {
- final ArrayList<InputMethodInfo> originalList = getSamplePreinstalledImes();
+ final ArrayList<InputMethodInfo> originalList = getSamplePreinstalledImes("en-rUS");
final List<InputMethodInfo> clonedList = cloneViaParcel(originalList);
assertNotNull(clonedList);
final List<InputMethodInfo> clonedClonedList = cloneViaParcel(clonedList);
@@ -139,11 +160,14 @@ public class InputMethodTest extends InstrumentationTestCase {
}
private void assertDefaultEnabledImes(final ArrayList<InputMethodInfo> preinstalledImes,
- final Locale systemLocale, final boolean isSystemReady, String... imeNames) {
+ final Locale systemLocale, final boolean isSystemReady, String... expectedImeNames) {
final Context context = getInstrumentation().getTargetContext();
- assertEquals(new HashSet<String>(Arrays.asList(imeNames)),
- getPackageNames(callGetDefaultEnabledImesUnderWithLocale(context,
- isSystemReady, preinstalledImes, systemLocale)));
+ final String[] actualImeNames = getPackageNames(callGetDefaultEnabledImesUnderWithLocale(
+ context, isSystemReady, preinstalledImes, systemLocale));
+ assertEquals(expectedImeNames.length, actualImeNames.length);
+ for (int i = 0; i < expectedImeNames.length; ++i) {
+ assertEquals(expectedImeNames[i], actualImeNames[i]);
+ }
}
private static List<InputMethodInfo> cloneViaParcel(final List<InputMethodInfo> list) {
@@ -172,11 +196,10 @@ public class InputMethodTest extends InstrumentationTestCase {
}
}
- private HashSet<String> getPackageNames(final ArrayList<InputMethodInfo> imis) {
- final HashSet<String> packageNames = new HashSet<>();
- for (final InputMethodInfo imi : imis) {
- final String actualPackageName = imi.getPackageName();
- packageNames.add(actualPackageName);
+ private String[] getPackageNames(final ArrayList<InputMethodInfo> imis) {
+ final String[] packageNames = new String[imis.size()];
+ for (int i = 0; i < imis.size(); ++i) {
+ packageNames[i] = imis.get(i).getPackageName();
}
return packageNames;
}
@@ -278,21 +301,34 @@ public class InputMethodTest extends InstrumentationTestCase {
return preinstalledImes;
}
- private static ArrayList<InputMethodInfo> getSamplePreinstalledImes() {
+ private static boolean contains(final String[] textList, final String textToBeChecked) {
+ if (textList == null) {
+ return false;
+ }
+ for (final String text : textList) {
+ if (Objects.equals(textToBeChecked, text)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static ArrayList<InputMethodInfo> getSamplePreinstalledImes(final String localeString) {
ArrayList<InputMethodInfo> preinstalledImes = new ArrayList<>();
// a dummy Voice IME
{
+ final boolean isDefaultIme = false;
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
subtypes.add(createDummyInputMethodSubtype("", SUBTYPE_MODE_VOICE, IS_AUX,
IS_AUTO, !IS_ASCII_CAPABLE));
preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.voice",
- "com.android.inputmethod.voice", "DummyVoiceIme", IS_AUX, IS_DEFAULT,
+ "com.android.inputmethod.voice", "DummyVoiceIme", IS_AUX, isDefaultIme,
subtypes));
}
-
// a dummy Hindi IME
{
+ final boolean isDefaultIme = contains(new String[]{ "hi", "en-rIN" }, localeString);
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
// TODO: This subtype should be marked as IS_ASCII_CAPABLE
subtypes.add(createDummyInputMethodSubtype("en_IN", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
@@ -300,32 +336,36 @@ public class InputMethodTest extends InstrumentationTestCase {
subtypes.add(createDummyInputMethodSubtype("hi", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, !IS_ASCII_CAPABLE));
preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.hindi",
- "com.android.inputmethod.hindi", "DummyHindiIme", !IS_AUX, IS_DEFAULT,
+ "com.android.inputmethod.hindi", "DummyHindiIme", !IS_AUX, isDefaultIme,
subtypes));
}
// a dummy Pinyin IME
{
+ final boolean isDefaultIme = contains(new String[]{ "zh-rCN" }, localeString);
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
subtypes.add(createDummyInputMethodSubtype("zh_CN", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, !IS_ASCII_CAPABLE));
- preinstalledImes.add(createDummyInputMethodInfo("ccom.android.apps.inputmethod.pinyin",
- "com.android.apps.inputmethod.pinyin", "DummyPinyinIme", !IS_AUX, IS_DEFAULT,
+ preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.pinyin",
+ "com.android.apps.inputmethod.pinyin", "DummyPinyinIme", !IS_AUX, isDefaultIme,
subtypes));
}
- // a dummy Korian IME
+ // a dummy Korean IME
{
+ final boolean isDefaultIme = contains(new String[]{ "ko" }, localeString);
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
subtypes.add(createDummyInputMethodSubtype("ko", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, !IS_ASCII_CAPABLE));
preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.korean",
- "com.android.apps.inputmethod.korean", "DummyKorianIme", !IS_AUX, IS_DEFAULT,
+ "com.android.apps.inputmethod.korean", "DummyKoreanIme", !IS_AUX, isDefaultIme,
subtypes));
}
// a dummy Latin IME
{
+ final boolean isDefaultIme = contains(
+ new String[]{ "en-rUS", "en-rGB", "en-rIN", "en", "hi" }, localeString);
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
subtypes.add(createDummyInputMethodSubtype("en_US", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, IS_ASCII_CAPABLE));
@@ -336,12 +376,13 @@ public class InputMethodTest extends InstrumentationTestCase {
subtypes.add(createDummyInputMethodSubtype("hi", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, IS_ASCII_CAPABLE));
preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.latin",
- "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, IS_DEFAULT,
+ "com.android.apps.inputmethod.latin", "DummyLatinIme", !IS_AUX, isDefaultIme,
subtypes));
}
// a dummy Japanese IME
{
+ final boolean isDefaultIme = contains(new String[]{ "ja", "ja-rJP" }, localeString);
final ArrayList<InputMethodSubtype> subtypes = new ArrayList<InputMethodSubtype>();
subtypes.add(createDummyInputMethodSubtype("ja", SUBTYPE_MODE_KEYBOARD, !IS_AUX,
!IS_AUTO, !IS_ASCII_CAPABLE));
@@ -349,7 +390,7 @@ public class InputMethodTest extends InstrumentationTestCase {
!IS_AUTO, !IS_ASCII_CAPABLE));
preinstalledImes.add(createDummyInputMethodInfo("com.android.apps.inputmethod.japanese",
"com.android.apps.inputmethod.japanese", "DummyJapaneseIme", !IS_AUX,
- IS_DEFAULT, subtypes));
+ isDefaultIme, subtypes));
}
return preinstalledImes;
diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml
index c4a949f..4b38ad3 100644
--- a/data/fonts/fallback_fonts.xml
+++ b/data/fonts/fallback_fonts.xml
@@ -223,7 +223,28 @@
</family>
<family>
<fileset>
- <file>NotoSansCherokee-Regular.ttf</file>
+ <file>NotoSansThaana-Regular.ttf</file>
+ <file>NotoSansThaana-Bold.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansBalinese-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansBatak-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansBuginese-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansBuhid-Regular.ttf</file>
</fileset>
</family>
<family>
@@ -233,6 +254,66 @@
</family>
<family>
<fileset>
+ <file>NotoSansCherokee-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansHanunoo-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansJavanese-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansLepcha-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansLimbu-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansMeeteiMayek-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansOlChiki-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansRejang-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansSaurashtra-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansSundanese-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansSylotiNagri-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>NotoSansTagbanwa-Regular.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
<file>NotoSansYi-Regular.ttf</file>
</fileset>
</family>
diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml
index 09055c6..4493554 100644
--- a/data/fonts/fonts.xml
+++ b/data/fonts/fonts.xml
@@ -220,12 +220,61 @@
<font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font>
</family>
<family>
- <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font>
+ <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font>
+ <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font>
</family>
<family>
<font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font>
</family>
<family>
+ <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font>
+ </family>
+ <family>
+ <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font>
+ </family>
+ <family>
<font weight="400" style="normal">NotoSansYi-Regular.ttf</font>
</family>
<family lang="zh-Hans">
diff --git a/docs/html/about/about_toc.cs b/docs/html/about/about_toc.cs
index c025b61..9033d69 100644
--- a/docs/html/about/about_toc.cs
+++ b/docs/html/about/about_toc.cs
@@ -11,6 +11,7 @@
<span class="en">Lollipop</span></a></div>
<ul>
<li><a href="<?cs var:toroot ?>about/versions/android-5.0.html">Android 5.0 APIs</a></li>
+ <li><a href="<?cs var:toroot ?>about/versions/android-5.0-changes.html">Android 5.0 Changes</a></li>
</ul>
</li>
<li class="nav-section">
diff --git a/docs/html/about/versions/android-5.0-changes.jd b/docs/html/about/versions/android-5.0-changes.jd
new file mode 100644
index 0000000..f12e83c
--- /dev/null
+++ b/docs/html/about/versions/android-5.0-changes.jd
@@ -0,0 +1,525 @@
+page.title=Android 5.0 Changes
+excludeFromSuggestions=true
+sdk.platform.version=5.0
+sdk.platform.apiLevel=21
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>In this document</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#UI"><a href="#ART">ART Runtime</a></a></li>
+ <li><a href="#BehaviorNotifications">Notifications</a></li>
+ <li><a href="#BehaviorMediaControl">Media Controls</a></li>
+ <li><a href="#BehaviorGetRecentTasks">getRecentTasks()</a></li>
+ <li><a href="#64BitSupport">64-Bit Android NDK</a></li>
+ <li><a href="#BindService">Binding to a Service</a></li>
+ <li><a href="#Power"><a href="#BehaviorWebView">WebView</a></a></li>
+ <li><a href="#custom_permissions">Custom Permissions</a></li>
+ <li><a href="#ssl">TLS/SSL Configuration</a></li>
+</ol>
+
+<h2>API Differences</h2>
+<ol>
+<li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 &raquo;</a> </li>
+<li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview to 21 &raquo;</a> </li>
+</ol>
+
+
+<h2>See Also</h2>
+<ol>
+<li><a href="{@docRoot}about/versions/lollipop.html">Android Lollipop Highlights</a> </li>
+<li><a href="{@docRoot}about/versions/android-5.0.html">Android 5.0 API Overview</a> </li>
+</ol>
+
+
+</div>
+</div>
+
+<p>API Level: {@sdkPlatformApiLevel}</p>
+<p>Along with new features and capabilities, Android 5.0 includes a variety of changes
+API changes,
+behavior changes, system enhancements, and bug fixes. This document highlights
+some of the key changes that you should be understand and account for in your apps.</p>
+
+<p>If you have previously published an app for Android, be aware that your app
+ might be affected by these changes in Android 5.0.</p>
+
+
+<p>For a high-level look at the new platform features, instead
+see the
+<a href="{@docRoot}about/versions/lollipop.html">Android Lollipop
+highlights</a>.</p>
+
+
+
+<h2 id="ART">Android Runtime (ART)</h2>
+
+<p>In Android 5.0 the ART runtime replaces Dalvik as the platform default. The ART runtime was
+introduced in Android 4.4 on an experimental basis.</p>
+
+<p>For an overview of ART's new features, see
+<a href="https://source.android.com/devices/tech/dalvik/art.html">Introducing
+ART</a>. Some of the major new features are:</p>
+
+<ul>
+ <li>Ahead-of-time (AOT) compilation</li>
+ <li>Improved garbage collection (GC)</li>
+ <li>Improved debugging support</li>
+</ul>
+
+<p>Most Android apps should just work without any changes under ART. However, some
+techniques that work on Dalvik do not work on ART. For information about the
+most important issues, see
+<a href="{@docRoot}guide/practices/verifying-apps-art.html">Verifying App
+Behavior on the Android Runtime (ART)</a>. Pay particular attention if:</p>
+
+<ul>
+ <li>Your app uses Java Native Interface (JNI) to run C/C++ code.</li>
+ <li>You use development tools that generate non-standard code (such as some
+ obfuscators).</li>
+ <li>You use techniques that are incompatible with compacting garbage
+ collection.</li>
+</ul>
+
+
+<h2 id="BehaviorNotifications">Notifications</h2>
+
+<p>Make sure your notifications take these Android 5.0 changes into account.
+ To learn more about designing your notifications for Android 5.0 and higher,
+ see the <a href="{@docRoot}design/patterns/notifications.html">notifications design guide</a>.
+</p>
+
+<h3 id="NotificationsMaterialDesignStyle">Material design style</h3>
+<p>Notifications are drawn with dark text atop white (or very light) backgrounds
+ to match the new material design widgets. Make sure that all your
+ notifications look right with the new color scheme. If your notifications
+look wrong, fix them:</p>
+
+<ul>
+ <li>Use {@link android.app.Notification.Builder#setColor(int) setColor()}
+ to set an accent color in a circle behind your icon image. </li>
+ <li>Update or remove assets that involve color. The system ignores all
+ non-alpha channels in action icons and in the main notification icon. You
+ should assume that these icons will be alpha-only. The system draws
+ notification icons in white and action icons in dark gray.</li>
+</ul>
+
+<h3 id="NotificationsSoundVibration">Sound and vibration</h3>
+<p>If you are currently adding sounds and vibrations to your notifications by
+using the {@link android.media.Ringtone}, {@link android.media.MediaPlayer},
+or {@link android.os.Vibrator} classes, remove this code so that
+the system can present notifications correctly in
+<em>priority</em> mode. Instead, use
+{@link android.app.Notification.Builder} methods to add sounds and
+vibration.</p>
+
+<p>Setting the device to
+{@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT} causes
+the device to enter the new priority mode. The device leaves priority
+mode if you set it to
+{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} or
+{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE}.</p>
+
+<p>Previously, Android used {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC}
+as the master stream to control volume on tablet devices. In Android 5.0, the
+master volume stream for both phone and tablet devices is now unified, and
+is controlled by {@link android.media.AudioManager#STREAM_RING STREAM_RING} or
+{@link android.media.AudioManager#STREAM_NOTIFICATION STREAM_NOTIFICATION}.</p>
+
+<h3 id="NotificationsLockscreenVisibility">Lock screen visibility</h3>
+<p>By default, notifications now appear on the user's lock screen in Android 5.0.
+Users can choose to protect sensitive information from being exposed, in which
+case the system automatically redacts the text displayed by the notification. To
+customize this redacted notification, use
+{@link android.app.Notification.Builder#setPublicVersion(android.app.Notification)
+ setPublicVersion()}.</p>
+<p>If the notification does not contain personal information, or if you want to
+allow media playback control on the notification, call the
+{@link android.app.Notification.Builder#setVisibility(int) setVisibility()}
+method and set the notification's visibility level to
+{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}.
+</p>
+
+<h3 id="NotificationsMediaPlayback">Media playback</h3>
+<p>If you are implementing notifications that present media playback
+status or transport controls, consider using the new
+{@link android.app.Notification.MediaStyle} template instead of a custom
+{@link android.widget.RemoteViews.RemoteView} object. Whichever approach you
+choose, make sure to set the notification's visibility to
+{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC} so that
+your controls are accessible from the lock screen. Note that beginning in
+Android 5.0, the system no longer shows
+{@link android.media.RemoteControlClient} objects on the lock screen. For more
+information, see
+<a href="#BehaviorMediaControl">If your app uses RemoteControlClient</a>.</p>
+
+<h3 id="NotificationsHeadsup">Heads-up notification</h3>
+<p>Notifications may now appear in a small floating window (also called a
+ heads-up notification) when the device is active (that is, the device is
+ unlocked and its screen is on). These notifications appear similar to the
+ compact form of your notification, except that the heads-up notification also
+ shows action buttons. Users can act on, or dismiss, a heads-up notification
+ without leaving the current app.</p>
+
+<p>Examples of conditions that may trigger heads-up notifications include:</p>
+
+<ul>
+ <li>The user's activity is in fullscreen mode (the app uses
+{@link android.app.Notification#fullScreenIntent})</li>
+ <li>The notification has high priority and uses ringtones or vibrations</li>
+</ul>
+
+<p>If your app implements notifications under any of those scenarios, make sure
+that heads-up notifications are presented correctly.</p>
+
+<h2 id="BehaviorMediaControl">Media Controls and RemoteControlClient</h2>
+<p>The {@link android.media.RemoteControlClient} class is now deprecated. Switch
+ to the new {@link android.media.session.MediaSession} API as
+ soon as possible.</p>
+
+<p>Lock screens in Android 5.0 do not show transport controls for
+your {@link android.media.session.MediaSession} or
+{@link android.media.RemoteControlClient}. Instead, your app can provide
+media playback control from the lock screen through a notification. This
+gives your app more control over the presentation of media buttons, while
+providing a consistent experience for users across locked and
+unlocked devices.</p>
+
+<p>Android 5.0 introduces a new
+{@link android.app.Notification.MediaStyle} template for this purpose.
+{@link android.app.Notification.MediaStyle} converts notification
+actions that you added with
+{@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence,
+ android.app.PendingIntent)
+Notification.Builder.addAction()} into compact buttons embedded in your app's
+media playback notifications. Pass your session token to the
+{@link android.app.Notification.MediaStyle#setMediaSession(android.media.session.MediaSession.Token)
+ setSession()} method to inform the system that this notification controls an
+ ongoing media session.</p>
+
+<p>Make sure to set the notification's visibility to
+ {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}
+ to mark the notification as safe to show on any lock screen (secure or
+ otherwise). For more information, see
+ <a href="#LockscreenNotifications">Lock screen notifications</a>.</p>
+
+<p>To display media playback controls if your app is running on the
+Android <a href="{@docRoot}tv/index.html">TV</a> or
+<a href="{@docRoot}wear/index.html">Wear</a> platform, implement the
+{@link android.media.session.MediaSession} class. You should also implement
+{@link android.media.session.MediaSession} if your app needs to receive media
+button events on Android devices.</p>
+
+<h2 id="BehaviorGetRecentTasks">getRecentTasks()</h2>
+
+<p>With the introduction of the new <em>concurrent documents and activities
+tasks</em> feature in Android 5.0 (see <a href="#Recents">Concurrent
+documents and activities in the recents screen</a> below),
+the {@link android.app.ActivityManager#getRecentTasks
+ActivityManager.getRecentTasks()} method is now deprecated to improve user
+privacy. For backward compatibility, this method still returns a small subset of
+its data, including the calling application’s own tasks and possibly some other
+non-sensitive tasks (such as Home). If your app is using this method to retrieve
+its own tasks, use {@link android.app.ActivityManager#getAppTasks() getAppTasks()}
+instead to retrieve that information.</p>
+
+<h2 id="64BitSupport">64-Bit Support in the Android NDK</h2>
+
+<p>Android 5.0 introduces support for 64-bit systems. The 64-bit enhancement
+ increases address space and improves performance, while still supporting
+ existing 32-bit apps fully. The 64-bit support also improves the performance of
+ OpenSSL for cryptography. In addition, this release introduces new native
+ media NDK APIs, as well as native OpenGL ES (GLES) 3.1 support.</p>
+
+<p>To use the 64-bit support provided in Android 5.0, download and install NDK
+ Revision 10c from the
+<a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK page</a>. Refer to the
+Revision 10c <a href="{@docRoot}tools/sdk/ndk/index.html#Revisions">release notes</a>
+for more information about important changes and bug fixes to the NDK.</p>
+
+<h2 id="BindService">Binding to a Service</h2>
+
+<p>The
+ {@link android.content.Context#bindService(android.content.Intent, android.content.ServiceConnection, int) Context.bindService()}
+ method now requires an explicit {@link android.content.Intent},
+and throws an exception if given an implicit intent.
+To ensure your app is secure, use an explicit intent when starting or binding
+your {@link android.app.Service}, and do not declare intent filters for the service.</p>
+
+<h2 id="BehaviorWebView">WebView</h2>
+
+<p>Android 5.0 changes the default behavior for your app.</p>
+<ul>
+<li><strong>If your app targets API level 21 or higher:</strong>
+ <ul>
+ <li>The system
+ blocks <a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent"
+ class="external-link">mixed content</a> and third party cookies by default. To allow mixed
+ content and third party cookies, use the
+ {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()}
+and {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()}
+methods respectively.</li>
+ <li>The system now intelligently chooses portions of the HTML
+ document to draw. This new default behavior helps to reduce memory
+ footprint and increase performance. If you want to
+ render the whole document at once, disable this optimization by calling
+ {@link android.webkit.WebView#enableSlowWholeDocumentDraw()}.</li>
+ </ul>
+</li>
+<li><strong>If your app targets API levels lower than 21:</strong> The system
+ allows mixed content and third party cookies, and always renders the whole
+ document at once.</li>
+</ul>
+
+<h2 id="custom_permissions">Uniqueness Requirement for Custom Permissions</h2>
+
+<p>
+ As documented in the <a href=
+ "{@docRoot}guide/topics/manifest/manifest-intro.html#perms">Permissions</a>
+ overview, Android apps can define custom permissions as a means of managing
+ access to components in a proprietary way, without using the platform’s
+ pre-defined system permissions. Apps define custom permissions in <a href=
+ "http://developer.android.com/guide/topics/manifest/permission-element.html"><code>
+ &lt;permission&gt;</code></a> elements declared in their manifest files.
+</p>
+
+<p>
+ There are a small number of scenarios where defining custom permissions is a
+ legitimate and secure approach. However, creating custom permissions is
+ sometimes unnecessary and can even introduce potential risk to an app,
+ depending on the protection level assigned to the permissions.
+</p>
+
+<p>
+ Android 5.0 includes a behavior change to ensure
+ that only one app can define a given custom permission, unless signed with the
+ same key as other apps defining the permission.
+</p>
+
+<h3>
+ Apps using duplicate custom permissions
+</h3>
+
+<p>
+ Any app can define any custom permission it wants, so it can happen
+ that multiple apps might <strong>define the same custom permission</strong>.
+ For example, if two apps offer a similar capability, they might derive the
+ same logical name for their custom permissions. Apps might also incorporate
+ common public libraries or code examples that themselves include the same
+ custom permission definitions.
+</p>
+
+<p>
+ In Android 4.4 and earlier, users were able to install multiple such
+ apps on a given device, although the system assigned the protection level
+ specified by the first-installed app.
+</p>
+
+<p>
+ Starting in Android 5.0, the system enforces a new
+ <strong>uniqueness restriction on custom permissions</strong> for
+ apps that are signed with different keys. Now only one app on a device can
+ define a given custom permission (as determined by its name), unless the
+ other app defining the permission is signed with the same key. If the user
+ tries to install an app with a duplicate custom permission and is not signed
+ with the same key as the resident app that defines the permission, the system
+ blocks the installation.
+</p>
+
+<h3>
+ Considerations for your app
+</h3>
+
+<p>
+ In Android 5.0 and later, apps can continue to define their own custom
+ permissions just as before and to request custom permissions from other apps
+ through the <code>&lt;uses-permission&gt;</code> mechanism. However with the
+ new requirement introduced in Android 5.0, you should carefully assess
+ possible impacts on your app.
+</p>
+
+<p>
+ Here are some points to consider:
+</p>
+
+<ul>
+ <li>Does your app declare any <a href=
+ "http://developer.android.com/guide/topics/manifest/permission-element.html">
+ <code>&lt;permission&gt;</code></a> elements in its manifest? If so, are
+ they actually necessary to the proper function of your app or service? Or
+ could you use a system default permission instead?
+ </li>
+
+ <li>If you have <a href=
+ "http://developer.android.com/guide/topics/manifest/permission-element.html">
+ <code>&lt;permission&gt;</code></a> elements in your app, do you know where
+ they came from?
+ </li>
+
+ <li>Do you actually intend for other apps to request your custom permissions
+ through <a href=
+ "http://developer.android.com/guide/topics/manifest/uses-permission-element.html">
+ <code>&lt;uses-permission&gt;</code></a>?
+ </li>
+
+ <li>Are you using boilerplate or example code in your app that includes
+ <a href=
+ "http://developer.android.com/guide/topics/manifest/permission-element.html">
+ <code>&lt;permission&gt;</code></a> elements? Are those permission elements
+ actually necessary?
+ </li>
+
+ <li>Do your custom permissions use names that are simple or based on common
+ terms that other apps might share?
+ </li>
+</ul>
+
+<h3>
+ New installs and updates
+</h3>
+
+<p>
+ As mentioned above, for new installs and updates of your app on devices
+ running Android 4.4 or earlier are unaffected and there is no change in
+ behavior. For new installs and updates on devices running Android 5.0 or
+ later, the system <strong>prevents installation of your app</strong> if it
+ defines a custom permission that is already defined by an existing resident
+ app.
+</p>
+
+<h3>
+ Existing installs with Android 5.0 system update
+</h3>
+
+<p>
+ If your app uses custom permissions and is widely distributed and installed,
+ there’s a chance that it will be affected when users receive update their
+ devices to Android 5.0. After the system update is installed, the system
+ revalidates installed apps, including a check of their custom permissions. If
+ your app defines a custom permission that is already defined by another app
+ that has already been validated, and your app is not signed with the same key
+ as the other app, the system <strong>does not re-install your app</strong>.
+</p>
+
+<h3>
+ Recommendations
+</h3>
+
+<p>
+ On devices running Android 5.0 or later, we recommend that you examine your
+ app immediately, make any adjustments needed, and publish the updated version
+ as soon as possible to your users.
+</p>
+
+<ul>
+ <li>If you are using custom permissions in your app, consider their origin
+ and whether you actually need them. Remove all <a href=
+ "http://developer.android.com/guide/topics/manifest/permission-element.html">
+ <code>&lt;permission&gt;</code></a> elements from your app, unless you are
+ certain that they are required for proper function of your app.
+ </li>
+
+ <li>Consider replacing your custom permissions with system default
+ permissions where possible.
+ </li>
+
+ <li>If your app requires custom permissions, rename your custom permissions
+ to be unique to your app, such as by appending them to the full package name
+ of your app.
+ </li>
+
+ <li>If you have a suite of apps <em>signed with different keys</em> and the apps
+ access a shared component by means of a custom permission, make sure that the
+ custom permission is only defined once, in the shared component. Apps that
+ use the shared component should not define the custom permission themselves,
+ but should instead request access through the <a href=
+ "{@docRoot}guide/topics/manifest/uses-permission-element.html">
+ <code>&lt;uses-permission&gt;</code></a> mechanism.
+ </li>
+
+ <li>If you have a suite of apps are <em>signed with the same key</em>,
+ each app can define the same custom permission(s) as <span style="white-space:nowrap;">needed
+ &mdash; the</span> system allows the apps to be installed in the usual way.
+ </li>
+
+</ul>
+
+
+<h2 id="ssl">
+ TLS/SSL Default Configuration Changes
+</h2>
+
+<p>
+ Android 5.0 introduces changes the default TLS/SSL configuration used by apps
+ for HTTPS and other TLS/SSL traffic:
+</p>
+
+<ul>
+ <li>TLSv1.2 and TLSv1.1 protocols are now enabled,</li>
+ <li>AES-GCM (AEAD) cipher suites are now enabled,</li>
+ <li>MD5, 3DES, export, and static key ECDH cipher suites are now disabled,</li>
+ <li>Forward Secrecy cipher suites (ECDHE and DHE) are preferred.</li>
+</ul>
+
+<p>
+ These changes may lead to breakages in HTTPS or TLS/SSL connectivity in a
+ small number of cases listed below.
+</p>
+
+<p>
+ Note that the security ProviderInstaller from Google Play services already
+ offers these changes across Android platform versions back to Android 2.3.
+</p>
+
+<h3>
+ Server does not support any of the enabled ciphers suites
+</h3>
+
+<p>
+ For example, a server might support only 3DES or MD5 cipher suites. The
+ preferred fix is to improve the server’s configuration to enable stronger and
+ more modern cipher suites and protocols. Ideally, TLSv1.2 and AES-GCM should
+ be enabled, and Forward Secrecy cipher suites (ECDHE, DHE) should be enabled
+ and preferred.
+</p>
+
+<p>
+ An alternative is to modify the app to use a custom SSLSocketFactory to
+ communicate with the server. The factory should be designed to create
+ SSLSocket instances which have some of the cipher suites required by the
+ server enabled in addition to default cipher suites.
+</p>
+
+<h3>
+ App is making wrong assumptions about cipher suites used to connect to server
+</h3>
+
+<p>
+ For example, some apps contain a custom X509TrustManager that breaks because
+ it expects the authType parameter to be RSA but encounters ECDHE_RSA or
+ DHE_RSA.
+</p>
+
+<h3>
+ Server is intolerant to TLSv1.1, TLSv1.2 or new TLS extensions
+</h3>
+
+<p>
+ For example, the TLS/SSL handshake with a server is erroneously rejected or
+ stalls. The preferred fix is to upgrade the server to comply with the TLS/SSL
+ protocol. This will make the server successfully negotiate these newer
+ protocols or negotiate TLSv1 or older protocols and ignore TLS extensions it
+ does not understand. In some cases disabling TLSv1.1 and TLSv1.2 on the
+ server may work as a stopgap measure until the server software is upgraded.
+</p>
+
+<p>
+ An alternative is to modify the app to use a custom SSLSocketFactory to
+ communicate with the server. The factory should be designed to create
+ SSLSocket instances with only those protocols enabled which are correctly
+ supported by the server.
+</p> \ No newline at end of file
diff --git a/docs/html/about/versions/android-5.0.jd b/docs/html/about/versions/android-5.0.jd
index a438420..756b75f 100644
--- a/docs/html/about/versions/android-5.0.jd
+++ b/docs/html/about/versions/android-5.0.jd
@@ -15,17 +15,10 @@ sdk.platform.apiLevel=21
<ol id="toc44" class="hide-nested">
<li><a href="#ApiLevel">Update your target API level</a></li>
- <li><a href="#Behaviors">Important Behavior Changes</a>
- <ol>
- <li><a href="#ART">If you haven't tested your app against the new Android Runtime (ART)...</a></li>
- <li><a href="#BehaviorNotifications">If your app implements notifications...</a></li>
- <li><a href="#BehaviorMediaControl">If your app uses RemoteControlClient...</a></li>
-<li><a href="#BehaviorGetRecentTasks">If your app uses getRecentTasks()...</a></li>
-<li><a href="#64BitSupport">If you are using the Android Native Development Kit (NDK)...</a></li>
-<li><a href="#BindService">If your app binds to a Service...</a></li>
-<li><a href="#BehaviorWebView">If your app uses a WebView...</a></li>
- </ol>
- </li>
+
+
+
+
<li><a href="#UI">User Interface</a>
<ol>
<li><a href="#MaterialDesign">Material design support</a></li>
@@ -113,6 +106,13 @@ sdk.platform.apiLevel=21
<li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview to 21 &raquo;</a> </li>
</ol>
+<h2>See Also</h2>
+<ol>
+<li><a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior Changes</a> </li>
+<li><a href="{@docRoot}about/versions/lollipop.html">Android Lollipop Highlights</a> </li>
+</ol>
+
+
</div>
</div>
@@ -122,12 +122,19 @@ sdk.platform.apiLevel=21
offers new features for users and app developers. This document provides an
introduction to the most notable new APIs.</p>
+<p>
+ If you have a published app, make sure to check out the <a href=
+ "{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Behavior
+ Changes</a> that you should account for in your app. These behavior changes
+ may affect your app on Android 5.0 devices, even if you are not using new APIs
+ or targeting new functionality.
+</p>
+
<p>For a high-level look at the new platform features, instead
see the
<a href="{@docRoot}about/versions/lollipop.html">Android Lollipop
highlights</a>.</p>
-
<h3 id="Start">Start developing</h3>
<p>To start building apps for Android 5.0, you must first <a href="{@docRoot}sdk/index.html">get
@@ -143,8 +150,6 @@ to download the Android 5.0 SDK Platform and System Images.</p>
">To test your apps on a real device, flash a Nexus 5 or Nexus 7 with the <br>
<a href="/preview/index.html#Start"><b>ANDROID PREVIEW SYSTEM IMAGE</b></a>.</p>
-
-
<h3 id="ApiLevel">Update your target API level</h3>
<p>To better optimize your app for devices running Android {@sdkPlatformVersion},
@@ -166,237 +171,18 @@ Different Platform Versions</a>.</p>
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">What is API
Level?</a></p>
-<h2 id="Behaviors">Important Behavior Changes</h2>
+<h3 id="Behaviors">Important behavior changes</h3>
-<p>If you have previously published an app for Android, be aware that your app
- might be affected by changes in Android 5.0.</p>
+<p>If you have previously published an app for Android, be aware that your app might be affected by changes in Android 5.0.</p>
-<h3 id="ART">If you haven't tested your app against the new Android Runtime (ART)...</h3>
-
-<p>The 4.4 release introduced a new, experimental Android runtime, ART. Under
-4.4, ART was optional, and the default runtime remained Dalvik. With Android
-5.0, ART is now the default runtime.</p>
-
-<p>For an overview of ART's new features, see
-<a href="https://source.android.com/devices/tech/dalvik/art.html">Introducing
-ART</a>. Some of the major new features are:</p>
-
-<ul>
- <li>Ahead-of-time (AOT) compilation</li>
- <li>Improved garbage collection (GC)</li>
- <li>Improved debugging support</li>
-</ul>
+<p>Please see <a href="{@docRoot}about/versions/android-5.0-changes.html">Android 5.0 Changes</a> for complete information.</p>
-<p>Most Android apps should just work without any changes under ART. However, some
-techniques that work on Dalvik do not work on ART. For information about the
-most important issues, see
-<a href="{@docRoot}guide/practices/verifying-apps-art.html">Verifying App
-Behavior on the Android Runtime (ART)</a>. Pay particular attention if:</p>
-
-<ul>
- <li>Your app uses Java Native Interface (JNI) to run C/C++ code.</li>
- <li>You use development tools that generate non-standard code (such as some
- obfuscators).</li>
- <li>You use techniques that are incompatible with compacting garbage
- collection. (ART does not currently implement compacting GC, but
- compacting GC is under development in the Android Open Source
- Project.)</li>
-</ul>
-
-<h3 id="BehaviorNotifications">If your app implements notifications...</h3>
-
-<p>Make sure your notifications take these Android 5.0 changes into account.
- To learn more about designing your notifications for Android 5.0 and higher,
- see the <a href="{@docRoot}design/patterns/notifications.html">notifications design guide</a>.
-</p>
-
-<h4 id="NotificationsMaterialDesignStyle">Material design style</h4>
-<p>Notifications are drawn with dark text atop white (or very light) backgrounds
- to match the new material design widgets. Make sure that all your
- notifications look right with the new color scheme. If your notifications
-look wrong, fix them:</p>
-
-<ul>
- <li>Use {@link android.app.Notification.Builder#setColor(int) setColor()}
- to set an accent color in a circle behind your icon image. </li>
- <li>Update or remove assets that involve color. The system ignores all
- non-alpha channels in action icons and in the main notification icon. You
- should assume that these icons will be alpha-only. The system draws
- notification icons in white and action icons in dark gray.</li>
-</ul>
-
-<h4 id="NotificationsSoundVibration">Sound and vibration</h4>
-<p>If you are currently adding sounds and vibrations to your notifications by
-using the {@link android.media.Ringtone}, {@link android.media.MediaPlayer},
-or {@link android.os.Vibrator} classes, remove this code so that
-the system can present notifications correctly in
-<em>priority</em> mode. Instead, use
-{@link android.app.Notification.Builder} methods to add sounds and
-vibration.</p>
-
-<p>Setting the device to
-{@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT} causes
-the device to enter the new priority mode. The device leaves priority
-mode if you set it to
-{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} or
-{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE}.</p>
-
-<p>Previously, Android used {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC}
-as the master stream to control volume on tablet devices. In Android 5.0, the
-master volume stream for both phone and tablet devices is now unified, and
-is controlled by {@link android.media.AudioManager#STREAM_RING STREAM_RING} or
-{@link android.media.AudioManager#STREAM_NOTIFICATION STREAM_NOTIFICATION}.</p>
-
-<h4 id="NotificationsLockscreenVisibility">Lock screen visibility</h4>
-<p>By default, notifications now appear on the user's lock screen in Android 5.0.
-Users can choose to protect sensitive information from being exposed, in which
-case the system automatically redacts the text displayed by the notification. To
-customize this redacted notification, use
-{@link android.app.Notification.Builder#setPublicVersion(android.app.Notification)
- setPublicVersion()}.</p>
-<p>If the notification does not contain personal information, or if you want to
-allow media playback control on the notification, call the
-{@link android.app.Notification.Builder#setVisibility(int) setVisibility()}
-method and set the notification's visibility level to
-{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}.
-</p>
-
-<h4 id="NotificationsMediaPlayback">Media playback</h4>
-<p>If you are implementing notifications that present media playback
-status or transport controls, consider using the new
-{@link android.app.Notification.MediaStyle} template instead of a custom
-{@link android.widget.RemoteViews.RemoteView} object. Whichever approach you
-choose, make sure to set the notification's visibility to
-{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC} so that
-your controls are accessible from the lock screen. Note that beginning in
-Android 5.0, the system no longer shows
-{@link android.media.RemoteControlClient} objects on the lock screen. For more
-information, see
-<a href="#BehaviorMediaControl">If your app uses RemoteControlClient</a>.</p>
-
-<h4 id="NotificationsHeadsup">Heads-up notification</h4>
-<p>Notifications may now appear in a small floating window (also called a
- heads-up notification) when the device is active (that is, the device is
- unlocked and its screen is on). These notifications appear similar to the
- compact form of your notification, except that the heads-up notification also
- shows action buttons. Users can act on, or dismiss, a heads-up notification
- without leaving the current app.</p>
-
-<p>Examples of conditions that may trigger heads-up notifications include:</p>
-
-<ul>
- <li>The user's activity is in fullscreen mode (the app uses
-{@link android.app.Notification#fullScreenIntent})</li>
- <li>The notification has high priority and uses ringtones or vibrations</li>
-</ul>
-
-<p>If your app implements notifications under any of those scenarios, make sure
-that heads-up notifications are presented correctly.</p>
-
-<h3 id="BehaviorMediaControl">If your app uses RemoteControlClient...</h3>
-<p>The {@link android.media.RemoteControlClient} class is now deprecated. Switch
- to the new {@link android.media.session.MediaSession} API as
- soon as possible.</p>
-
-<p>Lock screens in Android 5.0 do not show transport controls for
-your {@link android.media.session.MediaSession} or
-{@link android.media.RemoteControlClient}. Instead, your app can provide
-media playback control from the lock screen through a notification. This
-gives your app more control over the presentation of media buttons, while
-providing a consistent experience for users across locked and
-unlocked devices.</p>
-
-<p>Android 5.0 introduces a new
-{@link android.app.Notification.MediaStyle} template for this purpose.
-{@link android.app.Notification.MediaStyle} converts notification
-actions that you added with
-{@link android.app.Notification.Builder#addAction(int, java.lang.CharSequence,
- android.app.PendingIntent)
-Notification.Builder.addAction()} into compact buttons embedded in your app's
-media playback notifications. Pass your session token to the
-{@link android.app.Notification.MediaStyle#setMediaSession(android.media.session.MediaSession.Token)
- setSession()} method to inform the system that this notification controls an
- ongoing media session.</p>
-
-<p>Make sure to set the notification's visibility to
- {@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}
- to mark the notification as safe to show on any lock screen (secure or
- otherwise). For more information, see
- <a href="#LockscreenNotifications">Lock screen notifications</a>.</p>
-
-<p>To display media playback controls if your app is running on the
-Android <a href="{@docRoot}tv/index.html">TV</a> or
-<a href="{@docRoot}wear/index.html">Wear</a> platform, implement the
-{@link android.media.session.MediaSession} class. You should also implement
-{@link android.media.session.MediaSession} if your app needs to receive media
-button events on Android devices.</p>
-
-<h3 id="BehaviorGetRecentTasks">If your app uses getRecentTasks()...</h3>
-
-<p>With the introduction of the new <em>concurrent documents and activities
-tasks</em> feature in Android 5.0 (see <a href="#Recents">Concurrent
-documents and activities in the recents screen</a> below),
-the {@link android.app.ActivityManager#getRecentTasks
-ActivityManager.getRecentTasks()} method is now deprecated to improve user
-privacy. For backward compatibility, this method still returns a small subset of
-its data, including the calling application’s own tasks and possibly some other
-non-sensitive tasks (such as Home). If your app is using this method to retrieve
-its own tasks, use {@link android.app.ActivityManager#getAppTasks() getAppTasks()}
-instead to retrieve that information.</p>
-
-<h3 id="64BitSupport">If you are using the Android Native Development Kit (NDK)...</h3>
-
-<p>Android 5.0 introduces support for 64-bit systems. The 64-bit enhancement
- increases address space and improves performance, while still supporting
- existing 32-bit apps fully. The 64-bit support also improves the performance of
- OpenSSL for cryptography. In addition, this release introduces new native
- media NDK APIs, as well as native OpenGL ES (GLES) 3.1 support.</p>
-
-<p>To use the 64-bit support provided in Android 5.0, download and install NDK
- Revision 10c from the
-<a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK page</a>. Refer to the
-Revision 10c <a href="{@docRoot}tools/sdk/ndk/index.html#Revisions">release notes</a>
-for more information about important changes and bug fixes to the NDK.</p>
-
-<h3 id="BindService">If your app binds to a Service...</h3>
-
-<p>The
- {@link android.content.Context#bindService(android.content.Intent, android.content.ServiceConnection, int) Context.bindService()}
- method now requires an explicit {@link android.content.Intent},
-and throws an exception if given an implicit intent.
-To ensure your app is secure, use an explicit intent when starting or binding
-your {@link android.app.Service}, and do not declare intent filters for the service.</p>
-
-<h3 id="BehaviorWebView">If your app uses WebView...</h3>
-
-<p>Android 5.0 changes the default behavior for your app.</p>
-<ul>
-<li><strong>If your app targets API level 21 or higher:</strong>
- <ul>
- <li>The system
- blocks <a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent"
- class="external-link">mixed content</a> and third party cookies by default. To allow mixed
- content and third party cookies, use the
- {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()}
-and {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()}
-methods respectively.</li>
- <li>The system now intelligently chooses portions of the HTML
- document to draw. This new default behavior helps to reduce memory
- footprint and increase performance. If you want to
- render the whole document at once, disable this optimization by calling
- {@link android.webkit.WebView#enableSlowWholeDocumentDraw()}.</li>
- </ul>
-</li>
-<li><strong>If your app targets API levels lower than 21:</strong> The system
- allows mixed content and third party cookies, and always renders the whole
- document at once.</li>
-</ul>
<h2 id="UI">User Interface</h2>
<h3 id="MaterialDesign">Material design support</h3>
-<p>The upcoming release adds support for Android's new <em>material design</em>
+<p>Android 5.0 adds support for Android's new <em>material design</em>
style. You can create apps with material design that are visually dynamic and
have UI element transitions that feel natural to users. This support includes:</p>
diff --git a/docs/html/distribute/googleplay/googleplay_toc.cs b/docs/html/distribute/googleplay/googleplay_toc.cs
index fc7cd11..b3aa9bf 100644
--- a/docs/html/distribute/googleplay/googleplay_toc.cs
+++ b/docs/html/distribute/googleplay/googleplay_toc.cs
@@ -18,6 +18,12 @@
</div>
</li>
<li class="nav-section">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/googleplay/guide.html">
+ <span class="en">Finding Success on Google Play</span>
+ </a>
+ </div>
+ </li>
+ <li class="nav-section">
<div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/googleplay/tv.html">
<span class="en">Distributing to <span style="white-space:nowrap">Android TV</span></span>
</a>
diff --git a/docs/html/distribute/googleplay/guide.jd b/docs/html/distribute/googleplay/guide.jd
new file mode 100644
index 0000000..8317206
--- /dev/null
+++ b/docs/html/distribute/googleplay/guide.jd
@@ -0,0 +1,71 @@
+page.title=Finding Success on Google Play
+page.metaDescription=A guide to help you find success with your app or game business on Google Play.
+meta.tags="distribute", "bestpractices"
+page.tags="google play", "business", "monetize", "engagement"
+page.image=distribute/images/play_dev_guide.png
+
+@jd:body
+
+<p>
+ We’ve created a downloadable guide to help you find success with your app or
+ game business on Google Play. In it, you’ll find features, tips, and best
+ practices to help you build an effective strategy.
+</p>
+
+<p>
+ The guide is separated into the following sections:
+</p>
+<ul>
+ <li>
+ <strong>Publishing on Google Play</strong> &mdash; using the Google Play
+ Developer Console to distribute your app to over 1 billion Android users
+ worldwide.
+ </li>
+
+ <li>
+ <strong>Quality</strong> &mdash; The fundamentals of building a great app
+ and an insight into the Google Play guidelines and policies.
+ </li>
+
+ <li>
+ <strong>Discoverability &amp; reach</strong> &mdash; Maximizing your app's
+ discoverability and reaching the widest audience possible.
+ </li>
+
+ <li>
+ <strong>Engagement &amp; retention</strong> &mdash; Converting
+ installations into active users and improving user retention.
+ </li>
+
+ <li>
+ <strong>Monetization</strong> &mdash; Monetization strategies to generate
+ ongoing, growing revenue streams.
+ </li>
+
+ <li>
+ <strong>Measurement with Google Analytics</strong> &mdash; Understanding
+ your users and improving your app experience, conversions, and marketing.
+ </li>
+
+ <li>
+ <strong>Going global</strong> &mdash; Launching your app in local markets
+ around the world.
+ </li>
+</ul>
+
+<p>
+ Download the guide by clicking the image below or <a href=
+ "http://goo.gl/DFjbrS">get it on Google Play</a>.
+</p>
+
+<p>
+ We’ll release the guide in more languages in the coming months. Check back to
+ this website regularly as we post information on new features and best
+ practices to help you distribute and monetize your app.
+</p>
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:play_dev_guide"
+ data-cardSizes="9x6"
+ data-maxResults="1">
+ </div>
+
diff --git a/docs/html/distribute/images/play_dev_guide.png b/docs/html/distribute/images/play_dev_guide.png
new file mode 100644
index 0000000..5b0c0d9
--- /dev/null
+++ b/docs/html/distribute/images/play_dev_guide.png
Binary files differ
diff --git a/docs/html/distribute/images/play_dev_guide_b.jpg b/docs/html/distribute/images/play_dev_guide_b.jpg
new file mode 100644
index 0000000..15fd59f
--- /dev/null
+++ b/docs/html/distribute/images/play_dev_guide_b.jpg
Binary files differ
diff --git a/docs/html/distribute/tools/promote/brand.jd b/docs/html/distribute/tools/promote/brand.jd
index 9b9f9a3..22441df 100644
--- a/docs/html/distribute/tools/promote/brand.jd
+++ b/docs/html/distribute/tools/promote/brand.jd
@@ -11,17 +11,17 @@ provided that you follow the guidelines.</p>
<p>Use of the Android or Google Play brands must be reviewed by the Android
Partner Marketing team. Use the <a
-href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android and Google Play Brand Permissions Inquiry form</a> to submit your
+href="https://support.google.com/googleplay/contact/brand_developer">Android and Google Play Brand Permissions Inquiry form</a> to submit your
marketing for review.</p>
<h2 id="brand-android">Android</h2>
<p>The following are guidelines for the Android brand
and related assets.</p>
-
+
<h4 style="clear:right">Android in text</h4>
-
+
<div style="float:right;clear:right;width:200px;margin:0 0 20px 30px">
<img alt="" src="{@docRoot}images/brand/mediaplayer.png">
</div>
@@ -46,7 +46,7 @@ marketing for review.</p>
</ul>
</li>
</ul>
-
+
<p>Any use of the Android name needs to include this
attribution in your communication:</p>
<blockquote><em>Android is a trademark of Google Inc.</em></blockquote></p>
@@ -70,10 +70,10 @@ marketing for review.</p>
<p>When using the Android Robot or any modification of it, proper attribution is
required under the terms of the <a href="http://creativecommons.org/licenses/by/3.0/">Creative
Commons Attribution 3.0</a> license:</p>
-
+
<blockquote><em>The Android robot is reproduced or modified from work created and shared by Google and
used according to terms described in the Creative Commons 3.0 Attribution License.</em></blockquote>
-
+
<p>You may not file trademark applications incorporating the Android robot
logo or derivatives thereof within your company logo or business name. We
want to ensure that the Android robot remains available for all to use.</p>
@@ -119,7 +119,7 @@ Play&trade; store app."
<a href="{@docRoot}images/brand/Google_Play_Store_600.png">600x576</a>
</p>
</div>
-
+
<h4>Google Play store icon</h4>
<p>You may use the Google Play store icon, but you may not modify it.</p>
@@ -128,29 +128,29 @@ Play&trade; store app."
"Google Play store." However, when labeling the Google Play store icon directly, it's OK to use
"Play Store" alone to accurately reflect the icon label as it appears on a device.</p>
-
+
<h4>Google Play badge</h4>
-
+
<div style="float:right;clear:right;width:172px;margin-left:30px">
<img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="">
<p style="text-align:center">
<a href="{@docRoot}images/brand/en_app_rgb_wo_45.png">129x45</a> |
<a href="{@docRoot}images/brand/en_app_rgb_wo_60.png">172x60</a></p>
</div>
-
+
<div style="float:right;clear:right;width:172px;margin-left:30px">
<img src="{@docRoot}images/brand/en_generic_rgb_wo_60.png" alt="">
<p style="text-align:center">
<a href="{@docRoot}images/brand/en_generic_rgb_wo_45.png">129x45</a> |
<a href="{@docRoot}images/brand/en_generic_rgb_wo_60.png">172x60</a></p>
</div>
-
+
<p>The "Get it on Google Play" and "Android App on Google Play" logos are
badges that you can use on your website and promotional materials, to point
to your products on Google Play. Additional Google Play badge formats and
badges for music, books, magazines, movies, and TV shows are also available.
Use the <a
- href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android
+ href="https://support.google.com/googleplay/contact/brand_developer">Android
and Google Play Brand Permissions Inquiry form</a> to request
those badges.</p>
@@ -170,22 +170,22 @@ Play&trade; store app."
</ul>
</li>
</ul>
-
+
<p>To quickly create a badge that links to your apps on Google Play,
use the <a
href="{@docRoot}distribute/tools/promote/badges.html">Google Play badge generator</a>
(provides the badge in over 40 languages).</p>
-
+
<p>To create your own size, download an Adobe&reg; Illustrator&reg; (.ai) file for the
<a href="{@docRoot}distribute/tools/promote/badge-files.html">Google Play
badge in over 40 languages</a>.</p>
-
- <p>For details on all the ways that you can link to your product details page in Google Play,
+
+ <p>For details on all the ways that you can link to your product details page in Google Play,
see <a href="{@docRoot}distribute/tools/promote/linking.html">Linking to your products</a>.</p>
<h2 id="Marketing_Review">Marketing Reviews and Brand Inquiries</h2>
<p>Use the <a
-href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android
+href="https://support.google.com/googleplay/contact/brand_developer">Android
and Google Play Brand Permissions Inquiry form</a> to submit any marketing
reviews or brand inquires. Typical response time is at least one week.</p>
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_back.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_back.png
deleted file mode 100644
index f340a62..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_fore.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_fore.png
deleted file mode 100644
index 2a4e595..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_shadow.png
deleted file mode 100644
index f3a3120..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/land_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_back.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_back.png
deleted file mode 100644
index c40b37c..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_fore.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_fore.png
deleted file mode 100644
index aae684b..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_shadow.png
deleted file mode 100644
index 61a0da9..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/port_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/thumb.png b/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/thumb.png
deleted file mode 100644
index e21a421..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/galaxy_nexus/thumb.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_back.png
new file mode 100644
index 0000000..06695f5
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_back.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_fore.png
new file mode 100644
index 0000000..9fe5409
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_fore.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_shadow.png
new file mode 100644
index 0000000..99f826f
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/land_shadow.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_back.png
new file mode 100644
index 0000000..6e1aec6
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_back.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_fore.png
new file mode 100644
index 0000000..53ec73a
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_fore.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_shadow.png
new file mode 100644
index 0000000..66149c6
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/port_shadow.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_6/thumb.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/thumb.png
new file mode 100644
index 0000000..bc1f492
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_6/thumb.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_back.png
new file mode 100644
index 0000000..fdbc52c
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_back.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_fore.png
new file mode 100644
index 0000000..76fc78e
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_fore.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_shadow.png
new file mode 100644
index 0000000..d40758f
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/land_shadow.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_back.png
new file mode 100644
index 0000000..fd6f88f
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_back.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_fore.png
new file mode 100644
index 0000000..328ceef
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_fore.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_shadow.png
new file mode 100644
index 0000000..13eba2f
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/port_shadow.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_9/thumb.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/thumb.png
new file mode 100644
index 0000000..bb52e6c
--- /dev/null
+++ b/docs/html/distribute/tools/promote/device-art-resources/nexus_9/thumb.png
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_back.png
deleted file mode 100644
index f525e8e..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_fore.png
deleted file mode 100644
index e26bfe1..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_shadow.png
deleted file mode 100644
index ea26b73..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/land_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_back.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_back.png
deleted file mode 100644
index ed4ad0c..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_fore.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_fore.png
deleted file mode 100644
index 74bd077..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_shadow.png
deleted file mode 100644
index bb4bec8..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/port_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/thumb.png b/docs/html/distribute/tools/promote/device-art-resources/nexus_s/thumb.png
deleted file mode 100644
index 8b9a3d9..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/nexus_s/thumb.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_back.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/land_back.png
deleted file mode 100644
index e1eb075..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_fore.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/land_fore.png
deleted file mode 100644
index 15e5f50..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/land_shadow.png
deleted file mode 100644
index 885508a..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/land_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_back.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/port_back.png
deleted file mode 100644
index 290ca35..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_back.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_fore.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/port_fore.png
deleted file mode 100644
index 8b3dca3..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_fore.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_shadow.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/port_shadow.png
deleted file mode 100644
index 895b75e..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/port_shadow.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art-resources/xoom/thumb.png b/docs/html/distribute/tools/promote/device-art-resources/xoom/thumb.png
deleted file mode 100644
index 8fd08a4..0000000
--- a/docs/html/distribute/tools/promote/device-art-resources/xoom/thumb.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/distribute/tools/promote/device-art.jd b/docs/html/distribute/tools/promote/device-art.jd
index 1736060..3902b30 100644
--- a/docs/html/distribute/tools/promote/device-art.jd
+++ b/docs/html/distribute/tools/promote/device-art.jd
@@ -66,7 +66,7 @@ feature image or screenshots for your Google Play app listing.</p>
}
.device-list {
- padding: 0;
+ padding: 1em 0 0 0;
margin: 0;
}
@@ -187,6 +187,19 @@ feature image or screenshots for your Google Play app listing.</p>
portSize: [1080,1920],
},
{
+ id: 'nexus_6',
+ title: 'Nexus 6',
+ url: 'http://www.google.com/nexus/6/',
+ physicalSize: 6,
+ physicalHeight: 6.27,
+ density: '560DPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [489,327],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [327,489],
+ portSize: [1440, 2560],
+ },
+ {
id: 'nexus_7',
title: 'Nexus 7',
url: 'http://www.google.com/nexus/7/',
@@ -201,6 +214,20 @@ feature image or screenshots for your Google Play app listing.</p>
portSize: [800,1280]
},
{
+ id: 'nexus_9',
+ title: 'Nexus 9',
+ url: 'http://www.google.com/nexus/9/',
+ physicalSize: 9,
+ physicalHeight: 8.98,
+ actualResolution: [1536,2048],
+ density: 'XHDPI',
+ landRes: ['shadow', 'back', 'fore'],
+ landOffset: [514,350],
+ portRes: ['shadow', 'back', 'fore'],
+ portOffset: [348,514],
+ portSize: [1536,2048],
+ },
+ {
id: 'nexus_10',
title: 'Nexus 10',
url: 'http://www.google.com/nexus/10/',
@@ -212,19 +239,6 @@ feature image or screenshots for your Google Play app listing.</p>
landOffset: [227,217],
portRes: ['shadow', 'back', 'fore'],
portOffset: [217,223],
- portSize: [800,1280]
- },
- {
- id: 'xoom',
- title: 'Motorola XOOM',
- url: 'http://www.google.com/phone/detail/motorola-xoom',
- physicalSize: 10,
- physicalHeight: 6.61,
- density: 'MDPI',
- landRes: ['shadow', 'back', 'fore'],
- landOffset: [218,191],
- portRes: ['shadow', 'back', 'fore'],
- portOffset: [199,200],
portSize: [800,1280],
archived: true
},
@@ -256,34 +270,6 @@ feature image or screenshots for your Google Play app listing.</p>
portSize: [768,1280],
archived: true
},
- {
- id: 'galaxy_nexus',
- title: 'Galaxy Nexus',
- url: 'http://www.android.com/devices/detail/galaxy-nexus',
- physicalSize: 4.65,
- physicalHeight: 5.33,
- density: 'XHDPI',
- landRes: ['shadow', 'back', 'fore'],
- landOffset: [371,199],
- portRes: ['shadow', 'back', 'fore'],
- portOffset: [216,353],
- portSize: [720,1280],
- archived: true
- },
- {
- id: 'nexus_s',
- title: 'Nexus S',
- url: 'http://www.google.com/phone/detail/nexus-s',
- physicalSize: 4.0,
- physicalHeight: 4.88,
- density: 'HDPI',
- landRes: ['shadow', 'back', 'fore'],
- landOffset: [247,135],
- portRes: ['shadow', 'back', 'fore'],
- portOffset: [134,247],
- portSize: [480,800],
- archived: true
- }
];
DEVICES = DEVICES.sort(function(x, y) { return x.physicalSize - y.physicalSize; });
diff --git a/docs/html/google/auth/api-client.jd b/docs/html/google/auth/api-client.jd
index 5331d1e..a0836d1 100644
--- a/docs/html/google/auth/api-client.jd
+++ b/docs/html/google/auth/api-client.jd
@@ -15,6 +15,7 @@ startpage=true
<ol>
<li><a href="#HandlingFailures">Handle connection failures</a></li>
<li><a href="#MaintainingState">Maintain state while resolving an error</a></li>
+ <li><a href="#WearableApi">Access the Wearable API</a></li>
</ol>
</li>
<li><a href="#Communicating">Communicate with Google Services</a>
@@ -104,7 +105,17 @@ additional calls to
<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.Builder.html#addScope(com.google.android.gms.common.api.Scope)"
>{@code addScope()}</a>.</p>
-<p>However, before you can begin a connection by calling <a
+<p class="caution">
+<strong>Important:</strong> To avoid client connection errors on devices that do not have the
+<a href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app&hl=en">Android
+Wear app</a> installed, use a separate <a
+href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code
+GoogleApiClient}</a> instance to access only the <a
+href="{@docRoot}reference/com/google/android/gms/wearable/Wearable.html">{@code
+Wearable}</a> API. For more information, see <a href="#WearableApi">Access the Wearable
+API</a>.</p>
+
+<p>Before you can begin a connection by calling <a
href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()"
>{@code connect()}</a> on the <a
href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code
@@ -408,6 +419,45 @@ consult the corresponding documentation, such as for
</p>
+<h3 id="WearableApi">Access the Wearable API</h3>
+
+<p>On devices that do not have the <a
+href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app&hl=en">Android
+Wear app</a> installed, connection requests that include the <a
+href="{@docRoot}reference/com/google/android/gms/wearable/Wearable.html">{@code
+Wearable}</a> API fail with the <a
+href="{@docRoot}reference/com/google/android/gms/common/ConnectionResult.html#API_UNAVAILABLE">
+<code>API_UNAVAILABLE</code></a> error code. If your app uses the <a
+href="{@docRoot}reference/com/google/android/gms/wearable/Wearable.html">{@code
+Wearable}</a> API in addition to other Google APIs, use a separate <a
+href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code
+GoogleApiClient}</a> instance to access the <a
+href="{@docRoot}reference/com/google/android/gms/wearable/Wearable.html">{@code
+Wearable}</a> API. This approach enables you to access other Google APIs on devices that are not
+paired with a wearable device.</p>
+
+<p>When you use a separate <a
+href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code
+GoogleApiClient}</a> instance to access only the Wearable API, you can determine
+whether the <a
+href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app&hl=en">Android
+Wear app</a> is installed on the device:</p>
+
+<pre>
+// Connection failed listener method for a client that only
+// requests access to the Wearable API
+&#64;Override
+public void onConnectionFailed(ConnectionResult result) {
+ if (result.getErrorCode() == ConnectionResult.API_UNAVAILABLE) {
+ // The Android Wear app is not installed
+ }
+ ...
+}
+</pre>
+
+
+
+
<h2 id="Communicating">Communicate with Google Services</h2>
diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js
index d63580e..a38b80b 100644
--- a/docs/html/jd_collections.js
+++ b/docs/html/jd_collections.js
@@ -57,9 +57,9 @@ var RESOURCE_COLLECTIONS = {
},
"distribute/gp/gpfelanding": {
"resources": [
+ "distribute/googleplay/guide.html",
"distribute/googleplay/tv.html",
- "distribute/googleplay/edu/about.html",
- "distribute/googleplay/edu/videos.html"
+ "distribute/googleplay/edu/about.html"
]
},
"distribute/essentials": {
@@ -781,6 +781,12 @@ var RESOURCE_COLLECTIONS = {
"training/tv/index.html"
]
},
+ "play_dev_guide": {
+ "title": "",
+ "resources": [
+ "shareables/distribute/play_dev_guide_secrets_en.pdf"
+ ]
+ },
"distribute/stories/games": {
"title": "",
"resources": [
diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js
index 89d9761..36f26e8 100644
--- a/docs/html/jd_extras.js
+++ b/docs/html/jd_extras.js
@@ -1394,5 +1394,18 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([
"keywords": ["stories"],
"type": "Case Study Deck",
"titleFriendly": ""
+ },
+ {
+ "lang": "en",
+ "group": "",
+ "tags": [],
+ "url": "shareables/distribute/play_dev_guide_secrets_en.pdf",
+ "timestamp": null,
+ "image": "distribute/images/play_dev_guide_b.jpg",
+ "title": "The Secrets to App Success on Google Play",
+ "summary": "A guide to useful features, tips, and best practices that will help you grow a successful app business on Google Play.",
+ "keywords": ["distribute"],
+ "type": "PDF DOWNLOAD (11MB)",
+ "titleFriendly": ""
}
]);
diff --git a/docs/html/tools/index.jd b/docs/html/tools/index.jd
deleted file mode 100644
index 73f8969..0000000
--- a/docs/html/tools/index.jd
+++ /dev/null
@@ -1,122 +0,0 @@
-page.title=Developer Tools
-@jd:body
-
-
-<img src="{@docRoot}images/tools-home.png" style="float:right;" height="347" width="400" />
-
-<div style="position:relative;height:0">
-<div style="position:absolute;width:420px">
- <p>The Android Developer Tools (ADT) plugin for Eclipse provides
- a professional-grade development environment for building
- Android apps. It's a full Java IDE with advanced features to help you build, test, debug,
- and package your Android apps. </p>
- <p>Free, open-source, and runs on most major OS platforms.<br>To get started,
- <a href="{@docRoot}sdk/index.html">download the Android SDK.</a></p>
-</div>
-</div>
-
-<div style="margin-top:20px;"></div>
-
-<div class="col-7" style="margin-left:0">
-<h3>Full Java IDE</h3>
-
- <ul>
- <li>Android-specific refactoring, quick fixes, integrated navigation between Java and XML resources.</li>
- <li>Enhanced XML editors for Android XML resources.</li>
- <li>Static analysis tools to catch performance, usability, and correctness problems.</li>
- <li>Build support for complex projects, command-line support for CI through Ant. Includes ProGuard and app-signing. </li>
- <li>Template-based wizard to create standard Android projects and components.</li>
- </ul>
-</div>
-
-
-<div class="col-6" style="margin-right:0">
-
-<h3>Graphical UI Builders</h3>
- <ul>
- <li>Build rich Android UI with drag and drop.
- <li>Visualize your UI on tablets, phones, and other devices. Switch themes, locales, even platform versions instantly, without building.</li>
- <li>Visual refactoring lets you extracts layout for inclusion, convert layouts, extract styles.</li>
- <li>Editor support for working with custom UI components.</li>
- </ul>
-
-</div>
-
-
-<div class="col-7" style="clear:both;margin-left:0;">
-
-<h3>On-device Developer Options</h3>
-<ul>
- <li>Enable debugging over USB.</li>
- <li>Quickly capture bug reports onto the device.</li>
- <li>Show CPU usage on screen.</li>
- <li>Draw debugging information on screen such as layout bounds,
- updates on GPU views and hardware layers, and other information.</li>
- <li>Plus many more options to simulate app stresses or enable debugging options.</li>
-</ul>
-<p>To access these settings, open the <em>Developer options</em> in the
-system Settings. On Android 4.2 and higher, the Developer options screen is
-hidden by default. To make it available, go to
-<b>Settings > About phone</b> and tap <b>Build number</b> seven times. Return to the previous
-screen to find Developer options.</p>
-
-</div>
-
-<div class="col-6" style="margin-right:0">
- <img src="{@docRoot}images/tools/dev-options-inmilk.png" alt="" style="margin:-10px 0 0;">
-</div>
-
-
-<div class="col-7" style="clear:both;margin-left:0;">
-<h3>Develop on Hardware Devices</h3>
-
- <ul>
- <li>Use any commercial Android hardware device or multiple devices.</li>
- <li>Deploy your app to connected devices directy from the IDE.</li>
- <li>Live, on-device debugging, testing, and profiling.</li>
- </ul>
-</div>
-
-<div class="col-6" style="margin-right:0">
-<h3>Develop on Virtual Devices</h3>
- <ul>
- <li>Emulate any device. Use custom screen sizes, keyboards, and other hardware components. </li>
- <li>Advanced hardware emulation, including camera, sensors, multitouch, telephony.</li>
- <li>Develop and test for broad device compatibility.</li>
- </ul>
-
-</div>
-
-<div style="margin-top:20px;"></div>
-
-<div class="col-7" style="margin-left:0">
-<h3>Powerful Debugging</h3>
-
- <ul>
- <li>Full Java debugger with on-device debugging and Android-specific tools.</li>
- <li>Built-in memory analysis, performance/CPU profiling, OpenGL ES tracing.</li>
- <li>Graphical tools for debugging and optimizing UI, runtime inspecton of UI structure and performance.</li>
- <li>Runtime graphical analysis of your app's network bandwidth usage.</li>
- </ul>
-
-<h3>Testing</h3>
-
- <ul>
- <li>Fully instrumentated, scriptable test environment.</li>
- <li>Integrated reports using standard test UI.</li>
- <li>Create and run unit tests on hardware devices or emulator.</li>
- </ul>
-
-<h3>Native Development</h3>
-
- <ul>
- <li>Support for compiling and packaging existing code written in C or C++.</li>
- <li>Support for packaging multiple architectures in a single binary, for broad compatibility.</li>
- </ul>
-</div>
-
-<div class="col-6" style="margin-right:0">
- <img src="{@docRoot}images/debugging-tall.png" align="left" style="margin-top:10px">
-</div>
-
-
diff --git a/docs/html/tools/revisions/build-tools.jd b/docs/html/tools/revisions/build-tools.jd
index ec88efc..4afdf13 100644
--- a/docs/html/tools/revisions/build-tools.jd
+++ b/docs/html/tools/revisions/build-tools.jd
@@ -77,6 +77,17 @@ listing in the Android SDK Manager.</p>
<div class="toggle-content opened">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+ alt=""/>Build Tools, Revision 21.1.1</a> <em>(November 2014)</em>
+ </p>
+ <div class="toggle-content-toggleme">
+ <p>Fixed multidex script issues.</p>
+ </div>
+</div>
+
+
+<div class="toggle-content closed">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
alt=""/>Build Tools, Revision 21.1</a> <em>(October 2014)</em>
</p>
<div class="toggle-content-toggleme">
diff --git a/docs/html/training/articles/security-ssl.jd b/docs/html/training/articles/security-ssl.jd
index 0639fb0..7f43d9c 100644
--- a/docs/html/training/articles/security-ssl.jd
+++ b/docs/html/training/articles/security-ssl.jd
@@ -22,6 +22,7 @@ page.article=true
<li><a href="#Blacklisting">Blacklisting</a></li>
<li><a href="#Pinning">Pinning</a></li>
<li><a href="#ClientCert">Client Certificates</a></li>
+ <li><a href="#nogotofail">Nogotofail: Network Security Testing</a></li>
</ol>
@@ -511,8 +512,42 @@ See the discussion about creating a custom {@link javax.net.ssl.KeyManager} in t
+<h2 id="nogotofail">
+ Nogotofail: A Network Traffic Security Testing Tool
+</h2>
+<p>
+ Nogotofail is a tool gives you an easy way to confirm that your apps are safe
+ against known TLS/SSL vulnerabilities and misconfigurations. It's an
+ automated, powerful, and scalable tool for testing network security issues on
+ any device whose network traffic could be made to go through it. </p>
+ <p>Nogotofail is useful for three main use cases:
+</p>
+
+<ul>
+ <li>Finding bugs and vulnerabilities.
+ </li>
+
+ <li>Verifying fixes and watching for regressions.
+ </li>
+
+ <li>Understanding what applications and devices are generating what traffic.
+ </li>
+</ul>
+
+<p>
+ Nogotofail works for Android, iOS, Linux, Windows, Chrome OS, OSX, in fact
+ any device you use to connect to the Internet. There’s an easy-to-use client
+ to configure the settings and get notifications on Android and Linux, as well
+ as the attack engine itself which can be deployed as a router, VPN server, or
+ proxy.
+</p>
+
+<p>
+ You can access the tool at the <a href=
+ "https://github.com/google/nogotofail">Nogotofail open source project</a>.
+</p>
diff --git a/docs/html/training/material/images/shadows-depth.png b/docs/html/training/material/images/shadows-depth.png
index 26b6b4a..d28ac79 100644
--- a/docs/html/training/material/images/shadows-depth.png
+++ b/docs/html/training/material/images/shadows-depth.png
Binary files differ
diff --git a/docs/html/training/material/shadows-clipping.jd b/docs/html/training/material/shadows-clipping.jd
index f58d780..c1cd374 100644
--- a/docs/html/training/material/shadows-clipping.jd
+++ b/docs/html/training/material/shadows-clipping.jd
@@ -18,28 +18,36 @@ page.title=Defining Shadows and Clipping Views
</div>
</div>
-<p>Material design introduces depth for UI elements. Depth helps users understand the relative
-importance of each element and focus their attention to the task at hand.</p>
+<p>Material design introduces elevation for UI elements. Elevation helps users understand the
+relative importance of each element and focus their attention to the task at hand.</p>
-<p>The elevation of a view, represented by the Z property, determines the size of its shadow:
-views with higher Z values cast bigger shadows. Views only cast shadows on the Z=0 plane; they
-don't cast shadows on other views placed below them and above the Z=0 plane.</p>
+<p>The elevation of a view, represented by the Z property, determines the visual appearance of its
+shadow: views with higher Z values cast larger, softer shadows. Views with higher Z values occlude
+views with lower Z values; however, the Z value of a view does not affect the view's size.</p>
-<p>Views with higher Z values occlude views with lower Z values. However, the Z value of a view
-does not affect the view's size.</p>
+<p>Shadows are drawn by the parent of the elevated view, and thus subject to standard view clipping,
+clipped by the parent by default.</p>
<p>Elevation is also useful to create animations where widgets temporarily rise above the
view plane when performing some action.</p>
+<p>For more information about elevation in material design, see
+<a href="http://www.google.com/design/spec/what-is-material/objects-in-3d-space.html">Objects
+in 3D space</a>.</p>
+
<h2 id="Elevation">Assign Elevation to Your Views</h2>
-<p>The Z value for a view has two components, elevation and translation. The elevation is the
-static component, and the translation is used for animations:</p>
+<p>The Z value for a view has two components:
+
+<ul>
+<li>Elevation: The static component.</li>
+<li>Translation: The dynamic component used for animations.</li>
+</ul>
<p><code>Z = elevation + translationZ</code></p>
-<img src="{@docRoot}training/material/images/shadows-depth.png" width="680" height="177" alt=""/>
+<img src="{@docRoot}training/material/images/shadows-depth.png" width="580" height="261" alt=""/>
<p class="img-caption"><strong>Figure 1</strong> - Shadows for different view elevations.</p>
<p>To set the elevation of a view in a layout definition, use the <code>android:elevation</code>
@@ -59,9 +67,9 @@ guide.</p>
<p>You can also use a {@link android.animation.StateListAnimator} to
specify these animations in a declarative way. This is especially useful for cases where state
changes trigger animations, like when a user presses a button. For more information, see
-<a href="{@docRoot}training/material/animations.html#ViewState">Animate View State Changes</a></p>.
+<a href="{@docRoot}training/material/animations.html#ViewState">Animate View State Changes</a>.</p>
-<p>The Z values are measured in the same units as the X and Y values.</p>
+<p>The Z values are measured in dp (density-independent pixels).</p>
<h2 id="Shadows">Customize View Shadows and Outlines</h2>
diff --git a/docs/html/training/tv/start/hardware.jd b/docs/html/training/tv/start/hardware.jd
index 33d396b..fc52602 100644
--- a/docs/html/training/tv/start/hardware.jd
+++ b/docs/html/training/tv/start/hardware.jd
@@ -85,27 +85,27 @@ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION)
</tr>
<tr>
<td>Touchscreen</td>
- <td>android.hardware.touchscreen</td>
+ <td>{@code android.hardware.touchscreen}</td>
</tr>
<tr>
<td>Telephony</td>
- <td>android.hardware.telephony</td>
+ <td>{@code android.hardware.telephony}</td>
</tr>
<tr>
<td>Camera</td>
- <td>android.hardware.camera</td>
+ <td>{@code android.hardware.camera}</td>
</tr>
<tr>
<td>Near Field Communications (NFC)</td>
- <td>android.hardware.nfc</td>
+ <td>{@code android.hardware.nfc}</td>
</tr>
<tr>
<td>GPS</td>
- <td>android.hardware.location.gps</td>
+ <td>{@code android.hardware.location.gps}</td>
</tr>
<tr>
<td>Microphone</td>
- <td>android.hardware.microphone</td>
+ <td>{@code android.hardware.microphone}</td>
</tr>
</table>
@@ -142,20 +142,17 @@ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION)
android:required="false"/&gt;
</pre>
-<p class="caution">
- <strong>Caution:</strong> Declaring an unavailable hardware feature as required by setting its
- value to {@code true} in your app manifest prevents your app from being installed on TV
- devices or appearing in the Android TV home screen launcher.
+<p>
+ All apps intended for use on TV devices must declare that the touch screen feature is not required
+ as described in <a href="{@docRoot}training/tv/start/start.html#no-touchscreen">Get Started with
+ TV Apps</a>. If your app normally uses one or more of the features listed above, change the
+ {@code android:required} attribute setting to {@code false} for those features in your manifest.
</p>
<p class="caution">
- <strong>Caution:</strong> Some <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code uses-permission}</a> manifest declarations <em>imply hardware use</em>, which can also
- prevent your app from being installed and used on TV devices. For example, requesting the
- {@link android.Manifest.permission#RECORD_AUDIO} permission in your app implies the
- {@code android.hardware.microphone} hardware feature requirement. In which case, you must declare
- the microphone feature as not required ({@code android:required="false"}) in your app manifest.
- For a list of permission requests that imply a hardware feature requirement, see <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions-features">
- {@code uses-feature}</a> guide.
+ <strong>Caution:</strong> Declaring a hardware feature as required by setting its
+ value to {@code true} prevents your app from being installed on TV
+ devices or appearing in the Android TV home screen launcher.
</p>
<p>
@@ -172,6 +169,52 @@ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION)
</p>
+<h3 id="hardware-permissions">Declaring permissions that imply hardware features</h3>
+
+<p>
+ Some <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code uses-permission}</a>
+ manifest declarations <em>imply hardware features</em>. This behavior means that requesting some
+ permissions in your app manifest can exclude your app from from being installed and used on TV
+ devices. The following commonly requested permissions create an implicit hardware feature
+ requirement:
+</p>
+
+<table>
+ <tr>
+ <th>Permission</th>
+ <th>Implied hardware feature</th>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#RECORD_AUDIO}</td>
+ <td>{@code android.hardware.microphone}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#CAMERA}</td>
+ <td>{@code android.hardware.camera} <em>and</em> <br>
+ {@code android.hardware.camera.autofocus}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#ACCESS_COARSE_LOCATION}</td>
+ <td>{@code android.hardware.location} <em>and</em> <br>
+ {@code android.hardware.location.network}</td>
+ </tr>
+ <tr>
+ <td>{@link android.Manifest.permission#ACCESS_FINE_LOCATION}</td>
+ <td>{@code android.hardware.location} <em>and</em> <br>
+ {@code android.hardware.location.gps}</td>
+ </tr>
+</table>
+
+<p>
+ For a complete list of permission requests that imply a hardware feature requirement, see
+ <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html#permissions-features">{@code
+ uses-feature}</a> guide. If your app requests one of the features listed above, include a
+ <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code uses-feature}</a>
+ declaration in your manifest for the implied hardware feature that indicates it is not
+ required ({@code android:required="false"}).
+</p>
+
+
<h3 id="check-features">Checking for hardware features</h2>
<p>
diff --git a/docs/html/training/tv/start/start.jd b/docs/html/training/tv/start/start.jd
index 3b26abf..aab1a39 100644
--- a/docs/html/training/tv/start/start.jd
+++ b/docs/html/training/tv/start/start.jd
@@ -11,6 +11,7 @@ startpage=true
<h2>This lesson teaches you how to</h2>
<ol>
<li><a href="#dev-project">Setup a TV Project</a></li>
+ <li><a href="#tv-libraries">Add TV Support Libraries</a></li>
<li><a href="#build-it">Build TV Apps</a></li>
<li><a href="#run">Run TV Apps</a></li>
</ol>
@@ -86,17 +87,10 @@ startpage=true
<p>An application intended to run on TV devices must declare a launcher activity for TV
in its manifest using a {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} intent filter.
- This filter identifies your app as being enabled for TV, allowing it to be considered a TV app
- in Google Play. Declaring this intent also identifies which activity
+ This filter identifies your app as being enabled for TV, and is required for your app to be
+ considered a TV app in Google Play. Declaring this intent also identifies which activity
in your app to launch when a user selects its icon on the TV home screen.</p>
-<p class="caution">
- <strong>Caution:</strong> If you do not include the {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} intent filter in
- your app, it is not visible to users running the Google Play store on TV devices. Also, if your
- app does not have this filter when you load it onto a TV device using developer tools, the app
- does not appear in the TV user interface.
-</p>
-
<p>The following code snippet shows how to include this intent filter in your manifest:</p>
<pre>
@@ -132,6 +126,14 @@ startpage=true
launch on a TV device.
</p>
+<p class="caution">
+ <strong>Caution:</strong> If you do not include the
+ {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER} intent filter in
+ your app, it is not visible to users running the Google Play store on TV devices. Also, if your
+ app does not have this filter when you load it onto a TV device using developer tools, the app
+ does not appear in the TV user interface.
+</p>
+
<p>
If you are modifying an existing app for use on TV, your app should not use the same
activity layout for TV that it does for phones and tablets. The user interface of your TV app (or
@@ -142,6 +144,31 @@ startpage=true
"{@docRoot}training/tv/start/layouts.html">Building TV Layouts</a>.
</p>
+
+<h3 id="no-touchscreen">Declare touchscreen not required</h3>
+
+<p>
+ Applications that are intended to run on TV devices do not rely on touch screens for input. In
+ order to make this clear, the manifest of your TV app must declare that a the {@code
+ android.hardware.touchscreen} feature is not required. This setting identifies your app as being
+ able to work on a TV device, and is required for your app to be considered a TV app in Google
+ Play. The following code example shows how to include this manifest declaration:
+</p>
+
+<pre>
+&lt;manifest&gt;
+ <strong>&lt;uses-feature android:name="android.hardware.touchscreen"
+ android:required="false" /&gt;</strong>
+ ...
+&lt;/manifest&gt;
+</pre>
+
+<p class="caution">
+ <strong>Caution:</strong> You must declare that a touch screen is not required in your app
+ manifest, as shown this example code, or your app cannot appear in the Google Play store on TV
+ devices.
+</p>
+
<h3 id="banner">Provide a home screen banner</h3>
<p>
@@ -152,9 +179,10 @@ startpage=true
<pre>
&lt;application
- . . .
+ ...
android:banner="&#64;drawable/banner" &gt;
- . . .
+
+ ...
&lt;/application&gt;
</pre>
@@ -171,7 +199,7 @@ startpage=true
design guide.
</p>
-<h3 id="tv-libraries">Add TV support libraries</h3>
+<h2 id="tv-libraries">Add TV Support Libraries</h3>
<p>
The Android SDK includes support libraries that are intended for use with TV apps. These
diff --git a/docs/html/training/wearables/apps/bt-debugging.jd b/docs/html/training/wearables/apps/bt-debugging.jd
index 98cf804..7569e7e 100644
--- a/docs/html/training/wearables/apps/bt-debugging.jd
+++ b/docs/html/training/wearables/apps/bt-debugging.jd
@@ -19,7 +19,7 @@ page.title=Debugging over Bluetooth
</div>
</div>
-<p>You can debug your wearable over Bluetooth by routing it's debug output to the
+<p>You can debug your wearable over Bluetooth by routing its debug output to the
handheld device that's connected to your development machine.</p>
<h2 id="SetupDevices">Setup Devices for Debugging</h2>
@@ -90,4 +90,4 @@ adb -e &lt;command&gt;
adb -e logcat
adb -e shell
adb -e bugreport
-</pre> \ No newline at end of file
+</pre>
diff --git a/docs/html/training/wearables/apps/creating.jd b/docs/html/training/wearables/apps/creating.jd
index 7252ada..018d9f7 100644
--- a/docs/html/training/wearables/apps/creating.jd
+++ b/docs/html/training/wearables/apps/creating.jd
@@ -92,6 +92,11 @@ types of screen shapes, which is useful for testing.</p>
<li>Leave the Android Wear app open on your phone.</li>
<li>Connect the wearable to your machine through USB, so you can install apps directly to it
as you develop. A message appears on both the wearable and the Android Wear app prompting you to allow debugging.</li>
+ <p class="note"><strong>Note:</strong> If you can not connect your wearable to your machine via USB,
+ follow the directions on
+ <a href="{@docRoot}training/wearables/apps/bt-debugging.html">Debugging over
+ Bluetooth</a>.
+ </p>
<li>On the Android Wear app, check <strong>Always allow from this computer</strong> and tap
<strong>OK</strong>.</li>
</ol>
diff --git a/docs/html/training/wearables/apps/index.jd b/docs/html/training/wearables/apps/index.jd
index 256205b..4bdd6bf 100644
--- a/docs/html/training/wearables/apps/index.jd
+++ b/docs/html/training/wearables/apps/index.jd
@@ -64,7 +64,7 @@ in ADT. The rest of this training assumes you're using Android Studio.
<dd>Learn how to create and display custom layouts for notifications and
activities.</dd>
<dt><a href="{@docRoot}training/wearables/apps/voice.html">Adding Voice Capabilities</a></dt>
- <dd>Learn how to launch an activity with a voice actions and how to start the
+ <dd>Learn how to launch an activity with voice actions and how to start the
system speech recognizer app to obtain free-form voice input.</dd>
<dt><a href="{@docRoot}training/wearables/apps/packaging.html">Packaging Wearable Apps</a></dt>
<dd>Learn how to package a wearable app inside a
diff --git a/docs/html/training/wearables/data-layer/accessing.jd b/docs/html/training/wearables/data-layer/accessing.jd
index 36e3daa..b7ecf5b 100644
--- a/docs/html/training/wearables/data-layer/accessing.jd
+++ b/docs/html/training/wearables/data-layer/accessing.jd
@@ -12,9 +12,9 @@ page.title=Accessing the Wearable Data Layer
<h2>Dependencies and Prerequisites</h2>
<ol>
- <li><a href="{@docRoot}training/wearables/apps/environment.html">Creating
- Wearable Apps > Setting up Your Environment</a></li>
- <li><a href="{@docRoot}training/wearables/apps/creating.html">Creating
+ <li><a href="{@docRoot}training/wearables/apps/creating.html#SetupEmulator">Creating
+ Wearable Apps > Set Up an Android Wear Emulator or Device</a></li>
+ <li><a href="{@docRoot}training/wearables/apps/creating.html#CreateProject">Creating
Wearable Apps > Creating a Project</a></li>
</ol>
</div>
@@ -55,10 +55,21 @@ GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
Log.d(TAG, "onConnectionFailed: " + result);
}
})
+ // Request access only to the Wearable API
.addApi(Wearable.API)
.build();
</pre>
+<p class="caution">
+<strong>Important:</strong> To avoid client connection errors on devices that do not have the
+<a href="https://play.google.com/store/apps/details?id=com.google.android.wearable.app&hl=en">Android
+Wear app</a> installed, use a separate <a
+href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">{@code
+GoogleApiClient}</a> instance to access only the <a
+href="{@docRoot}reference/com/google/android/gms/wearable/Wearable.html">{@code
+Wearable}</a> API. For more information, see <a
+href="{@docRoot}google/auth/api-client.html#WearableApi">Access the Wearable API</a>.</p>
+
<p>Before you use the data layer API, start a connection on your client by calling the
<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">connect()</a>
method, as described in
diff --git a/docs/html/training/wearables/data-layer/data-items.jd b/docs/html/training/wearables/data-layer/data-items.jd
index 63c32ea..f843bb6 100644
--- a/docs/html/training/wearables/data-layer/data-items.jd
+++ b/docs/html/training/wearables/data-layer/data-items.jd
@@ -47,14 +47,14 @@ directly. Instead, you:
<p>
However, instead of working with raw bytes using <a href="{@docRoot}reference/com/google/android/gms/wearable/PutDataRequest.html#setData(byte[])">setData()</a>,
-we recommend you <a href="#data-map">use a data map</a>, which exposes
+we recommend you <a href="#SyncData">use a data map</a>, which exposes
a data item in an easy-to-use {@link android.os.Bundle}-like interface.
</p>
<h2 id="SyncData">Sync Data with a Data Map</h2>
<p>
-When possible, use the <a href="{@docRoot}reference/com/google/android/gms/wearable/DataMap.html"><code>DataMap</code></a> class,
-which lets you work with data items in the form of an Android {@link android.os.Bundle},
+When possible, use the <a href="{@docRoot}reference/com/google/android/gms/wearable/DataMap.html"><code>DataMap</code></a> class.
+This approach lets you work with data items in the form of an Android {@link android.os.Bundle},
so object serialization and de-serialization is done for you, and you can manipulate data with key-value pairs.
</p>
@@ -120,5 +120,5 @@ public void onDataChanged(DataEventBuffer dataEvents) {
<p>
This is just a snippet that requires more implementation details. Learn about
how to implement a full listener service or activity in
-<a href="{@docRoot}training/wearables/data-layer/events.html">Listening for Data Layer Events</a>.
+<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listening for Data Layer Events</a>.
</p> \ No newline at end of file
diff --git a/docs/html/training/wearables/data-layer/events.jd b/docs/html/training/wearables/data-layer/events.jd
index 9e8acbc..9196a2c 100644
--- a/docs/html/training/wearables/data-layer/events.jd
+++ b/docs/html/training/wearables/data-layer/events.jd
@@ -159,7 +159,7 @@ public class DataLayerListenerService extends WearableListenerService {
}
// Loop through the events and send a message
- / to the node that created the data item.
+ // to the node that created the data item.
for (DataEvent event : events) {
Uri uri = event.getDataItem().getUri();
diff --git a/docs/html/training/wearables/data-layer/index.jd b/docs/html/training/wearables/data-layer/index.jd
index 6ef3fc7..73d9ee5 100644
--- a/docs/html/training/wearables/data-layer/index.jd
+++ b/docs/html/training/wearables/data-layer/index.jd
@@ -83,5 +83,3 @@ channel.
<dt><a href="{@docRoot}training/wearables/data-layer/events.html">Handling Data Layer Events</a></dt>
<dd>Be notified of changes and events to the data layer.</dd>
</dl>
-
-</div> \ No newline at end of file
diff --git a/docs/html/training/wearables/data-layer/messages.jd b/docs/html/training/wearables/data-layer/messages.jd
index 71f1bb1..b3afacb 100644
--- a/docs/html/training/wearables/data-layer/messages.jd
+++ b/docs/html/training/wearables/data-layer/messages.jd
@@ -27,7 +27,7 @@ Messages are a one-way communication mechanism that's good for remote procedure
such as sending a message to the wearable
to start an activity. You can also use messages in request/response model
where one side of the connection sends a message, does some work,
-sends back a response message.</p>
+and sends back a response message.</p>
<h2 id="SendMessage">Send a Message</h2>
@@ -95,5 +95,5 @@ public void onMessageReceived(MessageEvent messageEvent) {
<p>
This is just a snippet that requires more implementation details. Learn about
how to implement a full listener service or activity in
-<a href="{@docRoot}training/wearables/data-layer/events.html">Listening for Data Layer Events</a>.
+<a href="{@docRoot}training/wearables/data-layer/events.html#Listen">Listening for Data Layer Events</a>.
</p> \ No newline at end of file
diff --git a/docs/html/training/wearables/notifications/creating.jd b/docs/html/training/wearables/notifications/creating.jd
index 84e3311..57ac36e 100644
--- a/docs/html/training/wearables/notifications/creating.jd
+++ b/docs/html/training/wearables/notifications/creating.jd
@@ -4,7 +4,6 @@ page.title=Creating a Notification
<div id="tb-wrapper">
<div id="tb">
-
<h2>This lesson teaches you to</h2>
<ol>
<li><a href="#Import">Import the Necessary Classes</a></li>
@@ -30,7 +29,6 @@ Notifications using {@link android.widget.RemoteViews} are stripped of custom
layouts and the wearable only displays the text and icons. However, you can create
<a href="{@docRoot}training/wearables/apps/layouts.html#CustomNotifications">create custom notifications</a>
that use custom card layouts by creating a wearable app that runs on the wearable device.</p>
-</div>
<h2 id="Import">Import the necessary classes</h2>
@@ -255,7 +253,7 @@ NotificationCompat.WearableExtender wearableExtender =
Notification notif = new NotificationCompat.Builder(mContext)
.setContentTitle("New mail from " + sender)
.setContentText(subject)
- .setSmallIcon(R.drawable.new_mail);
+ .setSmallIcon(R.drawable.new_mail)
.extend(wearableExtender)
.build();
</pre>
@@ -278,7 +276,7 @@ method, in the <code>res/drawable-hdpi</code> directory of your handheld app.</p
<p>If you ever need to read wearable-specific options at a later time, use the corresponding get
method for the option. This example calls the
{@link android.support.v4.app.NotificationCompat.WearableExtender#getHintHideIcon()} method to
-get whether or not this notification hides the icon:
+get whether or not this notification hides the icon:</p>
<pre>
NotificationCompat.WearableExtender wearableExtender =
new NotificationCompat.WearableExtender(notif);
@@ -304,14 +302,3 @@ notificationManager.notify(notificationId, notif);
features from {@link android.support.v4.app.NotificationCompat.WearableExtender}
do not work, so make sure to use {@link android.support.v4.app.NotificationCompat}.
</p>
-
-<pre>
-NotificationCompat.WearableExtender wearableExtender =
- new NotificationCompat.WearableExtender(notif);
-boolean hintHideIcon = wearableExtender.getHintHideIcon();
- </pre>
-
-<p>The {@link android.support.v4.app.NotificationCompat.WearableExtender} APIs allow you to add
-additional pages to notifications, stack notifications, and more. Continue to the following lessons
-to learn about these features.
-</p>
diff --git a/docs/html/training/wearables/notifications/index.jd b/docs/html/training/wearables/notifications/index.jd
index a7b6733..2833dfa 100644
--- a/docs/html/training/wearables/notifications/index.jd
+++ b/docs/html/training/wearables/notifications/index.jd
@@ -49,5 +49,3 @@ swipes to the left.</dd>
<dd>Learn how to place all similar notifications from your app in a stack, allowing users to view
each notification individually without adding multiple cards to the card stream.</dd>
</dl>
-
-</div> \ No newline at end of file
diff --git a/docs/html/training/wearables/notifications/stacks.jd b/docs/html/training/wearables/notifications/stacks.jd
index 9a528a4..9e70e1b 100644
--- a/docs/html/training/wearables/notifications/stacks.jd
+++ b/docs/html/training/wearables/notifications/stacks.jd
@@ -87,7 +87,7 @@ notification and call {@link android.support.v4.app.NotificationCompat.Builder#s
on the summary notification.</p>
<p>This notification does not appear in your stack of notifications on the wearable, but
-appears as the only notification on the handheld device.</p>
+it appears as the only notification on the handheld device.</p>
<pre style="clear:right">
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(),
diff --git a/docs/html/training/wearables/notifications/voice-input.jd b/docs/html/training/wearables/notifications/voice-input.jd
index 3ce1c80..5a49343 100644
--- a/docs/html/training/wearables/notifications/voice-input.jd
+++ b/docs/html/training/wearables/notifications/voice-input.jd
@@ -86,7 +86,7 @@ style="float:right;margin:0 0 20px 40px" />
{@link android.support.v4.app.RemoteInput}:</p>
<pre>
-public static final EXTRA_VOICE_REPLY = "extra_voice_reply";
+public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
...
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);
@@ -116,7 +116,7 @@ PendingIntent replyPendingIntent =
// Create the reply action and add the remote input
NotificationCompat.Action action =
new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
- getString(R.string.label, replyPendingIntent))
+ getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
@@ -171,4 +171,4 @@ private CharSequence getMessageText(Intent intent) {
}
return null;
}
-</pre> \ No newline at end of file
+</pre>
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index 5a3a617..84555c6 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -429,43 +429,31 @@ public class AnimatedStateListDrawable extends StateListDrawable {
private int parseTransition(@NonNull Resources r, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Theme theme)
throws XmlPullParserException, IOException {
- int drawableRes = 0;
- int fromId = 0;
- int toId = 0;
- boolean reversible = false;
-
- final int numAttrs = attrs.getAttributeCount();
- for (int i = 0; i < numAttrs; i++) {
- final int stateResId = attrs.getAttributeNameResource(i);
- switch (stateResId) {
- case 0:
- break;
- case R.attr.fromId:
- fromId = attrs.getAttributeResourceValue(i, 0);
- break;
- case R.attr.toId:
- toId = attrs.getAttributeResourceValue(i, 0);
- break;
- case R.attr.drawable:
- drawableRes = attrs.getAttributeResourceValue(i, 0);
- break;
- case R.attr.reversible:
- reversible = attrs.getAttributeBooleanValue(i, false);
- break;
- }
- }
+ // This allows state list drawable item elements to be themed at
+ // inflation time but does NOT make them work for Zygote preload.
+ final TypedArray a = obtainAttributes(r, theme, attrs,
+ R.styleable.AnimatedStateListDrawableTransition);
+ final int fromId = a.getResourceId(
+ R.styleable.AnimatedStateListDrawableTransition_fromId, 0);
+ final int toId = a.getResourceId(
+ R.styleable.AnimatedStateListDrawableTransition_toId, 0);
+ final boolean reversible = a.getBoolean(
+ R.styleable.AnimatedStateListDrawableTransition_reversible, false);
+ Drawable dr = a.getDrawable(
+ R.styleable.AnimatedStateListDrawableTransition_drawable);
+ a.recycle();
- final Drawable dr;
- if (drawableRes != 0) {
- dr = r.getDrawable(drawableRes, theme);
- } else {
+ // Loading child elements modifies the state of the AttributeSet's
+ // underlying parser, so it needs to happen after obtaining
+ // attributes and extracting states.
+ if (dr == null) {
int type;
while ((type = parser.next()) == XmlPullParser.TEXT) {
}
if (type != XmlPullParser.START_TAG) {
throw new XmlPullParserException(
parser.getPositionDescription()
- + ": <item> tag requires a 'drawable' attribute or "
+ + ": <transition> tag requires a 'drawable' attribute or "
+ "child tag defining a drawable");
}
dr = Drawable.createFromXmlInner(r, parser, attrs, theme);
@@ -477,34 +465,20 @@ public class AnimatedStateListDrawable extends StateListDrawable {
private int parseItem(@NonNull Resources r, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Theme theme)
throws XmlPullParserException, IOException {
- int drawableRes = 0;
- int keyframeId = 0;
-
- int j = 0;
- final int numAttrs = attrs.getAttributeCount();
- int[] states = new int[numAttrs];
- for (int i = 0; i < numAttrs; i++) {
- final int stateResId = attrs.getAttributeNameResource(i);
- switch (stateResId) {
- case 0:
- break;
- case R.attr.id:
- keyframeId = attrs.getAttributeResourceValue(i, 0);
- break;
- case R.attr.drawable:
- drawableRes = attrs.getAttributeResourceValue(i, 0);
- break;
- default:
- final boolean hasState = attrs.getAttributeBooleanValue(i, false);
- states[j++] = hasState ? stateResId : -stateResId;
- }
- }
- states = StateSet.trimStateSet(states, j);
+ // This allows state list drawable item elements to be themed at
+ // inflation time but does NOT make them work for Zygote preload.
+ final TypedArray a = obtainAttributes(r, theme, attrs,
+ R.styleable.AnimatedStateListDrawableItem);
+ final int keyframeId = a.getResourceId(R.styleable.AnimatedStateListDrawableItem_id, 0);
+ Drawable dr = a.getDrawable(R.styleable.AnimatedStateListDrawableItem_drawable);
+ a.recycle();
- final Drawable dr;
- if (drawableRes != 0) {
- dr = r.getDrawable(drawableRes, theme);
- } else {
+ final int[] states = extractStateSet(attrs);
+
+ // Loading child elements modifies the state of the AttributeSet's
+ // underlying parser, so it needs to happen after obtaining
+ // attributes and extracting states.
+ if (dr == null) {
int type;
while ((type = parser.next()) == XmlPullParser.TEXT) {
}
diff --git a/graphics/java/android/graphics/drawable/Ripple.java b/graphics/java/android/graphics/drawable/Ripple.java
index 864e119..6731366 100644
--- a/graphics/java/android/graphics/drawable/Ripple.java
+++ b/graphics/java/android/graphics/drawable/Ripple.java
@@ -26,6 +26,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
+import android.graphics.Xfermode;
import android.util.MathUtils;
import android.view.HardwareCanvas;
import android.view.RenderNodeAnimator;
@@ -58,8 +59,10 @@ class Ripple {
/** Bounds used for computing max radius. */
private final Rect mBounds;
- /** Full-opacity color for drawing this ripple. */
- private int mColorOpaque;
+ /** ARGB color for drawing this ripple. */
+ private int mColor;
+
+ private Xfermode mXfermode;
/** Maximum ripple radius. */
private float mOuterRadius;
@@ -120,9 +123,7 @@ class Ripple {
mStartingY = startingY;
}
- public void setup(int maxRadius, int color, float density) {
- mColorOpaque = color | 0xFF000000;
-
+ public void setup(int maxRadius, float density) {
if (maxRadius != RippleDrawable.RADIUS_AUTO) {
mHasMaxRadius = true;
mOuterRadius = maxRadius;
@@ -216,6 +217,10 @@ class Ripple {
* Draws the ripple centered at (0,0) using the specified paint.
*/
public boolean draw(Canvas c, Paint p) {
+ // Store the color and xfermode, we might need them later.
+ mColor = p.getColor();
+ mXfermode = p.getXfermode();
+
final boolean canUseHardware = c.isHardwareAccelerated();
if (mCanUseHardware != canUseHardware && mCanUseHardware) {
// We've switched from hardware to non-hardware mode. Panic.
@@ -261,8 +266,8 @@ class Ripple {
private boolean drawSoftware(Canvas c, Paint p) {
boolean hasContent = false;
- p.setColor(mColorOpaque);
- final int alpha = (int) (255 * mOpacity + 0.5f);
+ final int paintAlpha = p.getAlpha();
+ final int alpha = (int) (paintAlpha * mOpacity + 0.5f);
final float radius = MathUtils.lerp(0, mOuterRadius, mTweenRadius);
if (alpha > 0 && radius > 0) {
final float x = MathUtils.lerp(
@@ -270,8 +275,8 @@ class Ripple {
final float y = MathUtils.lerp(
mClampedStartingY - mBounds.exactCenterY(), mOuterY, mTweenY);
p.setAlpha(alpha);
- p.setStyle(Style.FILL);
c.drawCircle(x, y, radius, p);
+ p.setAlpha(paintAlpha);
hasContent = true;
}
@@ -374,8 +379,9 @@ class Ripple {
final float startRadius = MathUtils.lerp(0, mOuterRadius, mTweenRadius);
final Paint paint = getTempPaint();
paint.setAntiAlias(true);
- paint.setColor(mColorOpaque);
- paint.setAlpha((int) (255 * mOpacity + 0.5f));
+ paint.setColor(mColor);
+ paint.setXfermode(mXfermode);
+ paint.setAlpha((int) (Color.alpha(mColor) * mOpacity + 0.5f));
paint.setStyle(Style.FILL);
mPropPaint = CanvasProperty.createPaint(paint);
mPropRadius = CanvasProperty.createFloat(startRadius);
diff --git a/graphics/java/android/graphics/drawable/RippleBackground.java b/graphics/java/android/graphics/drawable/RippleBackground.java
index 21d865f..69847b5 100644
--- a/graphics/java/android/graphics/drawable/RippleBackground.java
+++ b/graphics/java/android/graphics/drawable/RippleBackground.java
@@ -26,6 +26,7 @@ import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
+import android.graphics.Xfermode;
import android.util.MathUtils;
import android.view.HardwareCanvas;
import android.view.RenderNodeAnimator;
@@ -60,11 +61,10 @@ class RippleBackground {
/** Bounds used for computing max radius. */
private final Rect mBounds;
- /** Full-opacity color for drawing this ripple. */
- private int mColorOpaque;
+ /** ARGB color for drawing this ripple. */
+ private int mColor;
- /** Maximum alpha value for drawing this ripple. */
- private int mColorAlpha;
+ private Xfermode mXfermode;
/** Maximum ripple radius. */
private float mOuterRadius;
@@ -106,10 +106,7 @@ class RippleBackground {
mBounds = bounds;
}
- public void setup(int maxRadius, int color, float density) {
- mColorOpaque = color | 0xFF000000;
- mColorAlpha = Color.alpha(color) / 2;
-
+ public void setup(int maxRadius, float density) {
if (maxRadius != RippleDrawable.RADIUS_AUTO) {
mHasMaxRadius = true;
mOuterRadius = maxRadius;
@@ -124,10 +121,6 @@ class RippleBackground {
mDensity = density;
}
- public boolean isHardwareAnimating() {
- return mHardwareAnimating;
- }
-
public void onHotspotBoundsChanged() {
if (!mHasMaxRadius) {
final float halfWidth = mBounds.width() / 2.0f;
@@ -151,6 +144,10 @@ class RippleBackground {
* Draws the ripple centered at (0,0) using the specified paint.
*/
public boolean draw(Canvas c, Paint p) {
+ // Store the color and xfermode, we might need them later.
+ mColor = p.getColor();
+ mXfermode = p.getXfermode();
+
final boolean canUseHardware = c.isHardwareAccelerated();
if (mCanUseHardware != canUseHardware && mCanUseHardware) {
// We've switched from hardware to non-hardware mode. Panic.
@@ -169,8 +166,7 @@ class RippleBackground {
}
public boolean shouldDraw() {
- final int outerAlpha = (int) (mColorAlpha * mOuterOpacity + 0.5f);
- return mCanUseHardware && mHardwareAnimating || outerAlpha > 0 && mOuterRadius > 0;
+ return (mCanUseHardware && mHardwareAnimating) || (mOuterOpacity > 0 && mOuterRadius > 0);
}
private boolean drawHardware(HardwareCanvas c) {
@@ -201,12 +197,13 @@ class RippleBackground {
private boolean drawSoftware(Canvas c, Paint p) {
boolean hasContent = false;
- p.setColor(mColorOpaque);
- final int outerAlpha = (int) (mColorAlpha * mOuterOpacity + 0.5f);
- if (outerAlpha > 0 && mOuterRadius > 0) {
- p.setAlpha(outerAlpha);
- p.setStyle(Style.FILL);
- c.drawCircle(mOuterX, mOuterY, mOuterRadius, p);
+ final int paintAlpha = p.getAlpha();
+ final int alpha = (int) (paintAlpha * mOuterOpacity + 0.5f);
+ final float radius = mOuterRadius;
+ if (alpha > 0 && radius > 0) {
+ p.setAlpha(alpha);
+ c.drawCircle(mOuterX, mOuterY, radius, p);
+ p.setAlpha(paintAlpha);
hasContent = true;
}
@@ -262,7 +259,7 @@ class RippleBackground {
// outer(t) = mOuterOpacity + t * WAVE_OUTER_OPACITY_VELOCITY / 1000
final int inflectionDuration = Math.max(0, (int) (1000 * (1 - mOuterOpacity)
/ (WAVE_OPACITY_DECAY_VELOCITY + outerOpacityVelocity) + 0.5f));
- final int inflectionOpacity = (int) (mColorAlpha * (mOuterOpacity
+ final int inflectionOpacity = (int) (Color.alpha(mColor) * (mOuterOpacity
+ inflectionDuration * outerOpacityVelocity * outerSizeInfluence / 1000) + 0.5f);
if (mCanUseHardware) {
@@ -277,8 +274,9 @@ class RippleBackground {
final Paint outerPaint = getTempPaint();
outerPaint.setAntiAlias(true);
- outerPaint.setColor(mColorOpaque);
- outerPaint.setAlpha((int) (mColorAlpha * mOuterOpacity + 0.5f));
+ outerPaint.setXfermode(mXfermode);
+ outerPaint.setColor(mColor);
+ outerPaint.setAlpha((int) (Color.alpha(mColor) * mOuterOpacity + 0.5f));
outerPaint.setStyle(Style.FILL);
mPropOuterPaint = CanvasProperty.createPaint(outerPaint);
mPropOuterRadius = CanvasProperty.createFloat(mOuterRadius);
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index e658279..8cbc239 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -16,6 +16,11 @@
package android.graphics.drawable;
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.res.ColorStateList;
@@ -34,11 +39,6 @@ import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
import java.io.IOException;
import java.util.Arrays;
@@ -157,13 +157,6 @@ public class RippleDrawable extends LayerDrawable {
private boolean mOverrideBounds;
/**
- * Whether the next draw MUST draw something to canvas. Used to work around
- * a bug in hardware invalidation following a render thread-accelerated
- * animation.
- */
- private boolean mNeedsDraw;
-
- /**
* Constructor used for drawable inflation.
*/
RippleDrawable() {
@@ -203,21 +196,15 @@ public class RippleDrawable extends LayerDrawable {
public void jumpToCurrentState() {
super.jumpToCurrentState();
- boolean needsDraw = false;
-
if (mRipple != null) {
- needsDraw |= mRipple.isHardwareAnimating();
mRipple.jump();
}
if (mBackground != null) {
- needsDraw |= mBackground.isHardwareAnimating();
mBackground.jump();
}
- needsDraw |= cancelExitingRipples();
-
- mNeedsDraw = needsDraw;
+ cancelExitingRipples();
invalidateSelf();
}
@@ -497,8 +484,7 @@ public class RippleDrawable extends LayerDrawable {
mBackground = new RippleBackground(this, mHotspotBounds);
}
- final int color = mState.mColor.getColorForState(getState(), Color.TRANSPARENT);
- mBackground.setup(mState.mMaxRadius, color, mDensity);
+ mBackground.setup(mState.mMaxRadius, mDensity);
mBackground.enter(focused);
}
@@ -534,8 +520,7 @@ public class RippleDrawable extends LayerDrawable {
mRipple = new Ripple(this, mHotspotBounds, x, y);
}
- final int color = mState.mColor.getColorForState(getState(), Color.TRANSPARENT);
- mRipple.setup(mState.mMaxRadius, color, mDensity);
+ mRipple.setup(mState.mMaxRadius, mDensity);
mRipple.enter();
}
@@ -559,23 +544,17 @@ public class RippleDrawable extends LayerDrawable {
* background. Nothing will be drawn after this method is called.
*/
private void clearHotspots() {
- boolean needsDraw = false;
-
if (mRipple != null) {
- needsDraw |= mRipple.isHardwareAnimating();
mRipple.cancel();
mRipple = null;
}
if (mBackground != null) {
- needsDraw |= mBackground.isHardwareAnimating();
mBackground.cancel();
mBackground = null;
}
- needsDraw |= cancelExitingRipples();
-
- mNeedsDraw = needsDraw;
+ cancelExitingRipples();
invalidateSelf();
}
@@ -631,56 +610,41 @@ public class RippleDrawable extends LayerDrawable {
}
}
+ /**
+ * Optimized for drawing ripples with a mask layer and optional content.
+ */
@Override
public void draw(@NonNull Canvas canvas) {
final boolean hasMask = mMask != null;
- final boolean drawNonMaskContent = mLayerState.mNum > (hasMask ? 1 : 0);
- final boolean drawMask = hasMask && mMask.getOpacity() != PixelFormat.OPAQUE;
+ final boolean hasRipples = mRipple != null || mExitingRipplesCount > 0
+ || (mBackground != null && mBackground.shouldDraw());
+
+ // Clip to the dirty bounds, which will be the drawable bounds if we
+ // have a mask or content and the ripple bounds if we're projecting.
final Rect bounds = getDirtyBounds();
final int saveCount = canvas.save(Canvas.CLIP_SAVE_FLAG);
canvas.clipRect(bounds);
- // If we have content, draw it into a layer first.
- final int contentLayer;
- if (drawNonMaskContent) {
- contentLayer = drawContentLayer(canvas, bounds, SRC_OVER);
- } else {
- contentLayer = -1;
- }
-
- // Next, try to draw the ripples (into a layer if necessary). If we need
- // to mask against the underlying content, set the xfermode to SRC_ATOP.
- final PorterDuffXfermode xfermode = (hasMask || !drawNonMaskContent) ? SRC_OVER : SRC_ATOP;
-
- // If we have a background and a non-opaque mask, draw the masking layer.
- final int backgroundLayer = drawBackgroundLayer(canvas, bounds, xfermode, drawMask);
- if (backgroundLayer >= 0) {
- if (drawMask) {
+ // If we have content, draw it first. If we have ripples and no mask,
+ // we'll draw it into a SRC_OVER layer so that we can mask ripples
+ // against it using SRC_IN.
+ final boolean hasContentLayer = drawContent(canvas, bounds, hasRipples, hasMask);
+
+ // Next, try to draw the ripples. If we have a non-opaque mask, we'll
+ // draw the ripples into a SRC_OVER layer, draw the mask into a DST_IN
+ // layer, and blend.
+ if (hasRipples) {
+ final boolean hasNonOpaqueMask = hasMask && mMask.getOpacity() != PixelFormat.OPAQUE;
+ final boolean hasRippleLayer = drawBackgroundAndRipples(canvas, bounds,
+ hasNonOpaqueMask, hasContentLayer);
+
+ // If drawing ripples created a layer, we have a non-opaque mask
+ // that needs to be blended on top of the ripples with DST_IN.
+ if (hasRippleLayer) {
drawMaskingLayer(canvas, bounds, DST_IN);
}
- canvas.restoreToCount(backgroundLayer);
}
- // If we have ripples and a non-opaque mask, draw the masking layer.
- final int rippleLayer = drawRippleLayer(canvas, bounds, xfermode);
- if (rippleLayer >= 0) {
- if (drawMask) {
- drawMaskingLayer(canvas, bounds, DST_IN);
- }
- canvas.restoreToCount(rippleLayer);
- }
-
- // If we failed to draw anything and we just canceled animations, at
- // least draw a color so that hardware invalidation works correctly.
- if (contentLayer < 0 && backgroundLayer < 0 && rippleLayer < 0 && mNeedsDraw) {
- canvas.drawColor(Color.TRANSPARENT);
-
- // Request another draw so we can avoid adding a transparent layer
- // during the next display list refresh.
- invalidateSelf();
- }
- mNeedsDraw = false;
-
canvas.restoreToCount(saveCount);
}
@@ -714,28 +678,27 @@ public class RippleDrawable extends LayerDrawable {
return -1;
}
- private int drawContentLayer(Canvas canvas, Rect bounds, PorterDuffXfermode mode) {
+ private boolean drawContent(Canvas canvas, Rect bounds, boolean hasRipples, boolean hasMask) {
final ChildDrawable[] array = mLayerState.mChildren;
final int count = mLayerState.mNum;
- // We don't need a layer if we don't expect to draw any ripples or
- // a background, we have an explicit mask, or if the non-mask content
- // is all opaque.
boolean needsLayer = false;
- if ((mExitingRipplesCount > 0 || (mBackground != null && mBackground.shouldDraw()))
- && mMask == null) {
+
+ if (hasRipples && !hasMask) {
+ // If we only have opaque content, we don't really need a layer
+ // because the ripples will be clipped to the drawable bounds.
for (int i = 0; i < count; i++) {
- if (array[i].mId != R.id.mask
- && array[i].mDrawable.getOpacity() != PixelFormat.OPAQUE) {
+ if (array[i].mDrawable.getOpacity() != PixelFormat.OPAQUE) {
needsLayer = true;
break;
}
}
}
- final Paint maskingPaint = getMaskingPaint(mode);
- final int restoreToCount = needsLayer ? canvas.saveLayer(bounds.left, bounds.top,
- bounds.right, bounds.bottom, maskingPaint) : -1;
+ if (needsLayer) {
+ canvas.saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom,
+ getMaskingPaint(SRC_OVER));
+ }
// Draw everything except the mask.
for (int i = 0; i < count; i++) {
@@ -744,82 +707,52 @@ public class RippleDrawable extends LayerDrawable {
}
}
- return restoreToCount;
+ return needsLayer;
}
- private int drawBackgroundLayer(
- Canvas canvas, Rect bounds, PorterDuffXfermode mode, boolean drawMask) {
- int saveCount = -1;
+ private boolean drawBackgroundAndRipples(
+ Canvas canvas, Rect bounds, boolean hasNonOpaqueMask, boolean hasContentLayer) {
+ if (hasNonOpaqueMask) {
+ final Paint p = getMaskingPaint(SRC_OVER);
+ canvas.saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, p);
+ }
- if (mBackground != null && mBackground.shouldDraw()) {
- // TODO: We can avoid saveLayer here if we push the xfermode into
- // the background's render thread animator at exit() time.
- if (drawMask || mode != SRC_OVER) {
- saveCount = canvas.saveLayer(bounds.left, bounds.top, bounds.right,
- bounds.bottom, getMaskingPaint(mode));
- }
+ final PorterDuffXfermode mode = hasContentLayer ? SRC_ATOP : SRC_OVER;
+ final float x = mHotspotBounds.exactCenterX();
+ final float y = mHotspotBounds.exactCenterY();
+ canvas.translate(x, y);
- final float x = mHotspotBounds.exactCenterX();
- final float y = mHotspotBounds.exactCenterY();
- canvas.translate(x, y);
- mBackground.draw(canvas, getRipplePaint());
- canvas.translate(-x, -y);
- }
+ final Paint p = getRipplePaint();
+ p.setXfermode(mode);
- return saveCount;
- }
+ // Grab the color for the current state and cut the alpha channel in
+ // half so that the ripple and background together yield full alpha.
+ final int color = mState.mColor.getColorForState(getState(), Color.BLACK);
+ final int alpha = (Color.alpha(color) / 2) << 24;
+ p.setColor(color & 0xFFFFFF | alpha);
- private int drawRippleLayer(Canvas canvas, Rect bounds, PorterDuffXfermode mode) {
- boolean drewRipples = false;
- int restoreToCount = -1;
- int restoreTranslate = -1;
+ final RippleBackground background = mBackground;
+ if (background != null && background.shouldDraw()) {
+ background.draw(canvas, p);
+ }
- // Draw ripples and update the animating ripples array.
final int count = mExitingRipplesCount;
- final Ripple[] ripples = mExitingRipples;
- for (int i = 0; i <= count; i++) {
- final Ripple ripple;
- if (i < count) {
- ripple = ripples[i];
- } else if (mRipple != null) {
- ripple = mRipple;
- } else {
- continue;
- }
-
- // If we're masking the ripple layer, make sure we have a layer
- // first. This will merge SRC_OVER (directly) onto the canvas.
- if (restoreToCount < 0) {
- final Paint maskingPaint = getMaskingPaint(mode);
- final int color = mState.mColor.getColorForState(getState(), Color.TRANSPARENT);
- final int alpha = Color.alpha(color);
- maskingPaint.setAlpha(alpha / 2);
-
- // TODO: We can avoid saveLayer here if we're only drawing one
- // ripple and we don't have content or a translucent mask.
- restoreToCount = canvas.saveLayer(bounds.left, bounds.top,
- bounds.right, bounds.bottom, maskingPaint);
-
- // Translate the canvas to the current hotspot bounds.
- restoreTranslate = canvas.save();
- canvas.translate(mHotspotBounds.exactCenterX(), mHotspotBounds.exactCenterY());
+ if (count > 0) {
+ final Ripple[] ripples = mExitingRipples;
+ for (int i = 0; i < count; i++) {
+ ripples[i].draw(canvas, p);
}
-
- drewRipples |= ripple.draw(canvas, getRipplePaint());
}
- // Always restore the translation.
- if (restoreTranslate >= 0) {
- canvas.restoreToCount(restoreTranslate);
+ final Ripple active = mRipple;
+ if (active != null) {
+ active.draw(canvas, p);
}
- // If we created a layer with no content, merge it immediately.
- if (restoreToCount >= 0 && !drewRipples) {
- canvas.restoreToCount(restoreToCount);
- restoreToCount = -1;
- }
+ canvas.translate(-x, -y);
- return restoreToCount;
+ // Returns true if a layer was created.
+ return hasNonOpaqueMask;
}
private int drawMaskingLayer(Canvas canvas, Rect bounds, PorterDuffXfermode mode) {
@@ -838,6 +771,7 @@ public class RippleDrawable extends LayerDrawable {
if (mRipplePaint == null) {
mRipplePaint = new Paint();
mRipplePaint.setAntiAlias(true);
+ mRipplePaint.setStyle(Paint.Style.FILL);
}
return mRipplePaint;
}
diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java
index 963943b..e7a8233 100644
--- a/graphics/java/android/graphics/drawable/StateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/StateListDrawable.java
@@ -173,29 +173,19 @@ public class StateListDrawable extends DrawableContainer {
continue;
}
- int drawableRes = 0;
-
- int i;
- int j = 0;
- final int numAttrs = attrs.getAttributeCount();
- int[] states = new int[numAttrs];
- for (i = 0; i < numAttrs; i++) {
- final int stateResId = attrs.getAttributeNameResource(i);
- if (stateResId == 0) break;
- if (stateResId == R.attr.drawable) {
- drawableRes = attrs.getAttributeResourceValue(i, 0);
- } else {
- states[j++] = attrs.getAttributeBooleanValue(i, false)
- ? stateResId
- : -stateResId;
- }
- }
- states = StateSet.trimStateSet(states, j);
-
- final Drawable dr;
- if (drawableRes != 0) {
- dr = r.getDrawable(drawableRes, theme);
- } else {
+ // This allows state list drawable item elements to be themed at
+ // inflation time but does NOT make them work for Zygote preload.
+ final TypedArray a = obtainAttributes(r, theme, attrs,
+ R.styleable.StateListDrawableItem);
+ Drawable dr = a.getDrawable(R.styleable.StateListDrawableItem_drawable);
+ a.recycle();
+
+ final int[] states = extractStateSet(attrs);
+
+ // Loading child elements modifies the state of the AttributeSet's
+ // underlying parser, so it needs to happen after obtaining
+ // attributes and extracting states.
+ if (dr == null) {
while ((type = parser.next()) == XmlPullParser.TEXT) {
}
if (type != XmlPullParser.START_TAG) {
@@ -211,6 +201,35 @@ public class StateListDrawable extends DrawableContainer {
}
}
+ /**
+ * Extracts state_ attributes from an attribute set.
+ *
+ * @param attrs The attribute set.
+ * @return An array of state_ attributes.
+ */
+ int[] extractStateSet(AttributeSet attrs) {
+ int j = 0;
+ final int numAttrs = attrs.getAttributeCount();
+ int[] states = new int[numAttrs];
+ for (int i = 0; i < numAttrs; i++) {
+ final int stateResId = attrs.getAttributeNameResource(i);
+ switch (stateResId) {
+ case 0:
+ break;
+ case R.attr.drawable:
+ case R.attr.id:
+ // Ignore attributes from StateListDrawableItem and
+ // AnimatedStateListDrawableItem.
+ continue;
+ default:
+ states[j++] = attrs.getAttributeBooleanValue(i, false)
+ ? stateResId : -stateResId;
+ }
+ }
+ states = StateSet.trimStateSet(states, j);
+ return states;
+ }
+
StateListState getStateListState() {
return mStateListState;
}
diff --git a/libs/hwui/AmbientShadow.cpp b/libs/hwui/AmbientShadow.cpp
index cb3a002..21c869b 100644
--- a/libs/hwui/AmbientShadow.cpp
+++ b/libs/hwui/AmbientShadow.cpp
@@ -326,9 +326,9 @@ void AmbientShadow::createAmbientShadow(bool isCasterOpaque,
shadowVertexBuffer.updateVertexCount(vertexBufferIndex);
shadowVertexBuffer.updateIndexCount(indexBufferIndex);
- ShadowTessellator::checkOverflow(vertexBufferIndex, totalVertexCount, "Vertex Buffer");
- ShadowTessellator::checkOverflow(indexBufferIndex, totalIndexCount, "Index Buffer");
- ShadowTessellator::checkOverflow(umbraIndex, totalUmbraCount, "Umbra Buffer");
+ ShadowTessellator::checkOverflow(vertexBufferIndex, totalVertexCount, "Ambient Vertex Buffer");
+ ShadowTessellator::checkOverflow(indexBufferIndex, totalIndexCount, "Ambient Index Buffer");
+ ShadowTessellator::checkOverflow(umbraIndex, totalUmbraCount, "Ambient Umbra Buffer");
#if DEBUG_SHADOW
for (int i = 0; i < vertexBufferIndex; i++) {
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h
index 7aa628c..e338686 100644
--- a/libs/hwui/Caches.h
+++ b/libs/hwui/Caches.h
@@ -340,7 +340,6 @@ public:
TessellationCache tessellationCache;
TextDropShadowCache dropShadowCache;
FboCache fboCache;
- ResourceCache resourceCache;
GammaFontRenderer* fontRenderer;
diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h
index dda3e89..84411ed 100644
--- a/libs/hwui/DeferredLayerUpdater.h
+++ b/libs/hwui/DeferredLayerUpdater.h
@@ -76,7 +76,7 @@ public:
ANDROID_API bool apply();
- ANDROID_API Layer* backingLayer() {
+ Layer* backingLayer() {
return mLayer;
}
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 4a927cf..8953166 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -39,29 +39,28 @@ DisplayListData::~DisplayListData() {
}
void DisplayListData::cleanupResources() {
- Caches& caches = Caches::getInstance();
- caches.unregisterFunctors(functors.size());
- caches.resourceCache.lock();
+ ResourceCache& resourceCache = ResourceCache::getInstance();
+ resourceCache.lock();
for (size_t i = 0; i < bitmapResources.size(); i++) {
- caches.resourceCache.decrementRefcountLocked(bitmapResources.itemAt(i));
+ resourceCache.decrementRefcountLocked(bitmapResources.itemAt(i));
}
for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
const SkBitmap* bitmap = ownedBitmapResources.itemAt(i);
- caches.resourceCache.decrementRefcountLocked(bitmap);
- caches.resourceCache.destructorLocked(bitmap);
+ resourceCache.decrementRefcountLocked(bitmap);
+ resourceCache.destructorLocked(bitmap);
}
for (size_t i = 0; i < patchResources.size(); i++) {
- caches.resourceCache.decrementRefcountLocked(patchResources.itemAt(i));
+ resourceCache.decrementRefcountLocked(patchResources.itemAt(i));
}
for (size_t i = 0; i < sourcePaths.size(); i++) {
- caches.resourceCache.decrementRefcountLocked(sourcePaths.itemAt(i));
+ resourceCache.decrementRefcountLocked(sourcePaths.itemAt(i));
}
- caches.resourceCache.unlock();
+ resourceCache.unlock();
for (size_t i = 0; i < paints.size(); i++) {
delete paints.itemAt(i);
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index c17dd09..c2cb76e 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -21,8 +21,9 @@
#include <private/hwui/DrawGlInfo.h>
-#include "Caches.h"
+#include "ResourceCache.h"
#include "DeferredDisplayList.h"
+#include "DeferredLayerUpdater.h"
#include "DisplayListLogBuffer.h"
#include "DisplayListOp.h"
#include "DisplayListRenderer.h"
@@ -32,7 +33,7 @@ namespace android {
namespace uirenderer {
DisplayListRenderer::DisplayListRenderer()
- : mCaches(Caches::getInstance())
+ : mResourceCache(ResourceCache::getInstance())
, mDisplayListData(NULL)
, mTranslateX(0.0f)
, mTranslateY(0.0f)
@@ -188,9 +189,11 @@ status_t DisplayListRenderer::drawRenderNode(RenderNode* renderNode, Rect& dirty
return DrawGlInfo::kStatusDone;
}
-status_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y) {
- mDisplayListData->ref(layer);
- addDrawOp(new (alloc()) DrawLayerOp(layer, x, y));
+status_t DisplayListRenderer::drawLayer(DeferredLayerUpdater* layerHandle, float x, float y) {
+ // We ref the DeferredLayerUpdater due to its thread-safe ref-counting
+ // semantics.
+ mDisplayListData->ref(layerHandle);
+ addDrawOp(new (alloc()) DrawLayerOp(layerHandle->backingLayer(), x, y));
return DrawGlInfo::kStatusDone;
}
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 901e8f0..2cc2be3 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -24,6 +24,7 @@
#include "DisplayListLogBuffer.h"
#include "RenderNode.h"
+#include "ResourceCache.h"
namespace android {
namespace uirenderer {
@@ -44,6 +45,7 @@ namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
class DeferredDisplayList;
+class DeferredLayerUpdater;
class DisplayListRenderer;
class DisplayListOp;
class DrawOp;
@@ -150,7 +152,7 @@ public:
// ----------------------------------------------------------------------------
// Canvas draw operations - special
// ----------------------------------------------------------------------------
- virtual status_t drawLayer(Layer* layer, float x, float y);
+ virtual status_t drawLayer(DeferredLayerUpdater* layerHandle, float x, float y);
virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, int32_t replayFlags);
// TODO: rename for consistency
@@ -209,7 +211,7 @@ private:
mDisplayListData->paths.add(pathCopy);
}
if (mDisplayListData->sourcePaths.indexOf(path) < 0) {
- mCaches.resourceCache.incrementRefcount(path);
+ mResourceCache.incrementRefcount(path);
mDisplayListData->sourcePaths.add(path);
}
return pathCopy;
@@ -273,19 +275,19 @@ private:
// contents, and drawing again. The only fix would be to always copy it the first time,
// which doesn't seem worth the extra cycles for this unlikely case.
mDisplayListData->bitmapResources.add(bitmap);
- mCaches.resourceCache.incrementRefcount(bitmap);
+ mResourceCache.incrementRefcount(bitmap);
return bitmap;
}
inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) {
mDisplayListData->ownedBitmapResources.add(bitmap);
- mCaches.resourceCache.incrementRefcount(bitmap);
+ mResourceCache.incrementRefcount(bitmap);
return bitmap;
}
inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
mDisplayListData->patchResources.add(patch);
- mCaches.resourceCache.incrementRefcount(patch);
+ mResourceCache.incrementRefcount(patch);
return patch;
}
@@ -293,7 +295,7 @@ private:
DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap;
DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap;
- Caches& mCaches;
+ ResourceCache& mResourceCache;
DisplayListData* mDisplayListData;
float mTranslateX;
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index c9ed9a7..13c5499 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -98,9 +98,6 @@ void RenderNode::setStagingDisplayList(DisplayListData* data) {
mNeedsDisplayListDataSync = true;
delete mStagingDisplayListData;
mStagingDisplayListData = data;
- if (mStagingDisplayListData) {
- Caches::getInstance().registerFunctors(mStagingDisplayListData->functors.size());
- }
}
/**
@@ -305,6 +302,10 @@ void RenderNode::pushStagingDisplayListChanges(TreeInfo& info) {
// changes in isRenderable or, in the future, bounds
damageSelf(info);
deleteDisplayListData();
+ // TODO: Remove this caches stuff
+ if (mStagingDisplayListData && mStagingDisplayListData->functors.size()) {
+ Caches::getInstance().registerFunctors(mStagingDisplayListData->functors.size());
+ }
mDisplayListData = mStagingDisplayListData;
mStagingDisplayListData = NULL;
if (mDisplayListData) {
@@ -321,6 +322,9 @@ void RenderNode::deleteDisplayListData() {
for (size_t i = 0; i < mDisplayListData->children().size(); i++) {
mDisplayListData->children()[i]->mRenderNode->decParentRefCount();
}
+ if (mDisplayListData->functors.size()) {
+ Caches::getInstance().unregisterFunctors(mDisplayListData->functors.size());
+ }
}
delete mDisplayListData;
mDisplayListData = NULL;
diff --git a/libs/hwui/Renderer.h b/libs/hwui/Renderer.h
index a2f8c05..3159d1e 100644
--- a/libs/hwui/Renderer.h
+++ b/libs/hwui/Renderer.h
@@ -220,7 +220,6 @@ public:
// ----------------------------------------------------------------------------
// Canvas draw operations - special
// ----------------------------------------------------------------------------
- virtual status_t drawLayer(Layer* layer, float x, float y) = 0;
virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty,
int32_t replayFlags) = 0;
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp
index 329d92f..12d4928 100644
--- a/libs/hwui/ResourceCache.cpp
+++ b/libs/hwui/ResourceCache.cpp
@@ -21,6 +21,12 @@
#include "Caches.h"
namespace android {
+
+#ifdef USE_OPENGL_RENDERER
+using namespace uirenderer;
+ANDROID_SINGLETON_STATIC_INSTANCE(ResourceCache);
+#endif
+
namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h
index 8539d12..a922d53 100644
--- a/libs/hwui/ResourceCache.h
+++ b/libs/hwui/ResourceCache.h
@@ -22,6 +22,7 @@
#include <SkBitmap.h>
#include <utils/KeyedVector.h>
+#include <utils/Singleton.h>
#include <androidfw/ResourceTypes.h>
@@ -53,11 +54,14 @@ public:
ResourceType resourceType;
};
-class ANDROID_API ResourceCache {
-public:
+class ANDROID_API ResourceCache: public Singleton<ResourceCache> {
ResourceCache();
~ResourceCache();
+ friend class Singleton<ResourceCache>;
+
+public:
+
/**
* When using these two methods, make sure to only invoke the *Locked()
* variants of increment/decrementRefcount(), recyle() and destructor()
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp
index df28ae8..e8f1b9a 100644
--- a/libs/hwui/SpotShadow.cpp
+++ b/libs/hwui/SpotShadow.cpp
@@ -618,68 +618,6 @@ void SpotShadow::createSpotShadow(bool isCasterOpaque, const Vector3& lightCente
}
/**
- * Converts a polygon specified with CW vertices into an array of distance-from-centroid values.
- *
- * Returns false in error conditions
- *
- * @param poly Array of vertices. Note that these *must* be CW.
- * @param polyLength The number of vertices in the polygon.
- * @param polyCentroid The centroid of the polygon, from which rays will be cast
- * @param rayDist The output array for the calculated distances, must be SHADOW_RAY_COUNT in size
- */
-bool convertPolyToRayDist(const Vector2* poly, int polyLength, const Vector2& polyCentroid,
- float* rayDist) {
- const int rays = SHADOW_RAY_COUNT;
- const float step = M_PI * 2 / rays;
-
- const Vector2* lastVertex = &(poly[polyLength - 1]);
- float startAngle = angle(*lastVertex, polyCentroid);
-
- // Start with the ray that's closest to and less than startAngle
- int rayIndex = floor((startAngle - EPSILON) / step);
- rayIndex = (rayIndex + rays) % rays; // ensure positive
-
- for (int polyIndex = 0; polyIndex < polyLength; polyIndex++) {
- /*
- * For a given pair of vertices on the polygon, poly[i-1] and poly[i], the rays that
- * intersect these will be those that are between the two angles from the centroid that the
- * vertices define.
- *
- * Because the polygon vertices are stored clockwise, the closest ray with an angle
- * *smaller* than that defined by angle(poly[i], centroid) will be the first ray that does
- * not intersect with poly[i-1], poly[i].
- */
- float currentAngle = angle(poly[polyIndex], polyCentroid);
-
- // find first ray that will not intersect the line segment poly[i-1] & poly[i]
- int firstRayIndexOnNextSegment = floor((currentAngle - EPSILON) / step);
- firstRayIndexOnNextSegment = (firstRayIndexOnNextSegment + rays) % rays; // ensure positive
-
- // Iterate through all rays that intersect with poly[i-1], poly[i] line segment.
- // This may be 0 rays.
- while (rayIndex != firstRayIndexOnNextSegment) {
- float distanceToIntersect = rayIntersectPoints(polyCentroid,
- cos(rayIndex * step),
- sin(rayIndex * step),
- *lastVertex, poly[polyIndex]);
- if (distanceToIntersect < 0) {
-#if DEBUG_SHADOW
- ALOGW("ERROR: convertPolyToRayDist failed");
-#endif
- return false; // error case, abort
- }
-
- rayDist[rayIndex] = distanceToIntersect;
-
- rayIndex = (rayIndex - 1 + rays) % rays;
- }
- lastVertex = &poly[polyIndex];
- }
-
- return true;
-}
-
-/**
* This is only for experimental purpose.
* After intersections are calculated, we could smooth the polygon if needed.
* So far, we don't think it is more appealing yet.
@@ -700,490 +638,223 @@ void SpotShadow::smoothPolygon(int level, int rays, float* rayDist) {
}
}
-/**
- * Generate a array of the angleData for either umbra or penumbra vertices.
- *
- * This array will be merged and used to guide where to shoot the rays, in clockwise order.
- *
- * @param angleDataList The result array of angle data.
- *
- * @return int The maximum angle's index in the array.
- */
-int SpotShadow::setupAngleList(VertexAngleData* angleDataList,
- int polyLength, const Vector2* polygon, const Vector2& centroid,
- bool isPenumbra, const char* name) {
- float maxAngle = FLT_MIN;
- int maxAngleIndex = 0;
- for (int i = 0; i < polyLength; i++) {
- float currentAngle = angle(polygon[i], centroid);
- if (currentAngle > maxAngle) {
- maxAngle = currentAngle;
- maxAngleIndex = i;
- }
- angleDataList[i].set(currentAngle, isPenumbra, i);
-#if DEBUG_SHADOW
- ALOGD("%s AngleList i %d %f", name, i, currentAngle);
-#endif
- }
- return maxAngleIndex;
-}
+// Index pair is meant for storing the tessellation information for the penumbra
+// area. One index must come from exterior tangent of the circles, the other one
+// must come from the interior tangent of the circles.
+struct IndexPair {
+ int outerIndex;
+ int innerIndex;
+};
-/**
- * Make sure the polygons are indeed in clockwise order.
- *
- * Possible reasons to return false: 1. The input polygon is not setup properly. 2. The hull
- * algorithm is not able to generate it properly.
- *
- * Anyway, since the algorithm depends on the clockwise, when these kind of unexpected error
- * situation is found, we need to detect it and early return without corrupting the memory.
- *
- * @return bool True if the angle list is actually from big to small.
- */
-bool SpotShadow::checkClockwise(int indexOfMaxAngle, int listLength, VertexAngleData* angleList,
- const char* name) {
- int currentIndex = indexOfMaxAngle;
-#if DEBUG_SHADOW
- ALOGD("max index %d", currentIndex);
-#endif
- for (int i = 0; i < listLength - 1; i++) {
- // TODO: Cache the last angle.
- float currentAngle = angleList[currentIndex].mAngle;
- float nextAngle = angleList[(currentIndex + 1) % listLength].mAngle;
- if (currentAngle < nextAngle) {
-#if DEBUG_SHADOW
- ALOGE("%s, is not CW, at index %d", name, currentIndex);
-#endif
- return false;
+// For one penumbra vertex, find the cloest umbra vertex and return its index.
+inline int getClosestUmbraIndex(const Vector2& pivot, const Vector2* polygon, int polygonLength) {
+ float minLengthSquared = FLT_MAX;
+ int resultIndex = -1;
+ bool hasDecreased = false;
+ // Starting with some negative offset, assuming both umbra and penumbra are starting
+ // at the same angle, this can help to find the result faster.
+ // Normally, loop 3 times, we can find the closest point.
+ int offset = polygonLength - 2;
+ for (int i = 0; i < polygonLength; i++) {
+ int currentIndex = (i + offset) % polygonLength;
+ float currentLengthSquared = (pivot - polygon[currentIndex]).lengthSquared();
+ if (currentLengthSquared < minLengthSquared) {
+ if (minLengthSquared != FLT_MAX) {
+ hasDecreased = true;
+ }
+ minLengthSquared = currentLengthSquared;
+ resultIndex = currentIndex;
+ } else if (currentLengthSquared > minLengthSquared && hasDecreased) {
+ // Early break b/c we have found the closet one and now the length
+ // is increasing again.
+ break;
}
- currentIndex = (currentIndex + 1) % listLength;
}
- return true;
+ if(resultIndex == -1) {
+ ALOGE("resultIndex is -1, the polygon must be invalid!");
+ resultIndex = 0;
+ }
+ return resultIndex;
}
-/**
- * Check the polygon is clockwise.
- *
- * @return bool True is the polygon is clockwise.
- */
-bool SpotShadow::checkPolyClockwise(int polyAngleLength, int maxPolyAngleIndex,
- const float* polyAngleList) {
- bool isPolyCW = true;
- // Starting from maxPolyAngleIndex , check around to make sure angle decrease.
- for (int i = 0; i < polyAngleLength - 1; i++) {
- float currentAngle = polyAngleList[(i + maxPolyAngleIndex) % polyAngleLength];
- float nextAngle = polyAngleList[(i + maxPolyAngleIndex + 1) % polyAngleLength];
- if (currentAngle < nextAngle) {
- isPolyCW = false;
- }
+inline bool sameDirections(bool isPositiveCross, float a, float b) {
+ if (isPositiveCross) {
+ return a >= 0 && b >= 0;
+ } else {
+ return a <= 0 && b <= 0;
}
- return isPolyCW;
}
-/**
- * Given the sorted array of all the vertices angle data, calculate for each
- * vertices, the offset value to array element which represent the start edge
- * of the polygon we need to shoot the ray at.
- *
- * TODO: Calculate this for umbra and penumbra in one loop using one single array.
- *
- * @param distances The result of the array distance counter.
- */
-void SpotShadow::calculateDistanceCounter(bool needsOffsetToUmbra, int angleLength,
- const VertexAngleData* allVerticesAngleData, int* distances) {
-
- bool firstVertexIsPenumbra = allVerticesAngleData[0].mIsPenumbra;
- // If we want distance to inner, then we just set to 0 when we see inner.
- bool needsSearch = needsOffsetToUmbra ? firstVertexIsPenumbra : !firstVertexIsPenumbra;
- int distanceCounter = 0;
- if (needsSearch) {
- int foundIndex = -1;
- for (int i = (angleLength - 1); i >= 0; i--) {
- bool currentIsOuter = allVerticesAngleData[i].mIsPenumbra;
- // If we need distance to inner, then we need to find a inner vertex.
- if (currentIsOuter != firstVertexIsPenumbra) {
- foundIndex = i;
- break;
- }
- }
- LOG_ALWAYS_FATAL_IF(foundIndex == -1, "Wrong index found, means either"
- " umbra or penumbra's length is 0");
- distanceCounter = angleLength - foundIndex;
- }
+// Find the right polygon edge to shoot the ray at.
+inline int findPolyIndex(bool isPositiveCross, int startPolyIndex, const Vector2& umbraDir,
+ const Vector2* polyToCentroid, int polyLength) {
+ // Make sure we loop with a bound.
+ for (int i = 0; i < polyLength; i++) {
+ int currentIndex = (i + startPolyIndex) % polyLength;
+ const Vector2& currentToCentroid = polyToCentroid[currentIndex];
+ const Vector2& nextToCentroid = polyToCentroid[(currentIndex + 1) % polyLength];
+
+ float currentCrossUmbra = currentToCentroid.cross(umbraDir);
+ float umbraCrossNext = umbraDir.cross(nextToCentroid);
+ if (sameDirections(isPositiveCross, currentCrossUmbra, umbraCrossNext)) {
#if DEBUG_SHADOW
- ALOGD("distances[0] is %d", distanceCounter);
+ ALOGD("findPolyIndex loop %d times , index %d", i, currentIndex );
#endif
-
- distances[0] = distanceCounter; // means never see a target poly
-
- for (int i = 1; i < angleLength; i++) {
- bool firstVertexIsPenumbra = allVerticesAngleData[i].mIsPenumbra;
- // When we needs for distance for each outer vertex to inner, then we
- // increase the distance when seeing outer vertices. Otherwise, we clear
- // to 0.
- bool needsIncrement = needsOffsetToUmbra ? firstVertexIsPenumbra : !firstVertexIsPenumbra;
- // If counter is not -1, that means we have seen an other polygon's vertex.
- if (needsIncrement && distanceCounter != -1) {
- distanceCounter++;
- } else {
- distanceCounter = 0;
+ return currentIndex;
}
- distances[i] = distanceCounter;
}
+ LOG_ALWAYS_FATAL("Can't find the right polygon's edge from startPolyIndex %d", startPolyIndex);
+ return -1;
}
-/**
- * Given umbra and penumbra angle data list, merge them by sorting the angle
- * from the biggest to smallest.
- *
- * @param allVerticesAngleData The result array of merged angle data.
- */
-void SpotShadow::mergeAngleList(int maxUmbraAngleIndex, int maxPenumbraAngleIndex,
- const VertexAngleData* umbraAngleList, int umbraLength,
- const VertexAngleData* penumbraAngleList, int penumbraLength,
- VertexAngleData* allVerticesAngleData) {
-
- int totalRayNumber = umbraLength + penumbraLength;
- int umbraIndex = maxUmbraAngleIndex;
- int penumbraIndex = maxPenumbraAngleIndex;
-
- float currentUmbraAngle = umbraAngleList[umbraIndex].mAngle;
- float currentPenumbraAngle = penumbraAngleList[penumbraIndex].mAngle;
-
- // TODO: Clean this up using a while loop with 2 iterators.
- for (int i = 0; i < totalRayNumber; i++) {
- if (currentUmbraAngle > currentPenumbraAngle) {
- allVerticesAngleData[i] = umbraAngleList[umbraIndex];
- umbraIndex = (umbraIndex + 1) % umbraLength;
-
- // If umbraIndex round back, that means we are running out of
- // umbra vertices to merge, so just copy all the penumbra leftover.
- // Otherwise, we update the currentUmbraAngle.
- if (umbraIndex != maxUmbraAngleIndex) {
- currentUmbraAngle = umbraAngleList[umbraIndex].mAngle;
- } else {
- for (int j = i + 1; j < totalRayNumber; j++) {
- allVerticesAngleData[j] = penumbraAngleList[penumbraIndex];
- penumbraIndex = (penumbraIndex + 1) % penumbraLength;
- }
+// Generate the index pair for penumbra / umbra vertices, and more penumbra vertices
+// if needed.
+inline void genNewPenumbraAndPairWithUmbra(const Vector2* penumbra, int penumbraLength,
+ const Vector2* umbra, int umbraLength, Vector2* newPenumbra, int& newPenumbraIndex,
+ IndexPair* verticesPair, int& verticesPairIndex) {
+ // In order to keep everything in just one loop, we need to pre-compute the
+ // closest umbra vertex for the last penumbra vertex.
+ int previousClosestUmbraIndex = getClosestUmbraIndex(penumbra[penumbraLength - 1],
+ umbra, umbraLength);
+ for (int i = 0; i < penumbraLength; i++) {
+ const Vector2& currentPenumbraVertex = penumbra[i];
+ // For current penumbra vertex, starting from previousClosestUmbraIndex,
+ // then check the next one until the distance increase.
+ // The last one before the increase is the umbra vertex we need to pair with.
+ int currentUmbraIndex = previousClosestUmbraIndex;
+ float currentLengthSquared = (currentPenumbraVertex - umbra[currentUmbraIndex]).lengthSquared();
+ int currentClosestUmbraIndex = -1;
+ int indexDelta = 0;
+ for (int j = 1; j < umbraLength; j++) {
+ int newUmbraIndex = (previousClosestUmbraIndex + j) % umbraLength;
+ float newLengthSquared = (currentPenumbraVertex - umbra[newUmbraIndex]).lengthSquared();
+ if (newLengthSquared > currentLengthSquared) {
+ currentClosestUmbraIndex = (previousClosestUmbraIndex + j - 1) % umbraLength;
break;
- }
- } else {
- allVerticesAngleData[i] = penumbraAngleList[penumbraIndex];
- penumbraIndex = (penumbraIndex + 1) % penumbraLength;
- // If penumbraIndex round back, that means we are running out of
- // penumbra vertices to merge, so just copy all the umbra leftover.
- // Otherwise, we update the currentPenumbraAngle.
- if (penumbraIndex != maxPenumbraAngleIndex) {
- currentPenumbraAngle = penumbraAngleList[penumbraIndex].mAngle;
} else {
- for (int j = i + 1; j < totalRayNumber; j++) {
- allVerticesAngleData[j] = umbraAngleList[umbraIndex];
- umbraIndex = (umbraIndex + 1) % umbraLength;
- }
- break;
+ currentLengthSquared = newLengthSquared;
+ indexDelta++;
}
}
- }
-}
-
-#if DEBUG_SHADOW
-/**
- * DEBUG ONLY: Verify all the offset compuation is correctly done by examining
- * each vertex and its neighbor.
- */
-static void verifyDistanceCounter(const VertexAngleData* allVerticesAngleData,
- const int* distances, int angleLength, const char* name) {
- int currentDistance = distances[0];
- for (int i = 1; i < angleLength; i++) {
- if (distances[i] != INT_MIN) {
- if (!((currentDistance + 1) == distances[i]
- || distances[i] == 0)) {
- ALOGE("Wrong distance found at i %d name %s", i, name);
+ LOG_ALWAYS_FATAL_IF(currentClosestUmbraIndex == -1, "Can't find a closet umbra vertext at all");
+
+ if (indexDelta > 1) {
+ // For those umbra don't have penumbra, generate new penumbra vertices by interpolation.
+ //
+ // Assuming Pi for penumbra vertices, and Ui for umbra vertices.
+ // In the case like below P1 paired with U1 and P2 paired with U5.
+ // U2 to U4 are unpaired umbra vertices.
+ //
+ // P1 P2
+ // | |
+ // U1 U2 U3 U4 U5
+ //
+ // We will need to generate 3 more penumbra vertices P1.1, P1.2, P1.3
+ // to pair with U2 to U4.
+ //
+ // P1 P1.1 P1.2 P1.3 P2
+ // | | | | |
+ // U1 U2 U3 U4 U5
+ //
+ // That distance ratio b/t Ui to U1 and Ui to U5 decides its paired penumbra
+ // vertex's location.
+ int newPenumbraNumber = indexDelta - 1;
+
+ float accumulatedDeltaLength[newPenumbraNumber];
+ float totalDeltaLength = 0;
+
+ // To save time, cache the previous umbra vertex info outside the loop
+ // and update each loop.
+ Vector2 previousClosestUmbra = umbra[previousClosestUmbraIndex];
+ Vector2 skippedUmbra;
+ // Use umbra data to precompute the length b/t unpaired umbra vertices,
+ // and its ratio against the total length.
+ for (int k = 0; k < indexDelta; k++) {
+ int skippedUmbraIndex = (previousClosestUmbraIndex + k + 1) % umbraLength;
+ skippedUmbra = umbra[skippedUmbraIndex];
+ float currentDeltaLength = (skippedUmbra - previousClosestUmbra).length();
+
+ totalDeltaLength += currentDeltaLength;
+ accumulatedDeltaLength[k] = totalDeltaLength;
+
+ previousClosestUmbra = skippedUmbra;
}
- currentDistance = distances[i];
- if (currentDistance != 0) {
- bool currentOuter = allVerticesAngleData[i].mIsPenumbra;
- for (int j = 1; j <= (currentDistance - 1); j++) {
- bool neigborOuter =
- allVerticesAngleData[(i + angleLength - j) % angleLength].mIsPenumbra;
- if (neigborOuter != currentOuter) {
- ALOGE("Wrong distance found at i %d name %s", i, name);
- }
- }
- bool oppositeOuter =
- allVerticesAngleData[(i + angleLength - currentDistance) % angleLength].mIsPenumbra;
- if (oppositeOuter == currentOuter) {
- ALOGE("Wrong distance found at i %d name %s", i, name);
- }
- }
- }
- }
-}
-/**
- * DEBUG ONLY: Verify all the angle data compuated are is correctly done
- */
-static void verifyAngleData(int totalRayNumber, const VertexAngleData* allVerticesAngleData,
- const int* distancesToInner, const int* distancesToOuter,
- const VertexAngleData* umbraAngleList, int maxUmbraAngleIndex, int umbraLength,
- const VertexAngleData* penumbraAngleList, int maxPenumbraAngleIndex,
- int penumbraLength) {
- for (int i = 0; i < totalRayNumber; i++) {
- ALOGD("currentAngleList i %d, angle %f, isInner %d, index %d distancesToInner"
- " %d distancesToOuter %d", i, allVerticesAngleData[i].mAngle,
- !allVerticesAngleData[i].mIsPenumbra,
- allVerticesAngleData[i].mVertexIndex, distancesToInner[i], distancesToOuter[i]);
- }
+ const Vector2& previousPenumbra = penumbra[(i + penumbraLength - 1) % penumbraLength];
+ // Then for each unpaired umbra vertex, create a new penumbra by the ratio,
+ // and pair them togehter.
+ for (int k = 0; k < newPenumbraNumber; k++) {
+ float weightForCurrentPenumbra = 1.0f;
+ if (totalDeltaLength != 0.0f) {
+ weightForCurrentPenumbra = accumulatedDeltaLength[k] / totalDeltaLength;
+ }
+ float weightForPreviousPenumbra = 1.0f - weightForCurrentPenumbra;
- verifyDistanceCounter(allVerticesAngleData, distancesToInner, totalRayNumber, "distancesToInner");
- verifyDistanceCounter(allVerticesAngleData, distancesToOuter, totalRayNumber, "distancesToOuter");
+ Vector2 interpolatedPenumbra = currentPenumbraVertex * weightForCurrentPenumbra +
+ previousPenumbra * weightForPreviousPenumbra;
- for (int i = 0; i < totalRayNumber; i++) {
- if ((distancesToInner[i] * distancesToOuter[i]) != 0) {
- ALOGE("distancesToInner wrong at index %d distancesToInner[i] %d,"
- " distancesToOuter[i] %d", i, distancesToInner[i], distancesToOuter[i]);
- }
- }
- int currentUmbraVertexIndex =
- umbraAngleList[maxUmbraAngleIndex].mVertexIndex;
- int currentPenumbraVertexIndex =
- penumbraAngleList[maxPenumbraAngleIndex].mVertexIndex;
- for (int i = 0; i < totalRayNumber; i++) {
- if (allVerticesAngleData[i].mIsPenumbra == true) {
- if (allVerticesAngleData[i].mVertexIndex != currentPenumbraVertexIndex) {
- ALOGW("wrong penumbra indexing i %d allVerticesAngleData[i].mVertexIndex %d "
- "currentpenumbraVertexIndex %d", i,
- allVerticesAngleData[i].mVertexIndex, currentPenumbraVertexIndex);
- }
- currentPenumbraVertexIndex = (currentPenumbraVertexIndex + 1) % penumbraLength;
- } else {
- if (allVerticesAngleData[i].mVertexIndex != currentUmbraVertexIndex) {
- ALOGW("wrong umbra indexing i %d allVerticesAngleData[i].mVertexIndex %d "
- "currentUmbraVertexIndex %d", i,
- allVerticesAngleData[i].mVertexIndex, currentUmbraVertexIndex);
+ int skippedUmbraIndex = (previousClosestUmbraIndex + k + 1) % umbraLength;
+ verticesPair[verticesPairIndex++] = {newPenumbraIndex, skippedUmbraIndex};
+ newPenumbra[newPenumbraIndex++] = interpolatedPenumbra;
}
- currentUmbraVertexIndex = (currentUmbraVertexIndex + 1) % umbraLength;
}
- }
- for (int i = 0; i < totalRayNumber - 1; i++) {
- float currentAngle = allVerticesAngleData[i].mAngle;
- float nextAngle = allVerticesAngleData[(i + 1) % totalRayNumber].mAngle;
- if (currentAngle < nextAngle) {
- ALOGE("Unexpected angle values!, currentAngle nextAngle %f %f", currentAngle, nextAngle);
- }
- }
-}
-#endif
+ verticesPair[verticesPairIndex++] = {newPenumbraIndex, currentClosestUmbraIndex};
+ newPenumbra[newPenumbraIndex++] = currentPenumbraVertex;
-/**
- * In order to compute the occluded umbra, we need to setup the angle data list
- * for the polygon data. Since we only store one poly vertex per polygon vertex,
- * this array only needs to be a float array which are the angles for each vertex.
- *
- * @param polyAngleList The result list
- *
- * @return int The index for the maximum angle in this array.
- */
-int SpotShadow::setupPolyAngleList(float* polyAngleList, int polyAngleLength,
- const Vector2* poly2d, const Vector2& centroid) {
- int maxPolyAngleIndex = -1;
- float maxPolyAngle = -FLT_MAX;
- for (int i = 0; i < polyAngleLength; i++) {
- polyAngleList[i] = angle(poly2d[i], centroid);
- if (polyAngleList[i] > maxPolyAngle) {
- maxPolyAngle = polyAngleList[i];
- maxPolyAngleIndex = i;
- }
+ previousClosestUmbraIndex = currentClosestUmbraIndex;
}
- return maxPolyAngleIndex;
-}
-
-/**
- * For umbra and penumbra, given the offset info and the current ray number,
- * find the right edge index (the (starting vertex) for the ray to shoot at.
- *
- * @return int The index of the starting vertex of the edge.
- */
-inline int SpotShadow::getEdgeStartIndex(const int* offsets, int rayIndex, int totalRayNumber,
- const VertexAngleData* allVerticesAngleData) {
- int tempOffset = offsets[rayIndex];
- int targetRayIndex = (rayIndex - tempOffset + totalRayNumber) % totalRayNumber;
- return allVerticesAngleData[targetRayIndex].mVertexIndex;
}
-/**
- * For the occluded umbra, given the array of angles, find the index of the
- * starting vertex of the edge, for the ray to shoo at.
- *
- * TODO: Save the last result to shorten the search distance.
- *
- * @return int The index of the starting vertex of the edge.
- */
-inline int SpotShadow::getPolyEdgeStartIndex(int maxPolyAngleIndex, int polyLength,
- const float* polyAngleList, float rayAngle) {
- int minPolyAngleIndex = (maxPolyAngleIndex + polyLength - 1) % polyLength;
- int resultIndex = -1;
- if (rayAngle > polyAngleList[maxPolyAngleIndex]
- || rayAngle <= polyAngleList[minPolyAngleIndex]) {
- resultIndex = minPolyAngleIndex;
- } else {
- for (int i = 0; i < polyLength - 1; i++) {
- int currentIndex = (maxPolyAngleIndex + i) % polyLength;
- int nextIndex = (maxPolyAngleIndex + i + 1) % polyLength;
- if (rayAngle <= polyAngleList[currentIndex]
- && rayAngle > polyAngleList[nextIndex]) {
- resultIndex = currentIndex;
- }
- }
+// Precompute all the polygon's vector, return true if the reference cross product is positive.
+inline bool genPolyToCentroid(const Vector2* poly2d, int polyLength,
+ const Vector2& centroid, Vector2* polyToCentroid) {
+ for (int j = 0; j < polyLength; j++) {
+ polyToCentroid[j] = poly2d[j] - centroid;
}
- if (CC_UNLIKELY(resultIndex == -1)) {
- // TODO: Add more error handling here.
- ALOGE("Wrong index found, means no edge can't be found for rayAngle %f", rayAngle);
+ float refCrossProduct = 0;
+ for (int j = 0; j < polyLength; j++) {
+ refCrossProduct = polyToCentroid[j].cross(polyToCentroid[(j + 1) % polyLength]);
+ if (refCrossProduct != 0) {
+ break;
+ }
}
- return resultIndex;
+
+ return refCrossProduct > 0;
}
-/**
- * Convert the incoming polygons into arrays of vertices, for each ray.
- * Ray only shoots when there is one vertex either on penumbra on umbra.
- *
- * Finally, it will generate vertices per ray for umbra, penumbra and optionally
- * occludedUmbra.
- *
- * Return true (success) when all vertices are generated
- */
-int SpotShadow::convertPolysToVerticesPerRay(
- bool hasOccludedUmbraArea, const Vector2* poly2d, int polyLength,
- const Vector2* umbra, int umbraLength, const Vector2* penumbra,
- int penumbraLength, const Vector2& centroid,
- Vector2* umbraVerticesPerRay, Vector2* penumbraVerticesPerRay,
- Vector2* occludedUmbraVerticesPerRay) {
- int totalRayNumber = umbraLength + penumbraLength;
-
- // For incoming umbra / penumbra polygons, we will build an intermediate data
- // structure to help us sort all the vertices according to the vertices.
- // Using this data structure, we can tell where (the angle) to shoot the ray,
- // whether we shoot at penumbra edge or umbra edge, and which edge to shoot at.
- //
- // We first parse each vertices and generate a table of VertexAngleData.
- // Based on that, we create 2 arrays telling us which edge to shoot at.
- VertexAngleData allVerticesAngleData[totalRayNumber];
- VertexAngleData umbraAngleList[umbraLength];
- VertexAngleData penumbraAngleList[penumbraLength];
-
- int polyAngleLength = hasOccludedUmbraArea ? polyLength : 0;
- float polyAngleList[polyAngleLength];
-
- const int maxUmbraAngleIndex =
- setupAngleList(umbraAngleList, umbraLength, umbra, centroid, false, "umbra");
- const int maxPenumbraAngleIndex =
- setupAngleList(penumbraAngleList, penumbraLength, penumbra, centroid, true, "penumbra");
- const int maxPolyAngleIndex = setupPolyAngleList(polyAngleList, polyAngleLength, poly2d, centroid);
-
- // Check all the polygons here are CW.
- bool isPolyCW = checkPolyClockwise(polyAngleLength, maxPolyAngleIndex, polyAngleList);
- bool isUmbraCW = checkClockwise(maxUmbraAngleIndex, umbraLength,
- umbraAngleList, "umbra");
- bool isPenumbraCW = checkClockwise(maxPenumbraAngleIndex, penumbraLength,
- penumbraAngleList, "penumbra");
-
- if (!isUmbraCW || !isPenumbraCW || !isPolyCW) {
-#if DEBUG_SHADOW
- ALOGE("One polygon is not CW isUmbraCW %d isPenumbraCW %d isPolyCW %d",
- isUmbraCW, isPenumbraCW, isPolyCW);
-#endif
- return false;
+// For one umbra vertex, shoot an ray from centroid to it.
+// If the ray hit the polygon first, then return the intersection point as the
+// closer vertex.
+inline Vector2 getCloserVertex(const Vector2& umbraVertex, const Vector2& centroid,
+ const Vector2* poly2d, int polyLength, const Vector2* polyToCentroid,
+ bool isPositiveCross, int& previousPolyIndex) {
+ Vector2 umbraToCentroid = umbraVertex - centroid;
+ float distanceToUmbra = umbraToCentroid.length();
+ umbraToCentroid = umbraToCentroid / distanceToUmbra;
+
+ // previousPolyIndex is updated for each item such that we can minimize the
+ // looping inside findPolyIndex();
+ previousPolyIndex = findPolyIndex(isPositiveCross, previousPolyIndex,
+ umbraToCentroid, polyToCentroid, polyLength);
+
+ float dx = umbraToCentroid.x;
+ float dy = umbraToCentroid.y;
+ float distanceToIntersectPoly = rayIntersectPoints(centroid, dx, dy,
+ poly2d[previousPolyIndex], poly2d[(previousPolyIndex + 1) % polyLength]);
+ if (distanceToIntersectPoly < 0) {
+ distanceToIntersectPoly = 0;
}
- mergeAngleList(maxUmbraAngleIndex, maxPenumbraAngleIndex,
- umbraAngleList, umbraLength, penumbraAngleList, penumbraLength,
- allVerticesAngleData);
-
- // Calculate the offset to the left most Inner vertex for each outerVertex.
- // Then the offset to the left most Outer vertex for each innerVertex.
- int offsetToInner[totalRayNumber];
- int offsetToOuter[totalRayNumber];
- calculateDistanceCounter(true, totalRayNumber, allVerticesAngleData, offsetToInner);
- calculateDistanceCounter(false, totalRayNumber, allVerticesAngleData, offsetToOuter);
-
- // Generate both umbraVerticesPerRay and penumbraVerticesPerRay
- for (int i = 0; i < totalRayNumber; i++) {
- float rayAngle = allVerticesAngleData[i].mAngle;
- bool isUmbraVertex = !allVerticesAngleData[i].mIsPenumbra;
-
- float dx = cosf(rayAngle);
- float dy = sinf(rayAngle);
- float distanceToIntersectUmbra = -1;
-
- if (isUmbraVertex) {
- // We can just copy umbra easily, and calculate the distance for the
- // occluded umbra computation.
- int startUmbraIndex = allVerticesAngleData[i].mVertexIndex;
- umbraVerticesPerRay[i] = umbra[startUmbraIndex];
- if (hasOccludedUmbraArea) {
- distanceToIntersectUmbra = (umbraVerticesPerRay[i] - centroid).length();
- }
-
- //shoot ray to penumbra only
- int startPenumbraIndex = getEdgeStartIndex(offsetToOuter, i, totalRayNumber,
- allVerticesAngleData);
- float distanceToIntersectPenumbra = rayIntersectPoints(centroid, dx, dy,
- penumbra[startPenumbraIndex],
- penumbra[(startPenumbraIndex + 1) % penumbraLength]);
- if (distanceToIntersectPenumbra < 0) {
-#if DEBUG_SHADOW
- ALOGW("convertPolyToRayDist for penumbra failed rayAngle %f dx %f dy %f",
- rayAngle, dx, dy);
-#endif
- distanceToIntersectPenumbra = 0;
- }
- penumbraVerticesPerRay[i].x = centroid.x + dx * distanceToIntersectPenumbra;
- penumbraVerticesPerRay[i].y = centroid.y + dy * distanceToIntersectPenumbra;
- } else {
- // We can just copy the penumbra
- int startPenumbraIndex = allVerticesAngleData[i].mVertexIndex;
- penumbraVerticesPerRay[i] = penumbra[startPenumbraIndex];
-
- // And shoot ray to umbra only
- int startUmbraIndex = getEdgeStartIndex(offsetToInner, i, totalRayNumber,
- allVerticesAngleData);
-
- distanceToIntersectUmbra = rayIntersectPoints(centroid, dx, dy,
- umbra[startUmbraIndex], umbra[(startUmbraIndex + 1) % umbraLength]);
- if (distanceToIntersectUmbra < 0) {
-#if DEBUG_SHADOW
- ALOGW("convertPolyToRayDist for umbra failed rayAngle %f dx %f dy %f",
- rayAngle, dx, dy);
-#endif
- distanceToIntersectUmbra = 0;
- }
- umbraVerticesPerRay[i].x = centroid.x + dx * distanceToIntersectUmbra;
- umbraVerticesPerRay[i].y = centroid.y + dy * distanceToIntersectUmbra;
- }
-
- if (hasOccludedUmbraArea) {
- // Shoot the same ray to the poly2d, and get the distance.
- int startPolyIndex = getPolyEdgeStartIndex(maxPolyAngleIndex, polyLength,
- polyAngleList, rayAngle);
-
- float distanceToIntersectPoly = rayIntersectPoints(centroid, dx, dy,
- poly2d[startPolyIndex], poly2d[(startPolyIndex + 1) % polyLength]);
- if (distanceToIntersectPoly < 0) {
- distanceToIntersectPoly = 0;
- }
- distanceToIntersectPoly = MathUtils::min(distanceToIntersectUmbra, distanceToIntersectPoly);
- occludedUmbraVerticesPerRay[i].x = centroid.x + dx * distanceToIntersectPoly;
- occludedUmbraVerticesPerRay[i].y = centroid.y + dy * distanceToIntersectPoly;
- }
+ // Pick the closer one as the occluded area vertex.
+ Vector2 closerVertex;
+ if (distanceToIntersectPoly < distanceToUmbra) {
+ closerVertex.x = centroid.x + dx * distanceToIntersectPoly;
+ closerVertex.y = centroid.y + dy * distanceToIntersectPoly;
+ } else {
+ closerVertex = umbraVertex;
}
-#if DEBUG_SHADOW
- verifyAngleData(totalRayNumber, allVerticesAngleData, offsetToInner,
- offsetToOuter, umbraAngleList, maxUmbraAngleIndex, umbraLength,
- penumbraAngleList, maxPenumbraAngleIndex, penumbraLength);
-#endif
- return true; // success
-
+ return closerVertex;
}
/**
@@ -1193,7 +864,6 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, float shadowStrength
Vector2* penumbra, int penumbraLength, Vector2* umbra, int umbraLength,
const Vector3* poly, int polyLength, VertexBuffer& shadowTriangleStrip,
const Vector2& centroid) {
-
bool hasOccludedUmbraArea = false;
Vector2 poly2d[polyLength];
@@ -1209,128 +879,140 @@ void SpotShadow::generateTriangleStrip(bool isCasterOpaque, float shadowStrength
}
}
- int totalRayNum = umbraLength + penumbraLength;
- Vector2 umbraVertices[totalRayNum];
- Vector2 penumbraVertices[totalRayNum];
- Vector2 occludedUmbraVertices[totalRayNum];
- bool convertSuccess = convertPolysToVerticesPerRay(hasOccludedUmbraArea, poly2d,
- polyLength, umbra, umbraLength, penumbra, penumbraLength,
- centroid, umbraVertices, penumbraVertices, occludedUmbraVertices);
- if (!convertSuccess) {
- return;
+ // For each penumbra vertex, find its corresponding closest umbra vertex index.
+ //
+ // Penumbra Vertices marked as Pi
+ // Umbra Vertices marked as Ui
+ // (P3)
+ // (P2) | ' (P4)
+ // (P1)' | | '
+ // ' | | '
+ // (P0) ------------------------------------------------(P5)
+ // | (U0) |(U1)
+ // | |
+ // | |(U2) (P5.1)
+ // | |
+ // | |
+ // | |
+ // | |
+ // | |
+ // | |
+ // (U4)-----------------------------------(U3) (P6)
+ //
+ // At least, like P0, P1, P2, they will find the matching umbra as U0.
+ // If we jump over some umbra vertex without matching penumbra vertex, then
+ // we will generate some new penumbra vertex by interpolation. Like P6 is
+ // matching U3, but U2 is not matched with any penumbra vertex.
+ // So interpolate P5.1 out and match U2.
+ // In this way, every umbra vertex will have a matching penumbra vertex.
+ //
+ // The total pair number can be as high as umbraLength + penumbraLength.
+ const int maxNewPenumbraLength = umbraLength + penumbraLength;
+ IndexPair verticesPair[maxNewPenumbraLength];
+ int verticesPairIndex = 0;
+
+ // Cache all the existing penumbra vertices and newly interpolated vertices into a
+ // a new array.
+ Vector2 newPenumbra[maxNewPenumbraLength];
+ int newPenumbraIndex = 0;
+
+ // For each penumbra vertex, find its closet umbra vertex by comparing the
+ // neighbor umbra vertices.
+ genNewPenumbraAndPairWithUmbra(penumbra, penumbraLength, umbra, umbraLength, newPenumbra,
+ newPenumbraIndex, verticesPair, verticesPairIndex);
+ ShadowTessellator::checkOverflow(verticesPairIndex, maxNewPenumbraLength, "Spot pair");
+ ShadowTessellator::checkOverflow(newPenumbraIndex, maxNewPenumbraLength, "Spot new penumbra");
+#if DEBUG_SHADOW
+ for (int i = 0; i < umbraLength; i++) {
+ ALOGD("umbra i %d, [%f, %f]", i, umbra[i].x, umbra[i].y);
+ }
+ for (int i = 0; i < newPenumbraIndex; i++) {
+ ALOGD("new penumbra i %d, [%f, %f]", i, newPenumbra[i].x, newPenumbra[i].y);
+ }
+ for (int i = 0; i < verticesPairIndex; i++) {
+ ALOGD("index i %d, [%d, %d]", i, verticesPair[i].outerIndex, verticesPair[i].innerIndex);
}
+#endif
- // Minimal value is 1, for each vertex show up once.
- // The bigger this value is , the smoother the look is, but more memory
- // is consumed.
- // When the ray number is high, that means the polygon has been fine
- // tessellated, we don't need this extra slice, just keep it as 1.
- int sliceNumberPerEdge = (totalRayNum > FINE_TESSELLATED_POLYGON_RAY_NUMBER) ? 1 : 2;
-
- // For each polygon, we at most add (totalRayNum * sliceNumberPerEdge) vertices.
- int slicedVertexCountPerPolygon = totalRayNum * sliceNumberPerEdge;
- int totalVertexCount = slicedVertexCountPerPolygon * 2 + totalRayNum;
- int totalIndexCount = 2 * (slicedVertexCountPerPolygon * 2 + 2);
+ // For the size of vertex buffer, we need 3 rings, one has newPenumbraSize,
+ // one has umbraLength, the last one has at most umbraLength.
+ //
+ // For the size of index buffer, the umbra area needs (2 * umbraLength + 2).
+ // The penumbra one can vary a bit, but it is bounded by (2 * verticesPairIndex + 2).
+ // And 2 more for jumping between penumbra to umbra.
+ const int newPenumbraLength = newPenumbraIndex;
+ const int totalVertexCount = newPenumbraLength + umbraLength * 2;
+ const int totalIndexCount = 2 * umbraLength + 2 * verticesPairIndex + 6;
AlphaVertex* shadowVertices =
shadowTriangleStrip.alloc<AlphaVertex>(totalVertexCount);
uint16_t* indexBuffer =
shadowTriangleStrip.allocIndices<uint16_t>(totalIndexCount);
-
- int indexBufferIndex = 0;
int vertexBufferIndex = 0;
+ int indexBufferIndex = 0;
- uint16_t slicedUmbraVertexIndex[totalRayNum * sliceNumberPerEdge];
- // Should be something like 0 0 0 1 1 1 2 3 3 3...
- int rayNumberPerSlicedUmbra[totalRayNum * sliceNumberPerEdge];
- int realUmbraVertexCount = 0;
- for (int i = 0; i < totalRayNum; i++) {
- Vector2 currentPenumbra = penumbraVertices[i];
- Vector2 currentUmbra = umbraVertices[i];
-
- Vector2 nextPenumbra = penumbraVertices[(i + 1) % totalRayNum];
- Vector2 nextUmbra = umbraVertices[(i + 1) % totalRayNum];
- // NextUmbra/Penumbra will be done in the next loop!!
- for (int weight = 0; weight < sliceNumberPerEdge; weight++) {
- const Vector2& slicedPenumbra = (currentPenumbra * (sliceNumberPerEdge - weight)
- + nextPenumbra * weight) / sliceNumberPerEdge;
-
- const Vector2& slicedUmbra = (currentUmbra * (sliceNumberPerEdge - weight)
- + nextUmbra * weight) / sliceNumberPerEdge;
-
- // In the vertex buffer, we fill the Penumbra first, then umbra.
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], slicedPenumbra.x,
- slicedPenumbra.y, 0.0f);
-
- // When we add umbra vertex, we need to remember its current ray number.
- // And its own vertexBufferIndex. This is for occluded umbra usage.
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- rayNumberPerSlicedUmbra[realUmbraVertexCount] = i;
- slicedUmbraVertexIndex[realUmbraVertexCount] = vertexBufferIndex;
- realUmbraVertexCount++;
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++], slicedUmbra.x,
- slicedUmbra.y, M_PI);
- }
+ // Fill the IB and VB for the penumbra area.
+ for (int i = 0; i < newPenumbraLength; i++) {
+ AlphaVertex::set(&shadowVertices[vertexBufferIndex++], newPenumbra[i].x,
+ newPenumbra[i].y, 0.0f);
+ }
+ for (int i = 0; i < umbraLength; i++) {
+ AlphaVertex::set(&shadowVertices[vertexBufferIndex++], umbra[i].x, umbra[i].y,
+ M_PI);
}
- indexBuffer[indexBufferIndex++] = 0;
- //RealUmbraVertexIndex[0] must be 1, so we connect back well at the
- //beginning of occluded area.
- indexBuffer[indexBufferIndex++] = 1;
+ for (int i = 0; i < verticesPairIndex; i++) {
+ indexBuffer[indexBufferIndex++] = verticesPair[i].outerIndex;
+ // All umbra index need to be offseted by newPenumbraSize.
+ indexBuffer[indexBufferIndex++] = verticesPair[i].innerIndex + newPenumbraLength;
+ }
+ indexBuffer[indexBufferIndex++] = verticesPair[0].outerIndex;
+ indexBuffer[indexBufferIndex++] = verticesPair[0].innerIndex + newPenumbraLength;
+
+ // Now fill the IB and VB for the umbra area.
+ // First duplicated the index from previous strip and the first one for the
+ // degenerated triangles.
+ indexBuffer[indexBufferIndex] = indexBuffer[indexBufferIndex - 1];
+ indexBufferIndex++;
+ indexBuffer[indexBufferIndex++] = newPenumbraLength + 0;
+ // Save the first VB index for umbra area in order to close the loop.
+ int savedStartIndex = vertexBufferIndex;
- float occludedUmbraAlpha = M_PI;
if (hasOccludedUmbraArea) {
- // Now the occludedUmbra area;
- int currentRayNumber = -1;
- int firstOccludedUmbraIndex = -1;
- for (int i = 0; i < realUmbraVertexCount; i++) {
- indexBuffer[indexBufferIndex++] = slicedUmbraVertexIndex[i];
-
- // If the occludedUmbra vertex has not been added yet, then add it.
- // Otherwise, just use the previously added occludedUmbra vertices.
- if (rayNumberPerSlicedUmbra[i] != currentRayNumber) {
- currentRayNumber++;
- indexBuffer[indexBufferIndex++] = vertexBufferIndex;
- // We need to remember the begining of the occludedUmbra vertices
- // to close this loop.
- if (currentRayNumber == 0) {
- firstOccludedUmbraIndex = vertexBufferIndex;
- }
- AlphaVertex::set(&shadowVertices[vertexBufferIndex++],
- occludedUmbraVertices[currentRayNumber].x,
- occludedUmbraVertices[currentRayNumber].y,
- occludedUmbraAlpha);
- } else {
- indexBuffer[indexBufferIndex++] = (vertexBufferIndex - 1);
- }
+ // Precompute all the polygon's vector, and the reference cross product,
+ // in order to find the right polygon edge for the ray to intersect.
+ Vector2 polyToCentroid[polyLength];
+ bool isPositiveCross = genPolyToCentroid(poly2d, polyLength, centroid, polyToCentroid);
+
+ // Because both the umbra and polygon are going in the same direction,
+ // we can save the previous polygon index to make sure we have less polygon
+ // vertex to compute for each ray.
+ int previousPolyIndex = 0;
+ for (int i = 0; i < umbraLength; i++) {
+ // Shoot a ray from centroid to each umbra vertices and pick the one with
+ // shorter distance to the centroid, b/t the umbra vertex or the intersection point.
+ Vector2 closerVertex = getCloserVertex(umbra[i], centroid, poly2d, polyLength,
+ polyToCentroid, isPositiveCross, previousPolyIndex);
+
+ // We already stored the umbra vertices, just need to add the occlued umbra's ones.
+ indexBuffer[indexBufferIndex++] = newPenumbraLength + i;
+ indexBuffer[indexBufferIndex++] = vertexBufferIndex;
+ AlphaVertex::set(&shadowVertices[vertexBufferIndex++],
+ closerVertex.x, closerVertex.y, M_PI);
}
- // Close the loop here!
- indexBuffer[indexBufferIndex++] = slicedUmbraVertexIndex[0];
- indexBuffer[indexBufferIndex++] = firstOccludedUmbraIndex;
} else {
+ // If there is no occluded umbra at all, then draw the triangle fan
+ // starting from the centroid to all umbra vertices.
int lastCentroidIndex = vertexBufferIndex;
AlphaVertex::set(&shadowVertices[vertexBufferIndex++], centroid.x,
- centroid.y, occludedUmbraAlpha);
- for (int i = 0; i < realUmbraVertexCount; i++) {
- indexBuffer[indexBufferIndex++] = slicedUmbraVertexIndex[i];
+ centroid.y, M_PI);
+ for (int i = 0; i < umbraLength; i++) {
+ indexBuffer[indexBufferIndex++] = newPenumbraLength + i;
indexBuffer[indexBufferIndex++] = lastCentroidIndex;
}
- // Close the loop here!
- indexBuffer[indexBufferIndex++] = slicedUmbraVertexIndex[0];
- indexBuffer[indexBufferIndex++] = lastCentroidIndex;
}
-
-#if DEBUG_SHADOW
- ALOGD("allocated IB %d allocated VB is %d", totalIndexCount, totalVertexCount);
- ALOGD("IB index %d VB index is %d", indexBufferIndex, vertexBufferIndex);
- for (int i = 0; i < vertexBufferIndex; i++) {
- ALOGD("vertexBuffer i %d, (%f, %f %f)", i, shadowVertices[i].x, shadowVertices[i].y,
- shadowVertices[i].alpha);
- }
- for (int i = 0; i < indexBufferIndex; i++) {
- ALOGD("indexBuffer i %d, indexBuffer[i] %d", i, indexBuffer[i]);
- }
-#endif
+ // Closing the umbra area triangle's loop here.
+ indexBuffer[indexBufferIndex++] = newPenumbraLength;
+ indexBuffer[indexBufferIndex++] = savedStartIndex;
// At the end, update the real index and vertex buffer size.
shadowTriangleStrip.updateVertexCount(vertexBufferIndex);
diff --git a/libs/hwui/SpotShadow.h b/libs/hwui/SpotShadow.h
index 6fa2028..e2d94f7 100644
--- a/libs/hwui/SpotShadow.h
+++ b/libs/hwui/SpotShadow.h
@@ -36,40 +36,6 @@ private:
static float projectCasterToOutline(Vector2& outline,
const Vector3& lightCenter, const Vector3& polyVertex);
- static int setupAngleList(VertexAngleData* angleDataList,
- int polyLength, const Vector2* polygon, const Vector2& centroid,
- bool isPenumbra, const char* name);
-
- static int convertPolysToVerticesPerRay(
- bool hasOccludedUmbraArea, const Vector2* poly2d, int polyLength,
- const Vector2* umbra, int umbraLength, const Vector2* penumbra,
- int penumbraLength, const Vector2& centroid,
- Vector2* umbraVerticesPerRay, Vector2* penumbraVerticesPerRay,
- Vector2* occludedUmbraVerticesPerRay);
-
- static bool checkClockwise(int maxIndex, int listLength,
- VertexAngleData* angleList, const char* name);
-
- static void calculateDistanceCounter(bool needsOffsetToUmbra, int angleLength,
- const VertexAngleData* allVerticesAngleData, int* distances);
-
- static void mergeAngleList(int maxUmbraAngleIndex, int maxPenumbraAngleIndex,
- const VertexAngleData* umbraAngleList, int umbraLength,
- const VertexAngleData* penumbraAngleList, int penumbraLength,
- VertexAngleData* allVerticesAngleData);
-
- static int setupPolyAngleList(float* polyAngleList, int polyAngleLength,
- const Vector2* poly2d, const Vector2& centroid);
-
- static bool checkPolyClockwise(int polyAngleLength, int maxPolyAngleIndex,
- const float* polyAngleList);
-
- static int getEdgeStartIndex(const int* offsets, int rayIndex, int totalRayNumber,
- const VertexAngleData* allVerticesAngleData);
-
- static int getPolyEdgeStartIndex(int maxPolyAngleIndex, int polyLength,
- const float* polyAngleList, float rayAngle);
-
static void computeLightPolygon(int points, const Vector3& lightCenter,
float size, Vector3* ret);
diff --git a/libs/hwui/Vector.h b/libs/hwui/Vector.h
index d033ed9..aa6acc9 100644
--- a/libs/hwui/Vector.h
+++ b/libs/hwui/Vector.h
@@ -99,6 +99,10 @@ struct Vector2 {
return x * v.x + y * v.y;
}
+ float cross(const Vector2& v) const {
+ return x * v.y - y * v.x;
+ }
+
void dump() {
ALOGD("Vector2[%.2f, %.2f]", x, y);
}
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index b499dd0..6c3637d 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -166,6 +166,11 @@ void CanvasContext::prepareTree(TreeInfo& info) {
freePrefetechedLayers();
}
+ if (CC_UNLIKELY(!mNativeWindow.get())) {
+ info.out.canDrawThisFrame = false;
+ return;
+ }
+
int runningBehind = 0;
// TODO: This query is moderately expensive, investigate adding some sort
// of fast-path based off when we last called eglSwapBuffers() as well as
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index e20564b..435244e 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -68,6 +68,8 @@ public:
bool initialize(ANativeWindow* window);
void updateSurface(ANativeWindow* window);
void pauseSurface(ANativeWindow* window);
+ bool hasSurface() { return mNativeWindow.get(); }
+
void setup(int width, int height, const Vector3& lightCenter, float lightRadius,
uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha);
void setOpaque(bool opaque);
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp
index dd34e09..97b31a9 100644
--- a/libs/hwui/renderthread/DrawFrameTask.cpp
+++ b/libs/hwui/renderthread/DrawFrameTask.cpp
@@ -132,6 +132,12 @@ bool DrawFrameTask::syncFrameState(TreeInfo& info) {
mLayers.clear();
mContext->prepareTree(info);
+ // This is after the prepareTree so that any pending operations
+ // (RenderNode tree state, prefetched layers, etc...) will be flushed.
+ if (CC_UNLIKELY(!mContext->hasSurface())) {
+ mSyncResult |= kSync_LostSurfaceRewardIfFound;
+ }
+
if (info.out.hasAnimations) {
if (info.out.requiresUiRedraw) {
mSyncResult |= kSync_UIRedrawRequired;
diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h
index 243cc5d..28f6cb2 100644
--- a/libs/hwui/renderthread/DrawFrameTask.h
+++ b/libs/hwui/renderthread/DrawFrameTask.h
@@ -42,6 +42,7 @@ class RenderThread;
enum SyncResult {
kSync_OK = 0,
kSync_UIRedrawRequired = 1 << 0,
+ kSync_LostSurfaceRewardIfFound = 1 << 1,
};
/*
diff --git a/location/java/android/location/GpsClock.java b/location/java/android/location/GpsClock.java
index 963b604..22ac1a9 100644
--- a/location/java/android/location/GpsClock.java
+++ b/location/java/android/location/GpsClock.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
@@ -26,6 +27,7 @@ import android.util.Log;
*
* @hide
*/
+@SystemApi
public class GpsClock implements Parcelable {
private static final String TAG = "GpsClock";
@@ -492,6 +494,7 @@ public class GpsClock implements Parcelable {
setType(TYPE_UNKNOWN);
setTimeInNs(Long.MIN_VALUE);
resetTimeUncertaintyInNs();
+ resetFullBiasInNs();
resetBiasInNs();
resetBiasUncertaintyInNs();
resetDriftInNsPerSec();
diff --git a/location/java/android/location/GpsMeasurement.java b/location/java/android/location/GpsMeasurement.java
index 1550dc2..1c50181 100644
--- a/location/java/android/location/GpsMeasurement.java
+++ b/location/java/android/location/GpsMeasurement.java
@@ -16,6 +16,7 @@
package android.location;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
@@ -25,6 +26,7 @@ import android.util.Log;
*
* @hide
*/
+@SystemApi
public class GpsMeasurement implements Parcelable {
private static final String TAG = "GpsMeasurement";
diff --git a/location/java/android/location/GpsMeasurementListenerTransport.java b/location/java/android/location/GpsMeasurementListenerTransport.java
index 2d9a372..610da96 100644
--- a/location/java/android/location/GpsMeasurementListenerTransport.java
+++ b/location/java/android/location/GpsMeasurementListenerTransport.java
@@ -26,14 +26,12 @@ import android.os.RemoteException;
*/
class GpsMeasurementListenerTransport
extends LocalListenerHelper<GpsMeasurementsEvent.Listener> {
- private final Context mContext;
private final ILocationManager mLocationManager;
private final IGpsMeasurementsListener mListenerTransport = new ListenerTransport();
public GpsMeasurementListenerTransport(Context context, ILocationManager locationManager) {
- super("GpsMeasurementListenerTransport");
- mContext = context;
+ super(context, "GpsMeasurementListenerTransport");
mLocationManager = locationManager;
}
@@ -41,7 +39,7 @@ class GpsMeasurementListenerTransport
protected boolean registerWithServer() throws RemoteException {
return mLocationManager.addGpsMeasurementsListener(
mListenerTransport,
- mContext.getPackageName());
+ getContext().getPackageName());
}
@Override
@@ -59,7 +57,18 @@ class GpsMeasurementListenerTransport
listener.onGpsMeasurementsReceived(event);
}
};
+ foreach(operation);
+ }
+ @Override
+ public void onStatusChanged(final int status) {
+ ListenerOperation<GpsMeasurementsEvent.Listener> operation =
+ new ListenerOperation<GpsMeasurementsEvent.Listener>() {
+ @Override
+ public void execute(GpsMeasurementsEvent.Listener listener) throws RemoteException {
+ listener.onStatusChanged(status);
+ }
+ };
foreach(operation);
}
}
diff --git a/location/java/android/location/GpsMeasurementsEvent.java b/location/java/android/location/GpsMeasurementsEvent.java
index e04ed81..1366873 100644
--- a/location/java/android/location/GpsMeasurementsEvent.java
+++ b/location/java/android/location/GpsMeasurementsEvent.java
@@ -17,6 +17,7 @@
package android.location;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -31,7 +32,26 @@ import java.util.Collections;
*
* @hide
*/
+@SystemApi
public class GpsMeasurementsEvent implements Parcelable {
+
+ /**
+ * The system does not support tracking of GPS Measurements. This status will not change in the
+ * future.
+ */
+ public static final int STATUS_NOT_SUPPORTED = 0;
+
+ /**
+ * GPS Measurements are successfully being tracked, it will receive updates once they are
+ * available.
+ */
+ public static final int STATUS_READY = 1;
+
+ /**
+ * GPS provider or Location is disabled, updates will not be received until they are enabled.
+ */
+ public static final int STATUS_GPS_LOCATION_DISABLED = 2;
+
private final GpsClock mClock;
private final Collection<GpsMeasurement> mReadOnlyMeasurements;
@@ -42,8 +62,18 @@ public class GpsMeasurementsEvent implements Parcelable {
*
* @hide
*/
+ @SystemApi
public interface Listener {
+
+ /**
+ * Returns the latest collected GPS Measurements.
+ */
void onGpsMeasurementsReceived(GpsMeasurementsEvent eventArgs);
+
+ /**
+ * Returns the latest status of the GPS Measurements sub-system.
+ */
+ void onStatusChanged(int status);
}
public GpsMeasurementsEvent(GpsClock clock, GpsMeasurement[] measurements) {
@@ -103,7 +133,9 @@ public class GpsMeasurementsEvent implements Parcelable {
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeParcelable(mClock, flags);
- GpsMeasurement[] measurementsArray = mReadOnlyMeasurements.toArray(new GpsMeasurement[0]);
+ int measurementsCount = mReadOnlyMeasurements.size();
+ GpsMeasurement[] measurementsArray =
+ mReadOnlyMeasurements.toArray(new GpsMeasurement[measurementsCount]);
parcel.writeInt(measurementsArray.length);
parcel.writeTypedArray(measurementsArray, flags);
}
diff --git a/location/java/android/location/GpsNavigationMessage.java b/location/java/android/location/GpsNavigationMessage.java
index 2eb4708..42f8ee4 100644
--- a/location/java/android/location/GpsNavigationMessage.java
+++ b/location/java/android/location/GpsNavigationMessage.java
@@ -17,6 +17,7 @@
package android.location;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
@@ -28,6 +29,7 @@ import java.security.InvalidParameterException;
*
* @hide
*/
+@SystemApi
public class GpsNavigationMessage implements Parcelable {
private static final String TAG = "GpsNavigationMessage";
private static final byte[] EMPTY_ARRAY = new byte[0];
diff --git a/location/java/android/location/GpsNavigationMessageEvent.java b/location/java/android/location/GpsNavigationMessageEvent.java
index 50ffa75..bd6921c 100644
--- a/location/java/android/location/GpsNavigationMessageEvent.java
+++ b/location/java/android/location/GpsNavigationMessageEvent.java
@@ -17,13 +17,11 @@
package android.location;
import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import java.security.InvalidParameterException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
/**
* A class implementing a container for data associated with a navigation message event.
@@ -31,7 +29,26 @@ import java.util.Collections;
*
* @hide
*/
+@SystemApi
public class GpsNavigationMessageEvent implements Parcelable {
+
+ /**
+ * The system does not support tracking of GPS Navigation Messages. This status will not change
+ * in the future.
+ */
+ public static int STATUS_NOT_SUPPORTED = 0;
+
+ /**
+ * GPS Navigation Messages are successfully being tracked, it will receive updates once they are
+ * available.
+ */
+ public static int STATUS_READY = 1;
+
+ /**
+ * GPS provider or Location is disabled, updated will not be received until they are enabled.
+ */
+ public static int STATUS_GPS_LOCATION_DISABLED = 2;
+
private final GpsNavigationMessage mNavigationMessage;
/**
@@ -41,8 +58,18 @@ public class GpsNavigationMessageEvent implements Parcelable {
*
* @hide
*/
+ @SystemApi
public interface Listener {
+
+ /**
+ * Returns the latest collected GPS Navigation Message.
+ */
void onGpsNavigationMessageReceived(GpsNavigationMessageEvent event);
+
+ /**
+ * Returns the latest status of the GPS Navigation Messages sub-system.
+ */
+ void onStatusChanged(int status);
}
public GpsNavigationMessageEvent(GpsNavigationMessage message) {
diff --git a/location/java/android/location/GpsNavigationMessageListenerTransport.java b/location/java/android/location/GpsNavigationMessageListenerTransport.java
index ec4812b..f6ba407 100644
--- a/location/java/android/location/GpsNavigationMessageListenerTransport.java
+++ b/location/java/android/location/GpsNavigationMessageListenerTransport.java
@@ -26,7 +26,6 @@ import android.os.RemoteException;
*/
class GpsNavigationMessageListenerTransport
extends LocalListenerHelper<GpsNavigationMessageEvent.Listener> {
- private final Context mContext;
private final ILocationManager mLocationManager;
private final IGpsNavigationMessageListener mListenerTransport = new ListenerTransport();
@@ -34,8 +33,7 @@ class GpsNavigationMessageListenerTransport
public GpsNavigationMessageListenerTransport(
Context context,
ILocationManager locationManager) {
- super("GpsNavigationMessageListenerTransport");
- mContext = context;
+ super(context, "GpsNavigationMessageListenerTransport");
mLocationManager = locationManager;
}
@@ -43,7 +41,7 @@ class GpsNavigationMessageListenerTransport
protected boolean registerWithServer() throws RemoteException {
return mLocationManager.addGpsNavigationMessageListener(
mListenerTransport,
- mContext.getPackageName());
+ getContext().getPackageName());
}
@Override
@@ -62,7 +60,19 @@ class GpsNavigationMessageListenerTransport
listener.onGpsNavigationMessageReceived(event);
}
};
+ foreach(operation);
+ }
+ @Override
+ public void onStatusChanged(final int status) {
+ ListenerOperation<GpsNavigationMessageEvent.Listener> operation =
+ new ListenerOperation<GpsNavigationMessageEvent.Listener>() {
+ @Override
+ public void execute(GpsNavigationMessageEvent.Listener listener)
+ throws RemoteException {
+ listener.onStatusChanged(status);
+ }
+ };
foreach(operation);
}
}
diff --git a/location/java/android/location/IGpsMeasurementsListener.aidl b/location/java/android/location/IGpsMeasurementsListener.aidl
index b34bb6c..cbd3100 100644
--- a/location/java/android/location/IGpsMeasurementsListener.aidl
+++ b/location/java/android/location/IGpsMeasurementsListener.aidl
@@ -23,4 +23,5 @@ import android.location.GpsMeasurementsEvent;
*/
oneway interface IGpsMeasurementsListener {
void onGpsMeasurementsReceived(in GpsMeasurementsEvent event);
+ void onStatusChanged(in int status);
}
diff --git a/location/java/android/location/IGpsNavigationMessageListener.aidl b/location/java/android/location/IGpsNavigationMessageListener.aidl
index 18603fe..a708ea6 100644
--- a/location/java/android/location/IGpsNavigationMessageListener.aidl
+++ b/location/java/android/location/IGpsNavigationMessageListener.aidl
@@ -23,4 +23,5 @@ import android.location.GpsNavigationMessageEvent;
*/
oneway interface IGpsNavigationMessageListener {
void onGpsNavigationMessageReceived(in GpsNavigationMessageEvent event);
+ void onStatusChanged(in int status);
}
diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl
index 1501710..af76175 100644
--- a/location/java/android/location/ILocationManager.aidl
+++ b/location/java/android/location/ILocationManager.aidl
@@ -62,12 +62,12 @@ interface ILocationManager
boolean sendNiResponse(int notifId, int userResponse);
boolean addGpsMeasurementsListener(in IGpsMeasurementsListener listener, in String packageName);
- boolean removeGpsMeasurementsListener(in IGpsMeasurementsListener listener);
+ void removeGpsMeasurementsListener(in IGpsMeasurementsListener listener);
boolean addGpsNavigationMessageListener(
in IGpsNavigationMessageListener listener,
in String packageName);
- boolean removeGpsNavigationMessageListener(in IGpsNavigationMessageListener listener);
+ void removeGpsNavigationMessageListener(in IGpsNavigationMessageListener listener);
// --- deprecated ---
List<String> getAllProviders();
diff --git a/location/java/android/location/LocalListenerHelper.java b/location/java/android/location/LocalListenerHelper.java
index 1f3bf67..458c451 100644
--- a/location/java/android/location/LocalListenerHelper.java
+++ b/location/java/android/location/LocalListenerHelper.java
@@ -19,6 +19,7 @@ package android.location;
import com.android.internal.util.Preconditions;
import android.annotation.NonNull;
+import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
@@ -32,17 +33,19 @@ import java.util.HashSet;
* @hide
*/
abstract class LocalListenerHelper<TListener> {
- private final HashSet<TListener> mListeners = new HashSet<TListener>();
+ private final HashSet<TListener> mListeners = new HashSet<>();
+
private final String mTag;
+ private final Context mContext;
- protected LocalListenerHelper(String name) {
+ protected LocalListenerHelper(Context context, String name) {
Preconditions.checkNotNull(name);
+ mContext = context;
mTag = name;
}
public boolean add(@NonNull TListener listener) {
Preconditions.checkNotNull(listener);
-
synchronized (mListeners) {
// we need to register with the service first, because we need to find out if the
// service will actually support the request before we attempt anything
@@ -59,18 +62,15 @@ abstract class LocalListenerHelper<TListener> {
return false;
}
}
-
if (mListeners.contains(listener)) {
return true;
}
- mListeners.add(listener);
+ return mListeners.add(listener);
}
- return true;
}
public void remove(@NonNull TListener listener) {
Preconditions.checkNotNull(listener);
-
synchronized (mListeners) {
boolean removed = mListeners.remove(listener);
boolean isLastRemoved = removed && mListeners.isEmpty();
@@ -78,7 +78,7 @@ abstract class LocalListenerHelper<TListener> {
try {
unregisterFromServer();
} catch (RemoteException e) {
-
+ Log.v(mTag, "Error handling last listener removal", e);
}
}
}
@@ -91,12 +91,15 @@ abstract class LocalListenerHelper<TListener> {
void execute(TListener listener) throws RemoteException;
}
- protected void foreach(ListenerOperation operation) {
+ protected Context getContext() {
+ return mContext;
+ }
+
+ protected void foreach(ListenerOperation<TListener> operation) {
Collection<TListener> listeners;
synchronized (mListeners) {
- listeners = new ArrayList<TListener>(mListeners);
+ listeners = new ArrayList<>(mListeners);
}
-
for (TListener listener : listeners) {
try {
operation.execute(listener);
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index ed408e0..0eb4fdc 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -1579,10 +1579,11 @@ public class LocationManager {
* Adds a GPS Measurement listener.
*
* @param listener a {@link GpsMeasurementsEvent.Listener} object to register.
- * @return {@code true} if the listener was successfully registered, {@code false} otherwise.
+ * @return {@code true} if the listener was added successfully, {@code false} otherwise.
*
* @hide
*/
+ @SystemApi
public boolean addGpsMeasurementListener(GpsMeasurementsEvent.Listener listener) {
return mGpsMeasurementListenerTransport.add(listener);
}
@@ -1594,6 +1595,7 @@ public class LocationManager {
*
* @hide
*/
+ @SystemApi
public void removeGpsMeasurementListener(GpsMeasurementsEvent.Listener listener) {
mGpsMeasurementListenerTransport.remove(listener);
}
@@ -1602,10 +1604,11 @@ public class LocationManager {
* Adds a GPS Navigation Message listener.
*
* @param listener a {@link GpsNavigationMessageEvent.Listener} object to register.
- * @return {@code true} if the listener was successfully registered, {@code false} otherwise.
+ * @return {@code true} if the listener was added successfully, {@code false} otherwise.
*
* @hide
*/
+ @SystemApi
public boolean addGpsNavigationMessageListener(GpsNavigationMessageEvent.Listener listener) {
return mGpsNavigationMessageListenerTransport.add(listener);
}
@@ -1617,6 +1620,7 @@ public class LocationManager {
*
* @hide
*/
+ @SystemApi
public void removeGpsNavigationMessageListener(
GpsNavigationMessageEvent.Listener listener) {
mGpsNavigationMessageListenerTransport.remove(listener);
diff --git a/media/java/android/media/MediaHTTPConnection.java b/media/java/android/media/MediaHTTPConnection.java
index d0f3334..b2886bb 100644
--- a/media/java/android/media/MediaHTTPConnection.java
+++ b/media/java/android/media/MediaHTTPConnection.java
@@ -31,6 +31,7 @@ import java.net.URL;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.NoRouteToHostException;
+import java.net.ProtocolException;
import java.util.HashMap;
import java.util.Map;
@@ -282,7 +283,7 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
if (offset > 0 && response != HttpURLConnection.HTTP_PARTIAL) {
// Some servers simply ignore "Range" requests and serve
// data from the start of the content.
- throw new IOException();
+ throw new ProtocolException();
}
mInputStream =
@@ -330,6 +331,9 @@ public class MediaHTTPConnection extends IMediaHTTPConnection.Stub {
}
return n;
+ } catch (ProtocolException e) {
+ Log.w(TAG, "readAt " + offset + " / " + size + " => " + e);
+ return MEDIA_ERROR_UNSUPPORTED;
} catch (NoRouteToHostException e) {
Log.w(TAG, "readAt " + offset + " / " + size + " => " + e);
return MEDIA_ERROR_UNSUPPORTED;
diff --git a/media/java/android/media/MediaMetadata.java b/media/java/android/media/MediaMetadata.java
index b4e6033..924078c 100644
--- a/media/java/android/media/MediaMetadata.java
+++ b/media/java/android/media/MediaMetadata.java
@@ -122,6 +122,10 @@ public final class MediaMetadata implements Parcelable {
/**
* The artwork for the media as a {@link Bitmap}.
+ * <p>
+ * The artwork should be relatively small and may be scaled down by the
+ * system if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_ART_URI} should be used instead.
*/
public static final String METADATA_KEY_ART = "android.media.metadata.ART";
@@ -129,12 +133,20 @@ public final class MediaMetadata implements Parcelable {
* The artwork for the media as a Uri formatted String. The artwork can be
* loaded using a combination of {@link ContentResolver#openInputStream} and
* {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
*/
public static final String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
/**
* The artwork for the album of the media's original source as a
* {@link Bitmap}.
+ * <p>
+ * The artwork should be relatively small and may be scaled down by the
+ * system if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_ALBUM_ART_URI} should be used instead.
*/
public static final String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
@@ -143,6 +155,10 @@ public final class MediaMetadata implements Parcelable {
* formatted String. The artwork can be loaded using a combination of
* {@link ContentResolver#openInputStream} and
* {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
*/
public static final String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
@@ -188,6 +204,10 @@ public final class MediaMetadata implements Parcelable {
* An icon or thumbnail that is suitable for display to the user. When
* displaying an icon for media described by this metadata this should be
* preferred to other fields if present. This must be a {@link Bitmap}.
+ * <p>
+ * The icon should be relatively small and may be scaled down by the system
+ * if it is too large. For higher resolution artwork
+ * {@link #METADATA_KEY_DISPLAY_ICON_URI} should be used instead.
*/
public static final String METADATA_KEY_DISPLAY_ICON
= "android.media.metadata.DISPLAY_ICON";
@@ -199,6 +219,10 @@ public final class MediaMetadata implements Parcelable {
* fields when present. The icon can be loaded using a combination of
* {@link ContentResolver#openInputStream} and
* {@link BitmapFactory#decodeStream}.
+ * <p>
+ * For the best results, Uris should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork through
+ * {@link ContentResolver#openTypedAssetFileDescriptor(Uri, String, Bundle)}.
*/
public static final String METADATA_KEY_DISPLAY_ICON_URI
= "android.media.metadata.DISPLAY_ICON_URI";
@@ -602,6 +626,11 @@ public final class MediaMetadata implements Parcelable {
* <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li>
* <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li>
* </ul>
+ * <p>
+ * Uris for artwork should use the content:// style and support
+ * {@link ContentResolver#EXTRA_SIZE} for retrieving scaled artwork
+ * through {@link ContentResolver#openTypedAssetFileDescriptor(Uri,
+ * String, Bundle)}.
*
* @param key The key for referencing this value
* @param value The String value to store
diff --git a/media/java/android/media/audiofx/AudioEffect.java b/media/java/android/media/audiofx/AudioEffect.java
index 9fa3f50..a8b9686 100644
--- a/media/java/android/media/audiofx/AudioEffect.java
+++ b/media/java/android/media/audiofx/AudioEffect.java
@@ -483,6 +483,10 @@ public class AudioEffect {
*/
public static boolean isEffectTypeAvailable(UUID type) {
AudioEffect.Descriptor[] desc = AudioEffect.queryEffects();
+ if (desc == null) {
+ return false;
+ }
+
for (int i = 0; i < desc.length; i++) {
if (desc[i].type.equals(type)) {
return true;
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index e490c2b..dd6bd20 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -449,6 +449,7 @@ public final class MediaController {
}
MessageHandler holder = new MessageHandler(handler.getLooper(), cb);
mCallbacks.add(holder);
+ holder.mRegistered = true;
if (!mCbRegistered) {
try {
@@ -467,6 +468,7 @@ public final class MediaController {
if (cb == handler.mCallback) {
mCallbacks.remove(i);
success = true;
+ handler.mRegistered = false;
}
}
if (mCbRegistered && mCallbacks.size() == 0) {
@@ -956,6 +958,7 @@ public final class MediaController {
private final static class MessageHandler extends Handler {
private final MediaController.Callback mCallback;
+ private boolean mRegistered = false;
public MessageHandler(Looper looper, MediaController.Callback cb) {
super(looper, null, true);
@@ -964,6 +967,9 @@ public final class MediaController {
@Override
public void handleMessage(Message msg) {
+ if (!mRegistered) {
+ return;
+ }
switch (msg.what) {
case MSG_EVENT:
mCallback.onSessionEvent((String) msg.obj, msg.getData());
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index aaff9a2..7830c80 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -80,7 +80,7 @@ public:
virtual ~JNIImageReaderContext();
- virtual void onFrameAvailable();
+ virtual void onFrameAvailable(const BufferItem& item);
CpuConsumer::LockedBuffer* getLockedBuffer();
@@ -187,7 +187,7 @@ JNIImageReaderContext::~JNIImageReaderContext() {
mConsumer.clear();
}
-void JNIImageReaderContext::onFrameAvailable()
+void JNIImageReaderContext::onFrameAvailable(const BufferItem& /*item*/)
{
ALOGV("%s: frame available", __FUNCTION__);
bool needsDetach = false;
diff --git a/packages/Keyguard/res/layout/keyguard_status_view.xml b/packages/Keyguard/res/layout/keyguard_status_view.xml
index 1858261..69f510e 100644
--- a/packages/Keyguard/res/layout/keyguard_status_view.xml
+++ b/packages/Keyguard/res/layout/keyguard_status_view.xml
@@ -55,7 +55,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/date_owner_info_margin"
android:layout_gravity="center_horizontal"
- android:textColor="#ccffffff"
+ android:textColor="@color/clock_gray"
android:textSize="@dimen/widget_label_font_size"
android:ellipsize="marquee"
android:singleLine="true" />
diff --git a/packages/Keyguard/res/values/colors.xml b/packages/Keyguard/res/values/colors.xml
index a9e8061..4e28eff 100644
--- a/packages/Keyguard/res/values/colors.xml
+++ b/packages/Keyguard/res/values/colors.xml
@@ -26,5 +26,5 @@
<!-- Clock -->
<color name="clock_white">#ffffffff</color>
- <color name="clock_gray">#80ffffff</color>
+ <color name="clock_gray">#99ffffff</color>
</resources>
diff --git a/packages/Keyguard/res/values/dimens.xml b/packages/Keyguard/res/values/dimens.xml
index fb7480c..8326d75 100644
--- a/packages/Keyguard/res/values/dimens.xml
+++ b/packages/Keyguard/res/values/dimens.xml
@@ -174,7 +174,7 @@
<dimen name="password_char_padding">8dp</dimen>
<!-- The vertical margin between the date and the owner info. -->
- <dimen name="date_owner_info_margin">10dp</dimen>
+ <dimen name="date_owner_info_margin">6dp</dimen>
<!-- The translation for disappearing security views after having solved them. -->
<dimen name="disappear_y_translation">-32dp</dimen>
diff --git a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
index 09c7165..f28d0e4 100644
--- a/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
+++ b/packages/Keyguard/test/SampleTrustAgent/src/com/android/trustagent/test/SampleTrustAgent.java
@@ -28,6 +28,8 @@ import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.widget.Toast;
+import java.util.List;
+
public class SampleTrustAgent extends TrustAgentService
implements SharedPreferences.OnSharedPreferenceChangeListener {
@@ -90,11 +92,10 @@ public class SampleTrustAgent extends TrustAgentService
}
@Override
- public boolean onConfigure(Configuration config) {
- if (config != null && config.options != null) {
- for (int i = 0; i < config.options.size(); i++) {
- PersistableBundle options = config.options.get(i);
- Log.v(TAG, "Policy options received: " + options.toString());
+ public boolean onConfigure(List<PersistableBundle> options) {
+ if (options != null) {
+ for (int i = 0; i < options.size(); i++) {
+ Log.v(TAG, "Policy options received: " + options.get(i));
}
} else {
Log.w(TAG, "onConfigure() called with no options");
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 9bfcadb..1771eac 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -71,7 +71,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 117;
+ private static final int DATABASE_VERSION = 118;
private Context mContext;
private int mUserHandle;
@@ -1879,6 +1879,22 @@ public class DatabaseHelper extends SQLiteOpenHelper {
upgradeVersion = 117;
}
+ if (upgradeVersion < 118) {
+ // Reset rotation-lock-for-accessibility on upgrade, since it now hides the display
+ // setting.
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)"
+ + " VALUES(?,?);");
+ loadSetting(stmt, Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, 0);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ upgradeVersion = 118;
+ }
// *** Remember to update DATABASE_VERSION above!
if (upgradeVersion != currentVersion) {
@@ -2598,6 +2614,9 @@ public class DatabaseHelper extends SQLiteOpenHelper {
// Set default cdma call auto retry
loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0);
+ // Set default simplified carrier network settings to 0
+ loadSetting(stmt, Settings.Global.HIDE_CARRIER_NETWORK_SETTINGS, 0);
+
// Set the preferred network mode to target desired value or Default
// value defined in RILConstants
int type;
diff --git a/packages/SystemUI/res/anim/ic_hotspot_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_cross_1.xml
new file mode 100644
index 0000000..ad06d8e
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_cross_1.xml
@@ -0,0 +1,31 @@
+<?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.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 4.44044494629,2.24310302734 c 0.0,0.0 0.0875396728516,0.112457275391 0.0875396728516,0.112457275391 "
+ android:valueTo="M 4.44044494629,2.24310302734 c 0.0,0.0 35.4000396729,35.3999633789 35.4000396729,35.3999633789 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_disable_cross_1_pathdata_interpolator" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
+</set>
diff --git a/packages/SystemUI/res/anim/ic_hotspot_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_mask.xml
new file mode 100644
index 0000000..4cd8ce9
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_mask.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="117"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 6.97125244141,7.33258056641 6.97125244141,7.33258056641 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -6.77128601074,-6.82850646973 -6.77128601074,-6.82850646973 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.659332275391,0.664688110352 0.659332275391,0.664688110351 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 29.0108337402,34.4080963135 29.0108337402,34.4080963135 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 29.8566131592,30.1964874268 29.8566131592,30.1964874268 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -29.6566467285,-29.6924133301 -29.6566467285,-29.6924133301 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.905746459961,0.856552124023 0.905746459961,0.856552124023 c 0.0,0.0 -3.13299560547,2.82975769043 -3.13299560547,2.82975769043 c 0.0,0.0 28.7644195557,34.2162475586 28.7644195557,34.2162475586 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_disable_mask_pathdata_interpolator_1" />
+ <objectAnimator
+ android:duration="233"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 29.8566131592,30.1964874268 29.8566131592,30.1964874268 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -29.6566467285,-29.6924133301 -29.6566467285,-29.6924133301 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.905746459961,0.856552124023 0.905746459961,0.856552124023 c 0.0,0.0 -3.13299560547,2.82975769043 -3.13299560547,2.82975769043 c 0.0,0.0 28.7644195557,34.2162475586 28.7644195557,34.2162475586 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 43.1884765625,43.515335083 43.1884765625,43.515335083 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -42.9885101318,-43.0112609863 -42.9885101318,-43.0112609863 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 13.0984039307,13.025604248 13.0984039307,13.025604248 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 16.571762085,22.0471801758 16.571762085,22.0471801758 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_disable_mask_pathdata_interpolator_2" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/zen_toast_enter.xml b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_root.xml
index e236782..770c401 100644
--- a/packages/SystemUI/res/anim/zen_toast_enter.xml
+++ b/packages/SystemUI/res/anim/ic_hotspot_disable_animation_root.xml
@@ -14,7 +14,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad"
- android:fromAlpha="0.0" android:toAlpha="1.0"
- android:duration="@integer/zen_toast_animation_duration" />
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="alpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.3"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/ic_hotspot_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_cross_1.xml
new file mode 100644
index 0000000..523e53a
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_cross_1.xml
@@ -0,0 +1,40 @@
+<?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.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 4.44044494629,2.24310302734 c 0.0,0.0 35.4000396729,35.3999633789 35.4000396729,35.3999633789 "
+ android:valueTo="M 4.44044494629,2.24310302734 c 0.0,0.0 0.0875396728516,0.112457275391 0.0875396728516,0.112457275391 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_enable_cross_1_pathdata_interpolator" />
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="1"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="1"
+ android:valueTo="0"
+ android:interpolator="@android:interpolator/linear" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/ic_hotspot_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_mask.xml
new file mode 100644
index 0000000..7562c9b
--- /dev/null
+++ b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_mask.xml
@@ -0,0 +1,35 @@
+<?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.
+-->
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="233"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 43.1884765625,43.515335083 43.1884765625,43.515335083 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -42.9885101318,-43.0112609863 -42.9885101318,-43.0112609863 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 13.0984039307,13.025604248 13.0984039307,13.025604248 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 16.571762085,22.0471801758 16.571762085,22.0471801758 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 29.8566131592,30.1964874268 29.8566131592,30.1964874268 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -29.6566467285,-29.6924133301 -29.6566467285,-29.6924133301 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.905746459961,0.856552124023 0.905746459961,0.856552124023 c 0.0,0.0 -3.13299560547,2.82975769043 -3.13299560547,2.82975769043 c 0.0,0.0 28.7644195557,34.2162475586 28.7644195557,34.2162475586 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_enable_mask_pathdata_interpolator_1" />
+ <objectAnimator
+ android:duration="117"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 29.8566131592,30.1964874268 29.8566131592,30.1964874268 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -29.6566467285,-29.6924133301 -29.6566467285,-29.6924133301 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.905746459961,0.856552124023 0.905746459961,0.856552124023 c 0.0,0.0 -3.13299560547,2.82975769043 -3.13299560547,2.82975769043 c 0.0,0.0 28.7644195557,34.2162475586 28.7644195557,34.2162475586 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 6.97125244141,7.33258056641 6.97125244141,7.33258056641 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -6.77128601074,-6.82850646973 -6.77128601074,-6.82850646973 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.659332275391,0.664688110352 0.659332275391,0.664688110351 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 29.0108337402,34.4080963135 29.0108337402,34.4080963135 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_hotspot_enable_mask_pathdata_interpolator_2" />
+ </set>
+</set>
diff --git a/packages/SystemUI/res/anim/zen_toast_exit.xml b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_root.xml
index a9b1ab2..387ca29 100644
--- a/packages/SystemUI/res/anim/zen_toast_exit.xml
+++ b/packages/SystemUI/res/anim/ic_hotspot_enable_animation_root.xml
@@ -14,7 +14,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad"
- android:fromAlpha="1.0" android:toAlpha="0.0"
- android:duration="@integer/zen_toast_animation_duration" />
+<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="alpha"
+ android:valueFrom="0.3"
+ android:valueTo="1.0"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_cross_1.xml
index a49ebf8..5e78f4c 100644
--- a/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_cross_1.xml
@@ -15,36 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_invert_colors_disable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
+ android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_invert_colors_disable_cross_1_pathdata_interpolator" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_mask.xml
index 605ef90..7f77372 100644
--- a/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_invert_colors_disable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_cross_1.xml
index 94f54b6..eacd248 100644
--- a/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_cross_1.xml
@@ -15,27 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
+ android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_invert_colors_enable_cross_1_pathdata_interpolator" />
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_invert_colors_enable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="533"
+ android:duration="333"
android:propertyName="strokeAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_mask.xml
index 9531cd9..a2126a0 100644
--- a/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_invert_colors_enable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_invert_colors_enable_mask_pathdata_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_invert_colors_enable_mask_pathdata_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_bottom.xml b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_bottom.xml
index 9add90c..b003e92 100644
--- a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_bottom.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_bottom.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="567"
+ android:duration="367"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_top.xml b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_top.xml
index 9add90c..b003e92 100644
--- a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_top.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrow_top.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="567"
+ android:duration="367"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrows.xml b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrows.xml
index 6c4e133..5c37479 100644
--- a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrows.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_arrows.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="317"
+ android:duration="117"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="1"
@@ -33,7 +33,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="317"
+ android:duration="117"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="1"
@@ -45,19 +45,10 @@
android:valueTo="0.9"
android:interpolator="@android:interpolator/linear" />
</set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="450"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="-135"
- android:interpolator="@interpolator/ic_landscape_from_auto_rotate_arrows_rotation_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="450"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="-135"
+ android:interpolator="@interpolator/ic_landscape_from_auto_rotate_arrows_rotation_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_body.xml b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_body.xml
index a8f5ce0..aa086c9 100644
--- a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_body.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_body.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="267"
+ android:duration="67"
android:propertyName="pathData"
android:valueFrom="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z"
android:valueTo="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z"
diff --git a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_device.xml b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_device.xml
index b9bb42d..27fd653 100644
--- a/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_device.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_from_auto_rotate_animation_device.xml
@@ -15,19 +15,10 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="400"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="-45"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="400"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="-45"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_bottom.xml b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_bottom.xml
index b8823a9..fa10b119 100644
--- a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_bottom.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_bottom.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="0"
diff --git a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_top.xml b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_top.xml
index b8823a9..fa10b119 100644
--- a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_top.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrow_top.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="0"
diff --git a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrows.xml b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrows.xml
index 14c2776..caae73a 100644
--- a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrows.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_arrows.xml
@@ -15,49 +15,22 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="scaleX"
- android:valueFrom="0.9"
- android:valueTo="0.9"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="333"
- android:propertyName="scaleX"
- android:valueFrom="0.9"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="scaleY"
- android:valueFrom="0.9"
- android:valueTo="0.9"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="333"
- android:propertyName="scaleY"
- android:valueFrom="0.9"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="-135"
- android:valueTo="-135"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="450"
- android:propertyName="rotation"
- android:valueFrom="-135"
- android:valueTo="0"
- android:interpolator="@interpolator/ic_landscape_to_auto_rotate_arrows_rotation_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleX"
+ android:valueFrom="0.9"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleY"
+ android:valueFrom="0.9"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="450"
+ android:propertyName="rotation"
+ android:valueFrom="-135"
+ android:valueTo="0"
+ android:interpolator="@interpolator/ic_landscape_to_auto_rotate_arrows_rotation_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_body.xml b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_body.xml
index ea8f979..aa22c3b 100644
--- a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_body.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_body.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="267"
+ android:duration="67"
android:propertyName="pathData"
android:valueFrom="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z"
android:valueTo="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z"
diff --git a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_device.xml b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_device.xml
index 4e3a356..2530f08 100644
--- a/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_device.xml
+++ b/packages/SystemUI/res/anim/ic_landscape_to_auto_rotate_animation_device.xml
@@ -15,19 +15,10 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="-45"
- android:valueTo="-45"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="400"
- android:propertyName="rotation"
- android:valueFrom="-45"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="400"
+ android:propertyName="rotation"
+ android:valueFrom="-45"
+ android:valueTo="0"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_bottom.xml b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_bottom.xml
index d05c4e1..4e20d81 100644
--- a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_bottom.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_bottom.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="600"
+ android:duration="400"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_top.xml b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_top.xml
index d05c4e1..4e20d81 100644
--- a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_top.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrow_top.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="600"
+ android:duration="400"
android:propertyName="fillAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrows.xml b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrows.xml
index 8bcbf1e..61bdfea 100644
--- a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrows.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_arrows.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="317"
+ android:duration="117"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="1"
@@ -33,7 +33,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="317"
+ android:duration="117"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="1"
@@ -45,19 +45,10 @@
android:valueTo="0.9"
android:interpolator="@android:interpolator/linear" />
</set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="617"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="-221"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="617"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="-221"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device.xml b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device.xml
index 79b1827..6a0a20b 100644
--- a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device.xml
@@ -15,19 +15,10 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="400"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="-135"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="400"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="-135"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device_1.xml b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device_1.xml
index a8f5ce0..92b19ad 100644
--- a/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device_1.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_from_auto_rotate_animation_device_1.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="267"
+ android:duration="167"
android:propertyName="pathData"
android:valueFrom="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z"
android:valueTo="M -3.5,-20.5 c -1.19999694824,-1.19999694824 -3.10000610352,-1.19999694824 -4.19999694824,0.0 c 0.0,0.0 -12.8000030518,12.6999969482 -12.8000030518,12.6999969482 c -1.19999694824,1.19999694824 -1.19999694824,3.10000610352 0.0,4.19999694824 c 0.0,0.0 24.0,24.0000152588 24.0,24.0000152588 c 1.19999694824,1.19999694824 3.10000610352,1.19999694824 4.19999694824,0.0 c 0.0,0.0 12.6999969482,-12.700012207 12.6999969482,-12.700012207 c 1.20001220703,-1.19999694824 1.20001220703,-3.09999084473 0.0,-4.19999694824 c 0.0,0.0 -23.8999938965,-24.0 -23.8999938965,-24.0 Z M 2.84999084473,15.5500183105 c 0.0,0.0 -18.6000061035,-18.5000457764 -18.6000061035,-18.5000457764 c 0.0,0.0 12.5999908447,-12.8000030518 12.5999908447,-12.8000030518 c 0.0,0.0 18.6000213623,18.5000457764 18.6000213623,18.5000457764 c 0.0,0.0 -12.6000061035,12.8000030518 -12.6000061035,12.8000030518 Z"
diff --git a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_bottom.xml b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_bottom.xml
index c3ae6c1..682dcf3 100644
--- a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_bottom.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_bottom.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="0"
diff --git a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_top.xml b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_top.xml
index c3ae6c1..682dcf3 100644
--- a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_top.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrow_top.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="fillAlpha"
android:valueFrom="0"
android:valueTo="0"
diff --git a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrows.xml b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrows.xml
index fde172a..9fa8ec0 100644
--- a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrows.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_arrows.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="333"
+ android:duration="133"
android:propertyName="scaleX"
android:valueFrom="0.9"
android:valueTo="0.9"
@@ -33,7 +33,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="333"
+ android:duration="133"
android:propertyName="scaleY"
android:valueFrom="0.9"
android:valueTo="0.9"
@@ -45,19 +45,10 @@
android:valueTo="1"
android:interpolator="@android:interpolator/linear" />
</set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="rotation"
- android:valueFrom="-221"
- android:valueTo="-221"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="617"
- android:propertyName="rotation"
- android:valueFrom="-221"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="617"
+ android:propertyName="rotation"
+ android:valueFrom="-221"
+ android:valueTo="0"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device.xml b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device.xml
index accf16d..3208eee 100644
--- a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="rotation"
android:valueFrom="-135"
android:valueTo="-135"
diff --git a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device_1.xml b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device_1.xml
index 15c6705..c1124af 100644
--- a/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device_1.xml
+++ b/packages/SystemUI/res/anim/ic_portrait_to_auto_rotate_animation_device_1.xml
@@ -18,7 +18,7 @@
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="250"
+ android:duration="50"
android:propertyName="pathData"
android:valueFrom="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z"
android:valueTo="M -3.34053039551,-22.9980926514 c -1.3207244873,-1.3207244873 -3.46876525879,-1.26383972168 -4.74829101563,0.125762939453 c 0.0,0.0 -14.8512420654,14.7411804199 -14.8512420654,14.7411804199 c -1.39259338379,1.392578125 -1.44947814941,3.54061889648 -0.125762939453,4.74827575684 c 0.0,0.0 26.4143981934,26.4144134521 26.4143981934,26.4144134521 c 1.3207244873,1.3207244873 3.46876525879,1.26382446289 4.74829101562,-0.125762939453 c 0.0,0.0 14.7381896973,-14.7381896973 14.7381896973,-14.7381896973 c 1.392578125,-1.39259338379 1.44947814941,-3.54061889648 0.125762939453,-4.74829101562 c 0.0,0.0 -26.3013458252,-26.417388916 -26.3013458252,-26.417388916 Z M 2.87156677246,16.9857940674 c 0.0,0.0 -19.7573547363,-19.7573699951 -19.7573547363,-19.7573699951 c 0.0,0.0 14.0142059326,-14.2142181396 14.0142059326,-14.2142181396 c 0.0,0.0 19.7573699951,19.7573699951 19.7573699951,19.7573699951 c 0.0,0.0 -14.0142211914,14.2142181396 -14.0142211914,14.2142181396 Z"
diff --git a/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_cross_1.xml
index 553da1a..39e4aec 100644
--- a/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_cross_1.xml
@@ -15,36 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_airplane_disable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
+ android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_airplane_disable_cross_1_pathdata_interpolator" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_mask.xml
index 605ef90..7f77372 100644
--- a/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_airplane_disable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_cross_1.xml
index 87cbaec..1b73cc0 100644
--- a/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_cross_1.xml
@@ -15,27 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
+ android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_airplane_enable_cross_1_pathdata_interpolator" />
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 "
- android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_airplane_enable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="533"
+ android:duration="333"
android:propertyName="strokeAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_mask.xml
index 56e0d1c..c45426c 100644
--- a/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_airplane_enable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_airplane_enable_mask_pathdata_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_airplane_enable_mask_pathdata_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_cross_1.xml
index aff3567..b9b19f5 100644
--- a/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_cross_1.xml
@@ -15,36 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
- android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
- android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
+ android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_mask.xml
index 31583f2..321a965 100644
--- a/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_flashlight_disable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_cross_1.xml
index c923015..011a96f 100644
--- a/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_cross_1.xml
@@ -15,27 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
+ android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_flashlight_enable_cross_1_pathdata_interpolator" />
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
- android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 8.34049987793,5.6930847168 c 0.0,0.0 29.7749786377,29.7999725342 29.7749786377,29.7999725342 "
- android:valueTo="M 8.34049987793,5.6930847168 c 0.0,0.0 0.274993896484,0.29997253418 0.274993896484,0.29997253418 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_flashlight_enable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="533"
+ android:duration="333"
android:propertyName="strokeAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_mask.xml
index 650d89f..14bab3a 100644
--- a/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_flashlight_enable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_flashlight_enable_mask_pathdata_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 37.8337860107,-39.2975769043 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 37.8337860107,-39.2849731445 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_flashlight_enable_mask_pathdata_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_location_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_location_disable_animation_cross_1.xml
index 73283a8..0c57530 100644
--- a/packages/SystemUI/res/anim/ic_signal_location_disable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_location_disable_animation_cross_1.xml
@@ -15,36 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
- android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
- android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
+ android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+ <objectAnimator
+ android:duration="17"
+ android:propertyName="strokeAlpha"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:interpolator/linear" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_location_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_location_disable_animation_mask.xml
index 7ef7b5b..501d68b 100644
--- a/packages/SystemUI/res/anim/ic_signal_location_disable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_location_disable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
</set>
diff --git a/packages/SystemUI/res/anim/ic_signal_location_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_location_enable_animation_cross_1.xml
index f4fc20e..1b5445d 100644
--- a/packages/SystemUI/res/anim/ic_signal_location_enable_animation_cross_1.xml
+++ b/packages/SystemUI/res/anim/ic_signal_location_enable_animation_cross_1.xml
@@ -15,27 +15,17 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
+ android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_location_enable_cross_1_pathdata_interpolator" />
<set
android:ordering="sequentially" >
<objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
- android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 6.44050598145,1.9430847168 c 0.0,0.0 33.5749816895,33.4499664307 33.5749816895,33.4499664307 "
- android:valueTo="M 6.44050598145,1.9430847168 c 0.0,0.0 0.374984741211,0.399978637695 0.374984741211,0.399978637695 "
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_location_enable_cross_1_pathdata_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="533"
+ android:duration="333"
android:propertyName="strokeAlpha"
android:valueFrom="1"
android:valueTo="1"
diff --git a/packages/SystemUI/res/anim/ic_signal_location_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_location_enable_animation_mask.xml
index b825eb9..9ca12da 100644
--- a/packages/SystemUI/res/anim/ic_signal_location_enable_animation_mask.xml
+++ b/packages/SystemUI/res/anim/ic_signal_location_enable_animation_mask.xml
@@ -15,21 +15,11 @@
limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="200"
- android:propertyName="pathData"
- android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="350"
- android:propertyName="pathData"
- android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueTo="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_signal_location_enable_mask_pathdata_interpolator" />
- </set>
+ <objectAnimator
+ android:duration="350"
+ android:propertyName="pathData"
+ android:valueFrom="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueTo="M 38.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 7.3759765625,7.55284118652 7.3759765625,7.55284118652 c 0.0,0.0 -2.61698913574,2.0938873291 -2.61698913574,2.0938873291 c 0.0,0.0 -7.57595825195,-7.56428527832 -7.57595825195,-7.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/ic_signal_location_enable_mask_pathdata_interpolator" />
</set>
diff --git a/packages/SystemUI/res/anim/recents_launch_next_affiliated_task_bounce.xml b/packages/SystemUI/res/anim/recents_launch_next_affiliated_task_bounce.xml
index a571cbc..74f2814 100644
--- a/packages/SystemUI/res/anim/recents_launch_next_affiliated_task_bounce.xml
+++ b/packages/SystemUI/res/anim/recents_launch_next_affiliated_task_bounce.xml
@@ -20,40 +20,30 @@
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal">
- <alpha android:fromAlpha="1.0" android:toAlpha="0.6"
- android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/accelerate_cubic"
- android:duration="133"/>
- <translate android:fromYDelta="0" android:toYDelta="10%"
+ <translate android:fromYDelta="0" android:toYDelta="2%"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/accelerate_cubic"
- android:duration="350"/>
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:duration="133"/>
- <scale android:fromXScale="1.0" android:toXScale="0.9"
- android:fromYScale="1.0" android:toYScale="0.9"
+ <scale android:fromXScale="1.0" android:toXScale="0.98"
+ android:fromYScale="1.0" android:toYScale="0.98"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
android:pivotX="50%p" android:pivotY="50%p"
android:interpolator="@android:interpolator/fast_out_slow_in"
- android:duration="350" />
+ android:duration="133" />
- <alpha android:fromAlpha="1.0" android:toAlpha="1.6666666666"
- android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@android:interpolator/decelerate_cubic"
- android:startOffset="350"
- android:duration="133"/>
-
- <translate android:fromYDelta="0%" android:toYDelta="-8.8888888888%"
- android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@android:interpolator/decelerate_cubic"
- android:startOffset="350"
- android:duration="350"/>
+ <translate android:fromYDelta="0" android:toYDelta="-2%"
+ android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
+ android:interpolator="@interpolator/recents_launch_prev_affiliated_task_bounce_ydelta"
+ android:startOffset="133"
+ android:duration="217"/>
- <scale android:fromXScale="1.0" android:toXScale="1.1111111111"
- android:fromYScale="1.0" android:toYScale="1.1111111111"
+ <scale android:fromXScale="1.0" android:toXScale="1.02040816326531"
+ android:fromYScale="1.0" android:toYScale="1.02040816326531"
android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
android:pivotX="50%p" android:pivotY="50%p"
- android:interpolator="@android:interpolator/decelerate_cubic"
- android:startOffset="350"
- android:duration="350" />
+ android:interpolator="@interpolator/recents_launch_next_affiliated_task_bounce_scale"
+ android:startOffset="133"
+ android:duration="217" />
</set> \ No newline at end of file
diff --git a/packages/SystemUI/res/anim/recents_launch_prev_affiliated_task_bounce.xml b/packages/SystemUI/res/anim/recents_launch_prev_affiliated_task_bounce.xml
index 46045ac..b19167d 100644
--- a/packages/SystemUI/res/anim/recents_launch_prev_affiliated_task_bounce.xml
+++ b/packages/SystemUI/res/anim/recents_launch_prev_affiliated_task_bounce.xml
@@ -22,12 +22,12 @@
<translate android:fromYDelta="0%" android:toYDelta="10%"
android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true"
- android:interpolator="@android:interpolator/decelerate_quint"
- android:duration="300" />
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:duration="133" />
- <translate android:fromYDelta="10%" android:toYDelta="0%"
+ <translate android:fromYDelta="0%" android:toYDelta="-10%"
android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
- android:interpolator="@android:interpolator/accelerate_quint"
- android:startOffset="300"
- android:duration="300" />
+ android:interpolator="@interpolator/recents_launch_prev_affiliated_task_bounce_ydelta"
+ android:startOffset="133"
+ android:duration="217" />
</set> \ No newline at end of file
diff --git a/packages/SystemUI/res/color/segmented_button_text_selector.xml b/packages/SystemUI/res/color/segmented_button_text_selector.xml
index 13c6169..909a6dd 100644
--- a/packages/SystemUI/res/color/segmented_button_text_selector.xml
+++ b/packages/SystemUI/res/color/segmented_button_text_selector.xml
@@ -17,7 +17,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_selected="true" android:color="@android:color/white"/>
- <item android:color="@color/segmented_button_text_inactive"/>
+ <item android:state_selected="true" android:color="@color/segmented_button_selected"/>
+ <item android:color="@color/segmented_button_unselected"/>
</selector> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/btn_borderless_rect.xml b/packages/SystemUI/res/drawable/btn_borderless_rect.xml
index 52dd402..d640141 100644
--- a/packages/SystemUI/res/drawable/btn_borderless_rect.xml
+++ b/packages/SystemUI/res/drawable/btn_borderless_rect.xml
@@ -16,6 +16,10 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight">
- <item android:id="@android:id/mask"
- android:drawable="@android:color/white" />
+ <item android:id="@android:id/mask">
+ <shape>
+ <corners android:radius="@dimen/borderless_button_radius" />
+ <solid android:color="@android:color/white" />
+ </shape>
+ </item>
</ripple> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm.xml b/packages/SystemUI/res/drawable/ic_audio_alarm.xml
index 5dd158e..91010a3 100644
--- a/packages/SystemUI/res/drawable/ic_audio_alarm.xml
+++ b/packages/SystemUI/res/drawable/ic_audio_alarm.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
+ android:width="28.0dp"
+ android:height="28.0dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
<path
diff --git a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml b/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml
index af445e3..dd124d7 100644
--- a/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_audio_alarm_mute.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
+ android:width="28.0dp"
+ android:height="28.0dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
<path
diff --git a/packages/SystemUI/res/drawable/ic_audio_bt.xml b/packages/SystemUI/res/drawable/ic_audio_bt.xml
new file mode 100644
index 0000000..c0da519
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_audio_bt.xml
@@ -0,0 +1,25 @@
+<!--
+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="28dp"
+ android:height="28dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml b/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml
new file mode 100644
index 0000000..718eee5
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_audio_bt_mute.xml
@@ -0,0 +1,25 @@
+<!--
+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="28dp"
+ android:height="28dp"
+ android:viewportWidth="48.0"
+ android:viewportHeight="48.0">
+
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M26.0,11.8l3.8,3.8l-3.2,3.2l2.8,2.8l6.0,-6.0L24.0,4.2l-2.0,0.0l0.0,10.1l4.0,4.0L26.0,11.8zM10.8,8.2L8.0,11.0l13.2,13.2L10.0,35.3l2.8,2.8L22.0,29.0l0.0,15.2l2.0,0.0l8.6,-8.6l4.6,4.6l2.8,-2.8L10.8,8.2zM26.0,36.5L26.0,29.0l3.8,3.8L26.0,36.5z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_audio_phone.xml b/packages/SystemUI/res/drawable/ic_audio_phone.xml
new file mode 100644
index 0000000..64147f2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_audio_phone.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.
+ */
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@*android:drawable/ic_audio_phone_am_alpha"
+ android:autoMirrored="true"
+ android:tint="#ffffffff" /> \ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_audio_vol.xml b/packages/SystemUI/res/drawable/ic_audio_vol.xml
index 76c14b1..587ea89 100644
--- a/packages/SystemUI/res/drawable/ic_audio_vol.xml
+++ b/packages/SystemUI/res/drawable/ic_audio_vol.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
+ android:width="28.0dp"
+ android:height="28.0dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
<path
diff --git a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml b/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml
index e158f7b..8a7c7ec 100644
--- a/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_audio_vol_mute.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32.0dp"
- android:height="32.0dp"
+ android:width="28.0dp"
+ android:height="28.0dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
<path
diff --git a/packages/SystemUI/res/drawable/ic_hotspot_disable.xml b/packages/SystemUI/res/drawable/ic_hotspot_disable.xml
new file mode 100644
index 0000000..8249609
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_hotspot_disable.xml
@@ -0,0 +1,62 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="root"
+ android:alpha="1.0"
+ android:height="48dp"
+ android:width="48dp"
+ android:viewportHeight="48"
+ android:viewportWidth="48" >
+ <group
+ android:name="ic_hotspot"
+ android:translateX="23.9778"
+ android:translateY="24.26443" >
+ <group
+ android:name="ic_hotspot_pivot"
+ android:translateX="-23.21545"
+ android:translateY="-18.86649" >
+ <clip-path
+ android:name="mask"
+ android:pathData="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 6.97125244141,7.33258056641 6.97125244141,7.33258056641 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -6.77128601074,-6.82850646973 -6.77128601074,-6.82850646973 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 0.659332275391,0.664688110352 0.659332275391,0.664688110351 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 29.0108337402,34.4080963135 29.0108337402,34.4080963135 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" />
+ <group
+ android:name="cross" >
+ <path
+ android:name="cross_1"
+ android:pathData="M 4.44044494629,2.24310302734 c 0.0,0.0 0.0875396728516,0.112457275391 0.0875396728516,0.112457275391 "
+ android:strokeColor="#FFFFFFFF"
+ android:strokeAlpha="0"
+ android:strokeWidth="3.5"
+ android:fillColor="#00000000" />
+ </group>
+ <group
+ android:name="hotspot"
+ android:translateX="23.481"
+ android:translateY="18.71151" >
+ <group
+ android:name="circles"
+ android:translateX="-0.23909"
+ android:translateY="-0.10807" >
+ <path
+ android:name="path_3"
+ android:pathData="M -0.0042724609375,-2.64895629883 c -2.20922851562,0.0 -4.0,1.791015625 -4.0,4.0 c 0.0,2.20922851562 1.79077148438,4.0 4.0,4.0 c 2.208984375,0.0 4.0,-1.79077148438 4.0,-4.0 c 0.0,-2.208984375 -1.791015625,-4.0 -4.0,-4.0 Z M 11.9957275391,1.35104370117 c 0.0,-6.626953125 -5.373046875,-12.0 -12.0,-12.0 c -6.62719726562,0.0 -12.0,5.373046875 -12.0,12.0 c 0.0,4.43603515625 2.41381835938,8.30004882812 5.99194335938,10.3771972656 c 0.0,0.0 2.01586914062,-3.48217773438 2.01586914062,-3.48217773438 c -2.38500976562,-1.38500976562 -4.0078125,-3.93798828125 -4.0078125,-6.89501953125 c 0.0,-4.41796875 3.58178710938,-8.0 8.0,-8.0 c 4.41796875,0.0 8.0,3.58203125 8.0,8.0 c 0.0,2.95703125 -1.623046875,5.51000976562 -4.00805664062,6.89501953125 c 0.0,0.0 2.01586914062,3.48217773438 2.01586914062,3.48217773438 c 3.578125,-2.0771484375 5.9921875,-5.94116210938 5.9921875,-10.3771972656 Z M -0.0042724609375,-18.6489562988 c -11.0451660156,0.0 -20.0,8.9541015625 -20.0,20.0 c 0.0,7.39306640625 4.02099609375,13.8330078125 9.98779296875,17.2951660156 c 0.0,0.0 2.00219726562,-3.458984375 2.00219726562,-3.458984375 c -4.77319335938,-2.77001953125 -7.98999023438,-7.92211914062 -7.98999023438,-13.8361816406 c 0.0,-8.8369140625 7.16381835938,-16.0 16.0,-16.0 c 8.83595275879,0.0 16.0000152588,7.1630859375 16.0000152588,16.0 c 0.0,5.9140625 -3.21704101562,11.0661621094 -7.990234375,13.8361816406 c 0.0,0.0 2.00219726562,3.458984375 2.00219726563,3.458984375 c 5.966796875,-3.46215820312 9.98803710937,-9.90209960938 9.98803710938,-17.2951660156 c 0.0,-11.0458984375 -8.955078125,-20.0 -20.0000152588,-20.0 Z"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="1" />
+ </group>
+ </group>
+ </group>
+ </group>
+</vector>
diff --git a/tests/VectorDrawableTest/res/drawable/ic_open_animation.xml b/packages/SystemUI/res/drawable/ic_hotspot_disable_animation.xml
index 83ee90b..694c23f 100644
--- a/tests/VectorDrawableTest/res/drawable/ic_open_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_hotspot_disable_animation.xml
@@ -1,4 +1,6 @@
-<!-- Copyright (C) 2014 The Android Open Source Project
+<?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.
@@ -13,17 +15,14 @@
limitations under the License.
-->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:drawable="@drawable/ic_open" >
+ android:drawable="@drawable/ic_hotspot_disable" >
<target
- android:name="ball_start"
- android:animation="@anim/ic_open_animation_ball_start" />
+ android:name="root"
+ android:animation="@anim/ic_hotspot_disable_animation_root" />
<target
- android:name="path_1"
- android:animation="@anim/ic_open_animation_path_1" />
+ android:name="mask"
+ android:animation="@anim/ic_hotspot_disable_animation_mask" />
<target
- android:name="ball_swoop"
- android:animation="@anim/ic_open_animation_ball_swoop" />
- <target
- android:name="path_1_1"
- android:animation="@anim/ic_open_animation_path_1_1" />
+ android:name="cross_1"
+ android:animation="@anim/ic_hotspot_disable_animation_cross_1" />
</animated-vector>
diff --git a/packages/SystemUI/res/drawable/ic_hotspot_enable.xml b/packages/SystemUI/res/drawable/ic_hotspot_enable.xml
new file mode 100644
index 0000000..5043bdf
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_hotspot_enable.xml
@@ -0,0 +1,62 @@
+<?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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="root"
+ android:alpha="0.3"
+ android:height="48dp"
+ android:width="48dp"
+ android:viewportHeight="48"
+ android:viewportWidth="48" >
+ <group
+ android:name="ic_hotspot"
+ android:translateX="23.97354"
+ android:translateY="24.26306" >
+ <group
+ android:name="ic_hotspot_pivot"
+ android:translateX="-23.21545"
+ android:translateY="-18.86649" >
+ <clip-path
+ android:name="mask"
+ android:pathData="M 38.8337860107,-40.3974914551 c 0.0,0.0 -38.4077911377,30.8523712158 -38.4077911377,30.8523712158 c 0.0,0.0 43.1884765625,43.515335083 43.1884765625,43.515335083 c 0.0,0.0 -2.4169921875,2.57838439941 -2.4169921875,2.57838439941 c 0.0,0.0 -42.9885101318,-43.0112609863 -42.9885101318,-43.0112609863 c 0.0,0.0 -32.6199798584,25.1699066162 -32.6199798584,25.1699066162 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 27.6589050293,-22.6579437256 27.6589050293,-22.6579437256 c 0.0,0.0 -30.8645172119,-34.00390625 -30.8645172119,-34.00390625 c 0.0,0.0 2.70756530762,-1.99278259277 2.70756530762,-1.99278259277 c 0.0,0.0 1.53030395508,-0.876571655273 1.53030395508,-0.876571655274 c 0.0,0.0 2.85780334473,-3.12069702148 2.85780334473,-3.12069702148 c 0.0,0.0 13.0984039307,13.025604248 13.0984039307,13.025604248 c 0.0,0.0 -3.13299560547,2.82977294922 -3.13299560547,2.82977294922 c 0.0,0.0 16.571762085,22.0471801758 16.571762085,22.0471801758 c 0.0,0.0 42.8175811768,-34.3554534912 42.8175811768,-34.3554534912 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" />
+ <group
+ android:name="cross" >
+ <path
+ android:name="cross_1"
+ android:pathData="M 4.44044494629,2.24310302734 c 0.0,0.0 35.4000396729,35.3999633789 35.4000396729,35.3999633789 "
+ android:strokeColor="#FFFFFFFF"
+ android:strokeAlpha="1"
+ android:strokeWidth="3.5"
+ android:fillColor="#00000000" />
+ </group>
+ <group
+ android:name="hotspot"
+ android:translateX="23.481"
+ android:translateY="18.71151" >
+ <group
+ android:name="circles"
+ android:translateX="-0.23909"
+ android:translateY="-0.10807" >
+ <path
+ android:name="circle_3"
+ android:pathData="M 0.0843505859375,-2.93901062012 c -2.30102539062,0.0 -4.16702270508,1.86602783203 -4.16702270508,4.16702270508 c 0.0,2.29898071289 1.86599731445,4.16598510742 4.16702270508,4.16598510742 c 2.29998779297,0.0 4.16598510742,-1.86700439453 4.16598510742,-4.16598510742 c 0.0,-2.30099487305 -1.86599731445,-4.16702270508 -4.16598510742,-4.16702270508 Z M 11.1185302734,5.83390808105 c 0.0,0.0 0.0009765625,0.00100708007812 0.0009765625,0.00100708007812 c 0.14501953125,-0.356994628906 0.27099609375,-0.725006103516 0.382995605469,-1.09799194336 c 0.0570068359375,-0.195007324219 0.101013183594,-0.394989013672 0.149017333984,-0.595001220703 c 0.0690002441406,-0.281005859375 0.126983642578,-0.563995361328 0.175994873047,-0.851989746094 c 0.0270080566406,-0.169006347656 0.0559997558594,-0.337005615234 0.0759887695313,-0.509002685547 c 0.0580139160156,-0.468017578125 0.0970153808594,-0.942993164062 0.0970153808593,-1.4280090332 c 0.0,0.0 0.0,-0.00100708007812 0.0,-0.00100708007812 c 0.0,-5.03900146484 -3.11099243164,-9.3450012207 -7.5119934082,-11.1229858398 c -0.00601196289062,-0.00299072265625 -0.0130004882812,-0.0050048828125 -0.0190124511719,-0.00701904296875 c -0.686004638672,-0.275970458984 -1.39999389648,-0.492980957031 -2.14099121094,-0.638977050781 c -0.072998046875,-0.0150146484375 -0.149017333984,-0.02099609375 -0.222991943359,-0.0339965820313 c -0.302001953125,-0.0540161132812 -0.605010986328,-0.106018066406 -0.916015625,-0.136016845703 c -0.389984130859,-0.0390014648438 -0.786987304688,-0.0599975585938 -1.18899536133,-0.0599975585937 c -0.402008056641,0.0 -0.799011230469,0.02099609375 -1.19000244141,0.0599975585937 c -0.304992675781,0.0299987792969 -0.602996826172,0.0809936523438 -0.901000976563,0.132995605469 c -0.0790100097656,0.0150146484375 -0.160003662109,0.02099609375 -0.238006591797,0.0370178222656 c -0.368988037109,0.0719909667969 -0.730987548828,0.164001464844 -1.08700561523,0.269989013672 c -0.00299072265625,0.00100708007812 -0.0059814453125,0.00201416015625 -0.00900268554687,0.0020141601562 c -0.351989746094,0.10498046875 -0.694000244141,0.226989746094 -1.0309753418,0.361999511719 c -0.0110168457031,0.00399780273438 -0.0220031738281,0.00698852539062 -0.0320129394531,0.0119934082031 c -4.40200805664,1.77798461914 -7.51098632812,6.083984375 -7.5119934082,11.1229858398 c 0.0,0.00799560546875 0.00198364257812,0.0160217285156 0.0019836425781,0.0240173339844 c 0.00100708007812,0.475006103516 0.0380249023438,0.940002441406 0.0950012207032,1.39898681641 c 0.02001953125,0.175994873047 0.0490112304688,0.348999023438 0.0780029296875,0.523010253906 c 0.0469970703125,0.281982421875 0.105010986328,0.557983398438 0.171997070312,0.833984375 c 0.0480041503906,0.204010009766 0.093017578125,0.410003662109 0.152008056641,0.610015869141 c 0.110992431641,0.372009277344 0.238006591797,0.736999511719 0.382019042969,1.09298706055 c 0.0,0.0 0.0009765625,0.0 0.0009765625,0.0 c 1.00701904297,2.48400878906 2.81301879883,4.56100463867 5.11001586914,5.89501953125 c 0.0,0.0 2.01599121094,-3.48300170898 2.01599121094,-3.48300170898 c -2.03900146484,-1.18402099609 -3.5119934082,-3.22500610352 -3.89898681641,-5.63900756836 c 0.0,0.0 0.0009765625,-0.00100708007812 0.0009765625,-0.00100708007812 c -0.0220031738281,-0.130981445312 -0.0369873046875,-0.265991210938 -0.052978515625,-0.399993896484 c -0.0290222167969,-0.274993896484 -0.0570068359375,-0.552001953125 -0.0570068359375,-0.834991455078 c 0.0,0.0 0.0,-0.0190124511719 0.0,-0.0190124511719 c 0.0,-3.98999023438 2.92498779297,-7.28900146484 6.74398803711,-7.89199829102 c 0.0,0.0 0.0180053710938,0.0169982910156 0.0180053710938,0.0169982910156 c 0.404998779297,-0.0639953613281 0.81298828125,-0.125 1.23599243164,-0.125 c 0.0,0.0 0.00201416015625,0.0 0.00201416015624,0.0 c 0.0,0.0 0.00299072265625,0.0 0.00299072265626,0.0 c 0.423004150391,0.0 0.830017089844,0.0610046386719 1.23501586914,0.125 c 0.0,0.0 0.0169982910156,-0.0180053710938 0.0169982910156,-0.0180053710938 c 3.81997680664,0.60400390625 6.74499511719,3.90301513672 6.74499511719,7.89199829102 c 0.0,0.292999267578 -0.0280151367188,0.578002929688 -0.0589904785156,0.861999511719 c -0.0150146484375,0.132019042969 -0.0290222167969,0.264007568359 -0.051025390625,0.393005371094 c -0.385986328125,2.41500854492 -1.85897827148,4.45599365234 -3.89797973633,5.64001464844 c 0.0,0.0 2.01599121094,3.48300170898 2.01599121094,3.48300170898 c 2.29699707031,-1.33401489258 4.10299682617,-3.41101074219 5.11001586914,-5.89602661133 Z M 19.9300231934,2.95698547363 c 0.0059814453125,-0.0659790039062 0.0159912109375,-0.130981445312 0.02099609375,-0.196990966797 c 0.031982421875,-0.462005615234 0.0479736328125,-0.928009033203 0.0489807128906,-1.39700317383 c 0,0.0 0,-0.00997924804688 0,-0.00997924804687 c 0,0.0 0,-0.00100708007812 0,-0.00100708007813 c 0,-7.22500610352 -3.84399414062,-13.5360107422 -9.58599853516,-17.0500183105 c -1.06500244141,-0.652984619141 -2.19299316406,-1.20599365234 -3.37799072266,-1.65197753906 c -0.157989501953,-0.0599975585938 -0.317016601562,-0.118011474609 -0.476989746094,-0.174011230469 c -0.317016601562,-0.110992431641 -0.634002685547,-0.218994140625 -0.9580078125,-0.31298828125 c -0.470001220703,-0.139007568359 -0.944000244141,-0.264007568359 -1.4280090332,-0.368011474609 c -0.186004638672,-0.0390014648438 -0.376983642578,-0.0669860839844 -0.565002441406,-0.101013183594 c -0.414001464844,-0.0759887695312 -0.832000732422,-0.140991210938 -1.25500488281,-0.190979003906 c -0.184997558594,-0.0220031738281 -0.369995117188,-0.0429992675781 -0.556976318359,-0.0599975585937 c -0.592010498047,-0.0530090332031 -1.18801879883,-0.0899963378906 -1.79602050781,-0.0899963378907 c -0.605987548828,0.0 -1.20300292969,0.0369873046875 -1.79598999023,0.0899963378907 c -0.186004638672,0.0169982910156 -0.371002197266,0.0379943847656 -0.555999755859,0.0599975585937 c -0.423004150391,0.0499877929688 -0.842010498047,0.114990234375 -1.25601196289,0.190979003906 c -0.18798828125,0.0350036621094 -0.377990722656,0.06201171875 -0.563995361328,0.101013183594 c -0.483001708984,0.10400390625 -0.959991455078,0.22900390625 -1.42999267578,0.368011474609 c -0.321990966797,0.093994140625 -0.638000488281,0.201995849609 -0.953002929688,0.311981201172 c -0.162994384766,0.0570068359375 -0.324005126953,0.115997314453 -0.484985351562,0.177001953125 c -1.18099975586,0.445007324219 -2.30599975586,0.997009277344 -3.36801147461,1.64700317383 c -0.00201416015625,0.00100708007812 -0.00399780273438,0.00201416015625 -0.0060119628907,0.0029907226562 c -5.74099731445,3.51400756836 -9.58499145508,9.82501220703 -9.58599853516,17.0500183105 c 0,0.0 0,0.00100708007812 0,0.00100708007813 c 0,0.0059814453125 0.00100708007812,0.0130004882812 0.0010070800781,0.0199890136719 c 0.0,0.466003417969 0.0169982910156,0.928009033203 0.0490112304688,1.38598632812 c 0.0050048828125,0.0690002441406 0.0159912109375,0.136016845703 0.02099609375,0.206024169922 c 0.031982421875,0.401000976562 0.0719909667969,0.799987792969 0.127990722656,1.19400024414 c 0.00201416015625,0.0189819335938 0.00701904296875,0.0369873046875 0.010009765625,0.0569763183594 c 0.888000488281,6.17202758789 4.59799194336,11.4250183105 9.7799987793,14.4309997559 c 0.0,0.0 2.00198364258,-3.458984375 2.00198364258,-3.458984375 c -2.58599853516,-1.5 -4.708984375,-3.70401000977 -6.11697387695,-6.34399414063 c 0.0,0.0 0.0169982910156,-0.0180053710938 0.0169982910156,-0.0180053710938 c -0.890014648438,-1.67098999023 -1.50601196289,-3.5110168457 -1.76000976562,-5.46499633789 c -0.00698852539062,-0.0500183105469 -0.010009765625,-0.102020263672 -0.0159912109375,-0.152008056641 c -0.0330200195312,-0.273010253906 -0.0610046386719,-0.545989990234 -0.0800170898437,-0.821990966797 c -0.0220031738281,-0.343017578125 -0.0350036621094,-0.68701171875 -0.0350036621094,-1.03500366211 c 0,-6.53701782227 3.92599487305,-12.1480102539 9.54299926758,-14.6310119629 c 0.157012939453,-0.0700073242188 0.313995361328,-0.135986328125 0.472015380859,-0.199981689453 c 0.373992919922,-0.151000976562 0.751983642578,-0.294006347656 1.13900756836,-0.417022705078 c 0.108978271484,-0.0350036621094 0.221984863281,-0.0619812011719 0.332000732422,-0.0950012207031 c 0.349975585938,-0.102996826172 0.705993652344,-0.194976806641 1.06597900391,-0.273986816406 c 0.114013671875,-0.0249938964844 0.227996826172,-0.052001953125 0.342010498047,-0.0750122070313 c 0.440002441406,-0.0869750976562 0.885986328125,-0.154998779297 1.33700561523,-0.203979492188 c 0.10400390625,-0.0120239257812 0.209991455078,-0.02001953125 0.315002441406,-0.0299987792969 c 0.47998046875,-0.0429992675781 0.963989257812,-0.072998046875 1.45397949219,-0.072998046875 c 0.492004394531,0.0 0.975006103516,0.0299987792969 1.45401000977,0.072998046875 c 0.105987548828,0.00997924804688 0.212005615234,0.0179748535156 0.316986083984,0.0299987792969 c 0.450012207031,0.0489807128906 0.89501953125,0.117004394531 1.33502197266,0.203002929688 c 0.115997314453,0.0239868164062 0.22998046875,0.0509948730469 0.345001220703,0.0769958496094 c 0.358001708984,0.0780029296875 0.710998535156,0.169982910156 1.06097412109,0.272003173828 c 0.111022949219,0.0329895019531 0.226013183594,0.0609741210938 0.336029052734,0.0969848632813 c 0.385986328125,0.123016357422 0.761993408203,0.265014648438 1.13497924805,0.415008544922 c 0.160003662109,0.0650024414062 0.319000244141,0.131988525391 0.477020263672,0.201995849609 c 5.61599731445,2.48400878906 9.53997802734,8.09399414062 9.53997802734,14.6310119629 c 0,0.346984863281 -0.0130004882812,0.690979003906 -0.0350036621094,1.03399658203 c -0.0179748535156,0.274993896484 -0.0469970703125,0.548004150391 -0.0789794921875,0.819000244141 c -0.00601196289062,0.052001953125 -0.010009765625,0.10498046875 -0.0160217285156,0.154998779297 c -0.252990722656,1.95498657227 -0.871002197266,3.79400634766 -1.75997924805,5.46499633789 c 0.0,0.0 0.0169982910156,0.0180053710938 0.0169982910156,0.0180053710938 c -1.40802001953,2.63998413086 -3.53100585938,4.84399414062 -6.11700439453,6.34399414063 c 0.0,0.0 2.00198364258,3.458984375 2.00198364258,3.458984375 c 5.18402099609,-3.00698852539 8.89501953125,-8.26300048828 9.78100585938,-14.4379882813 c 0.00201416015625,-0.0169982910156 0.00601196289062,-0.0320129394531 0.0079956054688,-0.0490112304688 c 0.0570068359375,-0.39697265625 0.0970153808594,-0.798980712891 0.129028320312,-1.20300292969 Z"
+ android:fillColor="#FFFFFFFF"
+ android:fillAlpha="1" />
+ </group>
+ </group>
+ </group>
+ </group>
+</vector>
diff --git a/packages/SystemUI/res/drawable/zen_toast_background.xml b/packages/SystemUI/res/drawable/ic_hotspot_enable_animation.xml
index 619fe20..c5187dd 100644
--- a/packages/SystemUI/res/drawable/zen_toast_background.xml
+++ b/packages/SystemUI/res/drawable/ic_hotspot_enable_animation.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!--
+ 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.
@@ -13,7 +14,15 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/system_primary_color" />
- <corners android:radius="@dimen/notification_material_rounded_rect_radius" />
-</shape>
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/ic_hotspot_enable" >
+ <target
+ android:name="root"
+ android:animation="@anim/ic_hotspot_enable_animation_root" />
+ <target
+ android:name="mask"
+ android:animation="@anim/ic_hotspot_enable_animation_mask" />
+ <target
+ android:name="cross_1"
+ android:animation="@anim/ic_hotspot_enable_animation_cross_1" />
+</animated-vector>
diff --git a/packages/SystemUI/res/drawable/ic_invert_colors_disable_animation.xml b/packages/SystemUI/res/drawable/ic_invert_colors_disable_animation.xml
index 2e26d42..476c00d 100644
--- a/packages/SystemUI/res/drawable/ic_invert_colors_disable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_invert_colors_disable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_invert_colors_disable_animation_root" />
<target
- android:name="icon"
- android:animation="@anim/ic_invert_colors_disable_animation_icon" />
- <target
android:name="mask"
android:animation="@anim/ic_invert_colors_disable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_invert_colors_enable.xml b/packages/SystemUI/res/drawable/ic_invert_colors_enable.xml
index 730ecc4..994cf8c 100644
--- a/packages/SystemUI/res/drawable/ic_invert_colors_enable.xml
+++ b/packages/SystemUI/res/drawable/ic_invert_colors_enable.xml
@@ -24,8 +24,7 @@
<group
android:name="icon"
android:translateX="21.9995"
- android:translateY="25.73401"
- android:alpha="0.54" >
+ android:translateY="25.73401" >
<group
android:name="icon_pivot"
android:translateX="-23.21545"
diff --git a/packages/SystemUI/res/drawable/ic_invert_colors_enable_animation.xml b/packages/SystemUI/res/drawable/ic_invert_colors_enable_animation.xml
index a709efb..879066c 100644
--- a/packages/SystemUI/res/drawable/ic_invert_colors_enable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_invert_colors_enable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_invert_colors_enable_animation_root" />
<target
- android:name="icon"
- android:animation="@anim/ic_invert_colors_enable_animation_icon" />
- <target
android:name="mask"
android:animation="@anim/ic_invert_colors_enable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_portrait_from_auto_rotate.xml b/packages/SystemUI/res/drawable/ic_portrait_from_auto_rotate.xml
index 1805a8e..0ac6795 100644
--- a/packages/SystemUI/res/drawable/ic_portrait_from_auto_rotate.xml
+++ b/packages/SystemUI/res/drawable/ic_portrait_from_auto_rotate.xml
@@ -20,11 +20,11 @@
android:viewportHeight="48"
android:viewportWidth="48" >
<group
- android:name="ic_screen_rotation_48px_outlines"
+ android:name="icon"
android:translateX="24"
android:translateY="24" >
<group
- android:name="ic_screen_rotation_48px_outlines_pivot"
+ android:name="icon_pivot"
android:translateX="-24.15"
android:translateY="-24.25" >
<group
diff --git a/packages/SystemUI/res/drawable/ic_portrait_to_auto_rotate.xml b/packages/SystemUI/res/drawable/ic_portrait_to_auto_rotate.xml
index feb3025..0cca6e3 100644
--- a/packages/SystemUI/res/drawable/ic_portrait_to_auto_rotate.xml
+++ b/packages/SystemUI/res/drawable/ic_portrait_to_auto_rotate.xml
@@ -20,11 +20,11 @@
android:viewportHeight="48"
android:viewportWidth="48" >
<group
- android:name="ic_screen_rotation_48px_outlines"
+ android:name="icon"
android:translateX="24"
android:translateY="24" >
<group
- android:name="ic_screen_rotation_48px_outlines_pivot"
+ android:name="icon_pivot"
android:translateX="-24.15"
android:translateY="-24.25" >
<group
diff --git a/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml b/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml
deleted file mode 100644
index d68ee4c..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-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="64.0dp"
- android:height="64.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
- <path
- android:fillColor="#4DFFFFFF"
- android:pathData="M35.099998,28.500000c0.600000,-1.400000 0.900000,-2.900000 0.900000,-4.500000c0.000000,-6.600000 -5.400000,-12.000000 -12.000000,-12.000000c-1.600000,0.000000 -3.100000,0.300000 -4.500000,0.900000l3.200000,3.200000c0.400000,-0.100000 0.800000,-0.100000 1.200000,-0.100000c4.400000,0.000000 8.000000,3.600000 8.000000,8.000000c0.000000,0.400000 0.000000,0.800000 -0.100000,1.300000L35.099998,28.500000zM24.000000,8.000000c8.800000,0.000000 16.000000,7.200000 16.000000,16.000000c0.000000,2.700000 -0.700000,5.200000 -1.900000,7.500000l2.900000,2.900000c1.900000,-3.000000 3.000000,-6.600000 3.000000,-10.400000c0.000000,-11.000000 -9.000000,-20.000000 -20.000000,-20.000000c-3.800000,0.000000 -7.400000,1.100000 -10.400000,2.900000l2.900000,2.900000C18.700001,8.700000 21.299999,8.000000 24.000000,8.000000zM6.500000,5.000000L4.000000,7.500000l4.200000,4.200000C5.600000,15.100000 4.000000,19.400000 4.000000,24.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,-3.500000 1.100000,-6.800000 3.100000,-9.400000l2.900000,2.900000C12.700000,19.400000 12.000000,21.600000 12.000000,24.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,-1.300000 0.300000,-2.500000 0.900000,-3.600000l3.200000,3.200000c0.000000,0.100000 0.000000,0.300000 0.000000,0.400000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000c0.100000,0.000000 0.300000,0.000000 0.400000,0.000000l0.000000,0.000000l0.000000,0.000000l15.000000,15.000000l2.500000,-2.500000L8.500000,7.000000L6.500000,5.000000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml b/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml
deleted file mode 100644
index da09f6e..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-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="64.0dp"
- android:height="64.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
-
- <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"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_audible.xml b/packages/SystemUI/res/drawable/ic_ringer_audible.xml
index f358fa2..fd50617 100644
--- a/packages/SystemUI/res/drawable/ic_ringer_audible.xml
+++ b/packages/SystemUI/res/drawable/ic_ringer_audible.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="28dp"
+ android:height="28dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
diff --git a/packages/SystemUI/res/drawable/ic_ringer_mute.xml b/packages/SystemUI/res/drawable/ic_ringer_mute.xml
index dee6018..b29a139 100644
--- a/packages/SystemUI/res/drawable/ic_ringer_mute.xml
+++ b/packages/SystemUI/res/drawable/ic_ringer_mute.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="28dp"
+ android:height="28dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
<path
diff --git a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
index 9642be3..4bff96d 100644
--- a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
+++ b/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="28dp"
+ android:height="28dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
diff --git a/packages/SystemUI/res/drawable/ic_signal_airplane_disable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_airplane_disable_animation.xml
index 3e838e2..4fe585c 100644
--- a/packages/SystemUI/res/drawable/ic_signal_airplane_disable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_airplane_disable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_signal_airplane_disable_animation_root" />
<target
- android:name="ic_signal_airplane"
- android:animation="@anim/ic_signal_airplane_disable_animation_ic_signal_airplane" />
- <target
android:name="mask"
android:animation="@anim/ic_signal_airplane_disable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_signal_airplane_enable.xml b/packages/SystemUI/res/drawable/ic_signal_airplane_enable.xml
index ea3a15b..e30b21f 100644
--- a/packages/SystemUI/res/drawable/ic_signal_airplane_enable.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_airplane_enable.xml
@@ -24,8 +24,7 @@
<group
android:name="ic_signal_airplane"
android:translateX="21.9995"
- android:translateY="25.73401"
- android:alpha="0.3" >
+ android:translateY="25.73401" >
<group
android:name="ic_signal_airplane_pivot"
android:translateX="-23.21545"
diff --git a/packages/SystemUI/res/drawable/ic_signal_flashlight_disable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_flashlight_disable_animation.xml
index 6d787ab..61e5287 100644
--- a/packages/SystemUI/res/drawable/ic_signal_flashlight_disable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_flashlight_disable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_signal_flashlight_disable_animation_root" />
<target
- android:name="ic_signal_flashlight"
- android:animation="@anim/ic_signal_flashlight_disable_animation_ic_signal_flashlight" />
- <target
android:name="mask"
android:animation="@anim/ic_signal_flashlight_disable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_signal_flashlight_enable.xml b/packages/SystemUI/res/drawable/ic_signal_flashlight_enable.xml
index 93e97ee..d53608f 100644
--- a/packages/SystemUI/res/drawable/ic_signal_flashlight_enable.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_flashlight_enable.xml
@@ -24,8 +24,7 @@
<group
android:name="ic_signal_flashlight"
android:translateX="21.9995"
- android:translateY="25.73401"
- android:alpha="0.3" >
+ android:translateY="25.73401" >
<group
android:name="ic_signal_flashlight_pivot"
android:translateX="-23.21545"
diff --git a/packages/SystemUI/res/drawable/ic_signal_flashlight_enable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_flashlight_enable_animation.xml
index dcfba7d..4bd9188 100644
--- a/packages/SystemUI/res/drawable/ic_signal_flashlight_enable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_flashlight_enable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_signal_flashlight_enable_animation_root" />
<target
- android:name="ic_signal_flashlight"
- android:animation="@anim/ic_signal_flashlight_enable_animation_ic_signal_flashlight" />
- <target
android:name="mask"
android:animation="@anim/ic_signal_flashlight_enable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_signal_location_disable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_location_disable_animation.xml
index a219c54..a598b2d 100644
--- a/packages/SystemUI/res/drawable/ic_signal_location_disable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_location_disable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_signal_location_disable_animation_root" />
<target
- android:name="ic_signal_location"
- android:animation="@anim/ic_signal_location_disable_animation_ic_signal_location" />
- <target
android:name="mask"
android:animation="@anim/ic_signal_location_disable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_signal_location_enable.xml b/packages/SystemUI/res/drawable/ic_signal_location_enable.xml
index c800ef4..8614458 100644
--- a/packages/SystemUI/res/drawable/ic_signal_location_enable.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_location_enable.xml
@@ -24,8 +24,7 @@
<group
android:name="ic_signal_location"
android:translateX="21.9995"
- android:translateY="25.73401"
- android:alpha="0.3" >
+ android:translateY="25.73401" >
<group
android:name="ic_signal_location_pivot"
android:translateX="-23.21545"
diff --git a/packages/SystemUI/res/drawable/ic_signal_location_enable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_location_enable_animation.xml
index bbc1d73..127af29 100644
--- a/packages/SystemUI/res/drawable/ic_signal_location_enable_animation.xml
+++ b/packages/SystemUI/res/drawable/ic_signal_location_enable_animation.xml
@@ -20,9 +20,6 @@
android:name="root"
android:animation="@anim/ic_signal_location_enable_animation_root" />
<target
- android:name="ic_signal_location"
- android:animation="@anim/ic_signal_location_enable_animation_ic_signal_location" />
- <target
android:name="mask"
android:animation="@anim/ic_signal_location_enable_animation_mask" />
<target
diff --git a/packages/SystemUI/res/drawable/ic_zen_all.xml b/packages/SystemUI/res/drawable/ic_zen_all.xml
new file mode 100644
index 0000000..5df2447
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_zen_all.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="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.6,3.6L5.2,2.2C2.8,4.0 1.2,6.8 1.0,10.0l2.0,0.0C3.2,7.3 4.5,5.0 6.6,3.6zM20.0,10.0l2.0,0.0c-0.2,-3.2 -1.7,-6.0 -4.1,-7.8l-1.4,1.4C18.5,5.0 19.8,7.3 20.0,10.0zM18.0,10.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0l-2.0,-2.0L18.0,10.5zM11.5,22.0c0.1,0.0 0.3,0.0 0.4,0.0c0.7,-0.1 1.2,-0.6 1.4,-1.2c0.1,-0.2 0.2,-0.5 0.2,-0.8l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_zen_important.xml b/packages/SystemUI/res/drawable/ic_zen_important.xml
index 11e9063..c2a59b8 100644
--- a/packages/SystemUI/res/drawable/ic_zen_important.xml
+++ b/packages/SystemUI/res/drawable/ic_zen_important.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="18dp"
+ android:height="18dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
diff --git a/packages/SystemUI/res/drawable/ic_zen_none.xml b/packages/SystemUI/res/drawable/ic_zen_none.xml
index 681d499..99014f2 100644
--- a/packages/SystemUI/res/drawable/ic_zen_none.xml
+++ b/packages/SystemUI/res/drawable/ic_zen_none.xml
@@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="32dp"
- android:height="32dp"
+ android:width="18dp"
+ android:height="18dp"
android:viewportWidth="48.0"
android:viewportHeight="48.0">
diff --git a/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml b/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml
new file mode 100644
index 0000000..354b8bd
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screen_pinning_bg_circ.xml
@@ -0,0 +1,28 @@
+<?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.
+ */
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval" >
+
+ <solid android:color="@color/system_accent_color" />
+
+ <size
+ android:height="@dimen/screen_pinning_nav_highlight_size"
+ android:width="@dimen/screen_pinning_nav_highlight_size" />
+
+</shape>
diff --git a/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml b/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml
new file mode 100644
index 0000000..9e83057
--- /dev/null
+++ b/packages/SystemUI/res/drawable/screen_pinning_light_bg_circ.xml
@@ -0,0 +1,28 @@
+<?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.
+ */
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval" >
+
+ <solid android:color="@color/screen_pinning_nav_icon_highlight_outer" />
+
+ <size
+ android:height="@dimen/screen_pinning_nav_highlight_outer_size"
+ android:width="@dimen/screen_pinning_nav_highlight_outer_size" />
+
+</shape>
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_3.xml b/packages/SystemUI/res/interpolator/ic_hotspot_disable_cross_1_pathdata_interpolator.xml
index 7b0af97..bc0442f 100644
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_3.xml
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_disable_cross_1_pathdata_interpolator.xml
@@ -1,4 +1,6 @@
-<!-- Copyright (C) 2014 The Android Open Source Project
+<?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.
@@ -13,4 +15,4 @@
limitations under the License.
-->
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.649706648701,0.0 0.884285938423,1.92358061843 1.0,1.0" />
+ android:pathData="M 0,0 c 0.166666667,0 0.2,1 1,1" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_2.xml b/packages/SystemUI/res/interpolator/ic_hotspot_disable_ic_hotspot_alpha_interpolator.xml
index 5011ef9..f7072f2 100644
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_2.xml
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_disable_ic_hotspot_alpha_interpolator.xml
@@ -1,4 +1,6 @@
-<!-- Copyright (C) 2014 The Android Open Source Project
+<?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.
@@ -13,4 +15,4 @@
limitations under the License.
-->
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.0103034467173,0.0 0.701918866569,1.0 1.0,1.0" />
+ android:pathData="M 0,0 c 0.8,0 0.6,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_1.xml
new file mode 100644
index 0000000..0cc9c02
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_1.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.166666667,0 0.833333333,0.833333333 1,1" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_2.xml
index 601cfc6..44c755e 100644
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_1.xml
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_disable_mask_pathdata_interpolator_2.xml
@@ -1,4 +1,6 @@
-<!-- Copyright (C) 2014 The Android Open Source Project
+<?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.
@@ -13,4 +15,4 @@
limitations under the License.
-->
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.33333333,0.0 0.202777547991,1.0 1.0,1.0" />
+ android:pathData="M 0,0 c 0.166666667,0.166666667 0.2,1 1,1" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_hotspot_enable_cross_1_pathdata_interpolator.xml
index 601cfc6..bc90d28 100644
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scalex_interpolator_1.xml
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_enable_cross_1_pathdata_interpolator.xml
@@ -1,4 +1,6 @@
-<!-- Copyright (C) 2014 The Android Open Source Project
+<?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.
@@ -13,4 +15,4 @@
limitations under the License.
-->
<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.33333333,0.0 0.202777547991,1.0 1.0,1.0" />
+ android:pathData="M 0,0 c 0.8,0 0.833333333,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_1.xml b/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_1.xml
new file mode 100644
index 0000000..e361d9c
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_1.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.8,0 0.833333333,0.833333333 1,1" />
diff --git a/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_2.xml b/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_2.xml
new file mode 100644
index 0000000..25ba970
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/ic_hotspot_enable_mask_pathdata_interpolator_2.xml
@@ -0,0 +1,18 @@
+<?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.
+-->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.166666667,0.166666667 0.833333333,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/recents_launch_next_affiliated_task_bounce_scale.xml b/packages/SystemUI/res/interpolator/recents_launch_next_affiliated_task_bounce_scale.xml
new file mode 100644
index 0000000..c4e5d97
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/recents_launch_next_affiliated_task_bounce_scale.xml
@@ -0,0 +1,20 @@
+<?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.
+*/
+-->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.8,0 0.2,1 1,1" />
diff --git a/packages/SystemUI/res/interpolator/recents_launch_prev_affiliated_task_bounce_ydelta.xml b/packages/SystemUI/res/interpolator/recents_launch_prev_affiliated_task_bounce_ydelta.xml
new file mode 100644
index 0000000..40a08b9
--- /dev/null
+++ b/packages/SystemUI/res/interpolator/recents_launch_prev_affiliated_task_bounce_ydelta.xml
@@ -0,0 +1,20 @@
+<?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.
+*/
+-->
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0,0 c 0.6,0 0.2,1 1,1" />
diff --git a/packages/SystemUI/res/layout/screen_pinning_request.xml b/packages/SystemUI/res/layout/screen_pinning_request.xml
new file mode 100644
index 0000000..fea45cc
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request.xml
@@ -0,0 +1,42 @@
+<?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.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ android:gravity="bottom|center_horizontal"
+ android:layoutDirection="ltr"
+ android:orientation="vertical" >
+
+ <include
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ layout="@layout/screen_pinning_request_text_area" />
+
+ <View
+ android:id="@+id/spacer"
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="18dp"
+ android:background="@color/screen_pinning_request_bg" />
+
+ <include
+ android:layout_width="@dimen/screen_pinning_request_width"
+ android:layout_height="wrap_content"
+ layout="@layout/screen_pinning_request_buttons" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
new file mode 100644
index 0000000..224a0a0
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
@@ -0,0 +1,143 @@
+<?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.
+ */
+-->
+<!--
+ This layout matches the structure of navigation_bar.xml and will need
+ to be kept up to sync with changes there.
+ On sw600dp, dimensions are changed to be large enough such that the
+ empty views between the buttons is reduced to nothing, if (nav bar)
+ sw600dp layout is changed then this will likely have to be adjusted
+ and possibly need a sw600dp specific one.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/screen_pinning_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:background="@color/screen_pinning_request_bg" >
+
+ <View
+ android:layout_width="@dimen/screen_pinning_request_side_width"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_back_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg_light"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_inner_padding"
+ android:paddingStart="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_back" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_home_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_home" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_recents_group"
+ android:layout_width="@dimen/screen_pinning_request_button_width"
+ android:layout_height="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0"
+ android:paddingStart="@dimen/screen_pinning_request_frame_padding"
+ android:paddingEnd="@dimen/screen_pinning_request_frame_padding" >
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_inner_padding"
+ android:paddingStart="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingStart="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_icon_padding"
+ android:scaleType="center"
+ android:src="@drawable/ic_sysbar_recent" />
+ </FrameLayout>
+
+ <View
+ android:layout_width="@dimen/screen_pinning_request_side_width"
+ android:layout_height="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
new file mode 100644
index 0000000..1e5193f
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
@@ -0,0 +1,135 @@
+<?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.
+ */
+-->
+<!-- Note all width/height dimensions are switched here to handle landspace
+ rather than duplicating them all.
+ This layout matches the structure of navigation_bar.xml (rot90) and
+ will need to be kept up to sync with changes there.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/screen_pinning_buttons"
+ android:layout_height="match_parent"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:background="@color/screen_pinning_request_bg"
+ android:orientation="vertical" >
+
+ <View
+ android:layout_height="@dimen/screen_pinning_request_side_width"
+ android:layout_width="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_recents_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:paddingLeft="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_recent" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_home_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_home" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:visibility="invisible" />
+
+ <FrameLayout
+ android:id="@+id/screen_pinning_back_group"
+ android:layout_height="@dimen/screen_pinning_request_button_width"
+ android:layout_width="@dimen/screen_pinning_request_button_height"
+ android:layout_weight="0" >
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg_light"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:src="@drawable/screen_pinning_light_bg_circ" />
+
+ <ImageView
+ android:id="@+id/screen_pinning_back_bg"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="matrix"
+ android:paddingLeft="@dimen/screen_pinning_request_inner_padding"
+ android:paddingTop="@dimen/screen_pinning_request_inner_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_inner_padding"
+ android:src="@drawable/screen_pinning_bg_circ" />
+
+ <ImageView
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:scaleType="center"
+ android:paddingLeft="@dimen/screen_pinning_request_nav_icon_padding"
+ android:paddingTop="@dimen/screen_pinning_request_nav_side_padding"
+ android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding"
+ android:src="@drawable/ic_sysbar_back" />
+ </FrameLayout>
+
+ <View
+ android:layout_height="@dimen/screen_pinning_request_side_width"
+ android:layout_width="match_parent"
+ android:layout_weight="0"
+ android:visibility="invisible" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml b/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml
new file mode 100644
index 0000000..e6c22d4
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_land_phone.xml
@@ -0,0 +1,35 @@
+<?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.
+ */
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_height="@dimen/screen_pinning_request_width"
+ android:layout_width="wrap_content"
+ android:gravity="right|center_vertical"
+ android:orientation="horizontal" >
+
+ <include
+ android:layout_width="360dp"
+ android:layout_height="@dimen/screen_pinning_request_width"
+ layout="@layout/screen_pinning_request_text_area" />
+
+ <include
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/screen_pinning_request_width"
+ layout="@layout/screen_pinning_request_buttons_land" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
new file mode 100644
index 0000000..df957f4
--- /dev/null
+++ b/packages/SystemUI/res/layout/screen_pinning_request_text_area.xml
@@ -0,0 +1,80 @@
+<?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.
+ */
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/screen_pinning_text_area"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="@color/screen_pinning_request_bg"
+ android:gravity="center_vertical" >
+
+ <TextView
+ android:id="@+id/screen_pinning_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="48dp"
+ android:paddingStart="48dp"
+ android:paddingTop="43dp"
+ android:text="@string/screen_pinning_title"
+ android:textColor="@color/screen_pinning_primary_text"
+ android:textSize="24sp" />
+
+ <TextView
+ android:id="@+id/screen_pinning_description"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/screen_pinning_title"
+ android:paddingEnd="48dp"
+ android:paddingStart="48dp"
+ android:paddingTop="12.6dp"
+ android:text="@string/screen_pinning_description"
+ android:textColor="@color/screen_pinning_primary_text"
+ android:textSize="16sp" />
+
+ <Button
+ android:id="@+id/screen_pinning_ok_button"
+ style="@android:style/Widget.Material.Button"
+ android:layout_width="wrap_content"
+ android:layout_height="36dp"
+ android:layout_alignParentEnd="true"
+ android:layout_below="@+id/screen_pinning_description"
+ android:layout_marginEnd="40dp"
+ android:layout_marginTop="18dp"
+ android:background="@null"
+ android:paddingEnd="8dp"
+ android:paddingStart="8dp"
+ android:text="@string/screen_pinning_positive"
+ android:textColor="@android:color/white"
+ android:textSize="14sp" />
+
+ <Button
+ android:id="@+id/screen_pinning_cancel_button"
+ style="@android:style/Widget.Material.Button"
+ android:layout_width="wrap_content"
+ android:layout_height="36dp"
+ android:layout_alignTop="@id/screen_pinning_ok_button"
+ android:layout_marginEnd="4dp"
+ android:layout_toStartOf="@id/screen_pinning_ok_button"
+ android:background="@null"
+ android:paddingEnd="8dp"
+ android:paddingStart="8dp"
+ android:text="@string/screen_pinning_negative"
+ android:textColor="@android:color/white"
+ android:textSize="14sp" />
+
+</RelativeLayout>
diff --git a/packages/SystemUI/res/layout/segmented_button.xml b/packages/SystemUI/res/layout/segmented_button.xml
index 772b19c..e92f310 100644
--- a/packages/SystemUI/res/layout/segmented_button.xml
+++ b/packages/SystemUI/res/layout/segmented_button.xml
@@ -19,8 +19,10 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/segmented_button_spacing"
android:layout_weight="1"
+ android:gravity="center_horizontal|top"
android:textColor="@color/segmented_button_text_selector"
android:background="@drawable/btn_borderless_rect"
android:textAppearance="@style/TextAppearance.QS.SegmentedButton"
- android:minHeight="36dp"
- android:padding="4dp" />
+ android:minHeight="64dp"
+ android:paddingTop="11dp"
+ android:drawablePadding="6dp" />
diff --git a/packages/SystemUI/res/layout/volume_panel_item.xml b/packages/SystemUI/res/layout/volume_panel_item.xml
index 85e3fb3..dad68c3 100644
--- a/packages/SystemUI/res/layout/volume_panel_item.xml
+++ b/packages/SystemUI/res/layout/volume_panel_item.xml
@@ -55,4 +55,20 @@
android:paddingTop="0dp" />
</FrameLayout>
+
+ <View
+ android:id="@+id/divider"
+ android:layout_width="1dp"
+ android:layout_height="32dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:background="@color/volume_panel_divider" />
+
+ <ImageView
+ android:id="@+id/secondary_icon"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:scaleType="center"
+ android:background="@drawable/btn_borderless_rect"
+ android:contentDescription="@null" />
</LinearLayout> \ No newline at end of file
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index ece6979..f2dc402 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -25,7 +25,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="12dp"
+ android:minHeight="8dp"
android:elevation="4dp"
android:background="@drawable/qs_background_secondary" >
@@ -33,9 +33,8 @@
android:id="@+id/zen_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/qs_panel_padding"
- android:layout_marginRight="@dimen/qs_panel_padding"
- android:layout_marginTop="4dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:clipChildren="false" />
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/zen_toast.xml b/packages/SystemUI/res/layout/zen_toast.xml
deleted file mode 100644
index 1e3d3cf..0000000
--- a/packages/SystemUI/res/layout/zen_toast.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/zen_toast_background"
- android:translationZ="@dimen/volume_panel_z"
- android:padding="18dp"
- android:gravity="center_horizontal"
- android:orientation="vertical" >
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:scaleType="center" />
-
- <TextView
- android:id="@android:id/message"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="12dp"
- android:lineSpacingExtra="4dp"
- android:gravity="center_horizontal"
- android:textAppearance="@style/TextAppearance.QS.ZenToast" />
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 25bd993..9f9f721 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Stel op"</string>
<string name="muted_by" msgid="6147073845094180001">"Gedemp deur <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 5b21f3f..800c273 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"አዋቅር"</string>
<string name="muted_by" msgid="6147073845094180001">"ድምጽ በ<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ተዘግቷል"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index f59d011..903ab3e 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"إعداد"</string>
<string name="muted_by" msgid="6147073845094180001">"تم كتم الصوت بواسطة <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 3a2eabd..eb80be2 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Настройване"</string>
<string name="muted_by" msgid="6147073845094180001">"Заглушено от <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index ff1d1a0..84eb836 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"সেট আপ"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> দ্বারা নিঃশব্দ করা হয়েছে"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index feb326c..e7ccba7 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configura"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciat per <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 2e0e0d7..db1cdc0 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastavit"</string>
<string name="muted_by" msgid="6147073845094180001">"Ignorováno stranou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 6770cba..50f5828 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfigurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Lyden blev afbrudt af <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 5542229..380df14 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Einrichten"</string>
<string name="muted_by" msgid="6147073845094180001">"Stummgeschaltet durch <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 946dc2c..456733c 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Ρύθμιση"</string>
<string name="muted_by" msgid="6147073845094180001">"Σίγαση από <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index f2018fa..8bac5f7 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setup"</string>
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index f2018fa..8bac5f7 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setup"</string>
<string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index d3aab3b..24214cf 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciados por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 1530bf3..26f9930 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 55d6d1f..5dca252 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Seadistus"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistas"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index 01cd860..e3c3c88 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfiguratu"</string>
<string name="muted_by" msgid="6147073845094180001">"Audioa desaktibatu da (<xliff:g id="THIRD_PARTY">%1$s</xliff:g>)"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 245ac4a..0f99deb 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"راه‌اندازی"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> آن را بی‌صدا کرد"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. ‏<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 0d5281c..82cb690 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Määritä asetukset"</string>
<string name="muted_by" msgid="6147073845094180001">"Mykistänyt <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 5119bab..64bd3ec 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Mis en sourdine par <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 52f05db..9f19c88 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurer"</string>
<string name="muted_by" msgid="6147073845094180001">"Son coupé par : <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index f5b773f..ffc0044 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 47da5bf..0c17786 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा म्यूट किया गया"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index bffb405..5b9eee8 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Postavi"</string>
<string name="muted_by" msgid="6147073845094180001">"Zvuk je isklj. treća strana <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 0b7dff3..e4911b6 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Beállítás"</string>
<string name="muted_by" msgid="6147073845094180001">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> elnémította"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index e56633a..5f955bc 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Կարգավորել"</string>
<string name="muted_by" msgid="6147073845094180001">"Համրեցվել է <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ի կողմից"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 2ad0285..1563f11 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Siapkan"</string>
<string name="muted_by" msgid="6147073845094180001">"Dinonaktifkan oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index cac5b27..6acc2ec 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Setja upp"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tók hljóðið af"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 150bcec..2672c54 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configura"</string>
<string name="muted_by" msgid="6147073845094180001">"Audio disattivato da <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index a073706..3d1b2dc 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"הגדר"</string>
<string name="muted_by" msgid="6147073845094180001">"הושתק על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>‏. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 22501d2..aaead1e 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>によりミュートになっています"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index 5bf4867..3330ba5 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"დაყენება"</string>
<string name="muted_by" msgid="6147073845094180001">"დადუმებულია <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ის მიერ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 34ee563..0314ede 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Реттеу"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> үнін өшірген"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index efa9eb7..9e49a05 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -354,4 +354,12 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"រៀបចំ"</string>
<string name="muted_by" msgid="6147073845094180001">"បាន​បិទ​សំឡេង​ដោយ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="screen_pinning_title" msgid="3273740381976175811">"អេក្រង់​ត្រូវ​បាន​ភ្ជាប់"</string>
+ <string name="screen_pinning_description" msgid="1346522416878235405">"រក្សាទុក​វា​ក្នុង​ទិដ្ឋភាព​រហូត​ដល់​អ្នក​ផ្ដាច់។ ប៉ះ ហើយ​សង្កត់​ថយក្រោយ និង​ទិដ្ឋភាព​នៅ​ពេល​តែ​មួយ​ដើម្បី​ផ្ដាច់។"</string>
+ <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"វា​រក្សាទុក​ក្នុង​ទិដ្ឋភាព​រហូត​ដល់​អ្នក​ផ្ដាច់។ ប៉ះ និង​សង្កត់​ទិដ្ឋភាព​ដើម្បី​ផ្ដាច់។"</string>
+ <string name="screen_pinning_positive" msgid="3783985798366751226">"យល់​ហើយ"</string>
+ <string name="screen_pinning_negative" msgid="3741602308343880268">"ទេ អរគុណ"</string>
+ <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"លាក់ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
+ <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"វា​នឹង​បង្ហាញ​ពេល​ក្រោយ​ ពេល​ដែល​អ្នក​បើក​ក្នុង​ការ​កំណត់។"</string>
+ <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"លាក់"</string>
</resources>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index ba13260..250e805 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"ಹೊಂದಿಸು"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಅವರಿಂದ ಮ್ಯೂಟ್‌ ಮಾಡಲಾಗಿದೆ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index f00bc01..5a1ab51 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"설정"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>에서 알림음 음소거"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index fc22815..524f0ec 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -379,4 +379,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Орнотуу"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> тарабынан үнсүздөлдү"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index 79a225d..0bdf44f 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"ຕັ້ງຄ່າ"</string>
<string name="muted_by" msgid="6147073845094180001">"ຖືກ​ປິດ​ສຽງ​ໂດຍ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 376d78e..877b654 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nustatyti"</string>
<string name="muted_by" msgid="6147073845094180001">"Nutildė <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index fe88b10..9afc7f7 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Iestatīt"</string>
<string name="muted_by" msgid="6147073845094180001">"Skaņu izslēdza <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 67d6f66..7f2ed37 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Постави"</string>
<string name="muted_by" msgid="6147073845094180001">"Звукот го исклучи <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index ec22c91..23009ea 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"സജ്ജീകരിക്കുക"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>, മ്യൂട്ടുചെയ്‌തു"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index 7c475a9..21c74b0 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Тохируулах"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-с хаасан"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index 7b3934c..4eaf87e 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट अप"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारे नि:शब्द केले"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 27b2184..e397c02 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sediakan"</string>
<string name="muted_by" msgid="6147073845094180001">"Diredam oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 6d7941f..bc337a4 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"သတ်မှတ်ရန်"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index da01a12..a64106a 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfigurer"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har kuttet lyden"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 4365cd5..a1abb1f 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेटअप गर्नुहोस्"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा मौन गरिएको"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 2663231..8da6709 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configureren"</string>
<string name="muted_by" msgid="6147073845094180001">"Gedempt door <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index fc79990..28cf52c 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Skonfiguruj"</string>
<string name="muted_by" msgid="6147073845094180001">"Ściszone przez: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index bc345b1..fee7222 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 4d8b1d0..698be77 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -277,8 +277,7 @@
<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 app"</string>
- <!-- no translation found for recents_lock_to_app_button_label (6942899049072506044) -->
- <skip />
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"fixação de tela"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"pesquisar"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Não foi possível iniciar <xliff:g id="APP">%s</xliff:g>."</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string>
@@ -357,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Configurar"</string>
<string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 481a6dd..c638e76 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Config."</string>
<string name="muted_by" msgid="6147073845094180001">"Dezactivate de <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 858b787..00c82b4 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Настроить"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук отключен приложением \"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>\""</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index b0a6b47..2ce64d9 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"සකසන්න"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> විසින් නිශ්ශබ්ද කරන ලදි"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3303312..f934552 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastaviť"</string>
<string name="muted_by" msgid="6147073845094180001">"Stlmené aplikáciou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index b6437a2..ef79001 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Nastavitev"</string>
<string name="muted_by" msgid="6147073845094180001">"Izklop zvoka: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index d47cf48..2798ac5 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Подеси"</string>
<string name="muted_by" msgid="6147073845094180001">"Звук је искључио/ла <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index ca0cfc6..5d70f06 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Konfig."</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har stängt av ljudet"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 58e0c41..80d5f77 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sanidi"</string>
<string name="muted_by" msgid="6147073845094180001">"Sauti imezimwa na <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-sw400dp/dimens.xml b/packages/SystemUI/res/values-sw400dp/dimens.xml
index 80e82c4..f19335b 100644
--- a/packages/SystemUI/res/values-sw400dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw400dp/dimens.xml
@@ -23,5 +23,13 @@
navigation_extra_key_width -->
<dimen name="navigation_side_padding">50dp</dimen>
+ <!-- Screen pinning request padding on side of icons
+ (makes the width match the nav bar)-->
+ <dimen name="screen_pinning_request_nav_side_padding">7dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ navigation_side_padding - 3 / 2 * (screen_pinning_request_button_width
+ - navigation_key_width) -->
+ <dimen name="screen_pinning_request_side_width">44dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
index 2c22cef..3a62ad9 100644
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -29,4 +29,15 @@
<dimen name="keyguard_clock_notifications_margin_max">36dp</dimen>
<dimen name="keyguard_indication_margin_bottom">80dp</dimen>
+
+ <!-- Screen pinning request width (just a little bit bigger than the three buttons here -->
+ <dimen name="screen_pinning_request_width">490dp</dimen>
+ <!-- Screen pinning request bottom button circle widths -->
+ <dimen name="screen_pinning_request_button_width">162dp</dimen>
+ <!-- Screen pinning request, controls padding on bigger screens, bigger nav bar -->
+ <dimen name="screen_pinning_request_frame_padding">39dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ In sw600dp we want the buttons centered so this fills the space,
+ (screen_pinning_request_width - 3 * screen_pinning_request_button_width) / 2 -->
+ <dimen name="screen_pinning_request_side_width">2dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index d3b5580..195fdb1 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -87,4 +87,15 @@
<!-- Margin on the right side of the system icon group on Keyguard. -->
<dimen name="system_icons_keyguard_padding_end">2dp</dimen>
+
+ <!-- Screen pinning request width -->
+ <dimen name="screen_pinning_request_width">400dp</dimen>
+ <!-- Screen pinning request bottom button circle widths -->
+ <dimen name="screen_pinning_request_button_width">128dp</dimen>
+ <!-- Screen pinning request, controls padding on bigger screens, bigger nav bar -->
+ <dimen name="screen_pinning_request_frame_padding">22dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ In sw600dp we want the buttons centered so this fills the space,
+ (screen_pinning_request_width - 3 * screen_pinning_request_button_width) / 2 -->
+ <dimen name="screen_pinning_request_side_width">8dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 847529c..4a3df38 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"அமை"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ஒலியடக்கினார்"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 393569a..d49aa1e 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"సెటప్ చేయి"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ద్వారా మ్యూట్ చేయబడింది"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 673e0e4..8318405 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"ตั้งค่า"</string>
<string name="muted_by" msgid="6147073845094180001">"ปิดเสียงโดย <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g> <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index e7db5f8..d19742f 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"I-set up"</string>
<string name="muted_by" msgid="6147073845094180001">"Na-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index e295be2..4d7014b 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Kur"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tarafından kapatıldı"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 6798df1..7a7e2f7 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Налаштув."</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає звук"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index 6b05ac5..38e152c 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"ترتیب دیں"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کے ذریعے خاموش کردہ"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>۔ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index c561400..11bd4fd 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Sozlash"</string>
<string name="muted_by" msgid="6147073845094180001">"“<xliff:g id="THIRD_PARTY">%1$s</xliff:g>” tomonidan ovozsiz qilingan"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 0572930..be9ac9e 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Thiết lập"</string>
<string name="muted_by" msgid="6147073845094180001">"Do <xliff:g id="THIRD_PARTY">%1$s</xliff:g> tắt tiếng"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 8895799..4dac3d3 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"设置"</string>
<string name="muted_by" msgid="6147073845094180001">"已被<xliff:g id="THIRD_PARTY">%1$s</xliff:g>设为静音"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>(<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>)"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index fe8fe85..1cc638c 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"靜音設定者:<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index a9dcc39..0bcd38f 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -356,4 +356,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"設定"</string>
<string name="muted_by" msgid="6147073845094180001">"由 <xliff:g id="THIRD_PARTY">%1$s</xliff:g> 設為靜音"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 282acaa..50cc5f4 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -354,4 +354,20 @@
<string name="hidden_notifications_setup" msgid="41079514801976810">"Lungisa"</string>
<string name="muted_by" msgid="6147073845094180001">"Ithuliswe ngu-<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for screen_pinning_title (3273740381976175811) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description (1346522416878235405) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (8518446209564202557) -->
+ <skip />
+ <!-- no translation found for screen_pinning_positive (3783985798366751226) -->
+ <skip />
+ <!-- no translation found for screen_pinning_negative (3741602308343880268) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_title (748792586749897883) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_message (2235970126803317374) -->
+ <skip />
+ <!-- no translation found for quick_settings_reset_confirmation_button (2660339101868367515) -->
+ <skip />
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index 82dccd2..a7783fc 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -101,8 +101,6 @@
<!-- The color of the circle around the primary user in the user switcher -->
<color name="current_user_border_color">@color/system_accent_color</color>
- <color name="segmented_button_text_inactive">#99afbdc4</color><!-- 60% -->
-
<!-- The "inside" of a notification, reached via longpress -->
<color name="notification_guts_bg_color">@color/system_secondary_color</color>
<color name="notification_guts_title_color">#FFFFFFFF</color>
@@ -123,4 +121,12 @@
<!-- Shadow color for the furthest pixels around the fake shadow for recents. -->
<color name="fake_shadow_end_color">#03000000</color>
+
+ <color name="screen_pinning_nav_icon_highlight_outer">#4080cbc4</color><!-- 25% deep teal 200 -->
+ <color name="screen_pinning_request_bg">#ff009688</color><!-- deep teal 500 -->
+ <color name="screen_pinning_request_window_bg">#80000000</color>
+
+ <color name="segmented_button_selected">#FFFFFFFF</color>
+ <color name="segmented_button_unselected">#B3B0BEC5</color><!-- 70% blue grey 200 -->
+ <color name="volume_panel_divider">#1FFFFFFF</color><!-- 12% white -->
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 4da54e3..3cd72fc 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -250,12 +250,6 @@
<!-- Number of times to show the strong alarm warning text in the volume dialog -->
<integer name="zen_mode_alarm_warning_threshold">5</integer>
- <!-- Zen toast fade in/out duration -->
- <integer name="zen_toast_animation_duration">500</integer>
-
- <!-- Zen toast visibility duration -->
- <integer name="zen_toast_visible_duration">500</integer>
-
<!-- Enable the default volume dialog -->
<bool name="enable_volume_ui">true</bool>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 6e6f302..5caa866 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -63,6 +63,8 @@
<!-- thickness (height) of the navigation bar on phones that require it -->
<dimen name="navigation_bar_size">@*android:dimen/navigation_bar_height</dimen>
+ <!-- Minimum swipe distance to catch the swipe gestures to invoke assist or switch tasks. -->
+ <dimen name="navigation_bar_min_swipe_distance">48dp</dimen>
<!-- thickness (height) of the dead zone at the top of the navigation bar,
reducing false presses on navbar buttons; approx 2mm -->
@@ -189,17 +191,14 @@
<dimen name="qs_data_usage_text_size">14sp</dimen>
<dimen name="qs_data_usage_usage_text_size">36sp</dimen>
- <dimen name="segmented_button_spacing">4dp</dimen>
- <dimen name="segmented_button_radius">2dp</dimen>
+ <dimen name="segmented_button_spacing">8dp</dimen>
+ <dimen name="borderless_button_radius">2dp</dimen>
<!-- How far the expanded QS panel peeks from the header in collapsed state. -->
<dimen name="qs_peek_height">8dp</dimen>
<dimen name="zen_mode_condition_detail_button_padding">8dp</dimen>
- <!-- Explicit width of the zen toast window -->
- <dimen name="zen_toast_width">224dp</dimen>
-
<!-- used by DessertCase -->
<dimen name="dessert_case_cell_size">192dp</dimen>
@@ -518,4 +517,29 @@
<!-- Padding for signal cluster and battery icon when there are not icons in signal cluster -->
<dimen name="no_signal_cluster_battery_padding">3dp</dimen>
+
+ <!-- Screen pinning request width -->
+ <dimen name="screen_pinning_request_width">@dimen/match_parent</dimen>
+ <!-- Screen pinning request nav button circle heights -->
+ <dimen name="screen_pinning_request_button_height">66dp</dimen>
+ <!-- Screen pinning request nav button circle widths -->
+ <dimen name="screen_pinning_request_button_width">84dp</dimen>
+ <!-- Screen pinning request padding on top of inner circle -->
+ <dimen name="screen_pinning_request_inner_padding">14dp</dimen>
+ <!-- Screen pinning request padding on top of icons -->
+ <dimen name="screen_pinning_request_nav_icon_padding">18dp</dimen>
+ <!-- Screen pinning request padding on side of icons
+ (makes the width match the nav bar)-->
+ <dimen name="screen_pinning_request_nav_side_padding">7dp</dimen>
+ <!-- Screen pinning request side views to match nav bar
+ navigation_side_padding - 3 / 2 * (screen_pinning_request_button_width
+ - navigation_key_width) -->
+ <dimen name="screen_pinning_request_side_width">34dp</dimen>
+ <!-- Screen pinning request controls padding on bigger screens -->
+ <dimen name="screen_pinning_request_frame_padding">0dp</dimen>
+ <!-- Screen pinning inner nav bar circle size -->
+ <dimen name="screen_pinning_nav_highlight_size">56dp</dimen>
+ <!-- Screen pinning inner nav bar outer circle size -->
+ <dimen name="screen_pinning_nav_highlight_outer_size">84dp</dimen>
+
</resources>
diff --git a/packages/SystemUI/res/values/internal.xml b/packages/SystemUI/res/values/internal.xml
index 3b593d2..67685ee 100644
--- a/packages/SystemUI/res/values/internal.xml
+++ b/packages/SystemUI/res/values/internal.xml
@@ -17,5 +17,6 @@
<resources>
<dimen name="status_bar_height">@*android:dimen/status_bar_height</dimen>
<dimen name="navigation_bar_height">@*android:dimen/navigation_bar_height</dimen>
+ <color name="screen_pinning_primary_text">@*android:color/primary_text_default_material_light</color>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7a0d655..d72643e 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -899,4 +899,24 @@
<!-- Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. [CHAR LIMIT=20] -->
<string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string>
+
+ <!-- Screen pinning dialog title. -->
+ <string name="screen_pinning_title">Screen is pinned</string>
+ <!-- Screen pinning dialog description. -->
+ <string name="screen_pinning_description">This keeps it in view until you unpin. Touch and hold Back and Overview at the same time to unpin.</string>
+ <!-- Screen pinning dialog description when in accessibility mode. -->
+ <string name="screen_pinning_description_accessible">This keeps it in view until you unpin. Touch and hold Overview to unpin.</string>
+ <!-- Screen pinning positive response. -->
+ <string name="screen_pinning_positive">Got it</string>
+ <!-- Screen pinning negative response. -->
+ <string name="screen_pinning_negative">No thanks</string>
+
+ <!-- Hide quick settings tile confirmation title -->
+ <string name="quick_settings_reset_confirmation_title">Hide <xliff:g id="tile_label" example="Hotspot">%1$s</xliff:g>?</string>
+
+ <!-- Hide quick settings tile confirmation message -->
+ <string name="quick_settings_reset_confirmation_message">It will reappear the next time you turn it on in settings.</string>
+
+ <!-- Hide quick settings tile confirmation button -->
+ <string name="quick_settings_reset_confirmation_button">Hide</string>
</resources>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 909dc42..7649340 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -167,14 +167,8 @@
<item name="android:textColor">@color/qs_subhead</item>
</style>
- <style name="TextAppearance.QS.ZenToast">
- <item name="android:textSize">14sp</item>
- </style>
-
<style name="TextAppearance.QS.SegmentedButton">
<item name="android:textSize">14sp</item>
- <item name="android:textAllCaps">true</item>
- <item name="android:fontFamily">sans-serif-medium</item>
</style>
<style name="TextAppearance.QS.DataUsage">
@@ -266,9 +260,4 @@
<style name="UserDetailView">
<item name="numColumns">3</item>
</style>
-
- <style name="ZenToastAnimations">
- <item name="android:windowEnterAnimation">@anim/zen_toast_enter</item>
- <item name="android:windowExitAnimation">@anim/zen_toast_exit</item>
- </style>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/DemoMode.java b/packages/SystemUI/src/com/android/systemui/DemoMode.java
index c16c3a1..9c206e2 100644
--- a/packages/SystemUI/src/com/android/systemui/DemoMode.java
+++ b/packages/SystemUI/src/com/android/systemui/DemoMode.java
@@ -32,4 +32,5 @@ public interface DemoMode {
public static final String COMMAND_BARS = "bars";
public static final String COMMAND_STATUS = "status";
public static final String COMMAND_NOTIFICATIONS = "notifications";
+ public static final String COMMAND_VOLUME = "volume";
}
diff --git a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
index 5f2c348..6337956 100644
--- a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
+++ b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
@@ -7,6 +7,8 @@ option java_package com.android.systemui;
# ---------------------------
36000 sysui_statusbar_touch (type|1),(x|1),(y|1),(enabled|1)
36001 sysui_heads_up_status (key|3),(visible|1)
+36002 sysui_fullscreen_notification (key|3)
+36003 sysui_heads_up_escalation (key|3)
# ---------------------------
# PhoneStatusBarView.java
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index f206e56..33f6564 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -453,7 +453,8 @@ public class SwipeHelper implements Gefingerpoken {
&& !mTouchAboveFalsingThreshold;
boolean dismissChild = mCallback.canChildBeDismissed(mCurrView)
- && !falsingDetected && (childSwipedFastEnough || childSwipedFarEnough);
+ && !falsingDetected && (childSwipedFastEnough || childSwipedFarEnough)
+ && ev.getActionMasked() == MotionEvent.ACTION_UP;
if (dismissChild) {
// flingadingy
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index f8c5e9c..8f14abb 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -449,10 +449,12 @@ public class DozeService extends DreamService {
private void updateListener() {
if (!mConfigured || mSensor == null) return;
- if (mRequested && !mDisabled) {
+ if (mRequested && !mDisabled && !mRegistered) {
mRegistered = mSensors.requestTriggerSensor(this, mSensor);
+ if (DEBUG) Log.d(mTag, "requestTriggerSensor " + mRegistered);
} else if (mRegistered) {
- mSensors.cancelTriggerSensor(this, mSensor);
+ final boolean rt = mSensors.cancelTriggerSensor(this, mSensor);
+ if (DEBUG) Log.d(mTag, "cancelTriggerSensor " + rt);
mRegistered = false;
}
}
@@ -483,7 +485,8 @@ public class DozeService extends DreamService {
}
requestPulse();
- setListening(true); // reregister, this sensor only fires once
+ mRegistered = false;
+ updateListener(); // 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
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 1ddd352..91b1569 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -296,7 +296,14 @@ public class QSPanel extends ViewGroup {
r.tile.secondaryClick();
}
};
- r.tileView.init(click, clickSecondary);
+ final View.OnLongClickListener longClick = new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ r.tile.longClick();
+ return true;
+ }
+ };
+ r.tileView.init(click, clickSecondary, longClick);
r.tile.setListening(mListening);
callback.onStateChanged(r.tile.getState());
r.tile.refreshState();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 2a66484..1790a4e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -112,6 +112,10 @@ public abstract class QSTile<TState extends State> implements Listenable {
mHandler.sendEmptyMessage(H.SECONDARY_CLICK);
}
+ public void longClick() {
+ mHandler.sendEmptyMessage(H.LONG_CLICK);
+ }
+
public void showDetail(boolean show) {
mHandler.obtainMessage(H.SHOW_DETAIL, show ? 1 : 0, 0).sendToTarget();
}
@@ -155,6 +159,10 @@ public abstract class QSTile<TState extends State> implements Listenable {
// optional
}
+ protected void handleLongClick() {
+ // optional
+ }
+
protected void handleRefreshState(Object arg) {
handleUpdateState(mTmpState, arg);
final boolean changed = mTmpState.copyTo(mState);
@@ -216,12 +224,13 @@ public abstract class QSTile<TState extends State> implements Listenable {
private static final int SET_CALLBACK = 1;
private static final int CLICK = 2;
private static final int SECONDARY_CLICK = 3;
- private static final int REFRESH_STATE = 4;
- private static final int SHOW_DETAIL = 5;
- private static final int USER_SWITCH = 6;
- private static final int TOGGLE_STATE_CHANGED = 7;
- private static final int SCAN_STATE_CHANGED = 8;
- private static final int DESTROY = 9;
+ private static final int LONG_CLICK = 4;
+ private static final int REFRESH_STATE = 5;
+ private static final int SHOW_DETAIL = 6;
+ private static final int USER_SWITCH = 7;
+ private static final int TOGGLE_STATE_CHANGED = 8;
+ private static final int SCAN_STATE_CHANGED = 9;
+ private static final int DESTROY = 10;
private H(Looper looper) {
super(looper);
@@ -241,6 +250,9 @@ public abstract class QSTile<TState extends State> implements Listenable {
} else if (msg.what == SECONDARY_CLICK) {
name = "handleSecondaryClick";
handleSecondaryClick();
+ } else if (msg.what == LONG_CLICK) {
+ name = "handleLongClick";
+ handleLongClick();
} else if (msg.what == REFRESH_STATE) {
name = "handleRefreshState";
handleRefreshState(msg.obj);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
index 3d0f47c..bb353d5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileView.java
@@ -63,6 +63,7 @@ public class QSTileView extends ViewGroup {
private boolean mDual;
private OnClickListener mClickPrimary;
private OnClickListener mClickSecondary;
+ private OnLongClickListener mLongClick;
private Drawable mTileBackground;
private RippleDrawable mRipple;
@@ -190,6 +191,7 @@ public class QSTileView extends ViewGroup {
mTopBackgroundView.setOnClickListener(null);
mTopBackgroundView.setClickable(false);
setOnClickListener(mClickPrimary);
+ setOnLongClickListener(mLongClick);
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);
}
@@ -206,9 +208,11 @@ public class QSTileView extends ViewGroup {
}
}
- public void init(OnClickListener clickPrimary, OnClickListener clickSecondary) {
+ public void init(OnClickListener clickPrimary, OnClickListener clickSecondary,
+ OnLongClickListener longClick) {
mClickPrimary = clickPrimary;
mClickSecondary = clickSecondary;
+ mLongClick = longClick;
}
protected View createIcon() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
index a1092a3..e60aa53 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
@@ -18,10 +18,13 @@ package com.android.systemui.qs;
import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.Listenable;
public class UsageTracker implements Listenable {
@@ -65,6 +68,25 @@ public class UsageTracker implements Listenable {
getSharedPrefs().edit().remove(mPrefKey).commit();
}
+ public void showResetConfirmation(String title, final Runnable onConfirmed) {
+ final SystemUIDialog d = new SystemUIDialog(mContext);
+ d.setTitle(title);
+ d.setMessage(mContext.getString(R.string.quick_settings_reset_confirmation_message));
+ d.setNegativeButton(android.R.string.cancel, null);
+ d.setPositiveButton(R.string.quick_settings_reset_confirmation_button,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ reset();
+ if (onConfirmed != null) {
+ onConfirmed.run();
+ }
+ }
+ });
+ d.setCanceledOnTouchOutside(true);
+ d.show();
+ }
+
private SharedPreferences getSharedPrefs() {
return mContext.getSharedPreferences(mContext.getPackageName(), 0);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index a19c29f..b565afa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -88,6 +88,19 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> {
}
@Override
+ protected void handleLongClick() {
+ if (mState.value) return; // don't allow usage reset if inversion is active
+ final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
+ mState.label);
+ mUsageTracker.showResetConfirmation(title, new Runnable() {
+ @Override
+ public void run() {
+ refreshState();
+ }
+ });
+ }
+
+ @Override
protected void handleUpdateState(BooleanState state, Object arg) {
final int value = arg instanceof Integer ? (Integer) arg : mSetting.getValue();
final boolean enabled = value != 0;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 64dab85..bccc753 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -27,6 +27,10 @@ import com.android.systemui.statusbar.policy.HotspotController;
/** Quick settings tile: Hotspot **/
public class HotspotTile extends QSTile<QSTile.BooleanState> {
+ private final AnimationIcon mEnable =
+ new AnimationIcon(R.drawable.ic_hotspot_enable_animation);
+ private final AnimationIcon mDisable =
+ new AnimationIcon(R.drawable.ic_hotspot_disable_animation);
private final HotspotController mController;
private final Callback mCallback = new Callback();
private final UsageTracker mUsageTracker;
@@ -62,6 +66,21 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> {
protected void handleClick() {
final boolean isEnabled = (Boolean) mState.value;
mController.setHotspotEnabled(!isEnabled);
+ mEnable.setAllowAnimation(true);
+ mDisable.setAllowAnimation(true);
+ }
+
+ @Override
+ protected void handleLongClick() {
+ if (mState.value) return; // don't allow usage reset if hotspot is active
+ final String title = mContext.getString(R.string.quick_settings_reset_confirmation_title,
+ mState.label);
+ mUsageTracker.showResetConfirmation(title, new Runnable() {
+ @Override
+ public void run() {
+ refreshState();
+ }
+ });
}
@Override
@@ -71,8 +90,7 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> {
state.label = mContext.getString(R.string.quick_settings_hotspot_label);
state.value = mController.isHotspotEnabled();
- state.icon = ResourceIcon.get(state.visible && state.value ? R.drawable.ic_qs_hotspot_on
- : R.drawable.ic_qs_hotspot_off);
+ state.icon = state.visible && state.value ? mEnable : mDisable;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
index 6fb9cd8..2736530 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
@@ -39,6 +39,8 @@ public class IntentTile extends QSTile<QSTile.State> {
private PendingIntent mOnClick;
private String mOnClickUri;
+ private PendingIntent mOnLongClick;
+ private String mOnLongClickUri;
private int mCurrentUserId;
private IntentTile(Host host, String action) {
@@ -80,15 +82,24 @@ public class IntentTile extends QSTile<QSTile.State> {
@Override
protected void handleClick() {
+ sendIntent("click", mOnClick, mOnClickUri);
+ }
+
+ @Override
+ protected void handleLongClick() {
+ sendIntent("long-click", mOnLongClick, mOnLongClickUri);
+ }
+
+ private void sendIntent(String type, PendingIntent pi, String uri) {
try {
- if (mOnClick != null) {
- mOnClick.send();
- } else if (mOnClickUri != null) {
- final Intent intent = Intent.parseUri(mOnClickUri, Intent.URI_INTENT_SCHEME);
+ if (pi != null) {
+ pi.send();
+ } else if (uri != null) {
+ final Intent intent = Intent.parseUri(uri, Intent.URI_INTENT_SCHEME);
mContext.sendBroadcastAsUser(intent, new UserHandle(mCurrentUserId));
}
} catch (Throwable t) {
- Log.w(TAG, "Error sending click intent", t);
+ Log.w(TAG, "Error sending " + type + " intent", t);
}
}
@@ -120,6 +131,8 @@ public class IntentTile extends QSTile<QSTile.State> {
}
mOnClick = intent.getParcelableExtra("onClick");
mOnClickUri = intent.getStringExtra("onClickUri");
+ mOnLongClick = intent.getParcelableExtra("onLongClick");
+ mOnLongClickUri = intent.getStringExtra("onLongClickUri");
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
diff --git a/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
new file mode 100644
index 0000000..2fa0b58
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recent/ScreenPinningRequest.java
@@ -0,0 +1,283 @@
+/*
+ * 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.recent;
+
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Configuration;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.os.RemoteException;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.recents.model.RecentsTaskLoader;
+
+import java.util.ArrayList;
+
+public class ScreenPinningRequest implements View.OnClickListener {
+ private final Context mContext;
+
+ private final AccessibilityManager mAccessibilityService;
+ private final WindowManager mWindowManager;
+
+ private RequestWindowView mRequestWindow;
+
+ public ScreenPinningRequest(Context context) {
+ mContext = context;
+ mAccessibilityService = (AccessibilityManager)
+ mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ mWindowManager = (WindowManager)
+ mContext.getSystemService(Context.WINDOW_SERVICE);
+ }
+
+ public void clearPrompt() {
+ if (mRequestWindow != null) {
+ mWindowManager.removeView(mRequestWindow);
+ mRequestWindow = null;
+ }
+ }
+
+ public void showPrompt(boolean allowCancel) {
+ clearPrompt();
+
+ mRequestWindow = new RequestWindowView(mContext, allowCancel);
+
+ mRequestWindow.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
+
+ // show the confirmation
+ WindowManager.LayoutParams lp = getWindowLayoutParams();
+ mWindowManager.addView(mRequestWindow, lp);
+ }
+
+ public void onConfigurationChanged() {
+ if (mRequestWindow != null) {
+ mRequestWindow.onConfigurationChanged();
+ }
+ }
+
+ private WindowManager.LayoutParams getWindowLayoutParams() {
+ final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
+ 0
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
+ ,
+ PixelFormat.TRANSLUCENT);
+ lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ lp.setTitle("ScreenPinningConfirmation");
+ lp.gravity = Gravity.FILL;
+ return lp;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v.getId() == R.id.screen_pinning_ok_button || mRequestWindow == v) {
+ try {
+ ActivityManagerNative.getDefault().startLockTaskModeOnCurrent();
+ } catch (RemoteException e) {}
+ }
+ clearPrompt();
+ }
+
+ public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) {
+ return new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT)
+ : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
+ }
+
+ private class RequestWindowView extends FrameLayout {
+ private static final int OFFSET_DP = 96;
+
+ private final ColorDrawable mColor = new ColorDrawable(0);
+ private ValueAnimator mColorAnim;
+ private ViewGroup mLayout;
+ private boolean mShowCancel;
+
+ public RequestWindowView(Context context, boolean showCancel) {
+ super(context);
+ setClickable(true);
+ setOnClickListener(ScreenPinningRequest.this);
+ setBackground(mColor);
+ mShowCancel = showCancel;
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ DisplayMetrics metrics = new DisplayMetrics();
+ mWindowManager.getDefaultDisplay().getMetrics(metrics);
+ float density = metrics.density;
+ boolean isLandscape = isLandscapePhone(mContext);
+
+ inflateView(isLandscape);
+ int bgColor = mContext.getResources().getColor(
+ R.color.screen_pinning_request_window_bg);
+ if (ActivityManager.isHighEndGfx()) {
+ mLayout.setAlpha(0f);
+ if (isLandscape) {
+ mLayout.setTranslationX(OFFSET_DP * density);
+ } else {
+ mLayout.setTranslationY(OFFSET_DP * density);
+ }
+ mLayout.animate()
+ .alpha(1f)
+ .translationX(0)
+ .translationY(0)
+ .setDuration(300)
+ .setInterpolator(new DecelerateInterpolator())
+ .start();
+
+ mColorAnim = ValueAnimator.ofObject(new ArgbEvaluator(), 0, bgColor);
+ mColorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ final int c = (Integer) animation.getAnimatedValue();
+ mColor.setColor(c);
+ }
+ });
+ mColorAnim.setDuration(1000);
+ mColorAnim.start();
+ } else {
+ mColor.setColor(bgColor);
+ }
+
+ IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
+ filter.addAction(Intent.ACTION_SCREEN_OFF);
+ mContext.registerReceiver(mReceiver, filter);
+ }
+
+ private boolean isLandscapePhone(Context context) {
+ Configuration config = mContext.getResources().getConfiguration();
+ return config.orientation == Configuration.ORIENTATION_LANDSCAPE
+ && config.smallestScreenWidthDp < 600;
+ }
+
+ private void inflateView(boolean isLandscape) {
+ // We only want this landscape orientation on <600dp, so rather than handle
+ // resource overlay for -land and -sw600dp-land, just inflate this
+ // other view for this single case.
+ mLayout = (ViewGroup) View.inflate(getContext(), isLandscape
+ ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request,
+ null);
+ // Catch touches so they don't trigger cancel/activate, like outside does.
+ mLayout.setClickable(true);
+ // Status bar is always on the right.
+ mLayout.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+ // Buttons and text do switch sides though.
+ View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
+ buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ mLayout.findViewById(R.id.screen_pinning_text_area)
+ .setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
+ swapChildrenIfRtlAndVertical(buttons);
+
+ ((Button) mLayout.findViewById(R.id.screen_pinning_ok_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ if (mShowCancel) {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setOnClickListener(ScreenPinningRequest.this);
+ } else {
+ ((Button) mLayout.findViewById(R.id.screen_pinning_cancel_button))
+ .setVisibility(View.INVISIBLE);
+ }
+
+ final int description = mAccessibilityService.isEnabled()
+ ? R.string.screen_pinning_description_accessible
+ : R.string.screen_pinning_description;
+ ((TextView) mLayout.findViewById(R.id.screen_pinning_description))
+ .setText(description);
+ final int backBgVisibility =
+ mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE;
+ mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility);
+ mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility);
+
+ addView(mLayout, getRequestLayoutParams(isLandscape));
+ }
+
+ private void swapChildrenIfRtlAndVertical(View group) {
+ if (mContext.getResources().getConfiguration().getLayoutDirection()
+ != View.LAYOUT_DIRECTION_RTL) {
+ return;
+ }
+ LinearLayout linearLayout = (LinearLayout) group;
+ if (linearLayout.getOrientation() == LinearLayout.VERTICAL) {
+ int childCount = linearLayout.getChildCount();
+ ArrayList<View> childList = new ArrayList<>(childCount);
+ for (int i = 0; i < childCount; i++) {
+ childList.add(linearLayout.getChildAt(i));
+ }
+ linearLayout.removeAllViews();
+ for (int i = childCount - 1; i >= 0; i--) {
+ linearLayout.addView(childList.get(i));
+ }
+ }
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ protected void onConfigurationChanged() {
+ removeAllViews();
+ inflateView(isLandscapePhone(mContext));
+ }
+
+ private final Runnable mUpdateLayoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mLayout != null && mLayout.getParent() != null) {
+ mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext)));
+ }
+ }
+ };
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
+ post(mUpdateLayoutRunnable);
+ } else if (intent.getAction().equals(Intent.ACTION_USER_SWITCHED)
+ || intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
+ clearPrompt();
+ }
+ }
+ };
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 76e8181..b5a6dac 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -36,10 +36,12 @@ import android.os.UserHandle;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
+
import com.android.systemui.R;
import com.android.systemui.RecentsComponent;
import com.android.systemui.recents.misc.Console;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.recents.model.RecentsTaskLoadPlan;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskGrouping;
@@ -54,7 +56,7 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/** A proxy implementation for the recents component */
-public class AlternateRecentsComponent {
+public class AlternateRecentsComponent implements ActivityOptions.OnAnimationStartedListener {
final public static String EXTRA_FROM_HOME = "recents.triggeredOverHome";
final public static String EXTRA_FROM_SEARCH_HOME = "recents.triggeredOverSearchHome";
@@ -62,7 +64,11 @@ public class AlternateRecentsComponent {
final public static String EXTRA_FROM_TASK_ID = "recents.activeTaskId";
final public static String EXTRA_TRIGGERED_FROM_ALT_TAB = "recents.triggeredFromAltTab";
final public static String EXTRA_TRIGGERED_FROM_HOME_KEY = "recents.triggeredFromHomeKey";
+ final public static String EXTRA_REUSE_TASK_STACK_VIEWS = "recents.reuseTaskStackViews";
+ final public static String EXTRA_NUM_VISIBLE_TASKS = "recents.numVisibleTasks";
+ final public static String EXTRA_NUM_VISIBLE_THUMBNAILS = "recents.numVisibleThumbnails";
+ final public static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
final public static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
final public static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
@@ -73,11 +79,15 @@ public class AlternateRecentsComponent {
final static String sRecentsActivity = "com.android.systemui.recents.RecentsActivity";
static RecentsComponent.Callbacks sRecentsComponentCallbacks;
+ static RecentsTaskLoadPlan sInstanceLoadPlan;
Context mContext;
LayoutInflater mInflater;
SystemServicesProxy mSystemServicesProxy;
+ Handler mHandler;
boolean mBootCompleted;
+ boolean mStartAnimationTriggered;
+ boolean mCanReuseTaskStackViews = true;
// Task launching
RecentsConfiguration mConfig;
@@ -103,6 +113,7 @@ public class AlternateRecentsComponent {
mInflater = LayoutInflater.from(context);
mContext = context;
mSystemServicesProxy = new SystemServicesProxy(context);
+ mHandler = new Handler();
mTaskStackBounds = new Rect();
}
@@ -127,8 +138,15 @@ public class AlternateRecentsComponent {
}
}
- // When we start, preload the metadata associated with the previous tasks
- RecentsTaskLoader.getInstance().preload(mContext);
+ // When we start, preload the metadata and icons associated with the recent tasks.
+ // We can use a new plan since the caches will be the same.
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ launchOpts.numVisibleTasks = loader.getApplicationIconCacheSize();
+ launchOpts.loadThumbnails = false;
+ loader.loadTasks(mContext, plan, launchOpts);
}
public void onBootCompleted() {
@@ -176,7 +194,11 @@ public class AlternateRecentsComponent {
}
public void onPreloadRecents() {
- // Do nothing
+ // Preload only the raw task list into a new load plan (which will be consumed by the
+ // RecentsActivity)
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ sInstanceLoadPlan.preloadRawTasks(true);
}
public void onCancelPreloadingRecents() {
@@ -185,8 +207,10 @@ public class AlternateRecentsComponent {
void showRelativeAffiliatedTask(boolean showNextTask) {
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- TaskStack stack = loader.getTaskStack(mSystemServicesProxy, mContext.getResources(),
- -1, -1, false, true, null, null);
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
+ TaskStack stack = plan.getTaskStack();
+
// Return early if there are no tasks
if (stack.getTaskCount() == 0) return;
@@ -199,6 +223,7 @@ public class AlternateRecentsComponent {
Task toTask = null;
ActivityOptions launchOpts = null;
int taskCount = tasks.size();
+ int numAffiliatedTasks = 0;
for (int i = 0; i < taskCount; i++) {
Task task = tasks.get(i);
if (task.key.id == runningTask.id) {
@@ -218,16 +243,23 @@ public class AlternateRecentsComponent {
if (toTaskKey != null) {
toTask = stack.findTaskWithId(toTaskKey.id);
}
+ numAffiliatedTasks = group.getTaskCount();
break;
}
}
// Return early if there is no next task
if (toTask == null) {
- if (showNextTask) {
- // XXX: Show the next-task bounce animation
- } else {
- // XXX: Show the prev-task bounce animation
+ if (numAffiliatedTasks > 1) {
+ if (showNextTask) {
+ mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
+ ActivityOptions.makeCustomInPlaceAnimation(mContext,
+ R.anim.recents_launch_next_affiliated_task_bounce));
+ } else {
+ mSystemServicesProxy.startInPlaceAnimationOnFrontMostApplication(
+ ActivityOptions.makeCustomInPlaceAnimation(mContext,
+ R.anim.recents_launch_prev_affiliated_task_bounce));
+ }
}
return;
}
@@ -251,6 +283,8 @@ public class AlternateRecentsComponent {
}
public void onConfigurationChanged(Configuration newConfig) {
+ // Don't reuse task stack views if the configuration changes
+ mCanReuseTaskStackViews = false;
// Reload the header bar layout
reloadHeaderBarLayout();
}
@@ -364,34 +398,39 @@ public class AlternateRecentsComponent {
* Creates the activity options for a unknown state->recents transition.
*/
ActivityOptions getUnknownTransitionActivityOptions() {
+ mStartAnimationTriggered = false;
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_unknown_enter,
- R.anim.recents_from_unknown_exit);
+ R.anim.recents_from_unknown_exit,
+ mHandler, this);
}
/**
* Creates the activity options for a home->recents transition.
*/
ActivityOptions getHomeTransitionActivityOptions(boolean fromSearchHome) {
+ mStartAnimationTriggered = false;
if (fromSearchHome) {
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_search_launcher_enter,
- R.anim.recents_from_search_launcher_exit);
+ R.anim.recents_from_search_launcher_exit,
+ mHandler, this);
}
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_launcher_enter,
- R.anim.recents_from_launcher_exit);
+ R.anim.recents_from_launcher_exit,
+ mHandler, this);
}
/**
* Creates the activity options for an app->recents transition.
*/
ActivityOptions getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo topTask,
- boolean isTopTaskHome) {
+ TaskStack stack, TaskStackView stackView) {
// Update the destination rect
Task toTask = new Task();
- TaskViewTransform toTransform = getThumbnailTransitionTransform(topTask.id, isTopTaskHome,
- toTask);
+ TaskViewTransform toTransform = getThumbnailTransitionTransform(stack, stackView,
+ topTask.id, toTask);
if (toTransform != null && toTask.key != null) {
Rect toTaskRect = toTransform.rect;
int toHeaderWidth = (int) (mHeaderBar.getMeasuredWidth() * toTransform.scale);
@@ -408,9 +447,10 @@ public class AlternateRecentsComponent {
c.setBitmap(null);
}
+ mStartAnimationTriggered = false;
return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mStatusBarView,
thumbnail, toTaskRect.left, toTaskRect.top, toTaskRect.width(),
- toTaskRect.height(), null);
+ toTaskRect.height(), this);
}
// If both the screenshot and thumbnail fails, then just fall back to the default transition
@@ -418,16 +458,8 @@ public class AlternateRecentsComponent {
}
/** Returns the transition rect for the given task id. */
- TaskViewTransform getThumbnailTransitionTransform(int runningTaskId, boolean isTopTaskHome,
- Task runningTaskOut) {
- // Get the stack of tasks that we are animating into
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- TaskStack stack = loader.getTaskStack(mSystemServicesProxy, mContext.getResources(),
- runningTaskId, -1, false, isTopTaskHome, null, null);
- if (stack.getTaskCount() == 0) {
- return null;
- }
-
+ TaskViewTransform getThumbnailTransitionTransform(TaskStack stack, TaskStackView stackView,
+ int runningTaskId, Task runningTaskOut) {
// Find the running task in the TaskStack
Task task = null;
ArrayList<Task> tasks = stack.getTasks();
@@ -449,30 +481,42 @@ public class AlternateRecentsComponent {
}
// Get the transform for the running task
- mDummyStackView.updateMinMaxScrollForStack(stack, mTriggeredFromAltTab, isTopTaskHome);
- mDummyStackView.getScroller().setStackScrollToInitialState();
- mTmpTransform = mDummyStackView.getStackAlgorithm().getStackTransform(task,
- mDummyStackView.getScroller().getStackScroll(), mTmpTransform, null);
+ stackView.getScroller().setStackScrollToInitialState();
+ mTmpTransform = stackView.getStackAlgorithm().getStackTransform(task,
+ stackView.getScroller().getStackScroll(), mTmpTransform, null);
return mTmpTransform;
}
/** Starts the recents activity */
void startRecentsActivity(ActivityManager.RunningTaskInfo topTask, boolean isTopTaskHome) {
- // If Recents is not the front-most activity and we should animate into it. If
- // the activity at the root of the top task stack in the home stack, then we just do a
- // simple transition. Otherwise, we animate to the rects defined by the Recents service,
- // which can differ depending on the number of items in the list.
- SystemServicesProxy ssp = mSystemServicesProxy;
- List<ActivityManager.RecentTaskInfo> recentTasks =
- ssp.getRecentTasks(3, UserHandle.CURRENT.getIdentifier(), isTopTaskHome);
- boolean useThumbnailTransition = !isTopTaskHome;
- boolean hasRecentTasks = !recentTasks.isEmpty();
+ if (sInstanceLoadPlan == null) {
+ // Create a new load plan if onPreloadRecents() was never triggered
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ }
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ loader.preloadTasks(sInstanceLoadPlan, isTopTaskHome);
+ TaskStack stack = sInstanceLoadPlan.getTaskStack();
+
+ // Prepare the dummy stack for the transition
+ mDummyStackView.updateMinMaxScrollForStack(stack, mTriggeredFromAltTab, isTopTaskHome);
+ TaskStackViewLayoutAlgorithm.VisibilityReport stackVr =
+ mDummyStackView.computeStackVisibilityReport();
+ boolean hasRecentTasks = stack.getTaskCount() > 0;
+ boolean useThumbnailTransition = !isTopTaskHome && hasRecentTasks;
if (useThumbnailTransition) {
+ // Ensure that we load the running task's icon
+ RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options();
+ launchOpts.runningTaskId = topTask.id;
+ launchOpts.loadThumbnails = false;
+ loader.loadTasks(mContext, sInstanceLoadPlan, launchOpts);
+
// Try starting with a thumbnail transition
- ActivityOptions opts = getThumbnailTransitionActivityOptions(topTask, isTopTaskHome);
+ ActivityOptions opts = getThumbnailTransitionActivityOptions(topTask, stack,
+ mDummyStackView);
if (opts != null) {
- startAlternateRecentsActivity(topTask, opts, EXTRA_FROM_APP_THUMBNAIL);
+ startAlternateRecentsActivity(topTask, opts, EXTRA_FROM_APP_THUMBNAIL, stackVr);
} else {
// Fall through below to the non-thumbnail transition
useThumbnailTransition = false;
@@ -506,11 +550,11 @@ public class AlternateRecentsComponent {
ActivityOptions opts = getHomeTransitionActivityOptions(fromSearchHome);
startAlternateRecentsActivity(topTask, opts,
- fromSearchHome ? EXTRA_FROM_SEARCH_HOME : EXTRA_FROM_HOME);
+ fromSearchHome ? EXTRA_FROM_SEARCH_HOME : EXTRA_FROM_HOME, stackVr);
} else {
// Otherwise we do the normal fade from an unknown source
ActivityOptions opts = getUnknownTransitionActivityOptions();
- startAlternateRecentsActivity(topTask, opts, EXTRA_FROM_HOME);
+ startAlternateRecentsActivity(topTask, opts, EXTRA_FROM_HOME, stackVr);
}
}
mLastToggleTime = System.currentTimeMillis();
@@ -518,7 +562,8 @@ public class AlternateRecentsComponent {
/** Starts the recents activity */
void startAlternateRecentsActivity(ActivityManager.RunningTaskInfo topTask,
- ActivityOptions opts, String extraFlag) {
+ ActivityOptions opts, String extraFlag,
+ TaskStackViewLayoutAlgorithm.VisibilityReport vr) {
Intent intent = new Intent(sToggleRecentsAction);
intent.setClassName(sRecentsPackage, sRecentsActivity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
@@ -529,11 +574,15 @@ public class AlternateRecentsComponent {
}
intent.putExtra(EXTRA_TRIGGERED_FROM_ALT_TAB, mTriggeredFromAltTab);
intent.putExtra(EXTRA_FROM_TASK_ID, (topTask != null) ? topTask.id : -1);
+ intent.putExtra(EXTRA_REUSE_TASK_STACK_VIEWS, mCanReuseTaskStackViews);
+ intent.putExtra(EXTRA_NUM_VISIBLE_TASKS, vr.numVisibleTasks);
+ intent.putExtra(EXTRA_NUM_VISIBLE_THUMBNAILS, vr.numVisibleThumbnails);
if (opts != null) {
mContext.startActivityAsUser(intent, opts.toBundle(), UserHandle.CURRENT);
} else {
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
}
+ mCanReuseTaskStackViews = true;
}
/** Sets the RecentsComponent callbacks. */
@@ -547,4 +596,51 @@ public class AlternateRecentsComponent {
sRecentsComponentCallbacks.onVisibilityChanged(visible);
}
}
+
+ /**
+ * Returns the preloaded load plan and invalidates it.
+ */
+ public static RecentsTaskLoadPlan consumeInstanceLoadPlan() {
+ RecentsTaskLoadPlan plan = sInstanceLoadPlan;
+ sInstanceLoadPlan = null;
+ return plan;
+ }
+
+ /**** OnAnimationStartedListener Implementation ****/
+
+ @Override
+ public void onAnimationStarted() {
+ // Notify recents to start the enter animation
+ if (!mStartAnimationTriggered) {
+ // There can be a race condition between the start animation callback and
+ // the start of the new activity (where we register the receiver that listens
+ // to this broadcast, so we add our own receiver and if that gets called, then
+ // we know the activity has not yet started and we can retry sending the broadcast.
+ BroadcastReceiver fallbackReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (getResultCode() == Activity.RESULT_OK) {
+ mStartAnimationTriggered = true;
+ return;
+ }
+
+ // Schedule for the broadcast to be sent again after some time
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ onAnimationStarted();
+ }
+ }, 25);
+ }
+ };
+
+ // Send the broadcast to notify Recents that the animation has started
+ Intent intent = new Intent(ACTION_START_ENTER_ANIMATION);
+ intent.setPackage(mContext.getPackageName());
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
+ Intent.FLAG_RECEIVER_FOREGROUND);
+ mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
+ fallbackReceiver, null, Activity.RESULT_CANCELED, null, null);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index 9b84d2e..4c76af7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -64,11 +64,6 @@ public class Constants {
public static String DebugModeVersion = "A";
}
- public static class RecentsTaskLoader {
- // XXX: This should be calculated on the first load
- public static final int PreloadFirstTasksCount = 6;
- }
-
public static class TaskStackView {
public static final int TaskStackOverscrollRange = 150;
public static final int FilterStartDelay = 25;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index d2c55f7..9a7fec4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -28,19 +28,19 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
import android.os.UserHandle;
import android.util.Pair;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewStub;
import android.widget.Toast;
+
import com.android.systemui.R;
import com.android.systemui.recents.misc.DebugTrigger;
import com.android.systemui.recents.misc.ReferenceCountedTrigger;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.misc.Utilities;
+import com.android.systemui.recents.model.RecentsTaskLoadPlan;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.SpaceNode;
import com.android.systemui.recents.model.Task;
@@ -49,6 +49,8 @@ import com.android.systemui.recents.views.DebugOverlayView;
import com.android.systemui.recents.views.RecentsView;
import com.android.systemui.recents.views.SystemBarScrimViews;
import com.android.systemui.recents.views.ViewAnimation;
+import com.android.systemui.statusbar.phone.PhoneStatusBar;
+import com.android.systemui.SystemUIApplication;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException;
@@ -81,6 +83,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Runnables to finish the Recents activity
FinishRecentsRunnable mFinishLaunchHomeRunnable;
+ private PhoneStatusBar mStatusBar;
+
/**
* A common Runnable to finish Recents either by calling finish() (with a custom animation) or
* launching Home with some ActivityOptions. Generally we always launch home when we exit
@@ -142,6 +146,12 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
} else if (action.equals(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
// If we are toggling Recents, then first unfilter any filtered stacks first
dismissRecentsToFocusedTaskOrHome(true);
+ } else if (action.equals(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION)) {
+ // Trigger the enter animation
+ onEnterAnimationTriggered();
+ // Notify the fallback receiver that we have successfully got the broadcast
+ // See AlternateRecentsComponent.onAnimationStarted()
+ setResultCode(Activity.RESULT_OK);
}
}
};
@@ -156,8 +166,10 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
// When the screen turns off, dismiss Recents to Home
dismissRecentsToHome(false);
- // Start preloading some tasks in the background
- RecentsTaskLoader.getInstance().preload(RecentsActivity.this);
+ // Preload the metadata for all tasks in the background
+ RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
+ RecentsTaskLoadPlan plan = loader.createLoadPlan(context);
+ loader.preloadTasks(plan, true /* isTopTaskHome */);
} else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
// When the search activity changes, update the Search widget
refreshSearchWidget();
@@ -180,6 +192,10 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Update the configuration based on the launch intent
boolean fromSearchHome = launchIntent.getBooleanExtra(
AlternateRecentsComponent.EXTRA_FROM_SEARCH_HOME, false);
+ int numVisibleTasks = launchIntent.getIntExtra(
+ AlternateRecentsComponent.EXTRA_NUM_VISIBLE_TASKS, 0);
+ int numVisibleThumbnails = launchIntent.getIntExtra(
+ AlternateRecentsComponent.EXTRA_NUM_VISIBLE_THUMBNAILS, 0);
mConfig.launchedFromHome = fromSearchHome || launchIntent.getBooleanExtra(
AlternateRecentsComponent.EXTRA_FROM_HOME, false);
mConfig.launchedFromAppWithThumbnail = launchIntent.getBooleanExtra(
@@ -188,17 +204,32 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
AlternateRecentsComponent.EXTRA_FROM_TASK_ID, -1);
mConfig.launchedWithAltTab = launchIntent.getBooleanExtra(
AlternateRecentsComponent.EXTRA_TRIGGERED_FROM_ALT_TAB, false);
+ mConfig.launchedReuseTaskStackViews = launchIntent.getBooleanExtra(
+ AlternateRecentsComponent.EXTRA_REUSE_TASK_STACK_VIEWS, false);
- // Load all the tasks
+ // If AlternateRecentsComponent has preloaded a load plan, then use that to prevent
+ // reconstructing the task stack
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- SpaceNode root = loader.reload(this,
- Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount,
- mConfig.launchedFromHome);
+ RecentsTaskLoadPlan plan = AlternateRecentsComponent.consumeInstanceLoadPlan();
+ if (plan == null) {
+ plan = loader.createLoadPlan(this);
+ loader.preloadTasks(plan, mConfig.launchedFromHome);
+ }
+
+ // Start loading tasks according to the load plan
+ RecentsTaskLoadPlan.Options loadOpts = new RecentsTaskLoadPlan.Options();
+ loadOpts.runningTaskId = mConfig.launchedToTaskId;
+ loadOpts.numVisibleTasks = numVisibleTasks;
+ loadOpts.numVisibleTaskThumbnails = numVisibleThumbnails;
+ loader.loadTasks(this, plan, loadOpts);
+
+ SpaceNode root = plan.getSpaceNode();
ArrayList<TaskStack> stacks = root.getStacks();
- if (!stacks.isEmpty()) {
- mRecentsView.setTaskStacks(root.getStacks());
+ boolean hasTasks = root.hasTasks();
+ if (hasTasks) {
+ mRecentsView.setTaskStacks(stacks);
}
- mConfig.launchedWithNoRecentTasks = !root.hasTasks();
+ mConfig.launchedWithNoRecentTasks = !hasTasks;
// Create the home intent runnable
Intent homeIntent = new Intent(Intent.ACTION_MAIN, null);
@@ -397,8 +428,12 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
// Update if we are getting a configuration change
if (savedInstanceState != null) {
+ // Update RecentsConfiguration
+ mConfig = RecentsConfiguration.reinitialize(this,
+ RecentsTaskLoader.getInstance().getSystemServicesProxy());
mConfig.updateOnConfigurationChange();
- onConfigurationChange();
+ // Trigger the enter animation
+ onEnterAnimationTriggered();
}
// Start listening for widget package changes if there is one bound, post it since we don't
@@ -416,10 +451,15 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
}
});
}
+
+ mStatusBar = ((SystemUIApplication) getApplication())
+ .getComponent(PhoneStatusBar.class);
}
/** Inflates the debug overlay if debug mode is enabled. */
void inflateDebugOverlay() {
+ if (!Constants.DebugFlags.App.EnableDebugMode) return;
+
if (mConfig.debugModeEnabled && mDebugOverlay == null) {
// Inflate the overlay and seek bars
mDebugOverlay = (DebugOverlayView) mDebugOverlayStub.inflate();
@@ -428,19 +468,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
}
}
- /** Called when the configuration changes. */
- void onConfigurationChange() {
- // Update RecentsConfiguration
- mConfig = RecentsConfiguration.reinitialize(this,
- RecentsTaskLoader.getInstance().getSystemServicesProxy());
-
- // Try and start the enter animation (or restart it on configuration changed)
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
- mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
- // Animate the SystemUI scrim views
- mScrimViews.startEnterRecentsAnimation();
- }
-
/** Handles changes to the activity visibility. */
void onRecentsActivityVisibilityChanged(boolean visible) {
if (!visible) {
@@ -474,6 +501,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
IntentFilter filter = new IntentFilter();
filter.addAction(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY);
filter.addAction(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY);
+ filter.addAction(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
// Register any broadcast receivers for the task loader
@@ -492,8 +520,8 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
protected void onStop() {
super.onStop();
- // Remove all the views
- mRecentsView.removeAllTaskStacks();
+ // Notify the views that we are no longer visible
+ mRecentsView.onRecentsHidden();
// Unregister the RecentsService receiver
unregisterReceiver(mServiceBroadcastReceiver);
@@ -515,8 +543,7 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
}
}
- @Override
- public void onEnterAnimationComplete() {
+ public void onEnterAnimationTriggered() {
// Try and start the enter animation (or restart it on configuration changed)
ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
@@ -584,7 +611,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
/** Called when debug mode is triggered */
public void onDebugModeTriggered() {
-
if (mConfig.developerOptionsEnabled) {
SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
@@ -592,13 +618,17 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
mConfig.debugModeEnabled = false;
inflateDebugOverlay();
- mDebugOverlay.disable();
+ if (mDebugOverlay != null) {
+ mDebugOverlay.disable();
+ }
} else {
// Enable the debug mode
settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
mConfig.debugModeEnabled = true;
inflateDebugOverlay();
- mDebugOverlay.enable();
+ if (mDebugOverlay != null) {
+ mDebugOverlay.enable();
+ }
}
Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion + ") " +
(mConfig.debugModeEnabled ? "Enabled" : "Disabled") + ", please restart Recents now",
@@ -631,6 +661,13 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView
mFinishLaunchHomeRunnable.run();
}
+ @Override
+ public void onScreenPinningRequest() {
+ if (mStatusBar != null) {
+ mStatusBar.showScreenPinningRequest(false);
+ }
+ }
+
/**** RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks Implementation ****/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index bfea3f7..e0c76b1 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -115,8 +115,8 @@ public class RecentsConfiguration {
public boolean launchedWithAltTab;
public boolean launchedWithNoRecentTasks;
public boolean launchedFromAppWithThumbnail;
- public boolean launchedFromAppWithScreenshot;
public boolean launchedFromHome;
+ public boolean launchedReuseTaskStackViews;
public int launchedToTaskId;
/** Misc **/
@@ -308,6 +308,7 @@ public class RecentsConfiguration {
launchedWithNoRecentTasks = false;
launchedFromAppWithThumbnail = false;
launchedFromHome = false;
+ launchedReuseTaskStackViews = false;
launchedToTaskId = -1;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/DozeTrigger.java b/packages/SystemUI/src/com/android/systemui/recents/misc/DozeTrigger.java
index 4456066..735f79f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/DozeTrigger.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/DozeTrigger.java
@@ -82,4 +82,9 @@ public class DozeTrigger {
public boolean hasTriggered() {
return mHasTriggered;
}
+
+ /** Resets the doze trigger state. */
+ public void resetTrigger() {
+ mHasTriggered = false;
+ }
}
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 b661385..9a4bd08 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -48,12 +48,14 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
import android.util.Pair;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.IWindowManager;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
@@ -242,6 +244,7 @@ public class SystemServicesProxy {
Bitmap thumbnail = SystemServicesProxy.getThumbnail(mAm, taskId);
if (thumbnail != null) {
+ thumbnail.setHasAlpha(false);
// We use a dumb heuristic for now, if the thumbnail is purely transparent in the top
// left pixel, then assume the whole thumbnail is transparent. Generally, proper
// screenshots are always composed onto a bitmap that has no alpha.
@@ -429,6 +432,7 @@ public class SystemServicesProxy {
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
AppWidgetProviderInfo.WIDGET_CATEGORY_SEARCHBOX);
if (!mAwm.bindAppWidgetIdIfAllowed(searchWidgetId, searchWidgetInfo.provider, opts)) {
+ host.deleteAppWidgetId(searchWidgetId);
return null;
}
return new Pair<Integer, AppWidgetProviderInfo>(searchWidgetId, searchWidgetInfo);
@@ -492,17 +496,6 @@ public class SystemServicesProxy {
}
/**
- * Locks the current task.
- */
- public void lockCurrentTask() {
- if (mIam == null) return;
-
- try {
- mIam.startLockTaskModeOnCurrent();
- } catch (RemoteException e) {}
- }
-
- /**
* Takes a screenshot of the current surface.
*/
public Bitmap takeScreenshot() {
@@ -532,4 +525,15 @@ public class SystemServicesProxy {
}
return false;
}
+
+ /** Starts an in-place animation on the front most application windows. */
+ public void startInPlaceAnimationOnFrontMostApplication(ActivityOptions opts) {
+ if (mIam == null) return;
+
+ try {
+ mIam.startInPlaceAnimationOnFrontMostApplication(opts);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
new file mode 100644
index 0000000..41251c8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -0,0 +1,224 @@
+/*
+ * 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.model;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.util.Log;
+import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.misc.SystemServicesProxy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+
+/**
+ * This class stores the loading state as it goes through multiple stages of loading:
+ * - preloadRawTasks() will load the raw set of recents tasks from the system
+ * - preloadPlan() will construct a new task stack with all metadata and only icons and thumbnails
+ * that are currently in the cache
+ * - executePlan() will actually load and fill in the icons and thumbnails according to the load
+ * options specified, such that we can transition into the Recents activity seamlessly
+ */
+public class RecentsTaskLoadPlan {
+ static String TAG = "RecentsTaskLoadPlan";
+ static boolean DEBUG = false;
+
+ /** The set of conditions to load tasks. */
+ public static class Options {
+ public int runningTaskId = -1;
+ public boolean loadIcons = true;
+ public boolean loadThumbnails = true;
+ public int numVisibleTasks = 0;
+ public int numVisibleTaskThumbnails = 0;
+ }
+
+ Context mContext;
+ RecentsConfiguration mConfig;
+ SystemServicesProxy mSystemServicesProxy;
+
+ List<ActivityManager.RecentTaskInfo> mRawTasks;
+ TaskStack mStack;
+ HashMap<Task.ComponentNameKey, ActivityInfoHandle> mActivityInfoCache =
+ new HashMap<Task.ComponentNameKey, ActivityInfoHandle>();
+
+ /** Package level ctor */
+ RecentsTaskLoadPlan(Context context, RecentsConfiguration config, SystemServicesProxy ssp) {
+ mContext = context;
+ mConfig = config;
+ mSystemServicesProxy = ssp;
+ }
+
+ /**
+ * An optimization to preload the raw list of tasks.
+ */
+ public synchronized void preloadRawTasks(boolean isTopTaskHome) {
+ mRawTasks = mSystemServicesProxy.getRecentTasks(mConfig.maxNumTasksToLoad,
+ UserHandle.CURRENT.getIdentifier(), isTopTaskHome);
+ Collections.reverse(mRawTasks);
+
+ if (DEBUG) Log.d(TAG, "preloadRawTasks, tasks: " + mRawTasks.size());
+ }
+
+ /**
+ * Preloads the list of recent tasks from the system. After this call, the TaskStack will
+ * have a list of all the recent tasks with their metadata, not including icons or
+ * thumbnails which were not cached and have to be loaded.
+ */
+ synchronized void preloadPlan(RecentsTaskLoader loader, boolean isTopTaskHome) {
+ if (DEBUG) Log.d(TAG, "preloadPlan");
+
+ mActivityInfoCache.clear();
+ mStack = new TaskStack();
+
+ Resources res = mContext.getResources();
+ ArrayList<Task> loadedTasks = new ArrayList<Task>();
+ if (mRawTasks == null) {
+ preloadRawTasks(isTopTaskHome);
+ }
+ int taskCount = mRawTasks.size();
+ for (int i = 0; i < taskCount; i++) {
+ ActivityManager.RecentTaskInfo t = mRawTasks.get(i);
+
+ // Compose the task key
+ Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.baseIntent, t.userId,
+ t.firstActiveTime, t.lastActiveTime);
+
+ // Get an existing activity info handle if possible
+ Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
+ ActivityInfoHandle infoHandle;
+ boolean hadCachedActivityInfo = false;
+ if (mActivityInfoCache.containsKey(cnKey)) {
+ infoHandle = mActivityInfoCache.get(cnKey);
+ hadCachedActivityInfo = true;
+ } else {
+ infoHandle = new ActivityInfoHandle();
+ }
+
+ // Load the label, icon, and color
+ String activityLabel = loader.getAndUpdateActivityLabel(taskKey, t.taskDescription,
+ mSystemServicesProxy, infoHandle);
+ Drawable activityIcon = loader.getAndUpdateActivityIcon(taskKey, t.taskDescription,
+ mSystemServicesProxy, res, infoHandle, false);
+ int activityColor = loader.getActivityPrimaryColor(t.taskDescription, mConfig);
+
+ // Update the activity info cache
+ if (!hadCachedActivityInfo && infoHandle.info != null) {
+ mActivityInfoCache.put(cnKey, infoHandle);
+ }
+
+ Bitmap icon = t.taskDescription != null
+ ? t.taskDescription.getInMemoryIcon()
+ : null;
+ String iconFilename = t.taskDescription != null
+ ? t.taskDescription.getIconFilename()
+ : null;
+
+ // Add the task to the stack
+ Task task = new Task(taskKey, (t.id != RecentsTaskLoader.INVALID_TASK_ID),
+ t.affiliatedTaskId, t.affiliatedTaskColor, activityLabel, activityIcon,
+ activityColor, (i == (taskCount - 1)), mConfig.lockToAppEnabled, icon,
+ iconFilename);
+ task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy, false);
+ loadedTasks.add(task);
+ }
+ mStack.setTasks(loadedTasks);
+ mStack.createAffiliatedGroupings(mConfig);
+
+ // Assertion
+ if (mStack.getTaskCount() != mRawTasks.size()) {
+ throw new RuntimeException("Loading failed");
+ }
+ }
+
+ /**
+ * Called to apply the actual loading based on the specified conditions.
+ */
+ synchronized void executePlan(Options opts, RecentsTaskLoader loader) {
+ if (DEBUG) Log.d(TAG, "executePlan, # tasks: " + opts.numVisibleTasks +
+ ", # thumbnails: " + opts.numVisibleTaskThumbnails +
+ ", running task id: " + opts.runningTaskId);
+
+ Resources res = mContext.getResources();
+
+ // Iterate through each of the tasks and load them according to the load conditions.
+ ArrayList<Task> tasks = mStack.getTasks();
+ int taskCount = tasks.size();
+ for (int i = 0; i < taskCount; i++) {
+ ActivityManager.RecentTaskInfo t = mRawTasks.get(i);
+ Task task = tasks.get(i);
+ Task.TaskKey taskKey = task.key;
+
+ // Get an existing activity info handle if possible
+ Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
+ ActivityInfoHandle infoHandle;
+ boolean hadCachedActivityInfo = false;
+ if (mActivityInfoCache.containsKey(cnKey)) {
+ infoHandle = mActivityInfoCache.get(cnKey);
+ hadCachedActivityInfo = true;
+ } else {
+ infoHandle = new ActivityInfoHandle();
+ }
+
+ boolean isRunningTask = (task.key.id == opts.runningTaskId);
+ boolean isVisibleTask = i >= (taskCount - opts.numVisibleTasks);
+ boolean isVisibleThumbnail = i >= (taskCount - opts.numVisibleTaskThumbnails);
+
+ if (opts.loadIcons && (isRunningTask || isVisibleTask)) {
+ if (task.activityIcon == null) {
+ if (DEBUG) Log.d(TAG, "\tLoading icon: " + taskKey);
+ task.activityIcon = loader.getAndUpdateActivityIcon(taskKey, t.taskDescription,
+ mSystemServicesProxy, res, infoHandle, true);
+ }
+ }
+ if (opts.loadThumbnails && (isRunningTask || isVisibleThumbnail)) {
+ if (task.thumbnail == null) {
+ if (DEBUG) Log.d(TAG, "\tLoading thumbnail: " + taskKey);
+ task.thumbnail = loader.getAndUpdateThumbnail(taskKey, mSystemServicesProxy,
+ true);
+ }
+ }
+
+ // Update the activity info cache
+ if (!hadCachedActivityInfo && infoHandle.info != null) {
+ mActivityInfoCache.put(cnKey, infoHandle);
+ }
+ }
+ }
+
+ /**
+ * Composes and returns a TaskStack from the preloaded list of recent tasks.
+ */
+ public TaskStack getTaskStack() {
+ return mStack;
+ }
+
+ /**
+ * Composes and returns a SpaceNode from the preloaded list of recent tasks.
+ */
+ public SpaceNode getSpaceNode() {
+ SpaceNode node = new SpaceNode();
+ node.setStack(mStack);
+ return node;
+ }
+}
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 b4f62d5..6fd738d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -26,7 +26,6 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.UserHandle;
import android.util.Log;
import com.android.systemui.R;
@@ -34,11 +33,7 @@ import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.SystemServicesProxy;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -205,9 +200,7 @@ class TaskResourceLoader implements Runnable {
// Load the thumbnail if it is stale or we haven't cached one yet
if (cachedThumbnail == null) {
cachedThumbnail = ssp.getTaskThumbnail(t.key.id);
- if (cachedThumbnail != null) {
- cachedThumbnail.setHasAlpha(false);
- } else {
+ if (cachedThumbnail == null) {
cachedThumbnail = mDefaultThumbnail;
}
mThumbnailCache.put(t.key, cachedThumbnail);
@@ -260,6 +253,7 @@ public class RecentsTaskLoader {
private static final String TAG = "RecentsTaskLoader";
static RecentsTaskLoader sInstance;
+ static int INVALID_TASK_ID = -1;
SystemServicesProxy mSystemServicesProxy;
DrawableLruCache mApplicationIconCache;
@@ -272,6 +266,7 @@ public class RecentsTaskLoader {
int mMaxThumbnailCacheSize;
int mMaxIconCacheSize;
+ int mNumVisibleTasksLoaded;
BitmapDrawable mDefaultApplicationIcon;
Bitmap mDefaultThumbnail;
@@ -324,31 +319,45 @@ public class RecentsTaskLoader {
return mSystemServicesProxy;
}
- /** Gets the list of recent tasks, ordered from back to front. */
- private static List<ActivityManager.RecentTaskInfo> getRecentTasks(SystemServicesProxy ssp,
- boolean isTopTaskHome) {
- RecentsConfiguration config = RecentsConfiguration.getInstance();
- List<ActivityManager.RecentTaskInfo> tasks =
- ssp.getRecentTasks(config.maxNumTasksToLoad, UserHandle.CURRENT.getIdentifier(),
- isTopTaskHome);
- Collections.reverse(tasks);
- return tasks;
+ /** Returns the activity label using as many cached values as we can. */
+ public String getAndUpdateActivityLabel(Task.TaskKey taskKey,
+ ActivityManager.TaskDescription td, SystemServicesProxy ssp,
+ ActivityInfoHandle infoHandle) {
+ // Return the task description label if it exists
+ if (td != null && td.getLabel() != null) {
+ return td.getLabel();
+ }
+ // Return the cached activity label if it exists
+ String label = mActivityLabelCache.getAndInvalidateIfModified(taskKey);
+ if (label != null) {
+ return label;
+ }
+ // All short paths failed, load the label from the activity info and cache it
+ if (infoHandle.info == null) {
+ infoHandle.info = ssp.getActivityInfo(taskKey.baseIntent.getComponent(),
+ taskKey.userId);
+ }
+ if (infoHandle.info != null) {
+ label = ssp.getActivityLabel(infoHandle.info);
+ mActivityLabelCache.put(taskKey, label);
+ } else {
+ Log.w(TAG, "Missing ActivityInfo for " + taskKey.baseIntent.getComponent()
+ + " u=" + taskKey.userId);
+ }
+ return label;
}
/** Returns the activity icon using as many cached values as we can. */
public Drawable getAndUpdateActivityIcon(Task.TaskKey taskKey,
- ActivityManager.TaskDescription td, SystemServicesProxy ssp,
- Resources res, ActivityInfoHandle infoHandle, boolean preloadTask) {
+ ActivityManager.TaskDescription td, SystemServicesProxy ssp,
+ Resources res, ActivityInfoHandle infoHandle, boolean loadIfNotCached) {
// Return the cached activity icon if it exists
Drawable icon = mApplicationIconCache.getAndInvalidateIfModified(taskKey);
if (icon != null) {
return icon;
}
- // If we are preloading this task, continue to load the task description icon or the
- // activity icon
- if (preloadTask) {
-
+ if (loadIfNotCached) {
// Return and cache the task description icon if it exists
Drawable tdDrawable = mLoader.getTaskDescriptionIcon(taskKey, td.getInMemoryIcon(),
td.getIconFilename(), ssp, res);
@@ -370,36 +379,29 @@ public class RecentsTaskLoader {
}
}
}
- // If we couldn't load any icon, return null
+ // We couldn't load any icon
return null;
}
- /** Returns the activity label using as many cached values as we can. */
- public String getAndUpdateActivityLabel(Task.TaskKey taskKey,
- ActivityManager.TaskDescription td, SystemServicesProxy ssp,
- ActivityInfoHandle infoHandle) {
- // Return the task description label if it exists
- if (td != null && td.getLabel() != null) {
- return td.getLabel();
+ /** Returns the bitmap using as many cached values as we can. */
+ public Bitmap getAndUpdateThumbnail(Task.TaskKey taskKey, SystemServicesProxy ssp,
+ boolean loadIfNotCached) {
+ // Return the cached thumbnail if it exists
+ Bitmap thumbnail = mThumbnailCache.getAndInvalidateIfModified(taskKey);
+ if (thumbnail != null) {
+ return thumbnail;
}
- // Return the cached activity label if it exists
- String label = mActivityLabelCache.getAndInvalidateIfModified(taskKey);
- if (label != null) {
- return label;
- }
- // All short paths failed, load the label from the activity info and cache it
- if (infoHandle.info == null) {
- infoHandle.info = ssp.getActivityInfo(taskKey.baseIntent.getComponent(),
- taskKey.userId);
- }
- if (infoHandle.info != null) {
- label = ssp.getActivityLabel(infoHandle.info);
- mActivityLabelCache.put(taskKey, label);
- } else {
- Log.w(TAG, "Missing ActivityInfo for " + taskKey.baseIntent.getComponent()
- + " u=" + taskKey.userId);
+
+ if (loadIfNotCached) {
+ // Load the thumbnail from the system
+ thumbnail = ssp.getTaskThumbnail(taskKey.id);
+ if (thumbnail != null) {
+ mThumbnailCache.put(taskKey, thumbnail);
+ return thumbnail;
+ }
}
- return label;
+ // We couldn't load any thumbnail
+ return null;
}
/** Returns the activity's primary color. */
@@ -411,124 +413,33 @@ public class RecentsTaskLoader {
return config.taskBarViewDefaultBackgroundColor;
}
- /** Reload the set of recent tasks */
- public SpaceNode reload(Context context, int preloadCount, boolean isTopTaskHome) {
- ArrayList<Task.TaskKey> taskKeys = new ArrayList<Task.TaskKey>();
- ArrayList<Task> tasksToLoad = new ArrayList<Task>();
- TaskStack stack = getTaskStack(mSystemServicesProxy, context.getResources(),
- -1, preloadCount, true, isTopTaskHome, taskKeys, tasksToLoad);
- SpaceNode root = new SpaceNode();
- root.setStack(stack);
-
- // Start the task loader and add all the tasks we need to load
- mLoadQueue.addTasks(tasksToLoad);
- mLoader.start(context);
-
- return root;
+ /** Returns the size of the app icon cache. */
+ public int getApplicationIconCacheSize() {
+ return mMaxIconCacheSize;
}
- /** Preloads the set of recent tasks (not including thumbnails). */
- public void preload(Context context) {
- ArrayList<Task> tasksToLoad = new ArrayList<Task>();
- getTaskStack(mSystemServicesProxy, context.getResources(),
- -1, -1, true, true, null, tasksToLoad);
-
- // Start the task loader and add all the tasks we need to load
- mLoadQueue.addTasks(tasksToLoad);
- mLoader.start(context);
- }
-
- /** Creates a lightweight stack of the current recent tasks, without thumbnails and icons. */
- public synchronized TaskStack getTaskStack(SystemServicesProxy ssp, Resources res,
- int preloadTaskId, int preloadTaskCount,
- boolean loadTaskThumbnails, boolean isTopTaskHome,
- List<Task.TaskKey> taskKeysOut, List<Task> tasksToLoadOut) {
+ public RecentsTaskLoadPlan createLoadPlan(Context context) {
RecentsConfiguration config = RecentsConfiguration.getInstance();
- List<ActivityManager.RecentTaskInfo> tasks = getRecentTasks(ssp, isTopTaskHome);
- HashMap<Task.ComponentNameKey, ActivityInfoHandle> activityInfoCache =
- new HashMap<Task.ComponentNameKey, ActivityInfoHandle>();
- ArrayList<Task> tasksToAdd = new ArrayList<Task>();
- TaskStack stack = new TaskStack();
-
- int taskCount = tasks.size();
- for (int i = 0; i < taskCount; i++) {
- ActivityManager.RecentTaskInfo t = tasks.get(i);
-
- // Compose the task key
- Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.baseIntent, t.userId,
- t.firstActiveTime, t.lastActiveTime);
-
- // Get an existing activity info handle if possible
- Task.ComponentNameKey cnKey = taskKey.getComponentNameKey();
- ActivityInfoHandle infoHandle;
- boolean hasCachedActivityInfo = false;
- if (activityInfoCache.containsKey(cnKey)) {
- infoHandle = activityInfoCache.get(cnKey);
- hasCachedActivityInfo = true;
- } else {
- infoHandle = new ActivityInfoHandle();
- }
-
- // Determine whether to preload this task
- boolean preloadTask = false;
- if (preloadTaskId > 0) {
- preloadTask = (t.id == preloadTaskId);
- } else if (preloadTaskCount > 0) {
- preloadTask = (i >= (taskCount - preloadTaskCount));
- }
-
- // Load the label, icon, and color
- String activityLabel = getAndUpdateActivityLabel(taskKey, t.taskDescription,
- ssp, infoHandle);
- Drawable activityIcon = getAndUpdateActivityIcon(taskKey, t.taskDescription,
- ssp, res, infoHandle, preloadTask);
- int activityColor = getActivityPrimaryColor(t.taskDescription, config);
-
- // Update the activity info cache
- if (!hasCachedActivityInfo && infoHandle.info != null) {
- activityInfoCache.put(cnKey, infoHandle);
- }
+ RecentsTaskLoadPlan plan = new RecentsTaskLoadPlan(context, config, mSystemServicesProxy);
+ return plan;
+ }
- Bitmap icon = t.taskDescription != null
- ? t.taskDescription.getInMemoryIcon()
- : null;
- String iconFilename = t.taskDescription != null
- ? t.taskDescription.getIconFilename()
- : null;
-
- // Add the task to the stack
- Task task = new Task(taskKey, (t.id > -1), t.affiliatedTaskId, t.affiliatedTaskColor,
- activityLabel, activityIcon, activityColor, (i == (taskCount - 1)),
- config.lockToAppEnabled, icon, iconFilename);
-
- if (preloadTask && loadTaskThumbnails) {
- // Load the thumbnail from the cache if possible
- task.thumbnail = mThumbnailCache.getAndInvalidateIfModified(taskKey);
- if (task.thumbnail == null) {
- // Load the thumbnail from the system
- task.thumbnail = ssp.getTaskThumbnail(taskKey.id);
- if (task.thumbnail != null) {
- task.thumbnail.setHasAlpha(false);
- mThumbnailCache.put(taskKey, task.thumbnail);
- }
- }
- if (task.thumbnail == null && tasksToLoadOut != null) {
- // Either the task has changed since the last active time, or it was not
- // previously cached, so try and load the task anew.
- tasksToLoadOut.add(task);
- }
- }
+ public void preloadTasks(RecentsTaskLoadPlan plan, boolean isTopTaskHome) {
+ plan.preloadPlan(this, isTopTaskHome);
+ }
- // Add to the list of task keys
- if (taskKeysOut != null) {
- taskKeysOut.add(taskKey);
- }
- // Add the task to the stack
- tasksToAdd.add(task);
+ public void loadTasks(Context context, RecentsTaskLoadPlan plan,
+ RecentsTaskLoadPlan.Options opts) {
+ if (opts == null) {
+ throw new RuntimeException("Requires load options");
+ }
+ plan.executePlan(opts, this);
+ if (opts.numVisibleTasks > 0) {
+ mNumVisibleTasksLoaded = opts.numVisibleTasks;
}
- stack.setTasks(tasksToAdd);
- stack.createAffiliatedGroupings(config);
- return stack;
+
+ // Start the loader
+ mLoader.start(context);
}
/** Acquires the task resource data directly from the pool. */
@@ -588,24 +499,22 @@ public class RecentsTaskLoader {
case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:
// Stop the loader immediately when the UI is no longer visible
stopLoader();
- mThumbnailCache.trimToSize(Math.max(
- Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount,
+ mThumbnailCache.trimToSize(Math.max(mNumVisibleTasksLoaded,
mMaxThumbnailCacheSize / 2));
- mApplicationIconCache.trimToSize(Math.max(
- Constants.Values.RecentsTaskLoader.PreloadFirstTasksCount,
+ mApplicationIconCache.trimToSize(Math.max(mNumVisibleTasksLoaded,
mMaxIconCacheSize / 2));
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE:
case ComponentCallbacks2.TRIM_MEMORY_BACKGROUND:
// We are leaving recents, so trim the data a bit
- mThumbnailCache.trimToSize(mMaxThumbnailCacheSize / 2);
- mApplicationIconCache.trimToSize(mMaxIconCacheSize / 2);
+ mThumbnailCache.trimToSize(Math.max(1, mMaxThumbnailCacheSize / 2));
+ mApplicationIconCache.trimToSize(Math.max(1, mMaxIconCacheSize / 2));
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
case ComponentCallbacks2.TRIM_MEMORY_MODERATE:
// We are going to be low on memory
- mThumbnailCache.trimToSize(mMaxThumbnailCacheSize / 4);
- mApplicationIconCache.trimToSize(mMaxIconCacheSize / 4);
+ mThumbnailCache.trimToSize(Math.max(1, mMaxThumbnailCacheSize / 4));
+ mApplicationIconCache.trimToSize(Math.max(1, mMaxIconCacheSize / 4));
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:
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 ff0330d..77a050a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -31,6 +31,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowInsets;
import android.widget.FrameLayout;
+
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -54,6 +55,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
public void onTaskLaunchFailed();
public void onAllTaskViewsDismissed();
public void onExitToHomeAnimationTriggered();
+ public void onScreenPinningRequest();
}
RecentsConfiguration mConfig;
@@ -95,42 +97,57 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
/** Set/get the bsp root node */
public void setTaskStacks(ArrayList<TaskStack> stacks) {
- // Remove all TaskStackViews (but leave the search bar)
+ int numStacks = stacks.size();
+
+ // Make a list of the stack view children only
+ ArrayList<TaskStackView> stackViews = new ArrayList<TaskStackView>();
int childCount = getChildCount();
- for (int i = childCount - 1; i >= 0; i--) {
- View v = getChildAt(i);
- if (v != mSearchBar) {
- removeViewAt(i);
+ for (int i = 0; i < childCount; i++) {
+ View child = getChildAt(i);
+ if (child != mSearchBar) {
+ stackViews.add((TaskStackView) child);
}
}
- // Create and add all the stacks for this partition of space.
+ // Remove all/extra stack views
+ int numTaskStacksToKeep = 0; // Keep no tasks if we are recreating the layout
+ if (mConfig.launchedReuseTaskStackViews) {
+ numTaskStacksToKeep = Math.min(childCount, numStacks);
+ }
+ for (int i = stackViews.size() - 1; i >= numTaskStacksToKeep; i--) {
+ removeView(stackViews.get(i));
+ stackViews.remove(i);
+ }
+
+ // Update the stack views that we are keeping
+ for (int i = 0; i < numTaskStacksToKeep; i++) {
+ stackViews.get(i).setStack(stacks.get(i));
+ }
+
+ // Add remaining/recreate stack views
mStacks = stacks;
- int numStacks = mStacks.size();
- for (int i = 0; i < numStacks; i++) {
- TaskStack stack = mStacks.get(i);
+ for (int i = stackViews.size(); i < numStacks; i++) {
+ TaskStack stack = stacks.get(i);
TaskStackView stackView = new TaskStackView(getContext(), stack);
stackView.setCallbacks(this);
- // Enable debug mode drawing
- if (mConfig.debugModeEnabled) {
- stackView.setDebugOverlay(mDebugOverlay);
- }
addView(stackView);
}
- // Reset the launched state
- mAlreadyLaunchingTask = false;
- }
-
- /** Removes all the task stack views from this recents view. */
- public void removeAllTaskStacks() {
- int childCount = getChildCount();
- for (int i = childCount - 1; i >= 0; i--) {
- View child = getChildAt(i);
- if (child != mSearchBar) {
- removeViewAt(i);
+ // Enable debug mode drawing on all the stacks if necessary
+ if (mConfig.debugModeEnabled) {
+ for (int i = childCount - 1; i >= 0; i--) {
+ View v = getChildAt(i);
+ if (v != mSearchBar) {
+ TaskStackView stackView = (TaskStackView) v;
+ stackView.setDebugOverlay(mDebugOverlay);
+ }
}
}
+
+ // Reset the launched state
+ mAlreadyLaunchingTask = false;
+ // Trigger a new layout
+ requestLayout();
}
/** Launches the focused task from the first stack if possible */
@@ -199,6 +216,9 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
/** Requests all task stacks to start their exit-recents animation */
public void startExitToHomeAnimation(ViewAnimation.TaskViewExitContext ctx) {
+ // We have to increment/decrement the post animation trigger in case there are no children
+ // to ensure that it runs
+ ctx.postAnimationTrigger.increment();
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
@@ -207,6 +227,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
stackView.startExitToHomeAnimation(ctx);
}
}
+ ctx.postAnimationTrigger.decrement();
// Notify of the exit animation
mCb.onExitToHomeAnimationTriggered();
@@ -446,7 +467,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
postDelayed(new Runnable() {
@Override
public void run() {
- ssp.lockCurrentTask();
+ mCb.onScreenPinningRequest();
}
}, 350);
mTriggered = true;
@@ -470,7 +491,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
if (ssp.startActivityFromRecents(getContext(), task.key.id,
task.activityLabel, launchOpts)) {
if (launchOpts == null && lockToTask) {
- ssp.lockCurrentTask();
+ mCb.onScreenPinningRequest();
}
} else {
// Dismiss the task and return the user to home if we fail to
@@ -486,7 +507,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
// Launch the app right away if there is no task view, otherwise, animate the icon out first
if (tv == null) {
- post(launchRunnable);
+ launchRunnable.run();
} else {
if (!task.group.isFrontMostTask(task)) {
// For affiliated tasks that are behind other tasks, we must animate the front cards
@@ -495,7 +516,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
} else {
// Otherwise, we can start the task transition immediately
stackView.startLaunchTaskAnimation(tv, null, lockToTask);
- postDelayed(launchRunnable, 17);
+ launchRunnable.run();
}
}
}
@@ -529,6 +550,19 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
mCb.onAllTaskViewsDismissed();
}
+ /** Final callback after Recents is finally hidden. */
+ public void onRecentsHidden() {
+ // Notify each task stack view
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ View child = getChildAt(i);
+ if (child != mSearchBar) {
+ TaskStackView stackView = (TaskStackView) child;
+ stackView.onRecentsHidden();
+ }
+ }
+ }
+
@Override
public void onTaskStackFilterTriggered() {
// Hide the search bar
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 dee26e6..49fd792 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -40,6 +40,7 @@ import com.android.systemui.recents.model.TaskStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
/* The visual representation of a task stack view */
@@ -99,25 +100,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
};
- // A convenience runnable to return all views to the pool
- Runnable mReturnAllViewsToPoolRunnable = new Runnable() {
- @Override
- public void run() {
- int childCount = getChildCount();
- for (int i = childCount - 1; i >= 0; i--) {
- TaskView tv = (TaskView) getChildAt(i);
- mViewPool.returnViewToPool(tv);
- // Also hide the view since we don't need it anymore
- tv.setVisibility(View.INVISIBLE);
- }
- }
- };
-
public TaskStackView(Context context, TaskStack stack) {
super(context);
+ // Set the stack first
+ setStack(stack);
mConfig = RecentsConfiguration.getInstance();
- mStack = stack;
- mStack.setCallbacks(this);
mViewPool = new ViewPool<TaskView, Task>(context, this);
mInflater = LayoutInflater.from(context);
mLayoutAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig);
@@ -143,11 +130,64 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mCb = cb;
}
+ /** Sets the task stack */
+ void setStack(TaskStack stack) {
+ // Unset the old stack
+ if (mStack != null) {
+ mStack.setCallbacks(null);
+
+ // Return all existing views to the pool
+ reset();
+ // Layout again with the new stack
+ requestLayout();
+ }
+
+ // Set the new stack
+ mStack = stack;
+ if (mStack != null) {
+ mStack.setCallbacks(this);
+ }
+ }
+
/** Sets the debug overlay */
public void setDebugOverlay(DebugOverlayView overlay) {
mDebugOverlay = overlay;
}
+ /** Resets this TaskStackView for reuse. */
+ void reset() {
+ // Reset the focused task
+ resetFocusedTask();
+
+ // Return all the views to the pool
+ int childCount = getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ TaskView tv = (TaskView) getChildAt(i);
+ mViewPool.returnViewToPool(tv);
+ }
+
+ // Mark each task view for relayout
+ if (mViewPool != null) {
+ Iterator<TaskView> iter = mViewPool.poolViewIterator();
+ if (iter != null) {
+ while (iter.hasNext()) {
+ TaskView tv = iter.next();
+ tv.reset();
+ }
+ }
+ }
+
+ // Reset the stack state
+ mStackViewsDirty = true;
+ mStackViewsClipDirty = true;
+ mAwaitingFirstLayout = true;
+ mPrevAccessibilityFocusedIndex = -1;
+ if (mUIDozeTrigger != null) {
+ mUIDozeTrigger.stopDozing();
+ mUIDozeTrigger.resetTrigger();
+ }
+ }
+
/** Requests that the views be synchronized with the model */
void requestSynchronizeStackViewsWithModel() {
requestSynchronizeStackViewsWithModel(0);
@@ -399,6 +439,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
/** Updates the min and max virtual scroll bounds */
void updateMinMaxScroll(boolean boundScrollToNewMinMax, boolean launchedWithAltTab,
boolean launchedFromHome) {
+ if (mStack == null) return;
+
// Compute the min and max scroll values
mLayoutAlgorithm.computeMinMaxScroll(mStack.getTasks(), launchedWithAltTab, launchedFromHome);
@@ -510,9 +552,21 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
tv.dismissTask();
}
+ /** Resets the focused task. */
+ void resetFocusedTask() {
+ if (mFocusedTaskIndex > -1) {
+ Task t = mStack.getTasks().get(mFocusedTaskIndex);
+ TaskView tv = getChildViewForTask(t);
+ tv.unsetFocusedTask();
+ }
+ mFocusedTaskIndex = -1;
+ }
+
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
+ if (mStack == null) return;
+
int childCount = getChildCount();
if (childCount > 0) {
TaskView backMostTask = (TaskView) getChildAt(0);
@@ -543,6 +597,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void computeScroll() {
+ if (mStack == null) return;
+
mStackScroller.computeScroll();
// Synchronize the views
synchronizeStackViewsWithModel();
@@ -572,11 +628,24 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
/**
+ * Computes the maximum number of visible tasks and thumbnails. Requires that
+ * updateMinMaxScrollForStack() is called first.
+ */
+ public TaskStackViewLayoutAlgorithm.VisibilityReport computeStackVisibilityReport() {
+ return mLayoutAlgorithm.computeStackVisibilityReport(mStack.getTasks());
+ }
+
+ /**
* This is called with the full window width and height to allow stack view children to
* perform the full screen transition down.
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ if (mStack == null) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ return;
+ }
+
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
@@ -622,6 +691,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ if (mStack == null) {
+ super.onLayout(changed, left, top, right, bottom);
+ return;
+ }
+
// Layout each of the children
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
@@ -758,9 +832,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
TaskView tv = (TaskView) getChildAt(i);
tv.startExitToHomeAnimation(ctx);
}
-
- // Add a runnable to the post animation ref counter to clear all the views
- ctx.postAnimationTrigger.addLastDecrementRunnable(mReturnAllViewsToPoolRunnable);
}
/** Animates a task view in this stack as it launches. */
@@ -780,6 +851,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
}
}
+ /** Final callback after Recents is finally hidden. */
+ void onRecentsHidden() {
+ setStack(null);
+ }
+
public boolean isTransformedTouchPointInView(float x, float y, View child) {
return isTransformedTouchPointInView(x, y, child, null);
}
@@ -944,20 +1020,25 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Reset the view properties
tv.resetViewProperties();
+
+ // Reset the clip state of the task view
+ tv.setClipViewInStack(false);
}
@Override
public void prepareViewToLeavePool(TaskView tv, Task task, boolean isNewView) {
+ if (mStack == null) return;
+
+ // It is possible for a view to be returned to the view pool before it is laid out,
+ // which means that we will need to relayout the view when it is first used next.
+ boolean requiresRelayout = tv.getWidth() <= 0 && !isNewView;
+
// Rebind the task and request that this task's data be filled into the TaskView
tv.onTaskBound(task);
// Load the task data
RecentsTaskLoader.getInstance().loadTaskData(task);
- // Sanity check, the task view should always be clipping against the stack at this point,
- // but just in case, re-enable it here
- tv.setClipViewInStack(true);
-
// If the doze trigger has already fired, then update the state for this task view
if (mUIDozeTrigger.hasTriggered()) {
tv.setNoUserInteractionState();
@@ -985,13 +1066,17 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
// Add/attach the view to the hierarchy
if (isNewView) {
addView(tv, insertIndex);
-
- // Set the callbacks and listeners for this new view
- tv.setTouchEnabled(true);
- tv.setCallbacks(this);
} else {
attachViewToParent(tv, insertIndex, tv.getLayoutParams());
+ if (requiresRelayout) {
+ tv.requestLayout();
+ }
}
+
+ // Set the new state for this view, including the callbacks and view clipping
+ tv.setCallbacks(this);
+ tv.setTouchEnabled(true);
+ tv.setClipViewInStack(true);
}
@Override
@@ -1082,6 +1167,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
@Override
public void onPackagesChanged(RecentsPackageMonitor monitor, String packageName, int userId) {
+ if (mStack == null) return;
+
// Compute which components need to be removed
HashSet<ComponentName> removedComponents = monitor.computeComponentsRemoved(
mStack.getTaskKeys(), packageName, userId);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
index c549d2b..5767e18 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
@@ -35,6 +35,18 @@ public class TaskStackViewLayoutAlgorithm {
// These are all going to change
static final float StackPeekMinScale = 0.8f; // The min scale of the last card in the peek area
+ // A report of the visibility state of the stack
+ public class VisibilityReport {
+ public int numVisibleTasks;
+ public int numVisibleThumbnails;
+
+ /** Package level ctor */
+ VisibilityReport(int tasks, int thumbnails) {
+ numVisibleTasks = tasks;
+ numVisibleThumbnails = thumbnails;
+ }
+ }
+
RecentsConfiguration mConfig;
// The various rects that define the stack view
@@ -117,7 +129,8 @@ public class TaskStackViewLayoutAlgorithm {
float pTaskHeightOffset = pAtBottomOfStackRect -
screenYToCurveProgress(mStackVisibleRect.bottom - taskHeight);
float pNavBarOffset = pAtBottomOfStackRect -
- screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom));
+ screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom -
+ mStackRect.bottom));
// Update the task offsets
float pAtBackMostCardTop = 0.5f;
@@ -130,8 +143,8 @@ public class TaskStackViewLayoutAlgorithm {
if (i < (taskCount - 1)) {
// Increment the peek height
- float pPeek = task.group.isFrontMostTask(task) ? pBetweenAffiliateOffset :
- pWithinAffiliateOffset;
+ float pPeek = task.group.isFrontMostTask(task) ?
+ pBetweenAffiliateOffset : pWithinAffiliateOffset;
pAtSecondFrontMostCardTop = pAtFrontMostCardTop;
pAtFrontMostCardTop += pPeek;
}
@@ -153,19 +166,72 @@ public class TaskStackViewLayoutAlgorithm {
mInitialScrollP = Math.max(0, mInitialScrollP);
}
+ /**
+ * Computes the maximum number of visible tasks and thumbnails. Requires that
+ * computeMinMaxScroll() is called first.
+ */
+ public VisibilityReport computeStackVisibilityReport(ArrayList<Task> tasks) {
+ if (tasks.size() <= 1) {
+ return new VisibilityReport(1, 1);
+ }
+
+ // Walk backwards in the task stack and count the number of tasks and visible thumbnails
+ int taskHeight = mTaskRect.height();
+ int numVisibleTasks = 1;
+ int numVisibleThumbnails = 1;
+ float progress = mTaskProgressMap.get(tasks.get(tasks.size() - 1).key) - mInitialScrollP;
+ int prevScreenY = curveProgressToScreenY(progress);
+ for (int i = tasks.size() - 2; i >= 0; i--) {
+ Task task = tasks.get(i);
+ progress = mTaskProgressMap.get(task.key) - mInitialScrollP;
+ if (progress < 0) {
+ break;
+ }
+ boolean isFrontMostTaskInGroup = task.group.isFrontMostTask(task);
+ if (isFrontMostTaskInGroup) {
+ float scaleAtP = curveProgressToScale(progress);
+ int scaleYOffsetAtP = (int) (((1f - scaleAtP) * taskHeight) / 2);
+ int screenY = curveProgressToScreenY(progress) + scaleYOffsetAtP;
+ boolean hasVisibleThumbnail = (prevScreenY - screenY) > mConfig.taskBarHeight;
+ if (hasVisibleThumbnail) {
+ numVisibleThumbnails++;
+ numVisibleTasks++;
+ prevScreenY = screenY;
+ } else {
+ // Once we hit the next front most task that does not have a visible thumbnail,
+ // walk through remaining visible set
+ for (int j = i; j >= 0; j--) {
+ numVisibleTasks++;
+ progress = mTaskProgressMap.get(tasks.get(j).key) - mInitialScrollP;
+ if (progress < 0) {
+ break;
+ }
+ }
+ break;
+ }
+ } else if (!isFrontMostTaskInGroup) {
+ // Affiliated task, no thumbnail
+ numVisibleTasks++;
+ }
+ }
+ return new VisibilityReport(numVisibleTasks, numVisibleThumbnails);
+ }
+
/** Update/get the transform */
- public TaskViewTransform getStackTransform(Task task, float stackScroll, TaskViewTransform transformOut,
- TaskViewTransform prevTransform) {
+ public TaskViewTransform getStackTransform(Task task, float stackScroll,
+ TaskViewTransform transformOut, TaskViewTransform prevTransform) {
// Return early if we have an invalid index
if (task == null || !mTaskProgressMap.containsKey(task.key)) {
transformOut.reset();
return transformOut;
}
- return getStackTransform(mTaskProgressMap.get(task.key), stackScroll, transformOut, prevTransform);
+ return getStackTransform(mTaskProgressMap.get(task.key), stackScroll, transformOut,
+ prevTransform);
}
/** Update/get the transform */
- public TaskViewTransform getStackTransform(float taskProgress, float stackScroll, TaskViewTransform transformOut, TaskViewTransform prevTransform) {
+ public TaskViewTransform getStackTransform(float taskProgress, float stackScroll,
+ TaskViewTransform transformOut, TaskViewTransform prevTransform) {
float pTaskRelative = taskProgress - stackScroll;
float pBounded = Math.max(0, Math.min(pTaskRelative, 1f));
// If the task top is outside of the bounds below the screen, then immediately reset it
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 7b4e10a..790130a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -112,6 +112,14 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mCb = cb;
}
+ /** Resets this TaskView for reuse. */
+ void reset() {
+ resetViewProperties();
+ resetNoUserInteractionState();
+ setClipViewInStack(false);
+ setCallbacks(null);
+ }
+
/** Gets the task */
Task getTask() {
return mTask;
@@ -191,6 +199,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
/** Resets this view's properties */
void resetViewProperties() {
setDim(0);
+ setLayerType(View.LAYER_TYPE_NONE, null);
TaskViewTransform.reset(this);
}
@@ -448,6 +457,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
mHeaderView.setNoUserInteractionState();
}
+ /** Resets the state tracking that the user has not interacted with the stack after a certain time. */
+ void resetNoUserInteractionState() {
+ mHeaderView.resetNoUserInteractionState();
+ }
+
/** Dismisses this task. */
void dismissTask() {
// Animate out the view and call the callback
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 ba868f5..5de84bd 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -263,6 +263,11 @@ public class TaskViewHeader extends FrameLayout {
}
}
+ /** Resets the state tracking that the user has not interacted with the stack after a certain time. */
+ void resetNoUserInteractionState() {
+ mDismissButton.setVisibility(View.INVISIBLE);
+ }
+
@Override
protected int[] onCreateDrawableState(int extraSpace) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java b/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java
index af0094e..12b91af 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/ViewPool.java
@@ -75,4 +75,12 @@ public class ViewPool<V, T> {
mViewCreator.prepareViewToLeavePool(v, prepareData, isNewView);
return v;
}
+
+ /** Returns an iterator to the list of the views in the pool. */
+ Iterator<V> poolViewIterator() {
+ if (mPool != null) {
+ return mPool.iterator();
+ }
+ return null;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 7bbf9e2..725a1a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -59,7 +59,6 @@ import android.service.notification.NotificationListenerService.RankingMap;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.Display;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 9db875f..0b1b883 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -56,6 +56,7 @@ public class CommandQueue extends IStatusBar.Stub {
private static final int MSG_BUZZ_BEEP_BLINKED = 15 << MSG_SHIFT;
private static final int MSG_NOTIFICATION_LIGHT_OFF = 16 << MSG_SHIFT;
private static final int MSG_NOTIFICATION_LIGHT_PULSE = 17 << MSG_SHIFT;
+ private static final int MSG_SHOW_SCREEN_PIN_REQUEST = 18 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -97,6 +98,7 @@ public class CommandQueue extends IStatusBar.Stub {
public void buzzBeepBlinked();
public void notificationLightOff();
public void notificationLightPulse(int argb, int onMillis, int offMillis);
+ public void showScreenPinningRequest();
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -238,6 +240,12 @@ public class CommandQueue extends IStatusBar.Stub {
}
}
+ public void showScreenPinningRequest() {
+ synchronized (mList) {
+ mHandler.sendEmptyMessage(MSG_SHOW_SCREEN_PIN_REQUEST);
+ }
+ }
+
private final class H extends Handler {
public void handleMessage(Message msg) {
final int what = msg.what & MSG_MASK;
@@ -317,6 +325,9 @@ public class CommandQueue extends IStatusBar.Stub {
case MSG_NOTIFICATION_LIGHT_PULSE:
mCallbacks.notificationLightPulse((Integer) msg.obj, msg.arg1, msg.arg2);
break;
+ case MSG_SHOW_SCREEN_PIN_REQUEST:
+ mCallbacks.showScreenPinningRequest();
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
index 628aab8..7ae6764 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java
@@ -17,10 +17,11 @@
package com.android.systemui.statusbar;
import android.app.StatusBarManager;
+import android.content.res.Resources;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
+import com.android.systemui.R;
public class DelegateViewHelper {
private View mDelegateView;
@@ -106,8 +107,8 @@ public class DelegateViewHelper {
public void setSourceView(View view) {
mSourceView = view;
if (mSourceView != null) {
- mTriggerThreshhold =
- ViewConfiguration.get(mSourceView.getContext()).getScaledPagingTouchSlop();
+ Resources r = mSourceView.getContext().getResources();
+ mTriggerThreshhold = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index a4e5e74..f8332ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -22,6 +22,7 @@ import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.service.notification.StatusBarNotification;
import android.util.AttributeSet;
+import android.view.MotionEvent;
import android.view.View;
import android.view.ViewStub;
import android.view.accessibility.AccessibilityEvent;
@@ -68,6 +69,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
private NotificationGuts mGuts;
private StatusBarNotification mStatusBarNotification;
+ private boolean mIsHeadsUp;
public void setIconAnimationRunning(boolean running) {
setIconAnimationRunning(running, mPublicLayout);
@@ -122,6 +124,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
return mStatusBarNotification;
}
+ public void setHeadsUp(boolean isHeadsUp) {
+ mIsHeadsUp = isHeadsUp;
+ }
+
public interface ExpansionLogger {
public void logNotificationExpansion(String key, boolean userAction, boolean expanded);
}
@@ -147,14 +153,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
mShowingPublicInitialized = false;
mIsSystemExpanded = false;
mExpansionDisabled = false;
- mPublicLayout.reset();
- mPrivateLayout.reset();
+ mPublicLayout.reset(mIsHeadsUp);
+ mPrivateLayout.reset(mIsHeadsUp);
resetHeight();
logExpansionEvent(false, wasExpanded);
}
public void resetHeight() {
- super.resetHeight();
+ if (mIsHeadsUp) {
+ resetActualHeight();
+ }
mMaxExpandHeight = 0;
mWasReset = true;
onHeightReset();
@@ -162,6 +170,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
}
@Override
+ protected boolean filterMotionEvent(MotionEvent event) {
+ return mIsHeadsUp || super.filterMotionEvent(event);
+ }
+
+ @Override
protected void onFinishInflate() {
super.onFinishInflate();
mPublicLayout = (NotificationContentView) findViewById(R.id.expandedPublic);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index edfbe86..bf1e78e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -103,9 +103,13 @@ public abstract class ExpandableView extends FrameLayout {
}
}
- protected void resetHeight() {
+ /**
+ * Resets the height of the view on the next layout pass
+ */
+ protected void resetActualHeight() {
mActualHeight = 0;
mActualHeightInitialized = false;
+ requestLayout();
}
protected int getInitialHeight() {
@@ -120,7 +124,7 @@ public abstract class ExpandableView extends FrameLayout {
return false;
}
- private boolean filterMotionEvent(MotionEvent event) {
+ protected boolean filterMotionEvent(MotionEvent event) {
return event.getActionMasked() != MotionEvent.ACTION_DOWN
|| event.getY() > mClipTopAmount && event.getY() < mActualHeight;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
index 992aa9f..58067c3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java
@@ -146,8 +146,8 @@ public class KeyguardIndicationController {
try {
long chargingTimeRemaining = mBatteryInfo.computeChargeTimeRemaining();
if (chargingTimeRemaining > 0) {
- String chargingTimeFormatted =
- Formatter.formatShortElapsedTime(mContext, chargingTimeRemaining);
+ String chargingTimeFormatted = Formatter.formatShortElapsedTimeRoundingUpToMinutes(
+ mContext, chargingTimeRemaining);
return mContext.getResources().getString(
R.string.keyguard_indication_charging_time, chargingTimeFormatted);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index 9b11f9b..99214a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -74,7 +74,7 @@ public class NotificationContentView extends FrameLayout {
public NotificationContentView(Context context, AttributeSet attrs) {
super(context, attrs);
mFadePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.ADD));
- reset();
+ reset(true);
}
@Override
@@ -89,7 +89,7 @@ public class NotificationContentView extends FrameLayout {
updateVisibility();
}
- public void reset() {
+ public void reset(boolean resetActualHeight) {
if (mContractedChild != null) {
mContractedChild.animate().cancel();
}
@@ -100,8 +100,10 @@ public class NotificationContentView extends FrameLayout {
mContractedChild = null;
mExpandedChild = null;
mSmallHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height);
- mActualHeight = mSmallHeight;
mContractedVisible = true;
+ if (resetActualHeight) {
+ mActualHeight = mSmallHeight;
+ }
}
public View getContractedChild() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index 6653254..4667d56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -451,6 +451,10 @@ public class KeyguardAffordanceHelper {
initIcons();
}
+ public void onRtlPropertiesChanged() {
+ initIcons();
+ }
+
public void reset(boolean animate) {
if (mSwipeAnimator != null) {
mSwipeAnimator.cancel();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index 9bb52e7..1e4dfb4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -21,6 +21,7 @@ import android.animation.LayoutTransition.TransitionListener;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
+import android.app.ActivityManagerNative;
import android.app.StatusBarManager;
import android.content.Context;
import android.content.res.Configuration;
@@ -30,6 +31,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
+import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Display;
@@ -43,6 +45,7 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
+
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.DelegateViewHelper;
@@ -332,7 +335,7 @@ public class NavigationBarView extends LinearLayout {
mDisabledFlags = disabledFlags;
final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
- final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
+ boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0);
final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
&& ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
final boolean disableSearch = ((disabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0);
@@ -357,6 +360,11 @@ public class NavigationBarView extends LinearLayout {
}
}
}
+ if (inLockTask() && disableRecent && !disableHome) {
+ // Don't hide recents when in lock task, it is used for exiting.
+ // Unless home is hidden, then in DPM locked mode and no exit available.
+ disableRecent = false;
+ }
getBackButton() .setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE);
getHomeButton() .setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE);
@@ -365,6 +373,14 @@ public class NavigationBarView extends LinearLayout {
mBarTransitions.applyBackButtonQuiescentAlpha(mBarTransitions.getMode(), true /*animate*/);
}
+ private boolean inLockTask() {
+ try {
+ return ActivityManagerNative.getDefault().isInLockTaskMode();
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
private void setVisibleOrGone(View view, boolean visible) {
if (view != null) {
view.setVisibility(visible ? VISIBLE : GONE);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
index c253e19..fdfcdfb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarViewTaskSwitchHelper.java
@@ -17,9 +17,11 @@
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.content.res.Resources;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
+import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
public class NavigationBarViewTaskSwitchHelper extends GestureDetector.SimpleOnGestureListener {
@@ -36,7 +38,8 @@ public class NavigationBarViewTaskSwitchHelper extends GestureDetector.SimpleOnG
public NavigationBarViewTaskSwitchHelper(Context context) {
ViewConfiguration configuration = ViewConfiguration.get(context);
- mScrollTouchSlop = 4 * configuration.getScaledTouchSlop();
+ Resources r = context.getResources();
+ mScrollTouchSlop = r.getDimensionPixelSize(R.dimen.navigation_bar_min_swipe_distance);
mMinFlingVelocity = configuration.getScaledMinimumFlingVelocity();
mTaskSwitcherDetector = new GestureDetector(context, this);
}
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 bb992b0..9d7d310 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -26,6 +26,7 @@ import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.AttributeSet;
+import android.util.LayoutDirection;
import android.util.MathUtils;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -169,6 +170,7 @@ public class NotificationPanelView extends PanelView implements
private int mQsFalsingThreshold;
private float mKeyguardStatusBarAnimateAlpha = 1f;
+ private int mOldLayoutDirection;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -521,7 +523,8 @@ public class NotificationPanelView extends PanelView implements
case MotionEvent.ACTION_UP:
trackMovement(event);
if (mQsTracking) {
- flingQsWithCurrentVelocity();
+ flingQsWithCurrentVelocity(
+ event.getActionMasked() == MotionEvent.ACTION_CANCEL);
mQsTracking = false;
}
mIntercepting = false;
@@ -556,9 +559,9 @@ public class NotificationPanelView extends PanelView implements
super.requestDisallowInterceptTouchEvent(disallowIntercept);
}
- private void flingQsWithCurrentVelocity() {
+ private void flingQsWithCurrentVelocity(boolean isCancelMotionEvent) {
float vel = getCurrentVelocity();
- flingSettings(vel, flingExpandsQs(vel));
+ flingSettings(vel, flingExpandsQs(vel) && !isCancelMotionEvent);
}
private boolean flingExpandsQs(float vel) {
@@ -727,7 +730,8 @@ public class NotificationPanelView extends PanelView implements
float fraction = getQsExpansionFraction();
if ((fraction != 0f || y >= mInitialTouchY)
&& (fraction != 1f || y <= mInitialTouchY)) {
- flingQsWithCurrentVelocity();
+ flingQsWithCurrentVelocity(
+ event.getActionMasked() == MotionEvent.ACTION_CANCEL);
} else {
mScrollYOverride = -1;
}
@@ -1589,6 +1593,14 @@ public class NotificationPanelView extends PanelView implements
}
@Override
+ public void onRtlPropertiesChanged(int layoutDirection) {
+ if (layoutDirection != mOldLayoutDirection) {
+ mAfforanceHelper.onRtlPropertiesChanged();
+ mOldLayoutDirection = layoutDirection;
+ }
+ }
+
+ @Override
public void onClick(View v) {
if (v == mHeader) {
onQsExpansionStarted();
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 c706ef0..47ce603 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -330,7 +330,8 @@ public abstract class PanelView extends FrameLayout {
vectorVel = (float) Math.hypot(
mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());
}
- boolean expand = flingExpands(vel, vectorVel);
+ boolean expand = flingExpands(vel, vectorVel)
+ || event.getActionMasked() == MotionEvent.ACTION_CANCEL;
onTrackingStopped(expand);
DozeLog.traceFling(expand, mTouchAboveFalsingThreshold,
mStatusBar.isFalsingThresholdNeeded(),
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 84ebcdf..1697646 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -123,6 +123,7 @@ 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.recent.ScreenPinningRequest;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.BackDropView;
import com.android.systemui.statusbar.BaseStatusBar;
@@ -356,6 +357,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
? new GestureRecorder("/sdcard/statusbar_gestures.dat")
: null;
+ private ScreenPinningRequest mScreenPinningRequest;
+
private int mNavigationIconHints = 0;
// ensure quick settings is disabled until the current user makes it through the setup wizard
@@ -597,6 +600,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
setControllerUsers();
notifyUserAboutHiddenNotifications();
+
+ mScreenPinningRequest = new ScreenPinningRequest(mContext);
}
// ================================================================================
@@ -1304,6 +1309,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// not immersive & a full-screen alert should be shown
if (DEBUG) Log.d(TAG, "Notification has fullScreenIntent; sending fullScreenIntent");
try {
+ EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION,
+ notification.getKey());
notification.getNotification().fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
@@ -1345,16 +1352,19 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
@Override
public void scheduleHeadsUpOpen() {
+ mHandler.removeMessages(MSG_SHOW_HEADS_UP);
mHandler.sendEmptyMessage(MSG_SHOW_HEADS_UP);
}
@Override
public void scheduleHeadsUpClose() {
+ mHandler.removeMessages(MSG_HIDE_HEADS_UP);
mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP);
}
@Override
public void scheduleHeadsUpEscalation() {
+ mHandler.removeMessages(MSG_ESCALATE_HEADS_UP);
mHandler.sendEmptyMessage(MSG_ESCALATE_HEADS_UP);
}
@@ -2189,6 +2199,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
if (DEBUG)
Log.d(TAG, "converting a heads up to fullScreen");
try {
+ EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_ESCALATION,
+ sbn.getKey());
notification.fullScreenIntent.send();
} catch (PendingIntent.CanceledException e) {
}
@@ -3144,6 +3156,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
updateShowSearchHoldoff();
updateRowStates();
+ mScreenPinningRequest.onConfigurationChanged();
}
@Override
@@ -3438,6 +3451,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
dispatchDemoCommand(COMMAND_ENTER, new Bundle());
}
boolean modeChange = command.equals(COMMAND_ENTER) || command.equals(COMMAND_EXIT);
+ if ((modeChange || command.equals(COMMAND_VOLUME)) && mVolumeComponent != null) {
+ mVolumeComponent.dispatchDemoCommand(command, args);
+ }
if (modeChange || command.equals(COMMAND_CLOCK)) {
dispatchDemoCommandToView(command, args, R.id.clock);
}
@@ -3968,6 +3984,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// long-pressed 'together'
if ((time - mLastLockToAppLongPress) < LOCK_TO_APP_GESTURE_TOLERENCE) {
activityManager.stopLockTaskModeOnCurrent();
+ // When exiting refresh disabled flags.
+ mNavigationBarView.setDisabledFlags(mDisabled, true);
} else if ((v.getId() == R.id.back)
&& !mNavigationBarView.getRecentsButton().isPressed()) {
// If we aren't pressing recents right now then they presses
@@ -3983,6 +4001,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
// When in accessibility mode a long press that is recents (not back)
// should stop lock task.
activityManager.stopLockTaskModeOnCurrent();
+ // When exiting refresh disabled flags.
+ mNavigationBarView.setDisabledFlags(mDisabled, true);
}
}
if (sendBackLongPress) {
@@ -4032,6 +4052,20 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
notifyUiVisibilityChanged(mSystemUiVisibility);
}
+ @Override
+ public void showScreenPinningRequest() {
+ if (mKeyguardMonitor.isShowing()) {
+ // Don't allow apps to trigger this from keyguard.
+ return;
+ }
+ // Show screen pinning request, since this comes from an app, show 'no thanks', button.
+ showScreenPinningRequest(true);
+ }
+
+ public void showScreenPinningRequest(boolean allowCancel) {
+ mScreenPinningRequest.showPrompt(allowCancel);
+ }
+
public boolean hasActiveNotifications() {
return !mNotificationData.getActiveNotifications().isEmpty();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
index 84216a4..11ff272 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
@@ -54,7 +54,6 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
private EdgeSwipeHelper mEdgeSwipeHelper;
private PhoneStatusBar mBar;
- private ExpandHelper mExpandHelper;
private long mStartTouchTime;
private ViewGroup mContentHolder;
@@ -102,6 +101,7 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
if (mHeadsUp != null) {
mHeadsUp.row.setSystemExpanded(true);
mHeadsUp.row.setSensitive(false);
+ mHeadsUp.row.setHeadsUp(true);
mHeadsUp.row.setHideSensitive(
false, false /* animated */, 0 /* delay */, 0 /* duration */);
if (mContentHolder == null) {
@@ -205,7 +205,6 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_min_height);
int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_max_height);
- mExpandHelper = new ExpandHelper(getContext(), this, minHeight, maxHeight);
mContentHolder = (ViewGroup) findViewById(R.id.content_holder);
mContentHolder.setOutlineProvider(CONTENT_HOLDER_OUTLINE_PROVIDER);
@@ -226,7 +225,6 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
}
return mEdgeSwipeHelper.onInterceptTouchEvent(ev)
|| mSwipeHelper.onInterceptTouchEvent(ev)
- || mExpandHelper.onInterceptTouchEvent(ev)
|| super.onInterceptTouchEvent(ev);
}
@@ -254,7 +252,6 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
mBar.resetHeadsUpDecayTimer();
return mEdgeSwipeHelper.onTouchEvent(ev)
|| mSwipeHelper.onTouchEvent(ev)
- || mExpandHelper.onTouchEvent(ev)
|| super.onTouchEvent(ev);
}
@@ -399,15 +396,12 @@ public class HeadsUpNotificationView extends FrameLayout implements SwipeHelper.
final float dY = ev.getY() - mFirstY;
final float daX = Math.abs(ev.getX() - mFirstX);
final float daY = Math.abs(dY);
- if (!mConsuming && (4f * daX) < daY && daY > mTouchSlop) {
+ if (!mConsuming && daX < daY && daY > mTouchSlop) {
+ releaseAndClose();
if (dY > 0) {
if (DEBUG_EDGE_SWIPE) Log.d(TAG, "found an open");
mBar.animateExpandNotificationsPanel();
}
- if (dY < 0) {
- if (DEBUG_EDGE_SWIPE) Log.d(TAG, "found a close");
- mBar.onHeadsUpDismissed();
- }
mConsuming = true;
}
break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 6c0b425..9cfd26b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -41,6 +41,7 @@ import android.util.Log;
import android.view.View;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.cdma.EriInfo;
@@ -170,6 +171,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
private final AccessPointController mAccessPoints;
private final MobileDataController mMobileDataController;
+ private final ConnectivityManager mConnectivityManager;
/**
* Construct this controller object and register for updates.
@@ -178,9 +180,9 @@ public class NetworkControllerImpl extends BroadcastReceiver
mContext = context;
final Resources res = context.getResources();
- ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
- Context.CONNECTIVITY_SERVICE);
- mHasMobileDataFeature = cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
+ mConnectivityManager =
+ (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ mHasMobileDataFeature = getCM().isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
mShowPhoneRSSIForData = res.getBoolean(R.bool.config_showPhoneRSSIForData);
mShowAtLeastThreeGees = res.getBoolean(R.bool.config_showMin3G);
@@ -192,13 +194,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
updateWimaxIcons();
// telephony
- mPhone = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
- mPhone.listen(mPhoneStateListener,
- PhoneStateListener.LISTEN_SERVICE_STATE
- | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
- | PhoneStateListener.LISTEN_CALL_STATE
- | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
- | PhoneStateListener.LISTEN_DATA_ACTIVITY);
+ mPhone = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
mHspaDataDistinguishable = mContext.getResources().getBoolean(
R.bool.config_hspa_data_distinguishable);
mNetworkNameSeparator = mContext.getString(R.string.status_bar_network_name_separator);
@@ -215,6 +211,36 @@ public class NetworkControllerImpl extends BroadcastReceiver
mWifiChannel.connect(mContext, handler, wifiMessenger);
}
+ registerListeners();
+
+ // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
+ updateAirplaneMode();
+
+ mLastLocale = mContext.getResources().getConfiguration().locale;
+ mAccessPoints = new AccessPointController(mContext);
+ mMobileDataController = new MobileDataController(mContext);
+ mMobileDataController.setCallback(new MobileDataController.Callback() {
+ @Override
+ public void onMobileDataEnabled(boolean enabled) {
+ notifyMobileDataEnabled(enabled);
+ }
+ });
+ }
+
+ @VisibleForTesting
+ protected ConnectivityManager getCM() {
+ return mConnectivityManager;
+ }
+
+ @VisibleForTesting
+ protected void registerListeners() {
+ mPhone.listen(mPhoneStateListener,
+ PhoneStateListener.LISTEN_SERVICE_STATE
+ | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
+ | PhoneStateListener.LISTEN_CALL_STATE
+ | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
+ | PhoneStateListener.LISTEN_DATA_ACTIVITY);
+
// broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.RSSI_CHANGED_ACTION);
@@ -233,20 +259,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
filter.addAction(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION);
filter.addAction(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION);
}
- context.registerReceiver(this, filter);
-
- // AIRPLANE_MODE_CHANGED is sent at boot; we've probably already missed it
- updateAirplaneMode();
-
- mLastLocale = mContext.getResources().getConfiguration().locale;
- mAccessPoints = new AccessPointController(mContext);
- mMobileDataController = new MobileDataController(mContext);
- mMobileDataController.setCallback(new MobileDataController.Callback() {
- @Override
- public void onMobileDataEnabled(boolean enabled) {
- notifyMobileDataEnabled(enabled);
- }
- });
+ mContext.registerReceiver(this, filter);
}
@Override
@@ -1072,9 +1085,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
Log.d(TAG, "updateConnectivity: intent=" + intent);
}
- final ConnectivityManager connManager = (ConnectivityManager) mContext
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- final NetworkInfo info = connManager.getActiveNetworkInfo();
+ final NetworkInfo info = getCM().getActiveNetworkInfo();
// Are we connected at all, by any interface?
mConnected = info != null && info.isConnected();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index 1b6a9e1..08732e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -178,4 +178,8 @@ public class TvStatusBar extends BaseStatusBar {
@Override
public void onActivationReset(ActivatableNotificationView view) {
}
+
+ @Override
+ public void showScreenPinningRequest() {
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
index f7f5047..2f02f7c 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
@@ -17,7 +17,6 @@
package com.android.systemui.volume;
import android.content.Context;
-import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -30,8 +29,6 @@ import com.android.systemui.R;
import java.util.Objects;
public class SegmentedButtons extends LinearLayout {
- private static final Typeface MEDIUM = Typeface.create("sans-serif-medium", Typeface.NORMAL);
- private static final Typeface BOLD = Typeface.create("sans-serif", Typeface.BOLD);
private static final int LABEL_RES_KEY = R.id.label;
private final Context mContext;
@@ -63,15 +60,17 @@ public class SegmentedButtons extends LinearLayout {
final Object tag = c.getTag();
final boolean selected = Objects.equals(mSelectedValue, tag);
c.setSelected(selected);
- c.setTypeface(selected ? BOLD : MEDIUM);
+ c.getCompoundDrawables()[1].setTint(mContext.getResources().getColor(selected
+ ? R.color.segmented_button_selected : R.color.segmented_button_unselected));
}
fireOnSelected();
}
- public void addButton(int labelResId, Object value) {
+ public void addButton(int labelResId, int iconResId, Object value) {
final Button b = (Button) mInflater.inflate(R.layout.segmented_button, this, false);
b.setTag(LABEL_RES_KEY, labelResId);
b.setText(labelResId);
+ b.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0);
final LayoutParams lp = (LayoutParams) b.getLayoutParams();
if (getChildCount() == 0) {
lp.leftMargin = lp.rightMargin = 0; // first button has no margin
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java
index 3c186c2..31adc95 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeComponent.java
@@ -16,8 +16,9 @@
package com.android.systemui.volume;
+import com.android.systemui.DemoMode;
import com.android.systemui.statusbar.policy.ZenModeController;
-public interface VolumeComponent {
+public interface VolumeComponent extends DemoMode {
ZenModeController getZenController();
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
index 360dee5..247cc51 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
@@ -16,6 +16,9 @@
package com.android.systemui.volume;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
@@ -42,6 +45,8 @@ import android.media.VolumeProvider;
import android.media.session.MediaController;
import android.media.session.MediaController.PlaybackInfo;
import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.Message;
@@ -59,12 +64,15 @@ import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.android.internal.R;
+import com.android.systemui.DemoMode;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -76,7 +84,7 @@ import java.io.PrintWriter;
*
* @hide
*/
-public class VolumePanel extends Handler {
+public class VolumePanel extends Handler implements DemoMode {
private static final String TAG = "VolumePanel";
private static boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
@@ -129,6 +137,8 @@ public class VolumePanel extends Handler {
private static final int IC_AUDIO_VOL = com.android.systemui.R.drawable.ic_audio_vol;
private static final int IC_AUDIO_VOL_MUTE = com.android.systemui.R.drawable.ic_audio_vol_mute;
+ private static final int IC_AUDIO_BT = com.android.systemui.R.drawable.ic_audio_bt;
+ private static final int IC_AUDIO_BT_MUTE = com.android.systemui.R.drawable.ic_audio_bt_mute;
private final String mTag;
protected final Context mContext;
@@ -142,6 +152,7 @@ public class VolumePanel extends Handler {
private float mDisabledAlpha;
private int mLastRingerMode = AudioManager.RINGER_MODE_NORMAL;
private int mLastRingerProgress = 0;
+ private int mDemoIcon;
// True if we want to play tones on the system stream when the master stream is specified.
private final boolean mPlayMasterStreamTones;
@@ -166,12 +177,13 @@ public class VolumePanel extends Handler {
/** All the slider controls mapped by stream type */
private SparseArray<StreamControl> mStreamControls;
private final AccessibilityManager mAccessibilityManager;
+ private final SecondaryIconTransition mSecondaryIconTransition;
private enum StreamResources {
BluetoothSCOStream(AudioManager.STREAM_BLUETOOTH_SCO,
R.string.volume_icon_description_bluetooth,
- R.drawable.ic_audio_bt,
- R.drawable.ic_audio_bt,
+ IC_AUDIO_BT,
+ IC_AUDIO_BT_MUTE,
false),
RingerStream(AudioManager.STREAM_RING,
R.string.volume_icon_description_ringer,
@@ -180,8 +192,8 @@ public class VolumePanel extends Handler {
false),
VoiceStream(AudioManager.STREAM_VOICE_CALL,
R.string.volume_icon_description_incall,
- R.drawable.ic_audio_phone,
- R.drawable.ic_audio_phone,
+ com.android.systemui.R.drawable.ic_audio_phone,
+ com.android.systemui.R.drawable.ic_audio_phone,
false),
AlarmStream(AudioManager.STREAM_ALARM,
R.string.volume_alarm,
@@ -246,6 +258,8 @@ public class VolumePanel extends Handler {
ImageView icon;
SeekBar seekbarView;
TextView suppressorView;
+ View divider;
+ ImageView secondaryIcon;
int iconRes;
int iconMuteRes;
int iconSuppressedRes;
@@ -339,6 +353,7 @@ public class VolumePanel extends Handler {
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mAccessibilityManager = (AccessibilityManager) context.getSystemService(
Context.ACCESSIBILITY_SERVICE);
+ mSecondaryIconTransition = new SecondaryIconTransition();
// For now, only show master volume if master volume is supported
final Resources res = context.getResources();
@@ -381,6 +396,8 @@ public class VolumePanel extends Handler {
mActiveStreamType = -1;
mAudioManager.forceVolumeControlStream(mActiveStreamType);
setZenPanelVisible(false);
+ mDemoIcon = 0;
+ mSecondaryIconTransition.cancel();
}
});
@@ -604,10 +621,12 @@ public class VolumePanel extends Handler {
mStreamControls = new SparseArray<StreamControl>(STREAMS.length);
+ final StreamResources notificationStream = StreamResources.NotificationStream;
for (int i = 0; i < STREAMS.length; i++) {
StreamResources streamRes = STREAMS[i];
final int streamType = streamRes.streamType;
+ final boolean isNotification = isNotificationOrRing(streamType);
final StreamControl sc = new StreamControl();
sc.streamType = streamType;
@@ -620,8 +639,8 @@ public class VolumePanel extends Handler {
sc.iconRes = streamRes.iconRes;
sc.iconMuteRes = streamRes.iconMuteRes;
sc.icon.setImageResource(sc.iconRes);
- sc.icon.setClickable(isNotificationOrRing(streamType));
- if (sc.icon.isClickable()) {
+ sc.icon.setClickable(isNotification);
+ if (isNotification) {
sc.icon.setSoundEffectsEnabled(false);
sc.icon.setOnClickListener(new OnClickListener() {
@Override
@@ -636,6 +655,23 @@ public class VolumePanel extends Handler {
sc.suppressorView =
(TextView) sc.group.findViewById(com.android.systemui.R.id.suppressor);
sc.suppressorView.setVisibility(View.GONE);
+ final boolean showSecondary = !isNotification && notificationStream.show;
+ sc.divider = sc.group.findViewById(com.android.systemui.R.id.divider);
+ sc.secondaryIcon = (ImageView) sc.group
+ .findViewById(com.android.systemui.R.id.secondary_icon);
+ sc.secondaryIcon.setImageResource(com.android.systemui.R.drawable.ic_ringer_audible);
+ sc.secondaryIcon.setContentDescription(res.getString(notificationStream.descRes));
+ sc.secondaryIcon.setClickable(showSecondary);
+ sc.divider.setVisibility(showSecondary ? View.VISIBLE : View.GONE);
+ sc.secondaryIcon.setVisibility(showSecondary ? View.VISIBLE : View.GONE);
+ if (showSecondary) {
+ sc.secondaryIcon.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSecondaryIconTransition.start(sc);
+ }
+ });
+ }
final int plusOne = (streamType == AudioSystem.STREAM_BLUETOOTH_SCO ||
streamType == AudioSystem.STREAM_VOICE_CALL) ? 1 : 0;
sc.seekbarView.setMax(getStreamMaxVolume(streamType) + plusOne);
@@ -696,7 +732,7 @@ public class VolumePanel extends Handler {
}
muted = ringerMode == AudioManager.RINGER_MODE_VIBRATE;
}
- sc.icon.setImageResource(muted ? sc.iconMuteRes : sc.iconRes);
+ sc.icon.setImageResource(mDemoIcon != 0 ? mDemoIcon : muted ? sc.iconMuteRes : sc.iconRes);
}
private void updateSliderSupressor(StreamControl sc) {
@@ -800,7 +836,8 @@ public class VolumePanel extends Handler {
}
private void updateTimeoutDelay() {
- mTimeoutDelay = sSafetyWarning != null ? TIMEOUT_DELAY_SAFETY_WARNING
+ mTimeoutDelay = mDemoIcon != 0 ? TIMEOUT_DELAY_EXPANDED
+ : sSafetyWarning != null ? TIMEOUT_DELAY_SAFETY_WARNING
: mActiveStreamType == AudioManager.STREAM_MUSIC ? TIMEOUT_DELAY_SHORT
: mZenPanelExpanded ? TIMEOUT_DELAY_EXPANDED
: isZenPanelVisible() ? TIMEOUT_DELAY_COLLAPSED
@@ -995,7 +1032,7 @@ public class VolumePanel extends Handler {
(AudioManager.DEVICE_OUT_BLUETOOTH_A2DP |
AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
AudioManager.DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)) != 0) {
- setMusicIcon(R.drawable.ic_audio_bt, R.drawable.ic_audio_bt_mute);
+ setMusicIcon(IC_AUDIO_BT, IC_AUDIO_BT_MUTE);
} else {
setMusicIcon(IC_AUDIO_VOL, IC_AUDIO_VOL_MUTE);
}
@@ -1075,6 +1112,12 @@ public class VolumePanel extends Handler {
updateSliderProgress(sc, index);
updateSliderEnabled(sc, isMuted(streamType),
(flags & AudioManager.FLAG_FIXED_VOLUME) != 0);
+ // check for secondary-icon transition completion
+ if (isNotificationOrRing(streamType) && mSecondaryIconTransition.isRunning()) {
+ mSecondaryIconTransition.cancel(); // safe to reset
+ sc.seekbarView.setAlpha(0); sc.seekbarView.animate().alpha(1);
+ mZenPanel.setAlpha(0); mZenPanel.animate().alpha(1);
+ }
}
if (!isShowing()) {
@@ -1406,6 +1449,22 @@ public class VolumePanel extends Handler {
return mZenController;
}
+ @Override
+ public void dispatchDemoCommand(String command, Bundle args) {
+ if (!COMMAND_VOLUME.equals(command)) return;
+ String icon = args.getString("icon");
+ final String iconMute = args.getString("iconmute");
+ final boolean mute = iconMute != null;
+ icon = mute ? iconMute : icon;
+ icon = icon.endsWith("Stream") ? icon : (icon + "Stream");
+ final StreamResources sr = StreamResources.valueOf(icon);
+ mDemoIcon = mute ? sr.iconMuteRes : sr.iconRes;
+ final int forcedStreamType = StreamResources.MediaStream.streamType;
+ mAudioManager.forceVolumeControlStream(forcedStreamType);
+ mAudioManager.adjustStreamVolume(forcedStreamType, AudioManager.ADJUST_SAME,
+ AudioManager.FLAG_SHOW_UI);
+ }
+
private final OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@@ -1445,6 +1504,80 @@ public class VolumePanel extends Handler {
}
};
+ private final class SecondaryIconTransition extends AnimatorListenerAdapter
+ implements Runnable {
+ private static final int ANIMATION_TIME = 400;
+ private static final int WAIT_FOR_SWITCH_TIME = 1000;
+
+ private final int mAnimationTime = (int)(ANIMATION_TIME * ValueAnimator.getDurationScale());
+ private final int mFadeOutTime = mAnimationTime / 2;
+ private final int mDelayTime = mAnimationTime / 3;
+
+ private final Interpolator mIconInterpolator =
+ AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in);
+
+ private StreamControl mTarget;
+
+ public void start(StreamControl sc) {
+ if (sc == null) throw new IllegalArgumentException();
+ if (mTarget != null) {
+ cancel();
+ }
+ mTarget = sc;
+ mTimeoutDelay = mAnimationTime + WAIT_FOR_SWITCH_TIME;
+ resetTimeout();
+ mTarget.secondaryIcon.setClickable(false);
+ final int N = mTarget.group.getChildCount();
+ for (int i = 0; i < N; i++) {
+ final View child = mTarget.group.getChildAt(i);
+ if (child != mTarget.secondaryIcon) {
+ child.animate().alpha(0).setDuration(mFadeOutTime).start();
+ }
+ }
+ mTarget.secondaryIcon.animate()
+ .translationXBy(mTarget.icon.getX() - mTarget.secondaryIcon.getX())
+ .setInterpolator(mIconInterpolator)
+ .setStartDelay(mDelayTime)
+ .setDuration(mAnimationTime - mDelayTime)
+ .setListener(this)
+ .start();
+ }
+
+ public boolean isRunning() {
+ return mTarget != null;
+ }
+
+ public void cancel() {
+ if (mTarget == null) return;
+ mTarget.secondaryIcon.setClickable(true);
+ final int N = mTarget.group.getChildCount();
+ for (int i = 0; i < N; i++) {
+ final View child = mTarget.group.getChildAt(i);
+ if (child != mTarget.secondaryIcon) {
+ child.animate().cancel();
+ child.setAlpha(1);
+ }
+ }
+ mTarget.secondaryIcon.animate().cancel();
+ mTarget.secondaryIcon.setTranslationX(0);
+ mTarget = null;
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (mTarget == null) return;
+ AsyncTask.execute(this);
+ }
+
+ @Override
+ public void run() {
+ if (mTarget == null) return;
+ mAudioManager.forceVolumeControlStream(StreamResources.NotificationStream.streamType);
+ mAudioManager.adjustStreamVolume(StreamResources.NotificationStream.streamType,
+ AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
+ }
+ }
+
public interface Callback {
void onZenSettings();
void onInteraction();
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
index 0fe6d89..5232a17 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
@@ -10,6 +10,7 @@ import android.media.session.ISessionController;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.net.Uri;
+import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
import android.provider.Settings;
@@ -184,6 +185,11 @@ public class VolumeUI extends SystemUI {
public ZenModeController getZenController() {
return mPanel.getZenController();
}
+
+ @Override
+ public void dispatchDemoCommand(String command, Bundle args) {
+ mPanel.dispatchDemoCommand(command, args);
+ }
}
private final class RemoteVolumeController extends IRemoteVolumeController.Stub {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 28ecbf9..b325653 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -80,7 +80,6 @@ public class ZenModePanel extends LinearLayout {
private final Interpolator mFastOutSlowInInterpolator;
private final int mSubheadWarningColor;
private final int mSubheadColor;
- private final ZenToast mZenToast;
private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this));
@@ -115,7 +114,6 @@ public class ZenModePanel extends LinearLayout {
final Resources res = mContext.getResources();
mSubheadWarningColor = res.getColor(R.color.system_warning_color);
mSubheadColor = res.getColor(R.color.qs_subhead);
- mZenToast = new ZenToast(mContext);
if (DEBUG) Log.d(mTag, "new ZenModePanel");
}
@@ -124,10 +122,12 @@ public class ZenModePanel extends LinearLayout {
super.onFinishInflate();
mZenButtons = (SegmentedButtons) findViewById(R.id.zen_buttons);
- mZenButtons.addButton(R.string.interruption_level_none, Global.ZEN_MODE_NO_INTERRUPTIONS);
- mZenButtons.addButton(R.string.interruption_level_priority,
+ mZenButtons.addButton(R.string.interruption_level_none, R.drawable.ic_zen_none,
+ Global.ZEN_MODE_NO_INTERRUPTIONS);
+ mZenButtons.addButton(R.string.interruption_level_priority, R.drawable.ic_zen_important,
Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS);
- mZenButtons.addButton(R.string.interruption_level_all, Global.ZEN_MODE_OFF);
+ mZenButtons.addButton(R.string.interruption_level_all, R.drawable.ic_zen_all,
+ Global.ZEN_MODE_OFF);
mZenButtons.setCallback(mZenButtonsCallback);
mZenSubhead = findViewById(R.id.zen_subhead);
@@ -160,7 +160,6 @@ public class ZenModePanel extends LinearLayout {
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (DEBUG) Log.d(mTag, "onAttachedToWindow");
- mZenToast.hide();
mAttachedZen = getSelectedZen(-1);
mSessionZen = mAttachedZen;
mSessionExitCondition = copy(mExitCondition);
@@ -193,10 +192,6 @@ public class ZenModePanel extends LinearLayout {
if (selectedZen == Global.ZEN_MODE_NO_INTERRUPTIONS) {
mPrefs.trackNoneSelected();
}
- if (selectedZen == Global.ZEN_MODE_NO_INTERRUPTIONS
- || selectedZen == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) {
- mZenToast.show(selectedZen);
- }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenToast.java b/packages/SystemUI/src/com/android/systemui/volume/ZenToast.java
deleted file mode 100644
index d887712..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenToast.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.volume;
-
-import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;
-import static android.provider.Settings.Global.ZEN_MODE_NO_INTERRUPTIONS;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Resources;
-import android.graphics.PixelFormat;
-import android.os.Handler;
-import android.os.Message;
-import android.os.UserHandle;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnAttachStateChangeListener;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import com.android.systemui.R;
-
-public class ZenToast {
- private static final String ACTION_SHOW = ZenToast.class.getName() + ".SHOW";
- private static final String ACTION_HIDE = ZenToast.class.getName() + ".HIDE";
- private static final String EXTRA_ZEN = "zen";
- private static final String EXTRA_TEXT = "text";
-
- private static final int MSG_SHOW = 1;
- private static final int MSG_HIDE = 2;
-
- private final Context mContext;
- private final WindowManager mWindowManager;
-
- private View mZenToast;
-
- public ZenToast(Context context) {
- mContext = context;
- mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
- final IntentFilter filter = new IntentFilter();
- filter.addAction(ACTION_SHOW);
- filter.addAction(ACTION_HIDE);
- mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, mHandler);
- }
-
- public void show(int zen) {
- mHandler.removeMessages(MSG_HIDE);
- mHandler.removeMessages(MSG_SHOW);
- mHandler.obtainMessage(MSG_SHOW, zen, 0).sendToTarget();
- }
-
- public void hide() {
- mHandler.removeMessages(MSG_HIDE);
- mHandler.removeMessages(MSG_SHOW);
- mHandler.obtainMessage(MSG_HIDE).sendToTarget();
- }
-
- private void handleShow(int zen, String overrideText) {
- handleHide();
-
- String text;
- final int iconRes;
- switch (zen) {
- case ZEN_MODE_NO_INTERRUPTIONS:
- text = mContext.getString(R.string.zen_no_interruptions);
- iconRes = R.drawable.ic_zen_none;
- break;
- case ZEN_MODE_IMPORTANT_INTERRUPTIONS:
- text = mContext.getString(R.string.zen_important_interruptions);
- iconRes = R.drawable.ic_zen_important;
- break;
- default:
- return;
- }
- if (overrideText != null) {
- text = overrideText;
- }
- final Resources res = mContext.getResources();
- final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
- params.height = WindowManager.LayoutParams.WRAP_CONTENT;
- params.width = res.getDimensionPixelSize(R.dimen.zen_toast_width);
- params.format = PixelFormat.TRANSLUCENT;
- params.windowAnimations = R.style.ZenToastAnimations;
- params.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
- params.setTitle(getClass().getSimpleName());
- params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
- params.gravity = Gravity.CENTER;
- params.packageName = mContext.getPackageName();
- mZenToast = LayoutInflater.from(mContext).inflate(R.layout.zen_toast, null);
- final TextView message = (TextView) mZenToast.findViewById(android.R.id.message);
- message.setText(text);
- final ImageView icon = (ImageView) mZenToast.findViewById(android.R.id.icon);
- icon.setImageResource(iconRes);
- mZenToast.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
- @Override
- public void onViewDetachedFromWindow(View v) {
- // noop
- }
-
- @Override
- public void onViewAttachedToWindow(View v) {
- mZenToast.announceForAccessibility(message.getText());
- }
- });
- mWindowManager.addView(mZenToast, params);
- final int animDuration = res.getInteger(R.integer.zen_toast_animation_duration);
- final int visibleDuration = res.getInteger(R.integer.zen_toast_visible_duration);
- mHandler.sendEmptyMessageDelayed(MSG_HIDE, animDuration + visibleDuration);
- }
-
- private void handleHide() {
- if (mZenToast != null) {
- mWindowManager.removeView(mZenToast);
- mZenToast = null;
- }
- }
-
- private final Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_SHOW:
- handleShow(msg.arg1, null);
- break;
- case MSG_HIDE:
- handleHide();
- break;
- }
- }
- };
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (ACTION_SHOW.equals(intent.getAction())) {
- final int zen = intent.getIntExtra(EXTRA_ZEN, ZEN_MODE_IMPORTANT_INTERRUPTIONS);
- final String text = intent.getStringExtra(EXTRA_TEXT);
- handleShow(zen, text);
- } else if (ACTION_HIDE.equals(intent.getAction())) {
- handleHide();
- }
- }
- };
-}
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 28e4b86..262e071 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -22,6 +22,9 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := SystemUITests
+LOCAL_INSTRUMENTATION_FOR := SystemUI
+
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target
# sign this with platform cert, so this test is allowed to inject key events into
# UI it doesn't own. This is necessary to allow screenshots to be taken
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index e52806d..1d319cf 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -25,7 +25,7 @@
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.systemui.tests"
+ android:targetPackage="com.android.systemui"
android:label="Tests for SystemUI">
</instrumentation>
</manifest>
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotTest.java
index a0bc4d7..5e5c284 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotTest.java
@@ -44,6 +44,10 @@ public class ScreenshotTest extends ActivityInstrumentationTestCase2<ScreenshotS
* to trigger the screenshot, and verifies the screenshot was taken successfully.
*/
public void testScreenshot() throws Exception {
+ if (true) {
+ // Disable until this works again.
+ return;
+ }
Log.d(LOG_TAG, "starting testScreenshot");
// launch the activity.
ScreenshotStubActivity activity = getActivity();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
new file mode 100644
index 0000000..c0aa31d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -0,0 +1,162 @@
+
+package com.android.systemui.statusbar.policy;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+public class NetworkControllerBaseTest extends AndroidTestCase {
+ private static final String TAG = "NetworkControllerBaseTest";
+
+ protected NetworkControllerImpl mNetworkController;
+ protected PhoneStateListener mPhoneStateListener;
+ protected SignalCluster mSignalCluster;
+ private SignalStrength mSignalStrength;
+ private ServiceState mServiceState;
+ private ConnectivityManager mMockCM;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // Mockito stuff.
+ System.setProperty("dexmaker.dexcache", mContext.getCacheDir().getPath());
+ Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+
+ mMockCM = mock(ConnectivityManager.class);
+ when(mMockCM.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true);
+
+ // TODO: Move away from fake, use spy if possible after MSIM refactor.
+ mNetworkController = new FakeNetworkControllerImpl(mContext);
+
+ mPhoneStateListener = mNetworkController.mPhoneStateListener;
+ mSignalStrength = mock(SignalStrength.class);
+ mServiceState = mock(ServiceState.class);
+ mSignalCluster = mock(SignalCluster.class);
+ mNetworkController.addSignalCluster(mSignalCluster);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ mNetworkController.dump(null, pw, null);
+ pw.flush();
+ Log.d(TAG, sw.toString());
+ super.tearDown();
+ }
+
+ public void setConnectivity(int inetCondition, int networkType, boolean isConnected) {
+ Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION);
+ NetworkInfo networkInfo = mock(NetworkInfo.class);
+ when(networkInfo.isConnected()).thenReturn(isConnected);
+ when(networkInfo.getType()).thenReturn(networkType);
+ when(networkInfo.getTypeName()).thenReturn("");
+ when(mMockCM.getActiveNetworkInfo()).thenReturn(networkInfo);
+
+ i.putExtra(ConnectivityManager.EXTRA_INET_CONDITION, inetCondition);
+ mNetworkController.onReceive(mContext, i);
+ }
+
+ public void setGsmRoaming(boolean isRoaming) {
+ when(mServiceState.getRoaming()).thenReturn(isRoaming);
+ updateServiceState();
+ }
+
+ public void setVoiceRegState(int voiceRegState) {
+ when(mServiceState.getVoiceRegState()).thenReturn(voiceRegState);
+ updateServiceState();
+ }
+
+ public void setIsEmergencyOnly(boolean isEmergency) {
+ when(mServiceState.isEmergencyOnly()).thenReturn(isEmergency);
+ updateServiceState();
+ }
+
+ public void setCdmaLevel(int level) {
+ when(mSignalStrength.getCdmaLevel()).thenReturn(level);
+ updateSignalStrength();
+ }
+
+ public void setLevel(int level) {
+ when(mSignalStrength.getLevel()).thenReturn(level);
+ updateSignalStrength();
+ }
+
+ public void setIsGsm(boolean gsm) {
+ when(mSignalStrength.isGsm()).thenReturn(gsm);
+ updateSignalStrength();
+ }
+
+ public void setCdmaEri(int index, int mode) {
+ // TODO: Figure this out.
+ }
+
+ private void updateSignalStrength() {
+ Log.d(TAG, "Sending Signal Strength: " + mSignalStrength);
+ mPhoneStateListener.onSignalStrengthsChanged(mSignalStrength);
+ }
+
+ private void updateServiceState() {
+ Log.d(TAG, "Sending Service State: " + mServiceState);
+ mPhoneStateListener.onServiceStateChanged(mServiceState);
+ }
+
+ public void updateCallState(int state) {
+ // Inputs not currently used in NetworkControllerImpl.
+ mPhoneStateListener.onCallStateChanged(state, "0123456789");
+ }
+
+ public void updateDataConnectionState(int dataState, int dataNetType) {
+ mPhoneStateListener.onDataConnectionStateChanged(dataState, dataNetType);
+ }
+
+ public void updateDataActivity(int dataActivity) {
+ mPhoneStateListener.onDataActivity(dataActivity);
+ }
+
+ protected void verifyLastMobileDataIndicators(boolean visible, int icon) {
+ ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
+ ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
+
+ // TODO: Verify all fields.
+ Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators(
+ visibleArg.capture(), iconArg.capture(),
+ ArgumentCaptor.forClass(Integer.class).capture(),
+ ArgumentCaptor.forClass(String.class).capture(),
+ ArgumentCaptor.forClass(String.class).capture(),
+ ArgumentCaptor.forClass(Boolean.class).capture());
+
+ assertEquals(icon, (int) iconArg.getValue());
+ assertEquals(visible, (boolean) visibleArg.getValue());
+ }
+
+ private class FakeNetworkControllerImpl extends NetworkControllerImpl {
+ public FakeNetworkControllerImpl(Context context) {
+ super(context);
+ }
+
+ @Override
+ public ConnectivityManager getCM() {
+ return mMockCM;
+ }
+
+ public void registerListeners() {};
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
new file mode 100644
index 0000000..fc2b1aa
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -0,0 +1,37 @@
+package com.android.systemui.statusbar.policy;
+
+import android.net.ConnectivityManager;
+import android.telephony.ServiceState;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+
+public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
+
+ public void testSignalStrength() {
+ int testStrength = SignalStrength.SIGNAL_STRENGTH_MODERATE;
+ setIsGsm(true);
+ setVoiceRegState(ServiceState.STATE_IN_SERVICE);
+ setGsmRoaming(false);
+ setLevel(testStrength);
+ updateDataConnectionState(TelephonyManager.DATA_CONNECTED,
+ TelephonyManager.NETWORK_TYPE_UMTS);
+ setConnectivity(100, ConnectivityManager.TYPE_MOBILE, true);
+
+ verifyLastMobileDataIndicators(true,
+ TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH[1][testStrength]);
+ }
+
+ public void testSignalRoaming() {
+ int testStrength = SignalStrength.SIGNAL_STRENGTH_MODERATE;
+ setIsGsm(true);
+ setVoiceRegState(ServiceState.STATE_IN_SERVICE);
+ setGsmRoaming(true);
+ setLevel(testStrength);
+ updateDataConnectionState(TelephonyManager.DATA_CONNECTED,
+ TelephonyManager.NETWORK_TYPE_UMTS);
+ setConnectivity(100, ConnectivityManager.TYPE_MOBILE, true);
+
+ verifyLastMobileDataIndicators(true,
+ TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][testStrength]);
+ }
+}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 3c44e87..24de9a8 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -525,6 +525,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private boolean mAllowTheaterModeWakeFromKey;
private boolean mAllowTheaterModeWakeFromPowerKey;
private boolean mAllowTheaterModeWakeFromMotion;
+ private boolean mAllowTheaterModeWakeFromMotionWhenNotDreaming;
private boolean mAllowTheaterModeWakeFromCameraLens;
private boolean mAllowTheaterModeWakeFromLidSwitch;
private boolean mAllowTheaterModeWakeFromWakeGesture;
@@ -1235,6 +1236,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
com.android.internal.R.bool.config_allowTheaterModeWakeFromPowerKey);
mAllowTheaterModeWakeFromMotion = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromMotion);
+ mAllowTheaterModeWakeFromMotionWhenNotDreaming = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromMotionWhenNotDreaming);
mAllowTheaterModeWakeFromCameraLens = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_allowTheaterModeWakeFromCameraLens);
mAllowTheaterModeWakeFromLidSwitch = mContext.getResources().getBoolean(
@@ -3073,7 +3076,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
@Override
- public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset) {
+ public void getInsetHintLw(WindowManager.LayoutParams attrs, Rect outContentInsets,
+ Rect outStableInsets) {
final int fl = PolicyControl.getWindowFlags(null, attrs);
final int sysuiVis = PolicyControl.getSystemUiVisibility(null, attrs);
final int systemUiVisibility = (sysuiVis | attrs.subtreeSystemUiVisibility);
@@ -3091,26 +3095,30 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
if ((systemUiVisibility & View.SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0) {
if ((fl & FLAG_FULLSCREEN) != 0) {
- contentInset.set(mStableFullscreenLeft, mStableFullscreenTop,
+ outContentInsets.set(mStableFullscreenLeft, mStableFullscreenTop,
availRight - mStableFullscreenRight,
availBottom - mStableFullscreenBottom);
} else {
- contentInset.set(mStableLeft, mStableTop,
+ outContentInsets.set(mStableLeft, mStableTop,
availRight - mStableRight, availBottom - mStableBottom);
}
} else if ((fl & FLAG_FULLSCREEN) != 0 || (fl & FLAG_LAYOUT_IN_OVERSCAN) != 0) {
- contentInset.setEmpty();
+ outContentInsets.setEmpty();
} else if ((systemUiVisibility & (View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)) == 0) {
- contentInset.set(mCurLeft, mCurTop,
+ outContentInsets.set(mCurLeft, mCurTop,
availRight - mCurRight, availBottom - mCurBottom);
} else {
- contentInset.set(mCurLeft, mCurTop,
+ outContentInsets.set(mCurLeft, mCurTop,
availRight - mCurRight, availBottom - mCurBottom);
}
+
+ outStableInsets.set(mStableLeft, mStableTop,
+ availRight - mStableRight, availBottom - mStableBottom);
return;
}
- contentInset.setEmpty();
+ outContentInsets.setEmpty();
+ outStableInsets.setEmpty();
}
/** {@inheritDoc} */
@@ -4777,6 +4785,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return ACTION_PASS_TO_USER;
}
+ // If we have not passed the action up and we are in theater mode without dreaming,
+ // there will be no dream to intercept the touch and wake into ambient. The device should
+ // wake up in this case.
+ if (isTheaterModeEnabled() && (policyFlags & FLAG_WAKE) != 0) {
+ wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotionWhenNotDreaming);
+ }
+
return 0;
}
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index fea1a7a..6c2681b 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -153,7 +153,7 @@ import javax.crypto.spec.SecretKeySpec;
import libcore.io.IoUtils;
-public class BackupManagerService extends IBackupManager.Stub {
+public class BackupManagerService {
private static final String TAG = "BackupManagerService";
private static final boolean DEBUG = true;
@@ -322,8 +322,12 @@ public class BackupManagerService extends IBackupManager.Stub {
// Watch the device provisioning operation during setup
ContentObserver mProvisionedObserver;
- static BackupManagerService sInstance;
- static BackupManagerService getInstance() {
+ // The published binder is actually to a singleton trampoline object that calls
+ // through to the proper code. This indirection lets us turn down the heavy
+ // implementation object on the fly without disturbing binders that have been
+ // cached elsewhere in the system.
+ static Trampoline sInstance;
+ static Trampoline getInstance() {
// Always constructed during system bringup, so no need to lazy-init
return sInstance;
}
@@ -332,7 +336,7 @@ public class BackupManagerService extends IBackupManager.Stub {
public Lifecycle(Context context) {
super(context);
- sInstance = new BackupManagerService(context);
+ sInstance = new Trampoline(context);
}
@Override
@@ -342,11 +346,17 @@ public class BackupManagerService extends IBackupManager.Stub {
@Override
public void onBootPhase(int phase) {
- if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
+ if (phase == PHASE_SYSTEM_SERVICES_READY) {
+ sInstance.initialize(UserHandle.USER_OWNER);
+ } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
ContentResolver r = sInstance.mContext.getContentResolver();
boolean areEnabled = Settings.Secure.getInt(r,
Settings.Secure.BACKUP_ENABLED, 0) != 0;
- sInstance.setBackupEnabled(areEnabled);
+ try {
+ sInstance.setBackupEnabled(areEnabled);
+ } catch (RemoteException e) {
+ // can't happen; it's a local object
+ }
}
}
}
@@ -934,7 +944,7 @@ public class BackupManagerService extends IBackupManager.Stub {
// ----- Main service implementation -----
- public BackupManagerService(Context context) {
+ public BackupManagerService(Context context, Trampoline parent) {
mContext = context;
mPackageManager = context.getPackageManager();
mPackageManagerBinder = AppGlobals.getPackageManager();
@@ -944,7 +954,7 @@ public class BackupManagerService extends IBackupManager.Stub {
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
- mBackupManagerBinder = asInterface(asBinder());
+ mBackupManagerBinder = Trampoline.asInterface(parent.asBinder());
// spin up the backup/restore handler thread
mHandlerThread = new HandlerThread("backup", Process.THREAD_PRIORITY_BACKGROUND);
@@ -1451,7 +1461,6 @@ public class BackupManagerService extends IBackupManager.Stub {
return false;
}
- @Override
public boolean setBackupPassword(String currentPw, String newPw) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"setBackupPassword");
@@ -1532,7 +1541,6 @@ public class BackupManagerService extends IBackupManager.Stub {
return false;
}
- @Override
public boolean hasBackupPassword() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"hasBackupPassword");
@@ -8145,7 +8153,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
//
// This is the variant used by 'adb backup'; it requires on-screen confirmation
// by the user because it can be used to offload data over untrusted USB.
- @Override
public void fullBackup(ParcelFileDescriptor fd, boolean includeApks,
boolean includeObbs, boolean includeShared, boolean doWidgets,
boolean doAllApps, boolean includeSystem, boolean compress, String[] pkgList) {
@@ -8217,7 +8224,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
}
}
- @Override
public void fullTransportBackup(String[] pkgNames) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP,
"fullTransportBackup");
@@ -8247,7 +8253,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
}
}
- @Override
public void fullRestore(ParcelFileDescriptor fd) {
mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullRestore");
@@ -8343,7 +8348,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
// Confirm that the previously-requested full backup/restore operation can proceed. This
// is used to require a user-facing disclosure about the operation.
- @Override
public void acknowledgeFullBackupOrRestore(int token, boolean allow,
String curPassword, String encPpassword, IFullBackupRestoreObserver observer) {
if (DEBUG) Slog.d(TAG, "acknowledgeFullBackupOrRestore : token=" + token
@@ -8391,8 +8395,7 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
}
}
- // Enable/disable the backup service
- @Override
+ // Enable/disable backups
public void setBackupEnabled(boolean enable) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP,
"setBackupEnabled");
@@ -8798,7 +8801,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
// Note that a currently-active backup agent has notified us that it has
// completed the given outstanding asynchronous backup/restore operation.
- @Override
public void opComplete(int token) {
if (MORE_DEBUG) Slog.v(TAG, "opComplete: " + Integer.toHexString(token));
Operation op = null;
@@ -9147,7 +9149,6 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
}
}
- @Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
diff --git a/services/backup/java/com/android/server/backup/FullBackupJob.java b/services/backup/java/com/android/server/backup/FullBackupJob.java
index 601f15e..7ad7657c 100644
--- a/services/backup/java/com/android/server/backup/FullBackupJob.java
+++ b/services/backup/java/com/android/server/backup/FullBackupJob.java
@@ -59,7 +59,7 @@ public class FullBackupJob extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
mParams = params;
- BackupManagerService service = BackupManagerService.getInstance();
+ Trampoline service = BackupManagerService.getInstance();
return service.beginFullBackup(this);
}
@@ -67,7 +67,7 @@ public class FullBackupJob extends JobService {
public boolean onStopJob(JobParameters params) {
if (mParams != null) {
mParams = null;
- BackupManagerService service = BackupManagerService.getInstance();
+ Trampoline service = BackupManagerService.getInstance();
service.endFullBackup();
}
return false;
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
new file mode 100644
index 0000000..5d2187f
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -0,0 +1,327 @@
+/*
+ * 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.server.backup;
+
+import android.app.backup.IBackupManager;
+import android.app.backup.IFullBackupRestoreObserver;
+import android.app.backup.IRestoreSession;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Environment;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.util.Slog;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+public class Trampoline extends IBackupManager.Stub {
+ static final String TAG = "BackupManagerService";
+ static final boolean DEBUG_TRAMPOLINE = false;
+
+ // When this file is present, the backup service is inactive
+ static final String BACKUP_SUPPRESS_FILENAME = "backup-suppress";
+
+ // Product-level suppression of backup/restore
+ static final String BACKUP_DISABLE_PROPERTY = "ro.backup.disable";
+
+ final Context mContext;
+ final File mSuppressFile; // existence testing & creating synchronized on 'this'
+ final boolean mGlobalDisable;
+ volatile BackupManagerService mService;
+
+ public Trampoline(Context context) {
+ mContext = context;
+ File dir = new File(Environment.getSecureDataDirectory(), "backup");
+ dir.mkdirs();
+ mSuppressFile = new File(dir, BACKUP_SUPPRESS_FILENAME);
+ mGlobalDisable = SystemProperties.getBoolean(BACKUP_DISABLE_PROPERTY, false);
+ }
+
+ // internal control API
+ public void initialize(final int whichUser) {
+ // Note that only the owner user is currently involved in backup/restore
+ if (whichUser == UserHandle.USER_OWNER) {
+ // Does this product support backup/restore at all?
+ if (mGlobalDisable) {
+ Slog.i(TAG, "Backup/restore not supported");
+ return;
+ }
+
+ synchronized (this) {
+ if (!mSuppressFile.exists()) {
+ mService = new BackupManagerService(mContext, this);
+ } else {
+ Slog.i(TAG, "Backup inactive in user " + whichUser);
+ }
+ }
+ }
+ }
+
+ public void setBackupServiceActive(final int userHandle, boolean makeActive) {
+ // Only the DPM should be changing the active state of backup
+ final int caller = Binder.getCallingUid();
+ if (caller != Process.SYSTEM_UID
+ && caller != Process.ROOT_UID) {
+ throw new SecurityException("No permission to configure backup activity");
+ }
+
+ if (mGlobalDisable) {
+ Slog.i(TAG, "Backup/restore not supported");
+ return;
+ }
+
+ if (userHandle == UserHandle.USER_OWNER) {
+ synchronized (this) {
+ if (makeActive != (mService != null)) {
+ Slog.i(TAG, "Making backup "
+ + (makeActive ? "" : "in") + "active in user " + userHandle);
+ if (makeActive) {
+ mService = new BackupManagerService(mContext, this);
+ mSuppressFile.delete();
+ } else {
+ mService = null;
+ try {
+ mSuppressFile.createNewFile();
+ } catch (IOException e) {
+ Slog.e(TAG, "Unable to persist backup service inactivity");
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // IBackupManager binder API
+ @Override
+ public void dataChanged(String packageName) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.dataChanged(packageName);
+ }
+ }
+
+ @Override
+ public void clearBackupData(String transportName, String packageName)
+ throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.clearBackupData(transportName, packageName);
+ }
+ }
+
+ @Override
+ public void agentConnected(String packageName, IBinder agent) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.agentConnected(packageName, agent);
+ }
+ }
+
+ @Override
+ public void agentDisconnected(String packageName) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.agentDisconnected(packageName);
+ }
+ }
+
+ @Override
+ public void restoreAtInstall(String packageName, int token) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.restoreAtInstall(packageName, token);
+ }
+ }
+
+ @Override
+ public void setBackupEnabled(boolean isEnabled) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.setBackupEnabled(isEnabled);
+ }
+ }
+
+ @Override
+ public void setAutoRestore(boolean doAutoRestore) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.setAutoRestore(doAutoRestore);
+ }
+ }
+
+ @Override
+ public void setBackupProvisioned(boolean isProvisioned) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.setBackupProvisioned(isProvisioned);
+ }
+ }
+
+ @Override
+ public boolean isBackupEnabled() throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.isBackupEnabled() : false;
+ }
+
+ @Override
+ public boolean setBackupPassword(String currentPw, String newPw) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.setBackupPassword(currentPw, newPw) : false;
+ }
+
+ @Override
+ public boolean hasBackupPassword() throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.hasBackupPassword() : false;
+ }
+
+ @Override
+ public void backupNow() throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.backupNow();
+ }
+ }
+
+ @Override
+ public void fullBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeObbs,
+ boolean includeShared, boolean doWidgets, boolean allApps,
+ boolean allIncludesSystem, boolean doCompress, String[] packageNames)
+ throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.fullBackup(fd, includeApks, includeObbs, includeShared, doWidgets,
+ allApps, allIncludesSystem, doCompress, packageNames);
+ }
+ }
+
+ @Override
+ public void fullTransportBackup(String[] packageNames) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.fullTransportBackup(packageNames);
+ }
+ }
+
+ @Override
+ public void fullRestore(ParcelFileDescriptor fd) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.fullRestore(fd);
+ }
+ }
+
+ @Override
+ public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword,
+ String encryptionPassword, IFullBackupRestoreObserver observer)
+ throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.acknowledgeFullBackupOrRestore(token, allow,
+ curPassword, encryptionPassword, observer);
+ }
+ }
+
+ @Override
+ public String getCurrentTransport() throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.getCurrentTransport() : null;
+ }
+
+ @Override
+ public String[] listAllTransports() throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.listAllTransports() : null;
+ }
+
+ @Override
+ public String selectBackupTransport(String transport) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.selectBackupTransport(transport) : null;
+ }
+
+ @Override
+ public Intent getConfigurationIntent(String transport) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.getConfigurationIntent(transport) : null;
+ }
+
+ @Override
+ public String getDestinationString(String transport) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.getDestinationString(transport) : null;
+ }
+
+ @Override
+ public Intent getDataManagementIntent(String transport) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.getDataManagementIntent(transport) : null;
+ }
+
+ @Override
+ public String getDataManagementLabel(String transport) throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.getDataManagementLabel(transport) : null;
+ }
+
+ @Override
+ public IRestoreSession beginRestoreSession(String packageName, String transportID)
+ throws RemoteException {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.beginRestoreSession(packageName, transportID) : null;
+ }
+
+ @Override
+ public void opComplete(int token) throws RemoteException {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.opComplete(token);
+ }
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.dump(fd, pw, args);
+ } else {
+ pw.println("Inactive");
+ }
+ }
+
+ // Full backup/restore entry points - non-Binder; called directly
+ // by the full-backup scheduled job
+ /* package */ boolean beginFullBackup(FullBackupJob scheduledJob) {
+ BackupManagerService svc = mService;
+ return (svc != null) ? svc.beginFullBackup(scheduledJob) : false;
+ }
+
+ /* package */ void endFullBackup() {
+ BackupManagerService svc = mService;
+ if (svc != null) {
+ svc.endFullBackup();
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 636228b..ebdd386 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -44,6 +44,10 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
class BluetoothManagerService extends IBluetoothManager.Stub {
private static final String TAG = "BluetoothManagerService";
private static final boolean DBG = true;
@@ -1282,4 +1286,21 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
// todo: notify user to power down and power up phone to make bluetooth work.
}
}
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ writer.println("enabled: " + mEnable);
+ writer.println("state: " + mState);
+ writer.println("address: " + mAddress);
+ writer.println("name: " + mName);
+ if (mBluetooth == null) {
+ writer.println("Bluetooth Service not connected");
+ } else {
+ try {
+ writer.println(mBluetooth.dump());
+ } catch (RemoteException re) {
+ writer.println("RemoteException while calling Bluetooth Service");
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index a2d246d..5997680 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -23,18 +23,19 @@ import static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE;
import static android.net.ConnectivityManager.TYPE_BLUETOOTH;
import static android.net.ConnectivityManager.TYPE_DUMMY;
import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
-import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
+import static android.net.ConnectivityManager.TYPE_MOBILE_CBS;
import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
-import static android.net.ConnectivityManager.TYPE_MOBILE_IMS;
-import static android.net.ConnectivityManager.TYPE_MOBILE_CBS;
-import static android.net.ConnectivityManager.TYPE_MOBILE_IA;
import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_MOBILE_IA;
+import static android.net.ConnectivityManager.TYPE_MOBILE_IMS;
+import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
+import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
import static android.net.ConnectivityManager.TYPE_NONE;
+import static android.net.ConnectivityManager.TYPE_PROXY;
+import static android.net.ConnectivityManager.TYPE_VPN;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static android.net.ConnectivityManager.TYPE_PROXY;
import static android.net.ConnectivityManager.getNetworkTypeName;
import static android.net.ConnectivityManager.isNetworkTypeValid;
import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
@@ -184,7 +185,8 @@ import javax.net.ssl.SSLSession;
/**
* @hide
*/
-public class ConnectivityService extends IConnectivityManager.Stub {
+public class ConnectivityService extends IConnectivityManager.Stub
+ implements PendingIntent.OnFinished {
private static final String TAG = "ConnectivityService";
private static final boolean DBG = true;
@@ -382,6 +384,19 @@ public class ConnectivityService extends IConnectivityManager.Stub {
*/
private static final int EVENT_SYSTEM_READY = 25;
+ /**
+ * used to add a network request with a pending intent
+ * includes a NetworkRequestInfo
+ */
+ private static final int EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT = 26;
+
+ /**
+ * used to remove a pending intent and its associated network request.
+ * arg1 = UID of caller
+ * obj = PendingIntent
+ */
+ private static final int EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT = 27;
+
/** Handler used for internal events. */
final private InternalHandler mHandler;
@@ -395,6 +410,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private String mNetTransitionWakeLockCausedBy = "";
private int mNetTransitionWakeLockSerialNumber;
private int mNetTransitionWakeLockTimeout;
+ private final PowerManager.WakeLock mPendingIntentWakeLock;
private InetAddress mDefaultDns;
@@ -649,6 +665,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetTransitionWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mNetTransitionWakeLockTimeout = mContext.getResources().getInteger(
com.android.internal.R.integer.config_networkTransitionTimeout);
+ mPendingIntentWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mNetTrackers = new NetworkStateTracker[
ConnectivityManager.MAX_NETWORK_TYPE+1];
@@ -687,6 +704,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// ignore it - leave the entry null
}
}
+
+ // Forcibly add TYPE_VPN as a supported type, if it has not already been added via config.
+ if (mNetConfigs[TYPE_VPN] == null) {
+ // mNetConfigs is used only for "restore time", which isn't applicable to VPNs, so we
+ // don't need to add TYPE_VPN to mNetConfigs.
+ mLegacyTypeTracker.addSupportedType(TYPE_VPN);
+ mNetworksDefined++; // used only in the log() statement below.
+ }
+
if (VDBG) log("mNetworksDefined=" + mNetworksDefined);
mProtectedNetworks = new ArrayList<Integer>();
@@ -2131,11 +2157,40 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
+ // If this method proves to be too slow then we can maintain a separate
+ // pendingIntent => NetworkRequestInfo map.
+ // This method assumes that every non-null PendingIntent maps to exactly 1 NetworkRequestInfo.
+ private NetworkRequestInfo findExistingNetworkRequestInfo(PendingIntent pendingIntent) {
+ Intent intent = pendingIntent.getIntent();
+ for (Map.Entry<NetworkRequest, NetworkRequestInfo> entry : mNetworkRequests.entrySet()) {
+ PendingIntent existingPendingIntent = entry.getValue().mPendingIntent;
+ if (existingPendingIntent != null &&
+ existingPendingIntent.getIntent().filterEquals(intent)) {
+ return entry.getValue();
+ }
+ }
+ return null;
+ }
+
+ private void handleRegisterNetworkRequestWithIntent(Message msg) {
+ final NetworkRequestInfo nri = (NetworkRequestInfo) (msg.obj);
+
+ NetworkRequestInfo existingRequest = findExistingNetworkRequestInfo(nri.mPendingIntent);
+ if (existingRequest != null) { // remove the existing request.
+ if (DBG) log("Replacing " + existingRequest.request + " with "
+ + nri.request + " because their intents matched.");
+ handleReleaseNetworkRequest(existingRequest.request, getCallingUid());
+ }
+ handleRegisterNetworkRequest(msg);
+ }
+
private void handleRegisterNetworkRequest(Message msg) {
final NetworkRequestInfo nri = (NetworkRequestInfo) (msg.obj);
final NetworkCapabilities newCap = nri.request.networkCapabilities;
int score = 0;
+ mNetworkRequests.put(nri.request, nri);
+
// Check for the best currently alive network that satisfies this request
NetworkAgentInfo bestNetwork = null;
for (NetworkAgentInfo network : mNetworkAgentInfos.values()) {
@@ -2173,7 +2228,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mLegacyTypeTracker.add(nri.request.legacyType, bestNetwork);
}
}
- mNetworkRequests.put(nri.request, nri);
+
if (nri.isRequest) {
if (DBG) log("sending new NetworkRequest to factories");
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
@@ -2183,6 +2238,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
+ private void handleReleaseNetworkRequestWithIntent(PendingIntent pendingIntent,
+ int callingUid) {
+ NetworkRequestInfo nri = findExistingNetworkRequestInfo(pendingIntent);
+ if (nri != null) {
+ handleReleaseNetworkRequest(nri.request, callingUid);
+ }
+ }
+
private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) {
NetworkRequestInfo nri = mNetworkRequests.get(request);
if (nri != null) {
@@ -2218,11 +2281,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
- // Maintain the illusion. When this request arrived, we might have preteneded
+ // Maintain the illusion. When this request arrived, we might have pretended
// that a network connected to serve it, even though the network was already
// connected. Now that this request has gone away, we might have to pretend
// that the network disconnected. LegacyTypeTracker will generate that
- // phatom disconnect for this type.
+ // phantom disconnect for this type.
NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
if (nai != null) {
mNetworkForRequestId.remove(nri.request.requestId);
@@ -2253,7 +2316,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
@Override
public void handleMessage(Message msg) {
- NetworkInfo info;
switch (msg.what) {
case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
@@ -2334,6 +2396,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
handleRegisterNetworkRequest(msg);
break;
}
+ case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: {
+ handleRegisterNetworkRequestWithIntent(msg);
+ break;
+ }
+ case EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT: {
+ handleReleaseNetworkRequestWithIntent((PendingIntent) msg.obj, msg.arg1);
+ break;
+ }
case EVENT_RELEASE_NETWORK_REQUEST: {
handleReleaseNetworkRequest((NetworkRequest) msg.obj, msg.arg1);
break;
@@ -3347,12 +3417,23 @@ public class ConnectivityService extends IConnectivityManager.Stub {
static final boolean LISTEN = false;
final NetworkRequest request;
- IBinder mBinder;
+ final PendingIntent mPendingIntent;
+ private final IBinder mBinder;
final int mPid;
final int mUid;
final Messenger messenger;
final boolean isRequest;
+ NetworkRequestInfo(NetworkRequest r, PendingIntent pi, boolean isRequest) {
+ request = r;
+ mPendingIntent = pi;
+ messenger = null;
+ mBinder = null;
+ mPid = getCallingPid();
+ mUid = getCallingUid();
+ this.isRequest = isRequest;
+ }
+
NetworkRequestInfo(Messenger m, NetworkRequest r, IBinder binder, boolean isRequest) {
super();
messenger = m;
@@ -3361,6 +3442,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mPid = getCallingPid();
mUid = getCallingUid();
this.isRequest = isRequest;
+ mPendingIntent = null;
try {
mBinder.linkToDeath(this, 0);
@@ -3370,7 +3452,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
void unlinkDeathRecipient() {
- mBinder.unlinkToDeath(this, 0);
+ if (mBinder != null) {
+ mBinder.unlinkToDeath(this, 0);
+ }
}
public void binderDied() {
@@ -3381,22 +3465,46 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public String toString() {
return (isRequest ? "Request" : "Listen") + " from uid/pid:" + mUid + "/" +
- mPid + " for " + request;
+ mPid + " for " + request +
+ (mPendingIntent == null ? "" : " to trigger " + mPendingIntent);
}
}
@Override
public NetworkRequest requestNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, int timeoutMs, IBinder binder, int legacyType) {
+ networkCapabilities = new NetworkCapabilities(networkCapabilities);
+ enforceNetworkRequestPermissions(networkCapabilities);
+ enforceMeteredApnPolicy(networkCapabilities);
+
+ if (timeoutMs < 0 || timeoutMs > ConnectivityManager.MAX_NETWORK_REQUEST_TIMEOUT_MS) {
+ throw new IllegalArgumentException("Bad timeout specified");
+ }
+
+ NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
+ nextNetworkRequestId());
+ if (DBG) log("requestNetwork for " + networkRequest);
+ NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder,
+ NetworkRequestInfo.REQUEST);
+
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri));
+ if (timeoutMs > 0) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_TIMEOUT_NETWORK_REQUEST,
+ nri), timeoutMs);
+ }
+ return networkRequest;
+ }
+
+ private void enforceNetworkRequestPermissions(NetworkCapabilities networkCapabilities) {
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
== false) {
enforceConnectivityInternalPermission();
} else {
enforceChangePermission();
}
+ }
- networkCapabilities = new NetworkCapabilities(networkCapabilities);
-
+ private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) {
// if UID is restricted, don't allow them to bring up metered APNs
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
== false) {
@@ -3411,29 +3519,30 @@ public class ConnectivityService extends IConnectivityManager.Stub {
networkCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
}
}
+ }
- if (timeoutMs < 0 || timeoutMs > ConnectivityManager.MAX_NETWORK_REQUEST_TIMEOUT_MS) {
- throw new IllegalArgumentException("Bad timeout specified");
- }
- NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, legacyType,
+ @Override
+ public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities,
+ PendingIntent operation) {
+ checkNotNull(operation, "PendingIntent cannot be null.");
+ networkCapabilities = new NetworkCapabilities(networkCapabilities);
+ enforceNetworkRequestPermissions(networkCapabilities);
+ enforceMeteredApnPolicy(networkCapabilities);
+
+ NetworkRequest networkRequest = new NetworkRequest(networkCapabilities, TYPE_NONE,
nextNetworkRequestId());
- if (DBG) log("requestNetwork for " + networkRequest);
- NetworkRequestInfo nri = new NetworkRequestInfo(messenger, networkRequest, binder,
+ if (DBG) log("pendingRequest for " + networkRequest + " to trigger " + operation);
+ NetworkRequestInfo nri = new NetworkRequestInfo(networkRequest, operation,
NetworkRequestInfo.REQUEST);
-
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST, nri));
- if (timeoutMs > 0) {
- mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_TIMEOUT_NETWORK_REQUEST,
- nri), timeoutMs);
- }
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT,
+ nri));
return networkRequest;
}
@Override
- public NetworkRequest pendingRequestForNetwork(NetworkCapabilities networkCapabilities,
- PendingIntent operation) {
- // TODO
- return null;
+ public void releasePendingNetworkRequest(PendingIntent operation) {
+ mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT,
+ getCallingUid(), 0, operation));
}
@Override
@@ -3727,6 +3836,39 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
+ private void sendPendingIntentForRequest(NetworkRequestInfo nri, NetworkAgentInfo networkAgent,
+ int notificationType) {
+ if (notificationType == ConnectivityManager.CALLBACK_AVAILABLE) {
+ Intent intent = new Intent();
+ intent.putExtra(ConnectivityManager.EXTRA_NETWORK_REQUEST_NETWORK, nri.request);
+ intent.putExtra(ConnectivityManager.EXTRA_NETWORK_REQUEST_NETWORK_REQUEST,
+ networkAgent.network);
+ sendIntent(nri.mPendingIntent, intent);
+ }
+ // else not handled
+ }
+
+ private void sendIntent(PendingIntent pendingIntent, Intent intent) {
+ mPendingIntentWakeLock.acquire();
+ try {
+ if (DBG) log("Sending " + pendingIntent);
+ pendingIntent.send(mContext, 0, intent, this /* onFinished */, null /* Handler */);
+ } catch (PendingIntent.CanceledException e) {
+ if (DBG) log(pendingIntent + " was not sent, it had been canceled.");
+ mPendingIntentWakeLock.release();
+ releasePendingNetworkRequest(pendingIntent);
+ }
+ // ...otherwise, mPendingIntentWakeLock.release() gets called by onSendFinished()
+ }
+
+ @Override
+ public void onSendFinished(PendingIntent pendingIntent, Intent intent, int resultCode,
+ String resultData, Bundle resultExtras) {
+ if (DBG) log("Finished sending " + pendingIntent);
+ mPendingIntentWakeLock.release();
+ releasePendingNetworkRequest(pendingIntent);
+ }
+
private void callCallbackForRequest(NetworkRequestInfo nri,
NetworkAgentInfo networkAgent, int notificationType) {
if (nri.messenger == null) return; // Default request has no msgr
@@ -3979,6 +4121,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
notifyNetworkCallbacks(newNetwork, ConnectivityManager.CALLBACK_AVAILABLE);
+
+ // A VPN generally won't get added to the legacy tracker in the "for (nri)" loop above,
+ // because usually there are no NetworkRequests it satisfies (e.g., mDefaultRequest
+ // wants the NOT_VPN capability, so it will never be satisfied by a VPN). So, add the
+ // newNetwork to the tracker explicitly (it's a no-op if it has already been added).
+ if (newNetwork.isVPN()) {
+ mLegacyTypeTracker.add(TYPE_VPN, newNetwork);
+ }
} else if (nascent) {
// Only tear down newly validated networks here. Leave unvalidated to either become
// validated (and get evaluated against peers, one losing here) or
@@ -4137,7 +4287,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// } else if (nai.networkMonitor.isEvaluating()) {
// notifyType = NetworkCallbacks.callCallbackForRequest(request, nai, notifyType);
// }
- callCallbackForRequest(nri, nai, notifyType);
+ if (nri.mPendingIntent == null) {
+ callCallbackForRequest(nri, nai, notifyType);
+ } else {
+ sendPendingIntentForRequest(nri, nai, notifyType);
+ }
}
private void sendLegacyNetworkBroadcast(NetworkAgentInfo nai, boolean connected, int type) {
@@ -4196,7 +4350,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
NetworkRequest nr = networkAgent.networkRequests.valueAt(i);
NetworkRequestInfo nri = mNetworkRequests.get(nr);
if (VDBG) log(" sending notification for " + nr);
- callCallbackForRequest(nri, networkAgent, notifyType);
+ if (nri.mPendingIntent == null) {
+ callCallbackForRequest(nri, networkAgent, notifyType);
+ } else {
+ sendPendingIntentForRequest(nri, networkAgent, notifyType);
+ }
}
}
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index d9c96e4..be83b9b 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -60,6 +60,8 @@ import android.location.Address;
import android.location.Criteria;
import android.location.GeocoderParams;
import android.location.Geofence;
+import android.location.GpsMeasurementsEvent;
+import android.location.GpsNavigationMessageEvent;
import android.location.IGpsMeasurementsListener;
import android.location.IGpsNavigationMessageListener;
import android.location.IGpsStatusListener;
@@ -1859,8 +1861,8 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
- public boolean removeGpsMeasurementsListener(IGpsMeasurementsListener listener) {
- return mGpsMeasurementsProvider.removeListener(listener);
+ public void removeGpsMeasurementsListener(IGpsMeasurementsListener listener) {
+ mGpsMeasurementsProvider.removeListener(listener);
}
@Override
@@ -1888,8 +1890,8 @@ public class LocationManagerService extends ILocationManager.Stub {
}
@Override
- public boolean removeGpsNavigationMessageListener(IGpsNavigationMessageListener listener) {
- return mGpsNavigationMessageProvider.removeListener(listener);
+ public void removeGpsNavigationMessageListener(IGpsNavigationMessageListener listener) {
+ mGpsNavigationMessageProvider.removeListener(listener);
}
@Override
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index 11ba8e8..77662cc 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -43,11 +43,9 @@ import android.provider.Settings.Secure;
import android.provider.Settings.SettingNotFoundException;
import android.security.KeyStore;
import android.text.TextUtils;
-import android.util.Log;
import android.util.Slog;
import com.android.internal.widget.ILockSettings;
-import com.android.internal.widget.ILockSettingsObserver;
import com.android.internal.widget.LockPatternUtils;
import java.util.ArrayList;
@@ -64,9 +62,6 @@ public class LockSettingsService extends ILockSettings.Stub {
private static final String PERMISSION = ACCESS_KEYGUARD_SECURE_STORAGE;
- private static final String SYSTEM_DEBUGGABLE = "ro.debuggable";
-
-
private static final String TAG = "LockSettingsService";
private final Context mContext;
@@ -76,8 +71,6 @@ public class LockSettingsService extends ILockSettings.Stub {
private LockPatternUtils mLockPatternUtils;
private boolean mFirstCallToVold;
- private final ArrayList<LockSettingsObserver> mObservers = new ArrayList<>();
-
public LockSettingsService(Context context) {
mContext = context;
// Open the database
@@ -87,6 +80,7 @@ public class LockSettingsService extends ILockSettings.Stub {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_ADDED);
+ filter.addAction(Intent.ACTION_USER_STARTING);
mContext.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null);
mStorage = new LockSettingsStorage(context, new LockSettingsStorage.Callback() {
@@ -120,12 +114,16 @@ public class LockSettingsService extends ILockSettings.Stub {
final int parentSysUid = UserHandle.getUid(parentInfo.id, Process.SYSTEM_UID);
ks.syncUid(parentSysUid, userSysUid);
}
+ } else if (Intent.ACTION_USER_STARTING.equals(intent.getAction())) {
+ final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
+ mStorage.prefetchUser(userHandle);
}
}
};
public void systemReady() {
migrateOldData();
+ mStorage.prefetchUser(UserHandle.USER_OWNER);
}
private void migrateOldData() {
@@ -227,7 +225,6 @@ public class LockSettingsService extends ILockSettings.Stub {
private void setStringUnchecked(String key, int userId, String value) {
mStorage.writeKeyValue(key, value, userId);
- notifyObservers(key, userId);
}
@Override
@@ -255,52 +252,6 @@ public class LockSettingsService extends ILockSettings.Stub {
}
@Override
- public void registerObserver(ILockSettingsObserver remote) throws RemoteException {
- synchronized (mObservers) {
- for (int i = 0; i < mObservers.size(); i++) {
- if (mObservers.get(i).remote.asBinder() == remote.asBinder()) {
- boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));
- if (isDebuggable) {
- throw new IllegalStateException("Observer was already registered.");
- } else {
- Log.e(TAG, "Observer was already registered.");
- return;
- }
- }
- }
- LockSettingsObserver o = new LockSettingsObserver();
- o.remote = remote;
- o.remote.asBinder().linkToDeath(o, 0);
- mObservers.add(o);
- }
- }
-
- @Override
- public void unregisterObserver(ILockSettingsObserver remote) throws RemoteException {
- synchronized (mObservers) {
- for (int i = 0; i < mObservers.size(); i++) {
- if (mObservers.get(i).remote.asBinder() == remote.asBinder()) {
- mObservers.remove(i);
- return;
- }
- }
- }
- }
-
- public void notifyObservers(String key, int userId) {
- synchronized (mObservers) {
- for (int i = 0; i < mObservers.size(); i++) {
- try {
- mObservers.get(i).remote.onLockSettingChanged(key, userId);
- } catch (RemoteException e) {
- // The stack trace is not really helpful here.
- Log.e(TAG, "Failed to notify ILockSettingsObserver: " + e);
- }
- }
- }
- }
-
- @Override
public boolean havePassword(int userId) throws RemoteException {
// Do we need a permissions check here?
@@ -444,7 +395,6 @@ public class LockSettingsService extends ILockSettings.Stub {
checkWritePermission(userId);
mStorage.removeUser(userId);
- notifyObservers(null /* key */, userId);
final KeyStore ks = KeyStore.getInstance();
final int userUid = UserHandle.getUid(userId, Process.SYSTEM_UID);
@@ -483,13 +433,4 @@ public class LockSettingsService extends ILockSettings.Stub {
}
return null;
}
-
- private class LockSettingsObserver implements DeathRecipient {
- ILockSettingsObserver remote;
-
- @Override
- public void binderDied() {
- mObservers.remove(this);
- }
- }
}
diff --git a/services/core/java/com/android/server/LockSettingsStorage.java b/services/core/java/com/android/server/LockSettingsStorage.java
index acbf8ef..c03bb58 100644
--- a/services/core/java/com/android/server/LockSettingsStorage.java
+++ b/services/core/java/com/android/server/LockSettingsStorage.java
@@ -16,6 +16,8 @@
package com.android.server;
+import com.android.internal.annotations.VisibleForTesting;
+
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.UserInfo;
@@ -49,25 +51,31 @@ class LockSettingsStorage {
private static final String[] COLUMNS_FOR_QUERY = {
COLUMN_VALUE
};
+ private static final String[] COLUMNS_FOR_PREFETCH = {
+ COLUMN_KEY, COLUMN_VALUE
+ };
private static final String SYSTEM_DIRECTORY = "/system/";
private static final String LOCK_PATTERN_FILE = "gesture.key";
private static final String LOCK_PASSWORD_FILE = "password.key";
+ private static final Object DEFAULT = new Object();
+
private final DatabaseHelper mOpenHelper;
private final Context mContext;
+ private final Cache mCache = new Cache();
private final Object mFileWriteLock = new Object();
- LockSettingsStorage(Context context, Callback callback) {
+ public LockSettingsStorage(Context context, Callback callback) {
mContext = context;
mOpenHelper = new DatabaseHelper(context, callback);
}
- void writeKeyValue(String key, String value, int userId) {
+ public void writeKeyValue(String key, String value, int userId) {
writeKeyValue(mOpenHelper.getWritableDatabase(), key, value, userId);
}
- void writeKeyValue(SQLiteDatabase db, String key, String value, int userId) {
+ public void writeKeyValue(SQLiteDatabase db, String key, String value, int userId) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_KEY, key);
cv.put(COLUMN_USERID, userId);
@@ -79,15 +87,24 @@ class LockSettingsStorage {
new String[] {key, Integer.toString(userId)});
db.insert(TABLE, null, cv);
db.setTransactionSuccessful();
+ mCache.putKeyValue(key, value, userId);
} finally {
db.endTransaction();
}
}
- String readKeyValue(String key, String defaultValue, int userId) {
+ public String readKeyValue(String key, String defaultValue, int userId) {
+ int version;
+ synchronized (mCache) {
+ if (mCache.hasKeyValue(key, userId)) {
+ return mCache.peekKeyValue(key, defaultValue, userId);
+ }
+ version = mCache.getVersion();
+ }
+
Cursor cursor;
- String result = defaultValue;
+ Object result = DEFAULT;
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if ((cursor = db.query(TABLE, COLUMNS_FOR_QUERY,
COLUMN_USERID + "=? AND " + COLUMN_KEY + "=?",
@@ -98,39 +115,77 @@ class LockSettingsStorage {
}
cursor.close();
}
- return result;
+ mCache.putKeyValueIfUnchanged(key, result, userId, version);
+ return result == DEFAULT ? defaultValue : (String) result;
}
- byte[] readPasswordHash(int userId) {
- final byte[] stored = readFile(getLockPasswordFilename(userId), userId);
+ public void prefetchUser(int userId) {
+ int version;
+ synchronized (mCache) {
+ if (mCache.isFetched(userId)) {
+ return;
+ }
+ mCache.setFetched(userId);
+ version = mCache.getVersion();
+ }
+
+ Cursor cursor;
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+ if ((cursor = db.query(TABLE, COLUMNS_FOR_PREFETCH,
+ COLUMN_USERID + "=?",
+ new String[] { Integer.toString(userId) },
+ null, null, null)) != null) {
+ while (cursor.moveToNext()) {
+ String key = cursor.getString(0);
+ String value = cursor.getString(1);
+ mCache.putKeyValueIfUnchanged(key, value, userId, version);
+ }
+ cursor.close();
+ }
+
+ // Populate cache by reading the password and pattern files.
+ readPasswordHash(userId);
+ readPatternHash(userId);
+ }
+
+ public byte[] readPasswordHash(int userId) {
+ final byte[] stored = readFile(getLockPasswordFilename(userId));
if (stored != null && stored.length > 0) {
return stored;
}
return null;
}
- byte[] readPatternHash(int userId) {
- final byte[] stored = readFile(getLockPatternFilename(userId), userId);
+ public byte[] readPatternHash(int userId) {
+ final byte[] stored = readFile(getLockPatternFilename(userId));
if (stored != null && stored.length > 0) {
return stored;
}
return null;
}
- boolean hasPassword(int userId) {
- return hasFile(getLockPasswordFilename(userId), userId);
+ public boolean hasPassword(int userId) {
+ return hasFile(getLockPasswordFilename(userId));
}
- boolean hasPattern(int userId) {
- return hasFile(getLockPatternFilename(userId), userId);
+ public boolean hasPattern(int userId) {
+ return hasFile(getLockPatternFilename(userId));
}
- private boolean hasFile(String name, int userId) {
- byte[] contents = readFile(name, userId);
+ private boolean hasFile(String name) {
+ byte[] contents = readFile(name);
return contents != null && contents.length > 0;
}
- private byte[] readFile(String name, int userId) {
+ private byte[] readFile(String name) {
+ int version;
+ synchronized (mCache) {
+ if (mCache.hasFile(name)) {
+ return mCache.peekFile(name);
+ }
+ version = mCache.getVersion();
+ }
+
RandomAccessFile raf = null;
byte[] stored = null;
try {
@@ -149,10 +204,11 @@ class LockSettingsStorage {
}
}
}
+ mCache.putFileIfUnchanged(name, stored, version);
return stored;
}
- private void writeFile(String name, byte[] hash, int userId) {
+ private void writeFile(String name, byte[] hash) {
synchronized (mFileWriteLock) {
RandomAccessFile raf = null;
try {
@@ -176,43 +232,39 @@ class LockSettingsStorage {
}
}
}
+ mCache.putFile(name, hash);
}
}
public void writePatternHash(byte[] hash, int userId) {
- writeFile(getLockPatternFilename(userId), hash, userId);
+ writeFile(getLockPatternFilename(userId), hash);
}
public void writePasswordHash(byte[] hash, int userId) {
- writeFile(getLockPasswordFilename(userId), hash, userId);
+ writeFile(getLockPasswordFilename(userId), hash);
}
- private String getLockPatternFilename(int userId) {
- String dataSystemDirectory =
- android.os.Environment.getDataDirectory().getAbsolutePath() +
- SYSTEM_DIRECTORY;
- userId = getUserParentOrSelfId(userId);
- if (userId == 0) {
- // Leave it in the same place for user 0
- return dataSystemDirectory + LOCK_PATTERN_FILE;
- } else {
- return new File(Environment.getUserSystemDirectory(userId), LOCK_PATTERN_FILE)
- .getAbsolutePath();
- }
+ @VisibleForTesting
+ String getLockPatternFilename(int userId) {
+ return getLockCredentialFilePathForUser(userId, LOCK_PATTERN_FILE);
}
- private String getLockPasswordFilename(int userId) {
+ @VisibleForTesting
+ String getLockPasswordFilename(int userId) {
+ return getLockCredentialFilePathForUser(userId, LOCK_PASSWORD_FILE);
+ }
+
+ private String getLockCredentialFilePathForUser(int userId, String basename) {
userId = getUserParentOrSelfId(userId);
String dataSystemDirectory =
android.os.Environment.getDataDirectory().getAbsolutePath() +
SYSTEM_DIRECTORY;
if (userId == 0) {
// Leave it in the same place for user 0
- return dataSystemDirectory + LOCK_PASSWORD_FILE;
+ return dataSystemDirectory + basename;
} else {
- return new File(Environment.getUserSystemDirectory(userId), LOCK_PASSWORD_FILE)
- .getAbsolutePath();
+ return new File(Environment.getUserSystemDirectory(userId), basename).getAbsolutePath();
}
}
@@ -237,13 +289,17 @@ class LockSettingsStorage {
synchronized (mFileWriteLock) {
if (parentInfo == null) {
// This user owns its lock settings files - safe to delete them
- File file = new File(getLockPasswordFilename(userId));
+ String name = getLockPasswordFilename(userId);
+ File file = new File(name);
if (file.exists()) {
file.delete();
+ mCache.putFile(name, null);
}
- file = new File(getLockPatternFilename(userId));
+ name = getLockPatternFilename(userId);
+ file = new File(name);
if (file.exists()) {
file.delete();
+ mCache.putFile(name, null);
}
}
}
@@ -252,13 +308,23 @@ class LockSettingsStorage {
db.beginTransaction();
db.delete(TABLE, COLUMN_USERID + "='" + userId + "'", null);
db.setTransactionSuccessful();
+ mCache.removeUser(userId);
} finally {
db.endTransaction();
}
}
+ @VisibleForTesting
+ void closeDatabase() {
+ mOpenHelper.close();
+ }
- interface Callback {
+ @VisibleForTesting
+ void clearCache() {
+ mCache.clear();
+ }
+
+ public interface Callback {
void initialize(SQLiteDatabase db);
}
@@ -304,4 +370,137 @@ class LockSettingsStorage {
}
}
}
+
+ /**
+ * Cache consistency model:
+ * - Writes to storage write directly to the cache, but this MUST happen within the atomic
+ * section either provided by the database transaction or mWriteLock, such that writes to the
+ * cache and writes to the backing storage are guaranteed to occur in the same order
+ *
+ * - Reads can populate the cache, but because they are no strong ordering guarantees with
+ * respect to writes this precaution is taken:
+ * - The cache is assigned a version number that increases every time the cache is modified.
+ * Reads from backing storage can only populate the cache if the backing storage
+ * has not changed since the load operation has begun.
+ * This guarantees that no read operation can shadow a write to the cache that happens
+ * after it had begun.
+ */
+ private static class Cache {
+ private final ArrayMap<CacheKey, Object> mCache = new ArrayMap<>();
+ private final CacheKey mCacheKey = new CacheKey();
+ private int mVersion = 0;
+
+ String peekKeyValue(String key, String defaultValue, int userId) {
+ Object cached = peek(CacheKey.TYPE_KEY_VALUE, key, userId);
+ return cached == DEFAULT ? defaultValue : (String) cached;
+ }
+
+ boolean hasKeyValue(String key, int userId) {
+ return contains(CacheKey.TYPE_KEY_VALUE, key, userId);
+ }
+
+ void putKeyValue(String key, String value, int userId) {
+ put(CacheKey.TYPE_KEY_VALUE, key, value, userId);
+ }
+
+ void putKeyValueIfUnchanged(String key, Object value, int userId, int version) {
+ putIfUnchanged(CacheKey.TYPE_KEY_VALUE, key, value, userId, version);
+ }
+
+ byte[] peekFile(String fileName) {
+ return (byte[]) peek(CacheKey.TYPE_FILE, fileName, -1 /* userId */);
+ }
+
+ boolean hasFile(String fileName) {
+ return contains(CacheKey.TYPE_FILE, fileName, -1 /* userId */);
+ }
+
+ void putFile(String key, byte[] value) {
+ put(CacheKey.TYPE_FILE, key, value, -1 /* userId */);
+ }
+
+ void putFileIfUnchanged(String key, byte[] value, int version) {
+ putIfUnchanged(CacheKey.TYPE_FILE, key, value, -1 /* userId */, version);
+ }
+
+ void setFetched(int userId) {
+ put(CacheKey.TYPE_FETCHED, "isFetched", "true", userId);
+ }
+
+ boolean isFetched(int userId) {
+ return contains(CacheKey.TYPE_FETCHED, "", userId);
+ }
+
+
+ private synchronized void put(int type, String key, Object value, int userId) {
+ // Create a new CachKey here because it may be saved in the map if the key is absent.
+ mCache.put(new CacheKey().set(type, key, userId), value);
+ mVersion++;
+ }
+
+ private synchronized void putIfUnchanged(int type, String key, Object value, int userId,
+ int version) {
+ if (!contains(type, key, userId) && mVersion == version) {
+ put(type, key, value, userId);
+ }
+ }
+
+ private synchronized boolean contains(int type, String key, int userId) {
+ return mCache.containsKey(mCacheKey.set(type, key, userId));
+ }
+
+ private synchronized Object peek(int type, String key, int userId) {
+ return mCache.get(mCacheKey.set(type, key, userId));
+ }
+
+ private synchronized int getVersion() {
+ return mVersion;
+ }
+
+ synchronized void removeUser(int userId) {
+ for (int i = mCache.size() - 1; i >= 0; i--) {
+ if (mCache.keyAt(i).userId == userId) {
+ mCache.removeAt(i);
+ }
+ }
+
+ // Make sure in-flight loads can't write to cache.
+ mVersion++;
+ }
+
+ synchronized void clear() {
+ mCache.clear();
+ mVersion++;
+ }
+
+ private static final class CacheKey {
+ static final int TYPE_KEY_VALUE = 0;
+ static final int TYPE_FILE = 1;
+ static final int TYPE_FETCHED = 2;
+
+ String key;
+ int userId;
+ int type;
+
+ public CacheKey set(int type, String key, int userId) {
+ this.type = type;
+ this.key = key;
+ this.userId = userId;
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof CacheKey))
+ return false;
+ CacheKey o = (CacheKey) obj;
+ return userId == o.userId && type == o.type && key.equals(o.key);
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode() ^ userId ^ type;
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java
index 96f9ab0..8c3b020 100644
--- a/services/core/java/com/android/server/NativeDaemonConnector.java
+++ b/services/core/java/com/android/server/NativeDaemonConnector.java
@@ -176,7 +176,6 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo
if (buffer[i] == 0) {
final String rawEvent = new String(
buffer, start, i - start, StandardCharsets.UTF_8);
- log("RCV <- {" + rawEvent + "}");
boolean releaseWl = false;
try {
@@ -197,7 +196,6 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo
mResponseQueue.add(event.getCmdNumber(), event);
}
} catch (IllegalArgumentException e) {
- log("Problem parsing message: " + rawEvent + " - " + e);
} finally {
if (releaseWl) {
mWakeLock.acquire();
@@ -209,7 +207,6 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo
}
if (start == 0) {
final String rawEvent = new String(buffer, start, count, StandardCharsets.UTF_8);
- log("RCV incomplete <- {" + rawEvent + "}");
}
// We should end at the amount we read. If not, compact then
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index fcc5339..2ed021a 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -34,6 +34,8 @@ import android.os.UserHandle;
import android.telephony.CellLocation;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.Rlog;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionListener;
import android.telephony.TelephonyManager;
import android.telephony.SubscriptionManager;
import android.telephony.PhoneStateListener;
@@ -56,6 +58,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import com.android.internal.app.IBatteryStats;
+import com.android.internal.telephony.ISubscriptionListener;
import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.IPhoneStateListener;
import com.android.internal.telephony.DefaultPhoneNotifier;
@@ -90,19 +93,30 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
IBinder binder;
IPhoneStateListener callback;
+ ISubscriptionListener subscriptionListenerCallback;
int callerUid;
int events;
- int subId;
+ int subId = SubscriptionManager.INVALID_SUB_ID;
- int phoneId;
+ int phoneId = SubscriptionManager.INVALID_PHONE_ID;
+
+ boolean matchPhoneStateListenerEvent(int events) {
+ return (callback != null) && ((events & this.events) != 0);
+ }
+
+ boolean matchSubscriptionListenerEvent(int events) {
+ return (subscriptionListenerCallback != null) && ((events & this.events) != 0);
+ }
@Override
public String toString() {
- return "{pkgForDebug=" + pkgForDebug + " callerUid=" + callerUid + " subId=" + subId +
- " phoneId=" + phoneId + " events=" + Integer.toHexString(events) + "}";
+ return "{pkgForDebug=" + pkgForDebug + " binder=" + binder + " callback=" + callback
+ + " subscriptionListenererCallback=" + subscriptionListenerCallback
+ + " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId
+ + " events=" + Integer.toHexString(events) + "}";
}
}
@@ -325,6 +339,101 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
@Override
+ public void registerSubscriptionListener(String pkgForDebug, ISubscriptionListener callback,
+ int events) {
+ int callerUid = UserHandle.getCallingUserId();
+ int myUid = UserHandle.myUserId();
+ if (VDBG) {
+ log("listen sl: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events)
+ + " myUid=" + myUid + " callerUid=" + callerUid + " callback=" + callback
+ + " callback.asBinder=" + callback.asBinder());
+ }
+
+ if (events != 0) {
+ /* Checks permission and throws Security exception */
+ checkSubscriptionListenerPermission(events);
+ Record r = null;
+
+ synchronized (mRecords) {
+ // register
+ find_and_add: {
+ IBinder b = callback.asBinder();
+ final int N = mRecords.size();
+ for (int i = 0; i < N; i++) {
+ r = mRecords.get(i);
+ if (b == r.binder) {
+ break find_and_add;
+ }
+ }
+ r = new Record();
+ r.binder = b;
+ mRecords.add(r);
+ if (DBG) log("listen sl: add new record");
+ }
+
+ r.subscriptionListenerCallback = callback;
+ r.pkgForDebug = pkgForDebug;
+ r.callerUid = callerUid;
+ r.events = events;
+ if (DBG) {
+ log("listen sl: Register r=" + r);
+ }
+ }
+
+ // Always notify when a listen is established.
+ if (r.matchSubscriptionListenerEvent(
+ SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED)) {
+ try {
+ if (VDBG) log("listen sl: send to r=" + r);
+ r.subscriptionListenerCallback.onSubscriptionInfoChanged();
+ if (VDBG) log("listen sl: sent to r=" + r);
+ } catch (RemoteException e) {
+ if (VDBG) log("listen sl: remote exception sending to r=" + r + " e=" + e);
+ remove(r.binder);
+ }
+ }
+ } else {
+ if (DBG) log("listen sl: Unregister as event is LISTEN_NONE");
+ unregisterSubscriptionListener(pkgForDebug, callback);
+ }
+ }
+
+ @Override
+ public void unregisterSubscriptionListener(String pkgForDebug, ISubscriptionListener callback) {
+ if (DBG) log("listen sl: Unregister as event is LISTEN_NONE");
+ remove(callback.asBinder());
+ }
+
+ private void checkSubscriptionListenerPermission(int events) {
+ if ((events & SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED) != 0) {
+ mContext.enforceCallingOrSelfPermission(
+ SubscriptionListener.PERMISSION_LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED, null);
+ }
+ }
+
+ @Override
+ public void notifySubscriptionInfoChanged() {
+ if (VDBG) log("notifySubscriptionInfoChanged:");
+ synchronized (mRecords) {
+ mRemoveList.clear();
+ for (Record r : mRecords) {
+ if (r.matchSubscriptionListenerEvent(
+ SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED)) {
+ try {
+ if (VDBG) log("notifySubscriptionInfoChanged: send to r=" + r);
+ r.subscriptionListenerCallback.onSubscriptionInfoChanged();
+ if (VDBG) log("notifySubscriptionInfoChanged: sent to r=" + r);
+ } catch (RemoteException ex) {
+ if (VDBG) log("notifySubscriptionInfoChanged: RemoteException r=" + r);
+ mRemoveList.add(r.binder);
+ }
+ }
+ }
+ handleRemoveListLocked();
+ }
+ }
+
+ @Override
public void listen(String pkgForDebug, IPhoneStateListener callback, int events,
boolean notifyNow) {
listenForSubscriber(SubscriptionManager.DEFAULT_SUB_ID, pkgForDebug, callback, events,
@@ -513,6 +622,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
final int recordCount = mRecords.size();
for (int i = 0; i < recordCount; i++) {
if (mRecords.get(i).binder == binder) {
+ if (VDBG) log("remove: binder=" + binder);
mRecords.remove(i);
return;
}
@@ -531,7 +641,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) {
for (Record r : mRecords) {
- if (((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) &&
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) &&
(r.subId == SubscriptionManager.DEFAULT_SUB_ID)) {
try {
r.callback.onCallStateChanged(state, incomingNumber);
@@ -559,7 +669,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mCallState[phoneId] = state;
mCallIncomingNumber[phoneId] = incomingNumber;
for (Record r : mRecords) {
- if (((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) &&
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) &&
(r.subId == subId) &&
(r.subId != SubscriptionManager.DEFAULT_SUB_ID)) {
try {
@@ -595,8 +705,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
log("notifyServiceStateForSubscriber: r=" + r + " subId=" + subId
+ " phoneId=" + phoneId + " state=" + state);
}
- if (((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) &&
- subIdMatch(r.subId, subId)) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SERVICE_STATE) &&
+ idMatch(r.subId, subId, phoneId)) {
try {
if (DBG) {
log("notifyServiceStateForSubscriber: callback.onSSC r=" + r
@@ -640,8 +750,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
log("notifySignalStrengthForSubscriber: r=" + r + " subId=" + subId
+ " phoneId=" + phoneId + " ss=" + signalStrength);
}
- if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) &&
- subIdMatch(r.subId, subId)) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) &&
+ idMatch(r.subId, subId, phoneId)) {
try {
if (DBG) {
log("notifySignalStrengthForSubscriber: callback.onSsS r=" + r
@@ -653,8 +764,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mRemoveList.add(r.binder);
}
}
- if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) &&
- subIdMatch(r.subId, subId)){
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SIGNAL_STRENGTH) &&
+ idMatch(r.subId, subId, phoneId)){
try {
int gsmSignalStrength = signalStrength.getGsmSignalStrength();
int ss = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
@@ -696,7 +807,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mCellInfo.set(phoneId, cellInfo);
for (Record r : mRecords) {
if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) &&
- subIdMatch(r.subId, subId)) {
+ idMatch(r.subId, subId, phoneId)) {
try {
if (DBG_LOC) {
log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r);
@@ -750,8 +861,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (validatePhoneId(phoneId)) {
mMessageWaiting[phoneId] = mwi;
for (Record r : mRecords) {
- if (((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) &&
- subIdMatch(r.subId, subId)) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) &&
+ idMatch(r.subId, subId, phoneId)) {
try {
r.callback.onMessageWaitingIndicatorChanged(mwi);
} catch (RemoteException ex) {
@@ -781,8 +893,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (validatePhoneId(phoneId)) {
mCallForwarding[phoneId] = cfi;
for (Record r : mRecords) {
- if (((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) &&
- subIdMatch(r.subId, subId)) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) &&
+ idMatch(r.subId, subId, phoneId)) {
try {
r.callback.onCallForwardingIndicatorChanged(cfi);
} catch (RemoteException ex) {
@@ -807,7 +920,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
int phoneId = SubscriptionManager.getPhoneId(subId);
mDataActivity[phoneId] = state;
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_DATA_ACTIVITY)) {
try {
r.callback.onDataActivity(state);
} catch (RemoteException ex) {
@@ -878,8 +991,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
+ ", " + mDataConnectionNetworkType[phoneId] + ")");
}
for (Record r : mRecords) {
- if (((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) &&
- subIdMatch(r.subId, subId)) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) &&
+ idMatch(r.subId, subId, phoneId)) {
try {
log("Notify data connection state changed on sub: " +
subId);
@@ -895,7 +1009,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType,
apnType, apn, reason, linkProperties, "");
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) {
@@ -930,7 +1045,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN,
apnType, "", reason, null, "");
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) {
@@ -965,7 +1081,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mCellLocation[phoneId] = cellLocation;
for (Record r : mRecords) {
if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) &&
- subIdMatch(r.subId, subId)) {
+ idMatch(r.subId, subId, phoneId)) {
try {
if (DBG_LOC) {
log("notifyCellLocation: cellLocation=" + cellLocation
@@ -989,7 +1105,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) {
mOtaspMode = otaspMode;
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_OTASP_CHANGED)) {
try {
r.callback.onOtaspChanged(otaspMode);
} catch (RemoteException ex) {
@@ -1015,7 +1131,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
DisconnectCause.NOT_VALID,
PreciseDisconnectCause.NOT_VALID);
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_PRECISE_CALL_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) {
try {
r.callback.onPreciseCallStateChanged(mPreciseCallState);
} catch (RemoteException ex) {
@@ -1038,7 +1154,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mPreciseCallState = new PreciseCallState(mRingingCallState, mForegroundCallState,
mBackgroundCallState, disconnectCause, preciseDisconnectCause);
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_PRECISE_CALL_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) {
try {
r.callback.onPreciseCallStateChanged(mPreciseCallState);
} catch (RemoteException ex) {
@@ -1062,7 +1178,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN,
apnType, apn, reason, null, failCause);
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) {
try {
r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState);
} catch (RemoteException ex) {
@@ -1083,7 +1200,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
synchronized (mRecords) {
mVoLteServiceState = lteState;
for (Record r : mRecords) {
- if ((r.events & PhoneStateListener.LISTEN_VOLTE_STATE) != 0) {
+ if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_VOLTE_STATE)) {
try {
r.callback.onVoLteServiceStateChanged(
new VoLteServiceState(mVoLteServiceState));
@@ -1106,7 +1223,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (VDBG) {
log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId);
}
- if (((r.events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) &&
+ if ((r.matchPhoneStateListenerEvent(
+ PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT)) &&
((r.subId == subId) ||
(r.subId == SubscriptionManager.DEFAULT_SUB_ID))) {
try {
@@ -1337,7 +1455,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
private void handleRemoveListLocked() {
- if (mRemoveList.size() > 0) {
+ int size = mRemoveList.size();
+ if (VDBG) log("handleRemoveListLocked: mRemoveList.size()=" + size);
+ if (size > 0) {
for (IBinder b: mRemoveList) {
remove(b);
}
@@ -1351,7 +1471,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
boolean valid = false;
try {
foregroundUser = ActivityManager.getCurrentUser();
- valid = r.callerUid == foregroundUser && (r.events & events) != 0;
+ valid = r.callerUid == foregroundUser && r.matchPhoneStateListenerEvent(events);
if (DBG | DBG_LOC) {
log("validateEventsAndUserLocked: valid=" + valid
+ " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser
@@ -1386,7 +1506,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
@Override
public String toString() {
- return mS + " " + mTime.toString() + " " + mSubId + " " + mPhoneId + " " + mState;
+ return mS + " Time " + mTime.toString() + " mSubId " + mSubId + " mPhoneId " + mPhoneId + " mState " + mState;
}
}
@@ -1429,8 +1549,12 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
}
- boolean subIdMatch(int rSubId, int subId) {
+ boolean idMatch(int rSubId, int subId, int phoneId) {
if(rSubId == SubscriptionManager.DEFAULT_SUB_ID) {
+ if(subId < 0) {
+ // Invalid case, we need compare phoneId with default one.
+ return (mDefaultPhoneId == phoneId);
+ }
return (subId == mDefaultSubId);
} else {
return (rSubId == subId);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 91e2df0..d0f5eed 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -81,7 +81,9 @@ import com.android.server.SystemServiceManager;
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
import com.android.server.firewall.IntentFirewall;
+import com.android.server.pm.Installer;
import com.android.server.pm.UserManagerService;
+import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.wm.AppTransition;
import com.android.server.wm.WindowManagerService;
import com.google.android.collect.Lists;
@@ -199,6 +201,7 @@ import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
+
import dalvik.system.VMRuntime;
import java.io.BufferedInputStream;
@@ -370,6 +373,8 @@ public final class ActivityManagerService extends ActivityManagerNative
/** All system services */
SystemServiceManager mSystemServiceManager;
+ private Installer mInstaller;
+
/** Run all ActivityStacks through this */
ActivityStackSupervisor mStackSupervisor;
@@ -952,10 +957,13 @@ public final class ActivityManagerService extends ActivityManagerNative
*/
private boolean mWentToSleep = false;
+ static final int LOCK_SCREEN_HIDDEN = 0;
+ static final int LOCK_SCREEN_LEAVING = 1;
+ static final int LOCK_SCREEN_SHOWN = 2;
/**
* State of external call telling us if the lock screen is shown.
*/
- private boolean mLockScreenShown = false;
+ int mLockScreenShown = LOCK_SCREEN_HIDDEN;
/**
* Set if we are shutting down the system, similar to sleeping.
@@ -1214,8 +1222,6 @@ public final class ActivityManagerService extends ActivityManagerNative
CompatModeDialog mCompatModeDialog;
long mLastMemUsageReportTime = 0;
- private LockToAppRequestDialog mLockToAppRequest;
-
/**
* Flag whether the current user is a "monkey", i.e. whether
* the UI is driven by a UI automation tool.
@@ -1686,7 +1692,6 @@ public final class ActivityManagerService extends ActivityManagerNative
BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
Integer.toString(msg.arg1), msg.arg1);
mSystemServiceManager.switchUser(msg.arg1);
- mLockToAppRequest.clearPrompt();
break;
}
case ENTER_ANIMATION_COMPLETE_MSG: {
@@ -2159,8 +2164,6 @@ public final class ActivityManagerService extends ActivityManagerNative
}
};
- mLockToAppRequest = new LockToAppRequestDialog(mContext, this);
-
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}
@@ -2169,6 +2172,10 @@ public final class ActivityManagerService extends ActivityManagerNative
mSystemServiceManager = mgr;
}
+ public void setInstaller(Installer installer) {
+ mInstaller = installer;
+ }
+
private void start() {
Process.removeAllProcessGroups();
mProcessCpuThread.start();
@@ -4281,9 +4288,13 @@ public final class ActivityManagerService extends ActivityManagerNative
// Keep track of the root activity of the task before we finish it
TaskRecord tr = r.task;
ActivityRecord rootR = tr.getRootActivity();
+ if (rootR == null) {
+ Slog.w(TAG, "Finishing task with all activities already finished");
+ }
// Do not allow task to finish in Lock Task mode.
if (tr == mStackSupervisor.mLockTaskModeTask) {
if (rootR == r) {
+ Slog.i(TAG, "Not finishing task in lock task mode");
mStackSupervisor.showLockTaskToast();
return false;
}
@@ -4302,6 +4313,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
if (!resumeOK) {
+ Slog.i(TAG, "Not finishing activity because controller resumed");
return false;
}
}
@@ -4314,9 +4326,15 @@ public final class ActivityManagerService extends ActivityManagerNative
// was the root activity in the task. The result code and data is ignored
// because we don't support returning them across task boundaries.
res = removeTaskByIdLocked(tr.taskId, false);
+ if (!res) {
+ Slog.i(TAG, "Removing task failed to finish activity");
+ }
} else {
res = tr.stack.requestFinishActivityLocked(token, resultCode,
resultData, "app-request", true);
+ if (!res) {
+ Slog.i(TAG, "Failed to finish by app-request");
+ }
}
return res;
} finally {
@@ -6118,9 +6136,8 @@ public final class ActivityManagerService extends ActivityManagerNative
synchronized (this) {
if (DEBUG_LOCKSCREEN) logLockScreen("");
mWindowManager.keyguardWaitingForActivityDrawn();
- if (mLockScreenShown) {
- mLockScreenShown = false;
- comeOutOfSleepIfNeededLocked();
+ if (mLockScreenShown == LOCK_SCREEN_SHOWN) {
+ mLockScreenShown = LOCK_SCREEN_LEAVING;
}
}
} finally {
@@ -6137,6 +6154,18 @@ public final class ActivityManagerService extends ActivityManagerNative
mCallFinishBooting = false;
}
+ ArraySet<String> completedIsas = new ArraySet<String>();
+ for (String abi : Build.SUPPORTED_ABIS) {
+ Process.establishZygoteConnectionForAbi(abi);
+ final String instructionSet = VMRuntime.getInstructionSet(abi);
+ if (!completedIsas.contains(instructionSet)) {
+ if (mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi)) != 0) {
+ Slog.e(TAG, "Unable to mark boot complete for abi: " + abi);
+ }
+ completedIsas.add(instructionSet);
+ }
+ }
+
// Register receivers to handle package update events
mPackageMonitor.register(mContext, Looper.getMainLooper(), UserHandle.ALL, false);
@@ -8150,6 +8179,16 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
+ private TaskRecord taskForIdLocked(int id) {
+ final TaskRecord task = recentTaskForIdLocked(id);
+ if (task != null) {
+ return task;
+ }
+
+ // Don't give up. Sometimes it just hasn't made it to recents yet.
+ return mStackSupervisor.anyTaskForIdLocked(id);
+ }
+
private TaskRecord recentTaskForIdLocked(int id) {
final int N = mRecentTasks.size();
for (int i=0; i<N; i++) {
@@ -8285,6 +8324,20 @@ public final class ActivityManagerService extends ActivityManagerNative
return mTaskPersister.getTaskDescriptionIcon(filename);
}
+ @Override
+ public void startInPlaceAnimationOnFrontMostApplication(ActivityOptions opts)
+ throws RemoteException {
+ if (opts.getAnimationType() != ActivityOptions.ANIM_CUSTOM_IN_PLACE ||
+ opts.getCustomInPlaceResId() == 0) {
+ throw new IllegalArgumentException("Expected in-place ActivityOption " +
+ "with valid animation");
+ }
+ mWindowManager.prepareAppTransition(AppTransition.TRANSIT_TASK_IN_PLACE, false);
+ mWindowManager.overridePendingAppTransitionInPlace(opts.getPackageName(),
+ opts.getCustomInPlaceResId());
+ mWindowManager.executeAppTransition();
+ }
+
private void cleanUpRemovedTaskLocked(TaskRecord tr, boolean killProcess) {
mRecentTasks.remove(tr);
tr.removedFromRecents(mTaskPersister);
@@ -8356,7 +8409,7 @@ public final class ActivityManagerService extends ActivityManagerNative
* @return Returns true if the given task was found and removed.
*/
private boolean removeTaskByIdLocked(int taskId, boolean killProcess) {
- TaskRecord tr = recentTaskForIdLocked(taskId);
+ TaskRecord tr = taskForIdLocked(taskId);
if (tr != null) {
tr.removeTaskActivitiesLocked();
cleanUpRemovedTaskLocked(tr, killProcess);
@@ -8365,6 +8418,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
return true;
}
+ Slog.w(TAG, "Request to remove task ignored for non-existent task " + taskId);
return false;
}
@@ -8430,7 +8484,7 @@ public final class ActivityManagerService extends ActivityManagerNative
"moveTaskToBack()");
synchronized(this) {
- TaskRecord tr = recentTaskForIdLocked(taskId);
+ TaskRecord tr = taskForIdLocked(taskId);
if (tr != null) {
if (tr == mStackSupervisor.mLockTaskModeTask) {
mStackSupervisor.showLockTaskToast();
@@ -8622,7 +8676,7 @@ public final class ActivityManagerService extends ActivityManagerNative
long ident = Binder.clearCallingIdentity();
try {
synchronized (this) {
- TaskRecord tr = recentTaskForIdLocked(taskId);
+ TaskRecord tr = taskForIdLocked(taskId);
return tr != null && tr.stack != null && tr.stack.isHomeStack();
}
} finally {
@@ -8656,13 +8710,11 @@ public final class ActivityManagerService extends ActivityManagerNative
}
boolean isSystemInitiated = Binder.getCallingUid() == Process.SYSTEM_UID;
if (!isSystemInitiated && !isLockTaskAuthorized(pkg)) {
- final TaskRecord taskRecord = task;
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mLockToAppRequest.showLockTaskPrompt(taskRecord);
- }
- });
+ StatusBarManagerInternal statusBarManager = LocalServices.getService(
+ StatusBarManagerInternal.class);
+ if (statusBarManager != null) {
+ statusBarManager.showScreenPinningRequest();
+ }
return;
}
long ident = Binder.clearCallingIdentity();
@@ -8724,11 +8776,16 @@ public final class ActivityManagerService extends ActivityManagerNative
public void startLockTaskModeOnCurrent() throws RemoteException {
enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
"startLockTaskModeOnCurrent");
- ActivityRecord r = null;
- synchronized (this) {
- r = mStackSupervisor.topRunningActivityLocked();
+ long ident = Binder.clearCallingIdentity();
+ try {
+ ActivityRecord r = null;
+ synchronized (this) {
+ r = mStackSupervisor.topRunningActivityLocked();
+ }
+ startLockTaskMode(r.task);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
- startLockTaskMode(r.task);
}
@Override
@@ -9957,14 +10014,23 @@ public final class ActivityManagerService extends ActivityManagerNative
Binder.restoreCallingIdentity(origId);
}
+ private String lockScreenShownToString() {
+ switch (mLockScreenShown) {
+ case LOCK_SCREEN_HIDDEN: return "LOCK_SCREEN_HIDDEN";
+ case LOCK_SCREEN_LEAVING: return "LOCK_SCREEN_LEAVING";
+ case LOCK_SCREEN_SHOWN: return "LOCK_SCREEN_SHOWN";
+ default: return "Unknown=" + mLockScreenShown;
+ }
+ }
+
void logLockScreen(String msg) {
if (DEBUG_LOCKSCREEN) Slog.d(TAG, Debug.getCallers(2) + ":" + msg +
- " mLockScreenShown=" + mLockScreenShown + " mWentToSleep=" +
+ " mLockScreenShown=" + lockScreenShownToString() + " mWentToSleep=" +
mWentToSleep + " mSleeping=" + mSleeping);
}
- private void comeOutOfSleepIfNeededLocked() {
- if ((!mWentToSleep && !mLockScreenShown) || mRunningVoice) {
+ void comeOutOfSleepIfNeededLocked() {
+ if ((!mWentToSleep && mLockScreenShown == LOCK_SCREEN_HIDDEN) || mRunningVoice) {
if (mSleeping) {
mSleeping = false;
mStackSupervisor.comeOutOfSleepIfNeededLocked();
@@ -10001,7 +10067,7 @@ public final class ActivityManagerService extends ActivityManagerNative
long ident = Binder.clearCallingIdentity();
try {
if (DEBUG_LOCKSCREEN) logLockScreen(" shown=" + shown);
- mLockScreenShown = shown;
+ mLockScreenShown = shown ? LOCK_SCREEN_SHOWN : LOCK_SCREEN_HIDDEN;
comeOutOfSleepIfNeededLocked();
} finally {
Binder.restoreCallingIdentity(ident);
@@ -12767,9 +12833,9 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
if (dumpPackage == null) {
- if (mSleeping || mWentToSleep || mLockScreenShown) {
+ if (mSleeping || mWentToSleep || mLockScreenShown != LOCK_SCREEN_HIDDEN) {
pw.println(" mSleeping=" + mSleeping + " mWentToSleep=" + mWentToSleep
- + " mLockScreenShown " + mLockScreenShown);
+ + " mLockScreenShown " + lockScreenShownToString());
}
if (mShuttingDown || mRunningVoice) {
pw.print(" mShuttingDown=" + mShuttingDown + " mRunningVoice=" + mRunningVoice);
@@ -15539,7 +15605,7 @@ public final class ActivityManagerService extends ActivityManagerNative
& Intent.FLAG_RECEIVER_BOOT_UPGRADE) == 0) {
Slog.w(TAG, "Skipping broadcast of " + intent
+ ": user " + userId + " is stopped");
- return ActivityManager.BROADCAST_SUCCESS;
+ return ActivityManager.BROADCAST_FAILED_USER_STOPPED;
}
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 1a0e45e..c12cadb 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -21,6 +21,7 @@ import android.os.PersistableBundle;
import android.os.Trace;
import com.android.internal.app.ResolverActivity;
+import com.android.internal.content.ReferrerIntent;
import com.android.internal.util.XmlUtils;
import com.android.server.AttributeCache;
import com.android.server.am.ActivityStack.ActivityState;
@@ -128,7 +129,7 @@ final class ActivityRecord {
final int requestCode; // code given by requester (resultTo)
ArrayList<ResultInfo> results; // pending ActivityResult objs we have received
HashSet<WeakReference<PendingIntentRecord>> pendingResults; // all pending intents for this act
- ArrayList<Intent> newIntents; // any pending new intents for single-top mode
+ ArrayList<ReferrerIntent> newIntents; // any pending new intents for single-top mode
ActivityOptions pendingOptions; // most recently given options
ActivityOptions returningOptions; // options that are coming back via convertToTranslucent
HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold
@@ -629,9 +630,9 @@ final class ActivityRecord {
}
}
- void addNewIntentLocked(Intent intent) {
+ void addNewIntentLocked(ReferrerIntent intent) {
if (newIntents == null) {
- newIntents = new ArrayList<Intent>();
+ newIntents = new ArrayList<>();
}
newIntents.add(intent);
}
@@ -640,7 +641,7 @@ final class ActivityRecord {
* Deliver a new Intent to an existing activity, so that its onNewIntent()
* method will be called at the proper time.
*/
- final void deliverNewIntentLocked(int callingUid, Intent intent) {
+ final void deliverNewIntentLocked(int callingUid, Intent intent, String referrer) {
// The activity now gets access to the data associated with this Intent.
service.grantUriPermissionFromIntentLocked(callingUid, packageName,
intent, getUriPermissionsLocked(), userId);
@@ -649,14 +650,14 @@ final class ActivityRecord {
// device is sleeping, then all activities are stopped, so in that
// case we will deliver it if this is the current top activity on its
// stack.
+ final ReferrerIntent rintent = new ReferrerIntent(intent, referrer);
boolean unsent = true;
if ((state == ActivityState.RESUMED || (service.isSleeping()
&& task.stack.topRunningActivityLocked(null) == this))
&& app != null && app.thread != null) {
try {
- ArrayList<Intent> ar = new ArrayList<Intent>();
- intent = new Intent(intent);
- ar.add(intent);
+ ArrayList<ReferrerIntent> ar = new ArrayList<>(1);
+ ar.add(rintent);
app.thread.scheduleNewIntent(ar, appToken);
unsent = false;
} catch (RemoteException e) {
@@ -668,7 +669,7 @@ final class ActivityRecord {
}
}
if (unsent) {
- addNewIntentLocked(new Intent(intent));
+ addNewIntentLocked(rintent);
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index b61bd8a..0dae028 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -44,6 +44,7 @@ import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
import android.util.ArraySet;
import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ItemMatcher;
@@ -241,9 +242,6 @@ final class ActivityStack {
/** Run all ActivityStacks through this */
final ActivityStackSupervisor mStackSupervisor;
- /** Used to keep resumeTopActivityLocked() from being entered recursively */
- private boolean inResumeTopActivity;
-
static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1;
static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2;
static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3;
@@ -1468,7 +1466,7 @@ final class ActivityStack {
}
final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {
- if (inResumeTopActivity) {
+ if (mStackSupervisor.inResumeTopActivity) {
// Don't even start recursing.
return false;
}
@@ -1476,10 +1474,14 @@ final class ActivityStack {
boolean result = false;
try {
// Protect against recursion.
- inResumeTopActivity = true;
+ mStackSupervisor.inResumeTopActivity = true;
+ if (mService.mLockScreenShown == ActivityManagerService.LOCK_SCREEN_LEAVING) {
+ mService.mLockScreenShown = ActivityManagerService.LOCK_SCREEN_HIDDEN;
+ mService.comeOutOfSleepIfNeededLocked();
+ }
result = resumeTopActivityInnerLocked(prev, options);
} finally {
- inResumeTopActivity = false;
+ mStackSupervisor.inResumeTopActivity = false;
}
return result;
}
@@ -1641,8 +1643,8 @@ final class ActivityStack {
boolean dontWaitForPause = (next.info.flags&ActivityInfo.FLAG_RESUME_WHILE_PAUSING) != 0;
boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause);
if (mResumedActivity != null) {
- pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);
if (DEBUG_STATES) Slog.d(TAG, "resumeTopActivityLocked: Pausing " + mResumedActivity);
+ pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);
}
if (pausing) {
if (DEBUG_SWITCH || DEBUG_STATES) Slog.v(TAG,
@@ -2952,7 +2954,8 @@ final class ActivityStack {
parentLaunchMode == ActivityInfo.LAUNCH_SINGLE_TASK ||
parentLaunchMode == ActivityInfo.LAUNCH_SINGLE_TOP ||
(destIntentFlags & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
- parent.deliverNewIntentLocked(srec.info.applicationInfo.uid, destIntent);
+ parent.deliverNewIntentLocked(srec.info.applicationInfo.uid, destIntent,
+ srec.packageName);
} else {
try {
ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo(
@@ -3772,7 +3775,7 @@ final class ActivityStack {
private boolean relaunchActivityLocked(ActivityRecord r,
int changes, boolean andResume) {
List<ResultInfo> results = null;
- List<Intent> newIntents = null;
+ List<ReferrerIntent> newIntents = null;
if (andResume) {
results = r.results;
newIntents = r.newIntents;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index cc7026a..099151f 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -97,6 +97,7 @@ import android.view.InputEvent;
import android.view.Surface;
import com.android.internal.app.HeavyWeightSwitcherActivity;
import com.android.internal.app.IVoiceInteractor;
+import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.TransferPipe;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
@@ -274,6 +275,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
final ArrayList<PendingActivityLaunch> mPendingActivityLaunches
= new ArrayList<PendingActivityLaunch>();
+ /** Used to keep resumeTopActivityLocked() from being entered recursively */
+ boolean inResumeTopActivity;
+
/**
* Description of a request to start a new activity, which has been held
* due to app switches being disabled.
@@ -1098,7 +1102,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
throw new RemoteException();
}
List<ResultInfo> results = null;
- List<Intent> newIntents = null;
+ List<ReferrerIntent> newIntents = null;
if (andResume) {
results = r.results;
newIntents = r.newIntents;
@@ -1152,9 +1156,9 @@ public final class ActivityStackSupervisor implements DisplayListener {
app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
- r.compat, r.task.voiceInteractor, app.repProcState, r.icicle, r.persistentState,
- results, newIntents, !andResume, mService.isNextTransitionForward(),
- profilerInfo);
+ r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState,
+ r.icicle, r.persistentState, results, newIntents, !andResume,
+ mService.isNextTransitionForward(), profilerInfo);
if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
// This may be a heavy-weight process! Note that the package
@@ -1893,7 +1897,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
r, top.task);
- top.deliverNewIntentLocked(callingUid, r.intent);
+ top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
} else {
// A special case: we need to
// start the activity because it is not currently
@@ -1919,7 +1923,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
if (intentActivity.frontOfTask) {
intentActivity.task.setIntent(r);
}
- intentActivity.deliverNewIntentLocked(callingUid, r.intent);
+ intentActivity.deliverNewIntentLocked(callingUid, r.intent,
+ r.launchedFromPackage);
} else if (!r.intent.filterEquals(intentActivity.task.intent)) {
// In this case we are launching the root activity
// of the task, but with a different intent. We
@@ -1992,7 +1997,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
// is the case, so this is it!
return ActivityManager.START_RETURN_INTENT_TO_CALLER;
}
- top.deliverNewIntentLocked(callingUid, r.intent);
+ top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
return ActivityManager.START_DELIVERED_TO_TOP;
}
}
@@ -2068,7 +2073,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
keepCurTransition = true;
if (top != null) {
ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
- top.deliverNewIntentLocked(callingUid, r.intent);
+ top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
// For paranoia, make sure we have correctly
// resumed the top activity.
targetStack.mLastPausedActivity = null;
@@ -2089,7 +2094,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
task.moveActivityToFrontLocked(top);
ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
top.updateOptionsLocked(options);
- top.deliverNewIntentLocked(callingUid, r.intent);
+ top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
targetStack.mLastPausedActivity = null;
if (doResume) {
targetStack.resumeTopActivityLocked(null);
@@ -2129,7 +2134,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
// is the case, so this is it!
return ActivityManager.START_RETURN_INTENT_TO_CALLER;
}
- top.deliverNewIntentLocked(callingUid, r.intent);
+ top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
return ActivityManager.START_DELIVERED_TO_TOP;
}
}
diff --git a/services/core/java/com/android/server/am/LockToAppRequestDialog.java b/services/core/java/com/android/server/am/LockToAppRequestDialog.java
deleted file mode 100644
index 739fd0a..0000000
--- a/services/core/java/com/android/server/am/LockToAppRequestDialog.java
+++ /dev/null
@@ -1,141 +0,0 @@
-
-package com.android.server.am;
-
-import android.app.AlertDialog;
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.content.res.Resources;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.util.Slog;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
-import android.widget.CheckBox;
-
-import com.android.internal.R;
-import com.android.internal.widget.ILockSettings;
-import com.android.internal.widget.LockPatternUtils;
-import com.android.internal.widget.LockPatternUtilsCache;
-
-public class LockToAppRequestDialog implements OnClickListener {
- private static final String TAG = "ActivityManager";
-
- final private Context mContext;
- final private ActivityManagerService mService;
-
- private AlertDialog mDialog;
- private TaskRecord mRequestedTask;
-
- private CheckBox mCheckbox;
-
- private ILockSettings mLockSettingsService;
-
- private AccessibilityManager mAccessibilityService;
-
- public LockToAppRequestDialog(Context context, ActivityManagerService activityManagerService) {
- mContext = context;
- mAccessibilityService = (AccessibilityManager)
- mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
- mService = activityManagerService;
- }
-
- private ILockSettings getLockSettings() {
- if (mLockSettingsService == null) {
- mLockSettingsService = LockPatternUtilsCache.getInstance(
- ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings")));
- }
- return mLockSettingsService;
- }
-
- private int getLockString(int userId) {
- try {
- int quality = (int) getLockSettings().getLong(LockPatternUtils.PASSWORD_TYPE_KEY,
- DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, userId);
- switch (quality) {
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
- return R.string.lock_to_app_unlock_pin;
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
- case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
- case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
- return R.string.lock_to_app_unlock_password;
- case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
- if (getLockSettings().getBoolean(Settings.Secure.LOCK_PATTERN_ENABLED, false,
- userId)) {
- return R.string.lock_to_app_unlock_pattern;
- }
- }
- } catch (RemoteException e) {
- }
- return 0;
- }
-
- public void clearPrompt() {
- if (mDialog != null) {
- mDialog.dismiss();
- mDialog = null;
- }
- }
-
- public void showLockTaskPrompt(TaskRecord task) {
- clearPrompt();
- mRequestedTask = task;
- final int unlockStringId = getLockString(task.userId);
-
- final Resources r = Resources.getSystem();
- final String description= r.getString(mAccessibilityService.isEnabled()
- ? R.string.lock_to_app_description_accessible
- : R.string.lock_to_app_description);
- AlertDialog.Builder builder = new AlertDialog.Builder(mContext)
- .setTitle(r.getString(R.string.lock_to_app_title))
- .setMessage(description)
- .setPositiveButton(r.getString(R.string.lock_to_app_positive), this)
- .setNegativeButton(r.getString(R.string.lock_to_app_negative), this);
- if (unlockStringId != 0) {
- builder.setView(R.layout.lock_to_app_checkbox);
- }
- mDialog = builder.create();
-
- mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- mDialog.getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
- mDialog.show();
-
- if (unlockStringId != 0) {
- String unlockString = mContext.getString(unlockStringId);
- mCheckbox = (CheckBox) mDialog.findViewById(R.id.lock_to_app_checkbox);
- mCheckbox.setText(unlockString);
-
- // Remember state.
- try {
- boolean useLock = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
- mCheckbox.setChecked(useLock);
- } catch (SettingNotFoundException e) {
- }
- } else {
- mCheckbox = null;
- }
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (DialogInterface.BUTTON_POSITIVE == which) {
- Slog.d(TAG, "accept lock-to-app request");
- // Set whether to use the lock screen when exiting.
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.LOCK_TO_APP_EXIT_LOCKED,
- mCheckbox != null && mCheckbox.isChecked() ? 1 : 0);
-
- // Start lock-to-app.
- mService.startLockTaskMode(mRequestedTask);
- } else {
- Slog.d(TAG, "ignore lock-to-app request");
- }
- }
-
-}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index 433ab60..ffaa03d 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -269,11 +269,13 @@ final class PendingIntentRecord extends IIntentSender.Stub {
try {
// If a completion callback has been requested, require
// that the broadcast be delivered synchronously
- owner.broadcastIntentInPackage(key.packageName, uid,
+ int sent = owner.broadcastIntentInPackage(key.packageName, uid,
finalIntent, resolvedType,
finishedReceiver, code, null, null,
requiredPermission, (finishedReceiver != null), false, userId);
- sendFinish = false;
+ if (sent == ActivityManager.BROADCAST_SUCCESS) {
+ sendFinish = false;
+ }
} catch (RuntimeException e) {
Slog.w(ActivityManagerService.TAG,
"Unable to send startActivity intent", e);
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 843a0cb..a4aff77 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -177,7 +177,7 @@ final class ProcessList {
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
private final int[] mOomMinFreeHigh = new int[] {
73728, 92160, 110592,
- 129024, 147456, 184320
+ 129024, 225000, 325000
};
// The actual OOM killer memory levels we are using.
private final int[] mOomMinFree = new int[mOomAdj.length];
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index fb98236..593a28a 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -46,6 +46,7 @@ import android.telephony.CellInfoGsm;
import android.telephony.CellInfoLte;
import android.telephony.CellInfoWcdma;
import android.telephony.TelephonyManager;
+import android.util.Log;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
@@ -272,6 +273,11 @@ public class NetworkMonitor extends StateMachine {
start();
}
+ @Override
+ protected void log(String s) {
+ Log.d(TAG + mNetworkAgentInfo.name(), s);
+ }
+
private class DefaultState extends State {
@Override
public boolean processMessage(Message message) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index f0f7973..6536165 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -706,9 +706,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
@ServiceThreadOnly
void onNewAvrAdded(HdmiDeviceInfo avr) {
assertRunOnServiceThread();
- if (getSystemAudioModeSetting()) {
- addAndStartAction(new SystemAudioAutoInitiationAction(this, avr.getLogicalAddress()));
- }
+ addAndStartAction(new SystemAudioAutoInitiationAction(this, avr.getLogicalAddress()));
if (isArcFeatureEnabled()) {
startArcAction(true);
}
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
index 50f8475..512d537 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioAutoInitiationAction.java
@@ -71,19 +71,16 @@ final class SystemAudioAutoInitiationAction extends HdmiCecFeatureAction {
}
private void handleSystemAudioModeStatusMessage() {
- // If the last setting is system audio, turn on system audio whatever AVR status is.
- if (tv().getSystemAudioModeSetting()) {
- if (canChangeSystemAudio()) {
- addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, true, null));
- }
- } else {
- // If the last setting is non-system audio, turn off system audio mode
- // and update system audio status (volume or mute).
- tv().setSystemAudioMode(false, true);
- if (canChangeSystemAudio()) {
- addAndStartAction(new SystemAudioStatusAction(tv(), mAvrAddress, null));
- }
+ if (!canChangeSystemAudio()) {
+ HdmiLogger.debug("Cannot change system audio mode in auto initiation action.");
+ finish();
+ return;
}
+
+ boolean systemAudioModeSetting = tv().getSystemAudioModeSetting();
+ // Update AVR's system audio mode regardless of AVR's status.
+ addAndStartAction(new SystemAudioActionFromTv(tv(), mAvrAddress, systemAudioModeSetting,
+ null));
finish();
}
diff --git a/services/core/java/com/android/server/input/InputWindowHandle.java b/services/core/java/com/android/server/input/InputWindowHandle.java
index 9a70f38..9149fcc 100644
--- a/services/core/java/com/android/server/input/InputWindowHandle.java
+++ b/services/core/java/com/android/server/input/InputWindowHandle.java
@@ -44,7 +44,6 @@ public final class InputWindowHandle {
// Window layout params attributes. (WindowManager.LayoutParams)
public int layoutParamsFlags;
- public int layoutParamsPrivateFlags;
public int layoutParamsType;
// Dispatching timeout.
diff --git a/services/core/java/com/android/server/location/GpsLocationProvider.java b/services/core/java/com/android/server/location/GpsLocationProvider.java
index c2cb4b1..8c3c102 100644
--- a/services/core/java/com/android/server/location/GpsLocationProvider.java
+++ b/services/core/java/com/android/server/location/GpsLocationProvider.java
@@ -72,6 +72,9 @@ import android.provider.Settings;
import android.provider.Telephony.Carriers;
import android.provider.Telephony.Sms.Intents;
import android.telephony.SmsMessage;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionListener;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
@@ -88,6 +91,7 @@ import java.io.StringReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
+import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;
@@ -162,6 +166,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
private static final int GPS_CAPABILITY_MSA = 0x0000004;
private static final int GPS_CAPABILITY_SINGLE_SHOT = 0x0000008;
private static final int GPS_CAPABILITY_ON_DEMAND_TIME = 0x0000010;
+ private static final int GPS_CAPABILITY_GEOFENCING = 0x0000020;
+ private static final int GPS_CAPABILITY_MEASUREMENTS = 0x0000040;
+ private static final int GPS_CAPABILITY_NAV_MESSAGES = 0x0000080;
// The AGPS SUPL mode
private static final int AGPS_SUPL_MODE_MSA = 0x02;
@@ -348,20 +355,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
private final ILocationManager mILocationManager;
private Location mLocation = new Location(LocationManager.GPS_PROVIDER);
private Bundle mLocationExtras = new Bundle();
- private GpsStatusListenerHelper mListenerHelper = new GpsStatusListenerHelper() {
- @Override
- protected boolean isSupported() {
- return GpsLocationProvider.isSupported();
- }
-
- @Override
- protected boolean registerWithService() {
- return true;
- }
-
- @Override
- protected void unregisterFromService() {}
- };
+ private final GpsStatusListenerHelper mListenerHelper;
+ private final GpsMeasurementsProvider mGpsMeasurementsProvider;
+ private final GpsNavigationMessageProvider mGpsNavigationMessageProvider;
// Handler for processing events
private Handler mHandler;
@@ -409,41 +405,6 @@ public class GpsLocationProvider implements LocationProviderInterface {
}
};
- private final GpsMeasurementsProvider mGpsMeasurementsProvider = new GpsMeasurementsProvider() {
- @Override
- public boolean isSupported() {
- return native_is_measurement_supported();
- }
-
- @Override
- protected boolean registerWithService() {
- return native_start_measurement_collection();
- }
-
- @Override
- protected void unregisterFromService() {
- native_stop_measurement_collection();
- }
- };
-
- private final GpsNavigationMessageProvider mGpsNavigationMessageProvider =
- new GpsNavigationMessageProvider() {
- @Override
- protected boolean isSupported() {
- return native_is_navigation_message_supported();
- }
-
- @Override
- protected boolean registerWithService() {
- return native_start_navigation_message_collection();
- }
-
- @Override
- protected void unregisterFromService() {
- native_stop_navigation_message_collection();
- }
- };
-
public IGpsStatusProvider getGpsStatusProvider() {
return mGpsStatusProvider;
}
@@ -495,26 +456,35 @@ public class GpsLocationProvider implements LocationProviderInterface {
|| Intent.ACTION_SCREEN_OFF.equals(action)
|| Intent.ACTION_SCREEN_ON.equals(action)) {
updateLowPowerMode();
- } else if (action.equals(SIM_STATE_CHANGED)
- || action.equals(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE)
- || action.equals(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED)) {
- Log.d(TAG, "received SIM realted action: " + action);
- TelephonyManager phone = (TelephonyManager)
- mContext.getSystemService(Context.TELEPHONY_SERVICE);
- String mccMnc = phone.getSimOperator();
- if (!TextUtils.isEmpty(mccMnc)) {
- Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc);
- synchronized (mLock) {
- reloadGpsProperties(context, mProperties);
- mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
- }
- } else {
- Log.d(TAG, "SIM MCC/MNC is still not available");
- }
+ } else if (action.equals(SIM_STATE_CHANGED)) {
+ subscriptionOrSimChanged(context);
}
}
};
+ private final SubscriptionListener mSubscriptionListener = new SubscriptionListener() {
+ @Override
+ public void onSubscriptionInfoChanged() {
+ subscriptionOrSimChanged(mContext);
+ }
+ };
+
+ private void subscriptionOrSimChanged(Context context) {
+ Log.d(TAG, "received SIM realted action: ");
+ TelephonyManager phone = (TelephonyManager)
+ mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ String mccMnc = phone.getSimOperator();
+ if (!TextUtils.isEmpty(mccMnc)) {
+ Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc);
+ synchronized (mLock) {
+ reloadGpsProperties(context, mProperties);
+ mNIHandler.setSuplEsEnabled(mSuplEsEnabled);
+ }
+ } else {
+ Log.d(TAG, "SIM MCC/MNC is still not available");
+ }
+ }
+
private void checkSmsSuplInit(Intent intent) {
SmsMessage[] messages = Intents.getMessagesFromIntent(intent);
for (int i=0; i <messages.length; i++) {
@@ -669,6 +639,16 @@ public class GpsLocationProvider implements LocationProviderInterface {
mNetInitiatedListener,
mSuplEsEnabled);
+ // TODO: When this object "finishes" we should unregister by invoking
+ // SubscriptionManager.unregister(mContext, mSubscriptionListener);
+ // This is not strictly necessary because it will be unregistered if the
+ // notification fails but it is good form.
+
+ // Register for SubscriptionInfo list changes which is guaranteed
+ // to invoke onSubscriptionInfoChanged the first time.
+ SubscriptionManager.register(mContext, mSubscriptionListener,
+ SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
+
// construct handler, listen for events
mHandler = new ProviderHandler(looper);
listenForBroadcasts();
@@ -696,6 +676,62 @@ public class GpsLocationProvider implements LocationProviderInterface {
mHandler.getLooper());
}
});
+
+ mListenerHelper = new GpsStatusListenerHelper(mHandler) {
+ @Override
+ protected boolean isAvailableInPlatform() {
+ return GpsLocationProvider.isSupported();
+ }
+
+ @Override
+ protected boolean isGpsEnabled() {
+ return isEnabled();
+ }
+ };
+
+ mGpsMeasurementsProvider = new GpsMeasurementsProvider(mHandler) {
+ @Override
+ public boolean isAvailableInPlatform() {
+ return native_is_measurement_supported();
+ }
+
+ @Override
+ protected boolean registerWithService() {
+ return native_start_measurement_collection();
+ }
+
+ @Override
+ protected void unregisterFromService() {
+ native_stop_measurement_collection();
+ }
+
+ @Override
+ protected boolean isGpsEnabled() {
+ return isEnabled();
+ }
+ };
+
+ mGpsNavigationMessageProvider = new GpsNavigationMessageProvider(mHandler) {
+ @Override
+ protected boolean isAvailableInPlatform() {
+ return native_is_navigation_message_supported();
+ }
+
+ @Override
+ protected boolean registerWithService() {
+ return native_start_navigation_message_collection();
+ }
+
+ @Override
+ protected void unregisterFromService() {
+ native_stop_navigation_message_collection();
+ }
+
+ @Override
+ protected boolean isGpsEnabled() {
+ return isEnabled();
+ }
+ };
}
private void listenForBroadcasts() {
@@ -722,10 +758,6 @@ public class GpsLocationProvider implements LocationProviderInterface {
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(SIM_STATE_CHANGED);
- // TODO: remove the use TelephonyIntents. We are using it because SIM_STATE_CHANGED
- // is not reliable at the moment.
- intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_CONTENT_CHANGE);
- intentFilter.addAction(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED);
mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, mHandler);
}
@@ -1445,7 +1477,9 @@ public class GpsLocationProvider implements LocationProviderInterface {
}
if (wasNavigating != mNavigating) {
- mListenerHelper.onStatusChanged(mNavigating);
+ mListenerHelper.onGpsEnabledChanged(mNavigating);
+ mGpsMeasurementsProvider.onGpsEnabledChanged(mNavigating);
+ mGpsNavigationMessageProvider.onGpsEnabledChanged(mNavigating);
// send an intent to notify that the GPS has been enabled or disabled
Intent intent = new Intent(LocationManager.GPS_ENABLED_CHANGE_ACTION);
@@ -1598,6 +1632,11 @@ public class GpsLocationProvider implements LocationProviderInterface {
mPeriodicTimeInjection = true;
requestUtcTime();
}
+
+ mGpsMeasurementsProvider.onCapabilitiesUpdated(
+ (capabilities & GPS_CAPABILITY_MEASUREMENTS) == GPS_CAPABILITY_MEASUREMENTS);
+ mGpsNavigationMessageProvider.onCapabilitiesUpdated(
+ (capabilities & GPS_CAPABILITY_NAV_MESSAGES) == GPS_CAPABILITY_NAV_MESSAGES);
}
/**
diff --git a/services/core/java/com/android/server/location/GpsMeasurementsProvider.java b/services/core/java/com/android/server/location/GpsMeasurementsProvider.java
index 1c48257..0514e0c 100644
--- a/services/core/java/com/android/server/location/GpsMeasurementsProvider.java
+++ b/services/core/java/com/android/server/location/GpsMeasurementsProvider.java
@@ -18,7 +18,9 @@ package com.android.server.location;
import android.location.GpsMeasurementsEvent;
import android.location.IGpsMeasurementsListener;
+import android.os.Handler;
import android.os.RemoteException;
+import android.util.Log;
/**
* An base implementation for GPS measurements provider.
@@ -29,8 +31,10 @@ import android.os.RemoteException;
*/
public abstract class GpsMeasurementsProvider
extends RemoteListenerHelper<IGpsMeasurementsListener> {
- public GpsMeasurementsProvider() {
- super("GpsMeasurementsProvider");
+ private static final String TAG = "GpsMeasurementsProvider";
+
+ public GpsMeasurementsProvider(Handler handler) {
+ super(handler, TAG);
}
public void onMeasurementsAvailable(final GpsMeasurementsEvent event) {
@@ -41,7 +45,56 @@ public abstract class GpsMeasurementsProvider
listener.onGpsMeasurementsReceived(event);
}
};
-
foreach(operation);
}
+
+ public void onCapabilitiesUpdated(boolean isGpsMeasurementsSupported) {
+ int status = isGpsMeasurementsSupported ?
+ GpsMeasurementsEvent.STATUS_READY :
+ GpsMeasurementsEvent.STATUS_NOT_SUPPORTED;
+ setSupported(isGpsMeasurementsSupported, new StatusChangedOperation(status));
+ }
+
+ @Override
+ protected ListenerOperation<IGpsMeasurementsListener> getHandlerOperation(int result) {
+ final int status;
+ switch (result) {
+ case RESULT_SUCCESS:
+ status = GpsMeasurementsEvent.STATUS_READY;
+ break;
+ case RESULT_NOT_AVAILABLE:
+ case RESULT_NOT_SUPPORTED:
+ case RESULT_INTERNAL_ERROR:
+ status = GpsMeasurementsEvent.STATUS_NOT_SUPPORTED;
+ break;
+ case RESULT_GPS_LOCATION_DISABLED:
+ status = GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
+ break;
+ default:
+ Log.v(TAG, "Unhandled addListener result: " + result);
+ return null;
+ }
+ return new StatusChangedOperation(status);
+ }
+
+ @Override
+ protected void handleGpsEnabledChanged(boolean enabled) {
+ int status = enabled ?
+ GpsMeasurementsEvent.STATUS_READY :
+ GpsMeasurementsEvent.STATUS_GPS_LOCATION_DISABLED;
+ foreach(new StatusChangedOperation(status));
+ }
+
+ private class StatusChangedOperation implements ListenerOperation<IGpsMeasurementsListener> {
+ private final int mStatus;
+
+ public StatusChangedOperation(int status) {
+ mStatus = status;
+ }
+
+ @Override
+ public void execute(IGpsMeasurementsListener listener) throws RemoteException {
+ listener.onStatusChanged(mStatus);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/location/GpsNavigationMessageProvider.java b/services/core/java/com/android/server/location/GpsNavigationMessageProvider.java
index fca7378..13d22fc 100644
--- a/services/core/java/com/android/server/location/GpsNavigationMessageProvider.java
+++ b/services/core/java/com/android/server/location/GpsNavigationMessageProvider.java
@@ -18,7 +18,9 @@ package com.android.server.location;
import android.location.GpsNavigationMessageEvent;
import android.location.IGpsNavigationMessageListener;
+import android.os.Handler;
import android.os.RemoteException;
+import android.util.Log;
/**
* An base implementation for GPS navigation messages provider.
@@ -29,8 +31,10 @@ import android.os.RemoteException;
*/
public abstract class GpsNavigationMessageProvider
extends RemoteListenerHelper<IGpsNavigationMessageListener> {
- public GpsNavigationMessageProvider() {
- super("GpsNavigationMessageProvider");
+ private static final String TAG = "GpsNavigationMessageProvider";
+
+ public GpsNavigationMessageProvider(Handler handler) {
+ super(handler, TAG);
}
public void onNavigationMessageAvailable(final GpsNavigationMessageEvent event) {
@@ -42,7 +46,57 @@ public abstract class GpsNavigationMessageProvider
listener.onGpsNavigationMessageReceived(event);
}
};
-
foreach(operation);
}
+
+ public void onCapabilitiesUpdated(boolean isGpsNavigationMessageSupported) {
+ int status = isGpsNavigationMessageSupported ?
+ GpsNavigationMessageEvent.STATUS_READY :
+ GpsNavigationMessageEvent.STATUS_NOT_SUPPORTED;
+ setSupported(isGpsNavigationMessageSupported, new StatusChangedOperation(status));
+ }
+
+ @Override
+ protected ListenerOperation<IGpsNavigationMessageListener> getHandlerOperation(int result) {
+ final int status;
+ switch (result) {
+ case RESULT_SUCCESS:
+ status = GpsNavigationMessageEvent.STATUS_READY;
+ break;
+ case RESULT_NOT_AVAILABLE:
+ case RESULT_NOT_SUPPORTED:
+ case RESULT_INTERNAL_ERROR:
+ status = GpsNavigationMessageEvent.STATUS_NOT_SUPPORTED;
+ break;
+ case RESULT_GPS_LOCATION_DISABLED:
+ status = GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED;
+ break;
+ default:
+ Log.v(TAG, "Unhandled addListener result: " + result);
+ return null;
+ }
+ return new StatusChangedOperation(status);
+ }
+
+ @Override
+ protected void handleGpsEnabledChanged(boolean enabled) {
+ int status = enabled ?
+ GpsNavigationMessageEvent.STATUS_READY :
+ GpsNavigationMessageEvent.STATUS_GPS_LOCATION_DISABLED;
+ foreach(new StatusChangedOperation(status));
+ }
+
+ private class StatusChangedOperation
+ implements ListenerOperation<IGpsNavigationMessageListener> {
+ private final int mStatus;
+
+ public StatusChangedOperation(int status) {
+ mStatus = status;
+ }
+
+ @Override
+ public void execute(IGpsNavigationMessageListener listener) throws RemoteException {
+ listener.onStatusChanged(mStatus);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/location/GpsStatusListenerHelper.java b/services/core/java/com/android/server/location/GpsStatusListenerHelper.java
index 27cf3d8..376b4a5 100644
--- a/services/core/java/com/android/server/location/GpsStatusListenerHelper.java
+++ b/services/core/java/com/android/server/location/GpsStatusListenerHelper.java
@@ -17,39 +17,64 @@
package com.android.server.location;
import android.location.IGpsStatusListener;
+import android.os.Handler;
import android.os.RemoteException;
/**
* Implementation of a handler for {@link IGpsStatusListener}.
*/
abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusListener> {
- public GpsStatusListenerHelper() {
- super("GpsStatusListenerHelper");
- }
+ public GpsStatusListenerHelper(Handler handler) {
+ super(handler, "GpsStatusListenerHelper");
- public void onFirstFix(final int timeToFirstFix) {
- Operation operation = new Operation() {
+ Operation nullOperation = new Operation() {
@Override
- public void execute(IGpsStatusListener listener) throws RemoteException {
- listener.onFirstFix(timeToFirstFix);
- }
+ public void execute(IGpsStatusListener iGpsStatusListener) throws RemoteException {}
};
+ setSupported(GpsLocationProvider.isSupported(), nullOperation);
+ }
+
+ @Override
+ protected boolean registerWithService() {
+ return true;
+ }
+
+ @Override
+ protected void unregisterFromService() {}
+
+ @Override
+ protected ListenerOperation<IGpsStatusListener> getHandlerOperation(int result) {
+ return null;
+ }
+ @Override
+ protected void handleGpsEnabledChanged(boolean enabled) {
+ Operation operation;
+ if (enabled) {
+ operation = new Operation() {
+ @Override
+ public void execute(IGpsStatusListener listener) throws RemoteException {
+ listener.onGpsStarted();
+ }
+ };
+ } else {
+ operation = new Operation() {
+ @Override
+ public void execute(IGpsStatusListener listener) throws RemoteException {
+ listener.onGpsStopped();
+ }
+ };
+ }
foreach(operation);
}
- public void onStatusChanged(final boolean isNavigating) {
+ public void onFirstFix(final int timeToFirstFix) {
Operation operation = new Operation() {
@Override
public void execute(IGpsStatusListener listener) throws RemoteException {
- if (isNavigating) {
- listener.onGpsStarted();
- } else {
- listener.onGpsStopped();
- }
+ listener.onFirstFix(timeToFirstFix);
}
};
-
foreach(operation);
}
@@ -76,7 +101,6 @@ abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusLi
usedInFixMask);
}
};
-
foreach(operation);
}
@@ -87,7 +111,6 @@ abstract class GpsStatusListenerHelper extends RemoteListenerHelper<IGpsStatusLi
listener.onNmeaReceived(timestamp, nmea);
}
};
-
foreach(operation);
}
diff --git a/services/core/java/com/android/server/location/RemoteListenerHelper.java b/services/core/java/com/android/server/location/RemoteListenerHelper.java
index 451af18..402b601 100644
--- a/services/core/java/com/android/server/location/RemoteListenerHelper.java
+++ b/services/core/java/com/android/server/location/RemoteListenerHelper.java
@@ -19,35 +19,41 @@ package com.android.server.location;
import com.android.internal.util.Preconditions;
import android.annotation.NonNull;
+import android.os.Handler;
import android.os.IBinder;
import android.os.IInterface;
import android.os.RemoteException;
import android.util.Log;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
/**
* A helper class, that handles operations in remote listeners, and tracks for remote process death.
*/
abstract class RemoteListenerHelper<TListener extends IInterface> {
+ protected static final int RESULT_SUCCESS = 0;
+ protected static final int RESULT_NOT_AVAILABLE = 1;
+ protected static final int RESULT_NOT_SUPPORTED = 2;
+ protected static final int RESULT_GPS_LOCATION_DISABLED = 3;
+ protected static final int RESULT_INTERNAL_ERROR = 4;
+
+ private final Handler mHandler;
private final String mTag;
- private final HashMap<IBinder, LinkedListener> mListenerMap =
- new HashMap<IBinder, LinkedListener>();
- protected RemoteListenerHelper(String name) {
+ private final HashMap<IBinder, LinkedListener> mListenerMap = new HashMap<>();
+
+ private boolean mIsRegistered;
+ private boolean mHasIsSupported;
+ private boolean mIsSupported;
+
+ protected RemoteListenerHelper(Handler handler, String name) {
Preconditions.checkNotNull(name);
+ mHandler = handler;
mTag = name;
}
public boolean addListener(@NonNull TListener listener) {
Preconditions.checkNotNull(listener, "Attempted to register a 'null' listener.");
- if (!isSupported()) {
- Log.e(mTag, "Refused to add listener, the feature is not supported.");
- return false;
- }
-
IBinder binder = listener.asBinder();
LinkedListener deathListener = new LinkedListener(listener);
synchronized (mListenerMap) {
@@ -55,75 +61,126 @@ abstract class RemoteListenerHelper<TListener extends IInterface> {
// listener already added
return true;
}
-
try {
binder.linkToDeath(deathListener, 0 /* flags */);
} catch (RemoteException e) {
// if the remote process registering the listener is already death, just swallow the
- // exception and continue
- Log.e(mTag, "Remote listener already died.", e);
+ // exception and return
+ Log.v(mTag, "Remote listener already died.", e);
return false;
}
-
mListenerMap.put(binder, deathListener);
- if (mListenerMap.size() == 1) {
- if (!registerWithService()) {
- Log.e(mTag, "RegisterWithService failed, listener will be removed.");
- removeListener(listener);
- return false;
- }
+
+ // update statuses we already know about, starting from the ones that will never change
+ int result;
+ if (!isAvailableInPlatform()) {
+ result = RESULT_NOT_AVAILABLE;
+ } else if (mHasIsSupported && !mIsSupported) {
+ result = RESULT_NOT_SUPPORTED;
+ } else if (!isGpsEnabled()) {
+ result = RESULT_GPS_LOCATION_DISABLED;
+ } else if (!tryRegister()) {
+ // only attempt to register if GPS is enabled, otherwise we will register once GPS
+ // becomes available
+ result = RESULT_INTERNAL_ERROR;
+ } else if (mHasIsSupported && mIsSupported) {
+ result = RESULT_SUCCESS;
+ } else {
+ // at this point if the supported flag is not set, the notification will be sent
+ // asynchronously in the future
+ return true;
}
+ post(listener, getHandlerOperation(result));
}
-
return true;
}
- public boolean removeListener(@NonNull TListener listener) {
+ public void removeListener(@NonNull TListener listener) {
Preconditions.checkNotNull(listener, "Attempted to remove a 'null' listener.");
- if (!isSupported()) {
- Log.e(mTag, "Refused to remove listener, the feature is not supported.");
- return false;
- }
-
IBinder binder = listener.asBinder();
LinkedListener linkedListener;
synchronized (mListenerMap) {
linkedListener = mListenerMap.remove(binder);
- if (mListenerMap.isEmpty() && linkedListener != null) {
- unregisterFromService();
+ if (mListenerMap.isEmpty()) {
+ tryUnregister();
}
}
-
if (linkedListener != null) {
binder.unlinkToDeath(linkedListener, 0 /* flags */);
}
- return true;
}
- protected abstract boolean isSupported();
+ public void onGpsEnabledChanged(boolean enabled) {
+ // handle first the sub-class implementation, so any error in registration can take
+ // precedence
+ handleGpsEnabledChanged(enabled);
+ synchronized (mListenerMap) {
+ if (!enabled) {
+ tryUnregister();
+ return;
+ }
+ if (mListenerMap.isEmpty()) {
+ return;
+ }
+ if (tryRegister()) {
+ // registration was successful, there is no need to update the state
+ return;
+ }
+ ListenerOperation<TListener> operation = getHandlerOperation(RESULT_INTERNAL_ERROR);
+ foreachUnsafe(operation);
+ }
+ }
+
+ protected abstract boolean isAvailableInPlatform();
+ protected abstract boolean isGpsEnabled();
protected abstract boolean registerWithService();
protected abstract void unregisterFromService();
+ protected abstract ListenerOperation<TListener> getHandlerOperation(int result);
+ protected abstract void handleGpsEnabledChanged(boolean enabled);
protected interface ListenerOperation<TListener extends IInterface> {
void execute(TListener listener) throws RemoteException;
}
- protected void foreach(ListenerOperation operation) {
- Collection<LinkedListener> linkedListeners;
+ protected void foreach(ListenerOperation<TListener> operation) {
synchronized (mListenerMap) {
- Collection<LinkedListener> values = mListenerMap.values();
- linkedListeners = new ArrayList<LinkedListener>(values);
+ foreachUnsafe(operation);
}
+ }
- for (LinkedListener linkedListener : linkedListeners) {
- TListener listener = linkedListener.getUnderlyingListener();
- try {
- operation.execute(listener);
- } catch (RemoteException e) {
- Log.e(mTag, "Error in monitored listener.", e);
- removeListener(listener);
- }
+ protected void setSupported(boolean value, ListenerOperation<TListener> notifier) {
+ synchronized (mListenerMap) {
+ mHasIsSupported = true;
+ mIsSupported = value;
+ foreachUnsafe(notifier);
+ }
+ }
+
+ private void foreachUnsafe(ListenerOperation<TListener> operation) {
+ for (LinkedListener linkedListener : mListenerMap.values()) {
+ post(linkedListener.getUnderlyingListener(), operation);
+ }
+ }
+
+ private void post(TListener listener, ListenerOperation<TListener> operation) {
+ if (operation != null) {
+ mHandler.post(new HandlerRunnable(listener, operation));
+ }
+ }
+
+ private boolean tryRegister() {
+ if (!mIsRegistered) {
+ mIsRegistered = registerWithService();
+ }
+ return mIsRegistered;
+ }
+
+ private void tryUnregister() {
+ if (!mIsRegistered) {
+ return;
}
+ unregisterFromService();
+ mIsRegistered = false;
}
private class LinkedListener implements IBinder.DeathRecipient {
@@ -144,4 +201,23 @@ abstract class RemoteListenerHelper<TListener extends IInterface> {
removeListener(mListener);
}
}
+
+ private class HandlerRunnable implements Runnable {
+ private final TListener mListener;
+ private final ListenerOperation<TListener> mOperation;
+
+ public HandlerRunnable(TListener listener, ListenerOperation<TListener> operation) {
+ mListener = listener;
+ mOperation = operation;
+ }
+
+ @Override
+ public void run() {
+ try {
+ mOperation.execute(mListener);
+ } catch (RemoteException e) {
+ Log.v(mTag, "Error in monitored listener.", e);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java
index 3ff9ff4..a1085d3 100644
--- a/services/core/java/com/android/server/notification/ConditionProviders.java
+++ b/services/core/java/com/android/server/notification/ConditionProviders.java
@@ -51,6 +51,7 @@ public class ConditionProviders extends ManagedServices {
= new ArrayMap<IBinder, IConditionListener>();
private final ArrayList<ConditionRecord> mRecords = new ArrayList<ConditionRecord>();
private final CountdownConditionProvider mCountdown = new CountdownConditionProvider();
+ private final NextAlarmTracker mNextAlarmTracker;
private final DowntimeConditionProvider mDowntime = new DowntimeConditionProvider();
private final NextAlarmConditionProvider mNextAlarm = new NextAlarmConditionProvider();
@@ -63,6 +64,7 @@ public class ConditionProviders extends ManagedServices {
mZenModeHelper = zenModeHelper;
mZenModeHelper.addCallback(new ZenModeHelperCallback());
loadZenConfig();
+ mNextAlarmTracker = new NextAlarmTracker(context);
}
@Override
@@ -101,6 +103,7 @@ public class ConditionProviders extends ManagedServices {
mCountdown.dump(pw, filter);
mDowntime.dump(pw, filter);
mNextAlarm.dump(pw, filter);
+ mNextAlarmTracker.dump(pw, filter);
}
@Override
@@ -111,6 +114,7 @@ public class ConditionProviders extends ManagedServices {
@Override
public void onBootPhaseAppsCanStart() {
super.onBootPhaseAppsCanStart();
+ mNextAlarmTracker.init();
mCountdown.attachBase(mContext);
registerService(mCountdown.asInterface(), CountdownConditionProvider.COMPONENT,
UserHandle.USER_OWNER);
@@ -121,20 +125,13 @@ public class ConditionProviders extends ManagedServices {
mNextAlarm.attachBase(mContext);
registerService(mNextAlarm.asInterface(), NextAlarmConditionProvider.COMPONENT,
UserHandle.USER_OWNER);
- mNextAlarm.setCallback(new NextAlarmConditionProvider.Callback() {
- @Override
- public boolean isInDowntime() {
- return mDowntime.isInDowntime();
- }
- });
+ mNextAlarm.setCallback(new NextAlarmCallback());
}
@Override
public void onUserSwitched() {
super.onUserSwitched();
- if (mNextAlarm != null) {
- mNextAlarm.onUserSwitched();
- }
+ mNextAlarmTracker.onUserSwitched();
}
@Override
@@ -572,6 +569,23 @@ public class ConditionProviders extends ManagedServices {
mZenModeHelper.setZenMode(Global.ZEN_MODE_OFF, "downtimeExit");
}
}
+
+ @Override
+ public NextAlarmTracker getNextAlarmTracker() {
+ return mNextAlarmTracker;
+ }
+ }
+
+ private class NextAlarmCallback implements NextAlarmConditionProvider.Callback {
+ @Override
+ public boolean isInDowntime() {
+ return mDowntime.isInDowntime();
+ }
+
+ @Override
+ public NextAlarmTracker getNextAlarmTracker() {
+ return mNextAlarmTracker;
+ }
}
private static class ConditionRecord {
diff --git a/services/core/java/com/android/server/notification/DowntimeConditionProvider.java b/services/core/java/com/android/server/notification/DowntimeConditionProvider.java
index 881c9ad..0fb5732 100644
--- a/services/core/java/com/android/server/notification/DowntimeConditionProvider.java
+++ b/services/core/java/com/android/server/notification/DowntimeConditionProvider.java
@@ -18,6 +18,7 @@ package com.android.server.notification;
import android.app.AlarmManager;
import android.app.PendingIntent;
+import android.app.AlarmManager.AlarmClockInfo;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -63,8 +64,10 @@ public class DowntimeConditionProvider extends ConditionProviderService {
private final Calendar mCalendar = Calendar.getInstance();
private final Context mContext = this;
private final ArraySet<Integer> mDays = new ArraySet<Integer>();
+ private final ArraySet<Long> mFiredAlarms = new ArraySet<Long>();
private boolean mConnected;
+ private NextAlarmTracker mTracker;
private int mDowntimeMode;
private ZenModeConfig mConfig;
private Callback mCallback;
@@ -77,6 +80,7 @@ public class DowntimeConditionProvider extends ConditionProviderService {
pw.println(" DowntimeConditionProvider:");
pw.print(" mConnected="); pw.println(mConnected);
pw.print(" mDowntimeMode="); pw.println(Global.zenModeToString(mDowntimeMode));
+ pw.print(" mFiredAlarms="); pw.println(mFiredAlarms);
}
public void attachBase(Context base) {
@@ -101,12 +105,15 @@ public class DowntimeConditionProvider extends ConditionProviderService {
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
mContext.registerReceiver(mReceiver, filter);
+ mTracker = mCallback.getNextAlarmTracker();
+ mTracker.addCallback(mTrackerCallback);
init();
}
@Override
public void onDestroy() {
if (DEBUG) Slog.d(TAG, "onDestroy");
+ mTracker.removeCallback(mTrackerCallback);
mConnected = false;
}
@@ -183,35 +190,52 @@ public class DowntimeConditionProvider extends ConditionProviderService {
}
}
- private int computeDowntimeMode(long time) {
- if (mConfig == null || mDays.size() == 0) return Global.ZEN_MODE_OFF;
+ private boolean isInDowntime(long time) {
+ if (mConfig == null || mDays.size() == 0) return false;
final long start = getTime(time, mConfig.sleepStartHour, mConfig.sleepStartMinute);
long end = getTime(time, mConfig.sleepEndHour, mConfig.sleepEndMinute);
- if (start == end) return Global.ZEN_MODE_OFF;
+ if (start == end) return false;
if (end < start) {
end = addDays(end, 1);
}
- final boolean inDowntime = isInDowntime(-1, time, start, end)
- || isInDowntime(0, time, start, end);
- return inDowntime ? (mConfig.sleepNone ? Global.ZEN_MODE_NO_INTERRUPTIONS
- : Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS) : Global.ZEN_MODE_OFF;
+ final boolean orAlarm = mConfig.sleepNone;
+ return isInDowntime(-1, time, start, end, orAlarm)
+ || isInDowntime(0, time, start, end, orAlarm);
}
- private boolean isInDowntime(int daysOffset, long time, long start, long end) {
+ private boolean isInDowntime(int daysOffset, long time, long start, long end, boolean orAlarm) {
final int n = Calendar.SATURDAY;
final int day = ((getDayOfWeek(time) - 1) + (daysOffset % n) + n) % n + 1;
start = addDays(start, daysOffset);
end = addDays(end, daysOffset);
+ if (orAlarm) {
+ end = findFiredAlarm(start, end);
+ }
return mDays.contains(day) && time >= start && time < end;
}
+ private long findFiredAlarm(long start, long end) {
+ final int N = mFiredAlarms.size();
+ for (int i = 0; i < N; i++) {
+ final long firedAlarm = mFiredAlarms.valueAt(i);
+ if (firedAlarm > start && firedAlarm < end) {
+ return firedAlarm;
+ }
+ }
+ return end;
+ }
+
private void reevaluateDowntime() {
- final int downtimeMode = computeDowntimeMode(System.currentTimeMillis());
+ final long now = System.currentTimeMillis();
+ final boolean inDowntimeNow = isInDowntime(now);
+ final int downtimeMode = inDowntimeNow ? (mConfig.sleepNone
+ ? Global.ZEN_MODE_NO_INTERRUPTIONS : Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS)
+ : Global.ZEN_MODE_OFF;
if (DEBUG) Slog.d(TAG, "downtimeMode=" + downtimeMode);
if (downtimeMode == mDowntimeMode) return;
mDowntimeMode = downtimeMode;
Slog.i(TAG, (isInDowntime() ? "Entering" : "Exiting" ) + " downtime");
- ZenLog.traceDowntime(mDowntimeMode, getDayOfWeek(System.currentTimeMillis()), mDays);
+ ZenLog.traceDowntime(mDowntimeMode, getDayOfWeek(now), mDays);
fireDowntimeChanged();
}
@@ -266,8 +290,8 @@ public class DowntimeConditionProvider extends ConditionProviderService {
PendingIntent.FLAG_UPDATE_CURRENT);
alarms.cancel(pendingIntent);
if (mConfig.sleepMode != null) {
- if (DEBUG) Slog.d(TAG, String.format("Scheduling %s for %s, %s in the future, now=%s",
- action, ts(time), time - now, ts(now)));
+ if (DEBUG) Slog.d(TAG, String.format("Scheduling %s for %s, in %s, now=%s",
+ action, ts(time), NextAlarmTracker.formatDuration(time - now), ts(now)));
alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
}
}
@@ -276,6 +300,30 @@ public class DowntimeConditionProvider extends ConditionProviderService {
return new Date(time) + " (" + time + ")";
}
+ private void onEvaluateNextAlarm(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) {
+ if (!booted) return; // we don't know yet
+ if (nextAlarm == null) return; // not fireable
+ if (DEBUG) Slog.d(TAG, "onEvaluateNextAlarm " + mTracker.formatAlarmDebug(nextAlarm));
+ if (System.currentTimeMillis() > wakeupTime) {
+ if (DEBUG) Slog.d(TAG, "Alarm fired: " + mTracker.formatAlarmDebug(wakeupTime));
+ trimFiredAlarms();
+ mFiredAlarms.add(wakeupTime);
+ }
+ reevaluateDowntime();
+ }
+
+ private void trimFiredAlarms() {
+ // remove fired alarms over 2 days old
+ final long keepAfter = System.currentTimeMillis() - 2 * 24 * 60 * 60 * 1000;
+ final int N = mFiredAlarms.size();
+ for (int i = N - 1; i >= 0; i--) {
+ final long firedAlarm = mFiredAlarms.valueAt(i);
+ if (firedAlarm < keepAfter) {
+ mFiredAlarms.removeAt(i);
+ }
+ }
+ }
+
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -296,7 +344,15 @@ public class DowntimeConditionProvider extends ConditionProviderService {
}
};
+ private final NextAlarmTracker.Callback mTrackerCallback = new NextAlarmTracker.Callback() {
+ @Override
+ public void onEvaluate(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) {
+ DowntimeConditionProvider.this.onEvaluateNextAlarm(nextAlarm, wakeupTime, booted);
+ }
+ };
+
public interface Callback {
void onDowntimeChanged(int downtimeMode);
+ NextAlarmTracker getNextAlarmTracker();
}
}
diff --git a/services/core/java/com/android/server/notification/NextAlarmConditionProvider.java b/services/core/java/com/android/server/notification/NextAlarmConditionProvider.java
index dba203b..35bbaa0 100644
--- a/services/core/java/com/android/server/notification/NextAlarmConditionProvider.java
+++ b/services/core/java/com/android/server/notification/NextAlarmConditionProvider.java
@@ -16,63 +16,56 @@
package com.android.server.notification;
-import android.app.ActivityManager;
import android.app.AlarmManager;
-import android.app.PendingIntent;
import android.app.AlarmManager.AlarmClockInfo;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.net.Uri;
-import android.os.Handler;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.UserHandle;
import android.service.notification.Condition;
import android.service.notification.ConditionProviderService;
import android.service.notification.IConditionProvider;
import android.service.notification.ZenModeConfig;
-import android.util.TimeUtils;
-import android.text.format.DateFormat;
import android.util.Log;
import android.util.Slog;
+import android.util.TimeUtils;
import com.android.internal.R;
import com.android.server.notification.NotificationManagerService.DumpFilter;
import java.io.PrintWriter;
-import java.util.Locale;
-/** Built-in zen condition provider for alarm clock conditions */
+/**
+ * Built-in zen condition provider for alarm-clock-based conditions.
+ *
+ * <p>If the user's next alarm is within a lookahead threshold (config, default 12hrs), advertise
+ * it as an exit condition for zen mode (unless the built-in downtime condition is also available).
+ *
+ * <p>When this next alarm is selected as the active exit condition, follow subsequent changes
+ * to the user's next alarm, assuming it remains within the 12-hr window.
+ *
+ * <p>The next alarm is defined as {@link AlarmManager#getNextAlarmClock(int)}, which does not
+ * survive a reboot. Maintain the illusion of a consistent next alarm value by holding on to
+ * a persisted condition until we receive the first value after reboot, or timeout with no value.
+ */
public class NextAlarmConditionProvider extends ConditionProviderService {
private static final String TAG = "NextAlarmConditions";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final String ACTION_TRIGGER = TAG + ".trigger";
- private static final String EXTRA_TRIGGER = "trigger";
- private static final int REQUEST_CODE = 100;
private static final long SECONDS = 1000;
- private static final long HOURS = 60 * 60 * SECONDS;
- private static final long NEXT_ALARM_UPDATE_DELAY = 1 * SECONDS; // treat clear+set as update
- private static final long EARLY = 5 * SECONDS; // fire early, ensure alarm stream is unmuted
+ private static final long MINUTES = 60 * SECONDS;
+ private static final long HOURS = 60 * MINUTES;
+
private static final String NEXT_ALARM_PATH = "next_alarm";
public static final ComponentName COMPONENT =
new ComponentName("android", NextAlarmConditionProvider.class.getName());
private final Context mContext = this;
- private final H mHandler = new H();
+ private NextAlarmTracker mTracker;
private boolean mConnected;
- private boolean mRegistered;
- private AlarmManager mAlarmManager;
- private int mCurrentUserId;
private long mLookaheadThreshold;
- private long mScheduledAlarmTime;
private Callback mCallback;
private Uri mCurrentSubscription;
- private PowerManager.WakeLock mWakeLock;
public NextAlarmConditionProvider() {
if (DEBUG) Slog.d(TAG, "new NextAlarmConditionProvider()");
@@ -81,13 +74,9 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
public void dump(PrintWriter pw, DumpFilter filter) {
pw.println(" NextAlarmConditionProvider:");
pw.print(" mConnected="); pw.println(mConnected);
- pw.print(" mRegistered="); pw.println(mRegistered);
- pw.print(" mCurrentUserId="); pw.println(mCurrentUserId);
- pw.print(" mScheduledAlarmTime="); pw.println(formatAlarmDebug(mScheduledAlarmTime));
pw.print(" mLookaheadThreshold="); pw.print(mLookaheadThreshold);
pw.print(" ("); TimeUtils.formatDuration(mLookaheadThreshold, pw); pw.println(")");
pw.print(" mCurrentSubscription="); pw.println(mCurrentSubscription);
- pw.print(" mWakeLock="); pw.println(mWakeLock);
}
public void setCallback(Callback callback) {
@@ -97,29 +86,18 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
@Override
public void onConnected() {
if (DEBUG) Slog.d(TAG, "onConnected");
- mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- final PowerManager p = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mWakeLock = p.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mLookaheadThreshold = mContext.getResources()
.getInteger(R.integer.config_next_alarm_condition_lookahead_threshold_hrs) * HOURS;
- init();
mConnected = true;
- }
-
- public void onUserSwitched() {
- if (DEBUG) Slog.d(TAG, "onUserSwitched");
- if (mConnected) {
- init();
- }
+ mTracker = mCallback.getNextAlarmTracker();
+ mTracker.addCallback(mTrackerCallback);
}
@Override
public void onDestroy() {
super.onDestroy();
if (DEBUG) Slog.d(TAG, "onDestroy");
- if (mConnected) {
- mContext.unregisterReceiver(mReceiver);
- }
+ mTracker.removeCallback(mTrackerCallback);
mConnected = false;
}
@@ -127,88 +105,24 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
public void onRequestConditions(int relevance) {
if (!mConnected || (relevance & Condition.FLAG_RELEVANT_NOW) == 0) return;
- final AlarmClockInfo nextAlarm = mAlarmManager.getNextAlarmClock(mCurrentUserId);
+ final AlarmClockInfo nextAlarm = mTracker.getNextAlarm();
if (nextAlarm == null) return; // no next alarm
if (mCallback != null && mCallback.isInDowntime()) return; // prefer downtime condition
if (!isWithinLookaheadThreshold(nextAlarm)) return; // alarm not within window
// next alarm exists, and is within the configured lookahead threshold
- notifyCondition(newConditionId(), nextAlarm, true, "request");
- }
-
- private boolean isWithinLookaheadThreshold(AlarmClockInfo alarm) {
- if (alarm == null) return false;
- final long delta = getEarlyTriggerTime(alarm) - System.currentTimeMillis();
- return delta > 0 && (mLookaheadThreshold <= 0 || delta < mLookaheadThreshold);
+ notifyCondition(newConditionId(), nextAlarm, Condition.STATE_TRUE, "request");
}
@Override
public void onSubscribe(Uri conditionId) {
if (DEBUG) Slog.d(TAG, "onSubscribe " + conditionId);
if (!isNextAlarmCondition(conditionId)) {
- notifyCondition(conditionId, null, false, "badCondition");
+ notifyCondition(conditionId, null, Condition.STATE_FALSE, "badCondition");
return;
}
mCurrentSubscription = conditionId;
- mHandler.postEvaluate(0);
- }
-
- private static long getEarlyTriggerTime(AlarmClockInfo alarm) {
- return alarm != null ? (alarm.getTriggerTime() - EARLY) : 0;
- }
-
- private void handleEvaluate() {
- final AlarmClockInfo nextAlarm = mAlarmManager.getNextAlarmClock(mCurrentUserId);
- final long triggerTime = getEarlyTriggerTime(nextAlarm);
- final boolean withinThreshold = isWithinLookaheadThreshold(nextAlarm);
- if (DEBUG) Slog.d(TAG, "handleEvaluate mCurrentSubscription=" + mCurrentSubscription
- + " nextAlarm=" + formatAlarmDebug(triggerTime)
- + " withinThreshold=" + withinThreshold);
- if (mCurrentSubscription == null) return; // no one cares
- if (!withinThreshold) {
- // triggertime invalid or in the past, condition = false
- notifyCondition(mCurrentSubscription, nextAlarm, false, "!withinThreshold");
- mCurrentSubscription = null;
- return;
- }
- // triggertime in the future, condition = true, schedule alarm
- notifyCondition(mCurrentSubscription, nextAlarm, true, "withinThreshold");
- rescheduleAlarm(triggerTime);
- }
-
- private static String formatDuration(long millis) {
- final StringBuilder sb = new StringBuilder();
- TimeUtils.formatDuration(millis, sb);
- return sb.toString();
- }
-
- private void rescheduleAlarm(long time) {
- if (DEBUG) Slog.d(TAG, "rescheduleAlarm " + time);
- final AlarmManager alarms = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, REQUEST_CODE,
- new Intent(ACTION_TRIGGER)
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
- .putExtra(EXTRA_TRIGGER, time),
- PendingIntent.FLAG_UPDATE_CURRENT);
- alarms.cancel(pendingIntent);
- mScheduledAlarmTime = time;
- if (time > 0) {
- if (DEBUG) Slog.d(TAG, String.format("Scheduling alarm for %s (in %s)",
- formatAlarmDebug(time), formatDuration(time - System.currentTimeMillis())));
- alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
- }
- }
-
- private void notifyCondition(Uri id, AlarmClockInfo alarm, boolean state, String reason) {
- final String formattedAlarm = alarm == null ? "" : formatAlarm(alarm.getTriggerTime());
- if (DEBUG) Slog.d(TAG, "notifyCondition " + state + " alarm=" + formattedAlarm + " reason="
- + reason);
- notifyCondition(new Condition(id,
- mContext.getString(R.string.zen_mode_next_alarm_summary, formattedAlarm),
- mContext.getString(R.string.zen_mode_next_alarm_line_one),
- formattedAlarm, 0,
- state ? Condition.STATE_TRUE : Condition.STATE_FALSE,
- Condition.FLAG_RELEVANT_NOW));
+ mTracker.evaluate();
}
@Override
@@ -216,7 +130,6 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
if (DEBUG) Slog.d(TAG, "onUnsubscribe " + conditionId);
if (conditionId != null && conditionId.equals(mCurrentSubscription)) {
mCurrentSubscription = null;
- rescheduleAlarm(0);
}
}
@@ -228,11 +141,27 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
return (IConditionProvider) onBind(null);
}
+ private boolean isWithinLookaheadThreshold(AlarmClockInfo alarm) {
+ if (alarm == null) return false;
+ final long delta = NextAlarmTracker.getEarlyTriggerTime(alarm) - System.currentTimeMillis();
+ return delta > 0 && (mLookaheadThreshold <= 0 || delta < mLookaheadThreshold);
+ }
+
+ private void notifyCondition(Uri id, AlarmClockInfo alarm, int state, String reason) {
+ final String formattedAlarm = alarm == null ? "" : mTracker.formatAlarm(alarm);
+ if (DEBUG) Slog.d(TAG, "notifyCondition " + Condition.stateToString(state)
+ + " alarm=" + formattedAlarm + " reason=" + reason);
+ notifyCondition(new Condition(id,
+ mContext.getString(R.string.zen_mode_next_alarm_summary, formattedAlarm),
+ mContext.getString(R.string.zen_mode_next_alarm_line_one),
+ formattedAlarm, 0, state, Condition.FLAG_RELEVANT_NOW));
+ }
+
private Uri newConditionId() {
return new Uri.Builder().scheme(Condition.SCHEME)
.authority(ZenModeConfig.SYSTEM_AUTHORITY)
.appendPath(NEXT_ALARM_PATH)
- .appendPath(Integer.toString(mCurrentUserId))
+ .appendPath(Integer.toString(mTracker.getCurrentUserId()))
.build();
}
@@ -241,78 +170,41 @@ public class NextAlarmConditionProvider extends ConditionProviderService {
&& conditionId.getAuthority().equals(ZenModeConfig.SYSTEM_AUTHORITY)
&& conditionId.getPathSegments().size() == 2
&& conditionId.getPathSegments().get(0).equals(NEXT_ALARM_PATH)
- && conditionId.getPathSegments().get(1).equals(Integer.toString(mCurrentUserId));
+ && conditionId.getPathSegments().get(1)
+ .equals(Integer.toString(mTracker.getCurrentUserId()));
}
- private void init() {
- if (mRegistered) {
- mContext.unregisterReceiver(mReceiver);
+ private void onEvaluate(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) {
+ final boolean withinThreshold = isWithinLookaheadThreshold(nextAlarm);
+ if (DEBUG) Slog.d(TAG, "onEvaluate mCurrentSubscription=" + mCurrentSubscription
+ + " nextAlarmWakeup=" + mTracker.formatAlarmDebug(wakeupTime)
+ + " withinThreshold=" + withinThreshold
+ + " booted=" + booted);
+ if (mCurrentSubscription == null) return; // no one cares
+ if (!booted) {
+ // we don't know yet
+ notifyCondition(mCurrentSubscription, nextAlarm, Condition.STATE_UNKNOWN, "!booted");
+ return;
}
- mCurrentUserId = ActivityManager.getCurrentUser();
- final IntentFilter filter = new IntentFilter();
- filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
- filter.addAction(ACTION_TRIGGER);
- filter.addAction(Intent.ACTION_TIME_CHANGED);
- filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
- mContext.registerReceiverAsUser(mReceiver, new UserHandle(mCurrentUserId), filter, null,
- null);
- mRegistered = true;
- mHandler.postEvaluate(0);
- }
-
- private String formatAlarm(long time) {
- return formatAlarm(time, "Hm", "hma");
- }
-
- private String formatAlarm(long time, String skeleton24, String skeleton12) {
- final String skeleton = DateFormat.is24HourFormat(mContext) ? skeleton24 : skeleton12;
- final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
- return DateFormat.format(pattern, time).toString();
- }
-
- private String formatAlarmDebug(AlarmClockInfo alarm) {
- return formatAlarmDebug(alarm != null ? alarm.getTriggerTime() : 0);
- }
-
- private String formatAlarmDebug(long time) {
- if (time <= 0) return Long.toString(time);
- return String.format("%s (%s)", time, formatAlarm(time, "Hms", "hmsa"));
+ if (!withinThreshold) {
+ // next alarm outside threshold or in the past, condition = false
+ notifyCondition(mCurrentSubscription, nextAlarm, Condition.STATE_FALSE, "!within");
+ mCurrentSubscription = null;
+ return;
+ }
+ // next alarm in the future and within threshold, condition = true
+ notifyCondition(mCurrentSubscription, nextAlarm, Condition.STATE_TRUE, "within");
}
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ private final NextAlarmTracker.Callback mTrackerCallback = new NextAlarmTracker.Callback() {
@Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (DEBUG) Slog.d(TAG, "onReceive " + action);
- long delay = 0;
- if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
- delay = NEXT_ALARM_UPDATE_DELAY;
- if (DEBUG) Slog.d(TAG, String.format(" next alarm for user %s: %s",
- mCurrentUserId,
- formatAlarmDebug(mAlarmManager.getNextAlarmClock(mCurrentUserId))));
- }
- mHandler.postEvaluate(delay);
- mWakeLock.acquire(delay + 5000); // stay awake during evaluate
+ public void onEvaluate(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) {
+ NextAlarmConditionProvider.this.onEvaluate(nextAlarm, wakeupTime, booted);
}
};
public interface Callback {
boolean isInDowntime();
- }
-
- private class H extends Handler {
- private static final int MSG_EVALUATE = 1;
-
- public void postEvaluate(long delay) {
- removeMessages(MSG_EVALUATE);
- sendEmptyMessageDelayed(MSG_EVALUATE, delay);
- }
-
- @Override
- public void handleMessage(Message msg) {
- if (msg.what == MSG_EVALUATE) {
- handleEvaluate();
- }
- }
+ NextAlarmTracker getNextAlarmTracker();
}
}
diff --git a/services/core/java/com/android/server/notification/NextAlarmTracker.java b/services/core/java/com/android/server/notification/NextAlarmTracker.java
new file mode 100644
index 0000000..234f545
--- /dev/null
+++ b/services/core/java/com/android/server/notification/NextAlarmTracker.java
@@ -0,0 +1,263 @@
+/*
+ * 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.server.notification;
+
+import android.app.ActivityManager;
+import android.app.AlarmManager;
+import android.app.AlarmManager.AlarmClockInfo;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.Message;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.text.format.DateFormat;
+import android.util.Log;
+import android.util.Slog;
+import android.util.TimeUtils;
+
+import com.android.server.notification.NotificationManagerService.DumpFilter;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Locale;
+
+/** Helper for tracking updates to the current user's next alarm. */
+public class NextAlarmTracker {
+ private static final String TAG = "NextAlarmTracker";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private static final String ACTION_TRIGGER = TAG + ".trigger";
+ private static final String EXTRA_TRIGGER = "trigger";
+ private static final int REQUEST_CODE = 100;
+
+ private static final long SECONDS = 1000;
+ private static final long MINUTES = 60 * SECONDS;
+ private static final long NEXT_ALARM_UPDATE_DELAY = 1 * SECONDS; // treat clear+set as update
+ private static final long EARLY = 5 * SECONDS; // fire early, ensure alarm stream is unmuted
+ private static final long WAIT_AFTER_INIT = 5 * MINUTES;// for initial alarm re-registration
+ private static final long WAIT_AFTER_BOOT = 20 * SECONDS; // for initial alarm re-registration
+
+ private final Context mContext;
+ private final H mHandler = new H();
+ private final ArrayList<Callback> mCallbacks = new ArrayList<Callback>();
+
+ private long mInit;
+ private boolean mRegistered;
+ private AlarmManager mAlarmManager;
+ private int mCurrentUserId;
+ private long mScheduledAlarmTime;
+ private long mBootCompleted;
+ private PowerManager.WakeLock mWakeLock;
+
+ public NextAlarmTracker(Context context) {
+ mContext = context;
+ }
+
+ public void dump(PrintWriter pw, DumpFilter filter) {
+ pw.println(" NextAlarmTracker:");
+ pw.print(" len(mCallbacks)="); pw.println(mCallbacks.size());
+ pw.print(" mRegistered="); pw.println(mRegistered);
+ pw.print(" mInit="); pw.println(mInit);
+ pw.print(" mBootCompleted="); pw.println(mBootCompleted);
+ pw.print(" mCurrentUserId="); pw.println(mCurrentUserId);
+ pw.print(" mScheduledAlarmTime="); pw.println(formatAlarmDebug(mScheduledAlarmTime));
+ pw.print(" mWakeLock="); pw.println(mWakeLock);
+ }
+
+ public void addCallback(Callback callback) {
+ mCallbacks.add(callback);
+ }
+
+ public void removeCallback(Callback callback) {
+ mCallbacks.remove(callback);
+ }
+
+ public int getCurrentUserId() {
+ return mCurrentUserId;
+ }
+
+ public AlarmClockInfo getNextAlarm() {
+ return mAlarmManager.getNextAlarmClock(mCurrentUserId);
+ }
+
+ public void onUserSwitched() {
+ reset();
+ }
+
+ public void init() {
+ mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ final PowerManager p = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = p.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mInit = System.currentTimeMillis();
+ reset();
+ }
+
+ public void reset() {
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ }
+ mCurrentUserId = ActivityManager.getCurrentUser();
+ final IntentFilter filter = new IntentFilter();
+ filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
+ filter.addAction(ACTION_TRIGGER);
+ filter.addAction(Intent.ACTION_TIME_CHANGED);
+ filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+ filter.addAction(Intent.ACTION_BOOT_COMPLETED);
+ mContext.registerReceiverAsUser(mReceiver, new UserHandle(mCurrentUserId), filter, null,
+ null);
+ mRegistered = true;
+ evaluate();
+ }
+
+ public void destroy() {
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ mRegistered = false;
+ }
+ }
+
+ public void evaluate() {
+ mHandler.postEvaluate(0);
+ }
+
+ private void fireEvaluate(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted) {
+ for (Callback callback : mCallbacks) {
+ callback.onEvaluate(nextAlarm, wakeupTime, booted);
+ }
+ }
+
+ private void handleEvaluate() {
+ final AlarmClockInfo nextAlarm = mAlarmManager.getNextAlarmClock(mCurrentUserId);
+ final long triggerTime = getEarlyTriggerTime(nextAlarm);
+ final long now = System.currentTimeMillis();
+ final boolean alarmUpcoming = triggerTime > now;
+ final boolean booted = isDoneWaitingAfterBoot(now);
+ if (DEBUG) Slog.d(TAG, "handleEvaluate nextAlarm=" + formatAlarmDebug(triggerTime)
+ + " alarmUpcoming=" + alarmUpcoming
+ + " booted=" + booted);
+ fireEvaluate(nextAlarm, triggerTime, booted);
+ if (!booted) {
+ // recheck after boot
+ final long recheckTime = (mBootCompleted > 0 ? mBootCompleted : now) + WAIT_AFTER_BOOT;
+ rescheduleAlarm(recheckTime);
+ return;
+ }
+ if (alarmUpcoming) {
+ // wake up just before the next alarm
+ rescheduleAlarm(triggerTime);
+ }
+ }
+
+ public static long getEarlyTriggerTime(AlarmClockInfo alarm) {
+ return alarm != null ? (alarm.getTriggerTime() - EARLY) : 0;
+ }
+
+ private boolean isDoneWaitingAfterBoot(long time) {
+ if (mBootCompleted > 0) return (time - mBootCompleted) > WAIT_AFTER_BOOT;
+ if (mInit > 0) return (time - mInit) > WAIT_AFTER_INIT;
+ return true;
+ }
+
+ public static String formatDuration(long millis) {
+ final StringBuilder sb = new StringBuilder();
+ TimeUtils.formatDuration(millis, sb);
+ return sb.toString();
+ }
+
+ public String formatAlarm(AlarmClockInfo alarm) {
+ return alarm != null ? formatAlarm(alarm.getTriggerTime()) : null;
+ }
+
+ private String formatAlarm(long time) {
+ return formatAlarm(time, "Hm", "hma");
+ }
+
+ private String formatAlarm(long time, String skeleton24, String skeleton12) {
+ final String skeleton = DateFormat.is24HourFormat(mContext) ? skeleton24 : skeleton12;
+ final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
+ return DateFormat.format(pattern, time).toString();
+ }
+
+ public String formatAlarmDebug(AlarmClockInfo alarm) {
+ return formatAlarmDebug(alarm != null ? alarm.getTriggerTime() : 0);
+ }
+
+ public String formatAlarmDebug(long time) {
+ if (time <= 0) return Long.toString(time);
+ return String.format("%s (%s)", time, formatAlarm(time, "Hms", "hmsa"));
+ }
+
+ private void rescheduleAlarm(long time) {
+ if (DEBUG) Slog.d(TAG, "rescheduleAlarm " + time);
+ final AlarmManager alarms = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, REQUEST_CODE,
+ new Intent(ACTION_TRIGGER)
+ .addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
+ .putExtra(EXTRA_TRIGGER, time),
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ alarms.cancel(pendingIntent);
+ mScheduledAlarmTime = time;
+ if (time > 0) {
+ if (DEBUG) Slog.d(TAG, String.format("Scheduling alarm for %s (in %s)",
+ formatAlarmDebug(time), formatDuration(time - System.currentTimeMillis())));
+ alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
+ }
+ }
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ if (DEBUG) Slog.d(TAG, "onReceive " + action);
+ long delay = 0;
+ if (action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
+ delay = NEXT_ALARM_UPDATE_DELAY;
+ if (DEBUG) Slog.d(TAG, String.format(" next alarm for user %s: %s",
+ mCurrentUserId,
+ formatAlarmDebug(mAlarmManager.getNextAlarmClock(mCurrentUserId))));
+ } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
+ mBootCompleted = System.currentTimeMillis();
+ }
+ mHandler.postEvaluate(delay);
+ mWakeLock.acquire(delay + 5000); // stay awake during evaluate
+ }
+ };
+
+ private class H extends Handler {
+ private static final int MSG_EVALUATE = 1;
+
+ public void postEvaluate(long delay) {
+ removeMessages(MSG_EVALUATE);
+ sendEmptyMessageDelayed(MSG_EVALUATE, delay);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == MSG_EVALUATE) {
+ handleEvaluate();
+ }
+ }
+ }
+
+ public interface Callback {
+ void onEvaluate(AlarmClockInfo nextAlarm, long wakeupTime, boolean booted);
+ }
+}
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index ca11862..31c604f 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -216,6 +216,18 @@ public final class Installer extends SystemService {
return mInstaller.execute(builder.toString());
}
+ public int markBootComplete(String instructionSet) {
+ if (!isValidInstructionSet(instructionSet)) {
+ Slog.e(TAG, "Invalid instruction set: " + instructionSet);
+ return -1;
+ }
+
+ StringBuilder builder = new StringBuilder("markbootcomplete");
+ builder.append(' ');
+ builder.append(instructionSet);
+ return mInstaller.execute(builder.toString());
+ }
+
public boolean ping() {
if (mInstaller.execute("ping") < 0) {
return false;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e645791..25c31c1 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4556,6 +4556,11 @@ public class PackageManagerService extends IPackageManager.Stub {
sortedPkgs.add(pkg);
}
+ // If we want to be lazy, filter everything that wasn't recently used.
+ if (mLazyDexOpt) {
+ filterRecentlyUsedApps(sortedPkgs);
+ }
+
int i = 0;
int total = sortedPkgs.size();
File dataDir = Environment.getDataDirectory();
@@ -4574,7 +4579,7 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- private void filterRecentlyUsedApps(ArraySet<PackageParser.Package> pkgs) {
+ private void filterRecentlyUsedApps(Collection<PackageParser.Package> pkgs) {
// Filter out packages that aren't recently used.
//
// The exception is first boot of a non-eng device (aka !mLazyDexOpt), which
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 8682f5c..c054e6c 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -3141,21 +3141,6 @@ public final class PowerManagerService extends SystemService
}
/**
- * Used by device administration to set the maximum screen off timeout.
- *
- * This method must only be called by the device administration policy manager.
- */
- @Override // Binder call
- public void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs) {
- final long ident = Binder.clearCallingIdentity();
- try {
- setMaximumScreenOffTimeoutFromDeviceAdminInternal(timeMs);
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- }
-
- /**
* Used by the settings application and brightness control widgets to
* temporarily override the current screen brightness setting so that the
* user can observe the effect of an intended settings change without applying
@@ -3300,6 +3285,11 @@ public final class PowerManagerService extends SystemService
}
@Override
+ public void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs) {
+ setMaximumScreenOffTimeoutFromDeviceAdminInternal(timeMs);
+ }
+
+ @Override
public boolean getLowPowerModeEnabled() {
synchronized (mLock) {
return mLowPowerModeEnabled;
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index c28e0bc..58c3ea1 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -23,4 +23,5 @@ public interface StatusBarManagerInternal {
void buzzBeepBlinked();
void notificationLightPulse(int argb, int onMillis, int offMillis);
void notificationLightOff();
+ void showScreenPinningRequest();
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 1919281..9828cd4 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -142,6 +142,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub {
}
}
}
+
+ @Override
+ public void showScreenPinningRequest() {
+ if (mBar != null) {
+ try {
+ mBar.showScreenPinningRequest();
+ } catch (RemoteException e) {
+ }
+ }
+ }
};
// ================================================================================
diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
index b2bcf75..4906bd1 100644
--- a/services/core/java/com/android/server/trust/TrustAgentWrapper.java
+++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java
@@ -39,9 +39,7 @@ import android.util.Log;
import android.util.Slog;
import android.service.trust.ITrustAgentService;
import android.service.trust.ITrustAgentServiceCallback;
-import android.service.trust.TrustAgentService;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -160,7 +158,7 @@ public class TrustAgentWrapper {
mTrustManagerService.updateTrust(mUserId, false);
break;
case MSG_RESTART_TIMEOUT:
- unbind();
+ destroy();
mTrustManagerService.resetAgent(mName, mUserId);
break;
case MSG_SET_TRUST_AGENT_FEATURES_COMPLETED:
@@ -367,7 +365,9 @@ public class TrustAgentWrapper {
return mMessage;
}
- public void unbind() {
+ public void destroy() {
+ mHandler.removeMessages(MSG_RESTART_TIMEOUT);
+
if (!mBound) {
return;
}
@@ -378,7 +378,6 @@ public class TrustAgentWrapper {
mTrustAgentService = null;
mSetTrustAgentFeaturesToken = null;
mHandler.sendEmptyMessage(MSG_REVOKE_TRUST);
- mHandler.removeMessages(MSG_RESTART_TIMEOUT);
}
public boolean isConnected() {
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index fe5cb33..2388c85 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -208,7 +208,8 @@ public class TrustManagerService extends SystemService {
obsoleteAgents.addAll(mActiveAgents);
for (UserInfo userInfo : userInfos) {
- if (userInfo.partial || !userInfo.isEnabled() || userInfo.guestToRemove) continue;
+ if (userInfo == null || userInfo.partial || !userInfo.isEnabled()
+ || userInfo.guestToRemove) continue;
if (!userInfo.supportsSwitchTo()) continue;
if (!mActivityManager.isUserRunning(userInfo.id)) continue;
if (lockPatternUtils.getKeyguardStoredPasswordQuality(userInfo.id)
@@ -258,7 +259,7 @@ public class TrustManagerService extends SystemService {
if (info.agent.isManagingTrust()) {
trustMayHaveChanged = true;
}
- info.agent.unbind();
+ info.agent.destroy();
mActiveAgents.remove(info);
}
}
@@ -290,7 +291,7 @@ public class TrustManagerService extends SystemService {
if (info.agent.isManagingTrust()) {
trustMayHaveChanged = true;
}
- info.agent.unbind();
+ info.agent.destroy();
mActiveAgents.removeAt(i);
}
}
@@ -308,7 +309,7 @@ public class TrustManagerService extends SystemService {
if (info.agent.isManagingTrust()) {
trustMayHaveChanged = true;
}
- info.agent.unbind();
+ info.agent.destroy();
mActiveAgents.removeAt(i);
}
}
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index eeb007c..f6e8bcf 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -109,6 +109,8 @@ public class AppTransition implements Dump {
/** A window in a new task is being opened behind an existing one in another activity's task.
* The new window will show briefly and then be gone. */
public static final int TRANSIT_TASK_OPEN_BEHIND = 16;
+ /** A window in a task is being animated in-place. */
+ public static final int TRANSIT_TASK_IN_PLACE = 17;
/** Fraction of animation at which the recents thumbnail stays completely transparent */
private static final float RECENTS_THUMBNAIL_FADEIN_FRACTION = 0.7f;
@@ -131,6 +133,7 @@ public class AppTransition implements Dump {
private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN = 4;
private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_UP = 5;
private static final int NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_DOWN = 6;
+ private static final int NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE = 7;
private int mNextAppTransitionType = NEXT_TRANSIT_TYPE_NONE;
// These are the possible states for the enter/exit activities during a thumbnail transition
@@ -146,6 +149,7 @@ public class AppTransition implements Dump {
private IRemoteCallback mNextAppTransitionCallback;
private int mNextAppTransitionEnter;
private int mNextAppTransitionExit;
+ private int mNextAppTransitionInPlace;
private int mNextAppTransitionStartX;
private int mNextAppTransitionStartY;
private int mNextAppTransitionStartWidth;
@@ -835,6 +839,12 @@ public class AppTransition implements Dump {
+ " anim=" + a + " nextAppTransition=ANIM_CUSTOM"
+ " transit=" + transit + " isEntrance=" + enter
+ " Callers=" + Debug.getCallers(3));
+ } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE) {
+ a = loadAnimationRes(mNextAppTransitionPackage, mNextAppTransitionInPlace);
+ if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
+ "applyAnimation:"
+ + " anim=" + a + " nextAppTransition=ANIM_CUSTOM_IN_PLACE"
+ + " transit=" + transit + " Callers=" + Debug.getCallers(3));
} else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_SCALE_UP) {
a = createScaleUpAnimationLocked(transit, enter, appWidth, appHeight);
if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG,
@@ -1013,6 +1023,16 @@ public class AppTransition implements Dump {
}
}
+ void overrideInPlaceAppTransition(String packageName, int anim) {
+ if (isTransitionSet()) {
+ mNextAppTransitionType = NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE;
+ mNextAppTransitionPackage = packageName;
+ mNextAppTransitionInPlace = anim;
+ } else {
+ postAnimationCallback();
+ }
+ }
+
@Override
public String toString() {
return "mNextAppTransition=0x" + Integer.toHexString(mNextAppTransition);
@@ -1092,6 +1112,8 @@ public class AppTransition implements Dump {
return "NEXT_TRANSIT_TYPE_NONE";
case NEXT_TRANSIT_TYPE_CUSTOM:
return "NEXT_TRANSIT_TYPE_CUSTOM";
+ case NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE:
+ return "NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE";
case NEXT_TRANSIT_TYPE_SCALE_UP:
return "NEXT_TRANSIT_TYPE_SCALE_UP";
case NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP:
@@ -1123,6 +1145,12 @@ public class AppTransition implements Dump {
pw.print(" mNextAppTransitionExit=0x");
pw.println(Integer.toHexString(mNextAppTransitionExit));
break;
+ case NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE:
+ pw.print(" mNextAppTransitionPackage=");
+ pw.println(mNextAppTransitionPackage);
+ pw.print(" mNextAppTransitionInPlace=0x");
+ pw.print(Integer.toHexString(mNextAppTransitionInPlace));
+ break;
case NEXT_TRANSIT_TYPE_SCALE_UP:
pw.print(" mNextAppTransitionStartX="); pw.print(mNextAppTransitionStartX);
pw.print(" mNextAppTransitionStartY=");
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index b2575e6..1086eb2 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -252,11 +252,17 @@ class AppWindowToken extends WindowToken {
return false;
}
+ @Override
void removeAllWindows() {
- for (int winNdx = allAppWindows.size() - 1; winNdx >= 0; --winNdx) {
- WindowState win = allAppWindows.get(winNdx);
- if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) Slog.w(WindowManagerService.TAG,
- "removeAllWindows: removing win=" + win);
+ int winNdx;
+ while ((winNdx = allAppWindows.size()) > 0) {
+ WindowState win = allAppWindows.get(winNdx - 1);
+ if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) {
+ Slog.w(WindowManagerService.TAG, "removeAllWindows: removing win=" + win);
+ }
+
+ // {@link WindowManagerService.removeWindowLocked} may remove multiple entries from
+ // {@link #allAppWindows} if the window to be removed has child windows.
win.mService.removeWindowLocked(win.mSession, win);
}
}
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index edc7c93..c6951bd 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -114,7 +114,6 @@ class DragState {
mDragWindowHandle.inputChannel = mServerChannel;
mDragWindowHandle.layer = getDragLayerLw();
mDragWindowHandle.layoutParamsFlags = 0;
- mDragWindowHandle.layoutParamsPrivateFlags = 0;
mDragWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_DRAG;
mDragWindowHandle.dispatchingTimeoutNanos =
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
diff --git a/services/core/java/com/android/server/wm/FakeWindowImpl.java b/services/core/java/com/android/server/wm/FakeWindowImpl.java
index c18ea01..1136ced 100644
--- a/services/core/java/com/android/server/wm/FakeWindowImpl.java
+++ b/services/core/java/com/android/server/wm/FakeWindowImpl.java
@@ -38,7 +38,7 @@ public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
public FakeWindowImpl(WindowManagerService service,
Looper looper, InputEventReceiver.Factory inputEventReceiverFactory,
- String name, int windowType, int layoutParamsFlags, int layoutParamsPrivateFlags,
+ String name, int windowType, int layoutParamsFlags,
boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
mService = service;
@@ -61,7 +61,6 @@ public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
mWindowLayer = getLayerLw(windowType);
mWindowHandle.layer = mWindowLayer;
mWindowHandle.layoutParamsFlags = layoutParamsFlags;
- mWindowHandle.layoutParamsPrivateFlags = layoutParamsPrivateFlags;
mWindowHandle.layoutParamsType = windowType;
mWindowHandle.dispatchingTimeoutNanos =
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index 46aefb6..0327cb3 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -168,8 +168,8 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
}
private void addInputWindowHandleLw(final InputWindowHandle inputWindowHandle,
- final WindowState child, int flags, int privateFlags, final int type,
- final boolean isVisible, final boolean hasFocus, final boolean hasWallpaper) {
+ final WindowState child, int flags, final int type, final boolean isVisible,
+ final boolean hasFocus, final boolean hasWallpaper) {
// Add a window to our list of input windows.
inputWindowHandle.name = child.toString();
final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
@@ -184,7 +184,6 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
child.getTouchableRegion(inputWindowHandle.touchableRegion);
}
inputWindowHandle.layoutParamsFlags = flags;
- inputWindowHandle.layoutParamsPrivateFlags = privateFlags;
inputWindowHandle.layoutParamsType = type;
inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos();
inputWindowHandle.visible = isVisible;
@@ -298,15 +297,14 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
final WindowState u = universeBackground.mWin;
if (u.mInputChannel != null && u.mInputWindowHandle != null) {
addInputWindowHandleLw(u.mInputWindowHandle, u, u.mAttrs.flags,
- u.mAttrs.privateFlags, u.mAttrs.type,
- true, u == mInputFocus, false);
+ u.mAttrs.type, true, u == mInputFocus, false);
}
addedUniverse = true;
}
if (child.mWinAnimator != universeBackground) {
- addInputWindowHandleLw(inputWindowHandle, child, flags, privateFlags, type,
- isVisible, hasFocus, hasWallpaper);
+ addInputWindowHandleLw(inputWindowHandle, child, flags, type, isVisible,
+ hasFocus, hasWallpaper);
}
}
}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index d737e7f..a4dfd8a 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -155,31 +155,32 @@ final class Session extends IWindowSession.Stub
@Override
public int add(IWindow window, int seq, WindowManager.LayoutParams attrs,
- int viewVisibility, Rect outContentInsets, InputChannel outInputChannel) {
+ int viewVisibility, Rect outContentInsets, Rect outStableInsets,
+ InputChannel outInputChannel) {
return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
- outContentInsets, outInputChannel);
+ outContentInsets, outStableInsets, outInputChannel);
}
@Override
public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
- int viewVisibility, int displayId, Rect outContentInsets,
+ int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
InputChannel outInputChannel) {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
- outContentInsets, outInputChannel);
+ outContentInsets, outStableInsets, outInputChannel);
}
@Override
public int addWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
- int viewVisibility, Rect outContentInsets) {
+ int viewVisibility, Rect outContentInsets, Rect outStableInsets) {
return addToDisplayWithoutInputChannel(window, seq, attrs, viewVisibility,
- Display.DEFAULT_DISPLAY, outContentInsets);
+ Display.DEFAULT_DISPLAY, outContentInsets, outStableInsets);
}
@Override
public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
- int viewVisibility, int displayId, Rect outContentInsets) {
+ int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
- outContentInsets, null);
+ outContentInsets, outStableInsets, null);
}
public void remove(IWindow window) {
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index 8d93141..82e4bb1 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -20,6 +20,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static com.android.server.wm.WindowManagerService.DEBUG_KEYGUARD;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
import static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
@@ -272,6 +273,7 @@ public class WindowAnimator {
if (winAnimator.mSurfaceControl != null) {
final boolean wasAnimating = winAnimator.mWasAnimating;
final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
+ mAnimating |= nowAnimating;
if (WindowManagerService.DEBUG_WALLPAPER) {
Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
@@ -329,7 +331,9 @@ public class WindowAnimator {
+ " anim=" + win.mWinAnimator.mAnimation);
} else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
final boolean hideWhenLocked = !((win.mIsImWindow && showImeOverKeyguard) ||
- (appShowWhenLocked != null && appShowWhenLocked == win.mAppToken));
+ (appShowWhenLocked != null && (appShowWhenLocked == win.mAppToken ||
+ // Show error dialogs over apps that dismiss keyguard.
+ (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0)));
if (((mForceHiding == KEYGUARD_ANIMATING_IN)
&& (!winAnimator.isAnimating() || hideWhenLocked))
|| ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
@@ -423,7 +427,8 @@ public class WindowAnimator {
if (mKeyguardGoingAwayDisableWindowAnimations) {
if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: skipping anim for windows");
} else {
- if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: created anim for windows");
+ if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: created anim for windows="
+ + unForceHiding);
mPostKeyguardExitAnimation = mPolicy.createForceHideEnterAnimation(
wallpaperInUnForceHiding, mKeyguardGoingAwayToNotificationShade);
}
@@ -434,6 +439,17 @@ public class WindowAnimator {
winAnimator.keyguardGoingAwayAnimation = true;
}
}
+
+ // Wallpaper is going away in un-force-hide motion, animate it as well.
+ if (!wallpaperInUnForceHiding && wallpaper != null
+ && !mKeyguardGoingAwayDisableWindowAnimations) {
+ if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: wallpaper animating away");
+ Animation a = mPolicy.createForceHideWallpaperExitAnimation(
+ mKeyguardGoingAwayToNotificationShade);
+ if (a != null) {
+ wallpaper.mWinAnimator.setAnimation(a);
+ }
+ }
}
if (mPostKeyguardExitAnimation != null) {
@@ -448,17 +464,6 @@ public class WindowAnimator {
mPostKeyguardExitAnimation = null;
}
}
-
- // Wallpaper is going away in un-force-hide motion, animate it as well.
- if (!wallpaperInUnForceHiding && wallpaper != null
- && !mKeyguardGoingAwayDisableWindowAnimations) {
- if (DEBUG_KEYGUARD) Slog.d(TAG, "updateWindowsLocked: wallpaper animating away");
- Animation a = mPolicy.createForceHideWallpaperExitAnimation(
- mKeyguardGoingAwayToNotificationShade);
- if (a != null) {
- wallpaper.mWinAnimator.setAnimation(a);
- }
- }
}
private void updateWallpaperLocked(int displayId) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 968b35c..6cb1e4a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2266,7 +2266,7 @@ public class WindowManagerService extends IWindowManager.Stub
public int addWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
- Rect outContentInsets, InputChannel outInputChannel) {
+ Rect outContentInsets, Rect outStableInsets, InputChannel outInputChannel) {
int[] appOp = new int[1];
int res = mPolicy.checkAddPermission(attrs, appOp);
if (res != WindowManagerGlobal.ADD_OKAY) {
@@ -2504,9 +2504,10 @@ public class WindowManagerService extends IWindowManager.Stub
winAnimator.mEnteringAnimation = true;
if (displayContent.isDefaultDisplay) {
- mPolicy.getContentInsetHintLw(attrs, outContentInsets);
+ mPolicy.getInsetHintLw(win.mAttrs, outContentInsets, outStableInsets);
} else {
outContentInsets.setEmpty();
+ outStableInsets.setEmpty();
}
if (mInTouchMode) {
@@ -4124,6 +4125,13 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
+ public void overridePendingAppTransitionInPlace(String packageName, int anim) {
+ synchronized(mWindowMap) {
+ mAppTransition.overrideInPlaceAppTransition(packageName, anim);
+ }
+ }
+
+ @Override
public void executeAppTransition() {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
"executeAppTransition()")) {
@@ -4535,6 +4543,15 @@ public class WindowManagerService extends IWindowManager.Stub
return delayed;
}
+ void updateTokenInPlaceLocked(AppWindowToken wtoken, int transit) {
+ if (transit != AppTransition.TRANSIT_UNSET) {
+ if (wtoken.mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) {
+ wtoken.mAppAnimator.animation = null;
+ }
+ applyAnimationLocked(wtoken, null, transit, false, false);
+ }
+ }
+
@Override
public void setAppVisibility(IBinder token, boolean visible) {
if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
@@ -9125,6 +9142,29 @@ public class WindowManagerService extends IWindowManager.Stub
int topOpeningLayer = 0;
int topClosingLayer = 0;
+ // Process all applications animating in place
+ if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) {
+ // Find the focused window
+ final WindowState win =
+ findFocusedWindowLocked(getDefaultDisplayContentLocked());
+ if (win != null) {
+ final AppWindowToken wtoken = win.mAppToken;
+ final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now animating app in place " + wtoken);
+ appAnimator.clearThumbnail();
+ appAnimator.animation = null;
+ updateTokenInPlaceLocked(wtoken, transit);
+ wtoken.updateReportedVisibilityLocked();
+
+ appAnimator.mAllAppWinAnimators.clear();
+ final int N = wtoken.allAppWindows.size();
+ for (int j = 0; j < N; j++) {
+ appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator);
+ }
+ mAnimator.mAnimating |= appAnimator.showAllWindowsLocked();
+ }
+ }
+
NN = mOpeningApps.size();
for (i=0; i<NN; i++) {
AppWindowToken wtoken = mOpeningApps.valueAt(i);
@@ -10751,9 +10791,7 @@ public class WindowManagerService extends IWindowManager.Stub
boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
synchronized (mWindowMap) {
FakeWindowImpl fw = new FakeWindowImpl(this, looper, inputEventReceiverFactory,
- name, windowType,
- layoutParamsFlags, layoutParamsPrivateFlags, canReceiveKeys,
- hasFocus, touchFullscreen);
+ name, windowType, layoutParamsFlags, canReceiveKeys, hasFocus, touchFullscreen);
int i=0;
while (i<mFakeWindows.size()) {
if (mFakeWindows.get(i).mWindowLayer <= fw.mWindowLayer) {
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 1dadb17..819ca50 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -486,8 +486,9 @@ class WindowStateAnimator {
}
boolean finishDrawingLocked() {
- if (DEBUG_STARTING_WINDOW &&
- mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
+ final boolean startingWindow =
+ mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+ if (DEBUG_STARTING_WINDOW && startingWindow) {
Slog.v(TAG, "Finishing drawing window " + mWin + ": mDrawState="
+ drawStateToString());
}
@@ -495,11 +496,13 @@ class WindowStateAnimator {
if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || SHOW_TRANSACTIONS || DEBUG_ORIENTATION)
Slog.v(TAG, "finishDrawingLocked: mDrawState=COMMIT_DRAW_PENDING " + this + " in "
+ mSurfaceControl);
- if (DEBUG_STARTING_WINDOW &&
- mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) {
+ if (DEBUG_STARTING_WINDOW && startingWindow) {
Slog.v(TAG, "Draw state now committed in " + mWin);
}
mDrawState = COMMIT_DRAW_PENDING;
+ if (startingWindow) {
+ mService.notifyActivityDrawnForKeyguard();
+ }
return true;
}
return false;
diff --git a/services/core/jni/com_android_server_input_InputWindowHandle.cpp b/services/core/jni/com_android_server_input_InputWindowHandle.cpp
index 03bf7eb..46ec1f4 100644
--- a/services/core/jni/com_android_server_input_InputWindowHandle.cpp
+++ b/services/core/jni/com_android_server_input_InputWindowHandle.cpp
@@ -36,7 +36,6 @@ static struct {
jfieldID inputChannel;
jfieldID name;
jfieldID layoutParamsFlags;
- jfieldID layoutParamsPrivateFlags;
jfieldID layoutParamsType;
jfieldID dispatchingTimeoutNanos;
jfieldID frameLeft;
@@ -113,8 +112,6 @@ bool NativeInputWindowHandle::updateInfo() {
mInfo->layoutParamsFlags = env->GetIntField(obj,
gInputWindowHandleClassInfo.layoutParamsFlags);
- mInfo->layoutParamsPrivateFlags = env->GetIntField(obj,
- gInputWindowHandleClassInfo.layoutParamsPrivateFlags);
mInfo->layoutParamsType = env->GetIntField(obj,
gInputWindowHandleClassInfo.layoutParamsType);
mInfo->dispatchingTimeout = env->GetLongField(obj,
@@ -251,9 +248,6 @@ int register_android_server_InputWindowHandle(JNIEnv* env) {
GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsFlags, clazz,
"layoutParamsFlags", "I");
- GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsPrivateFlags, clazz,
- "layoutParamsPrivateFlags", "I");
-
GET_FIELD_ID(gInputWindowHandleClassInfo.layoutParamsType, clazz,
"layoutParamsType", "I");
diff --git a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp
index 6958087..8183321 100644
--- a/services/core/jni/com_android_server_location_GpsLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GpsLocationProvider.cpp
@@ -1195,6 +1195,7 @@ static jobject translate_gps_measurement(JNIEnv* env, GpsMeasurement* measuremen
usedInFixSetterMethod,
(flags & GPS_MEASUREMENT_HAS_USED_IN_FIX) && measurement->used_in_fix);
+ env->DeleteLocalRef(gpsMeasurementClass);
return gpsMeasurementObject;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 2c6a222..0713772 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -59,9 +59,9 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
-import android.os.IPowerManager;
import android.os.PersistableBundle;
import android.os.PowerManager;
+import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.RecoverySystem;
import android.os.RemoteCallback;
@@ -179,6 +179,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
SECURE_SETTINGS_WHITELIST = new HashSet();
SECURE_SETTINGS_WHITELIST.add(Settings.Secure.DEFAULT_INPUT_METHOD);
SECURE_SETTINGS_WHITELIST.add(Settings.Secure.SKIP_FIRST_USE_HINTS);
+ SECURE_SETTINGS_WHITELIST.add(Settings.Secure.INSTALL_NON_MARKET_APPS);
SECURE_SETTINGS_DEVICEOWNER_WHITELIST = new HashSet();
SECURE_SETTINGS_DEVICEOWNER_WHITELIST.addAll(SECURE_SETTINGS_WHITELIST);
@@ -204,7 +205,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
final LocalService mLocalService;
- IPowerManager mIPowerManager;
+ final PowerManager mPowerManager;
+ final PowerManagerInternal mPowerManagerInternal;
+
IWindowManager mIWindowManager;
NotificationManager mNotificationManager;
@@ -925,8 +928,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
mUserManager = UserManager.get(mContext);
mHasFeature = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_DEVICE_ADMIN);
- mWakeLock = ((PowerManager)context.getSystemService(Context.POWER_SERVICE))
- .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM");
+ mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+ mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
+ mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DPM");
mLocalService = new LocalService();
if (!mHasFeature) {
// Skip the rest of the initialization
@@ -1038,14 +1042,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
}
- private IPowerManager getIPowerManager() {
- if (mIPowerManager == null) {
- IBinder b = ServiceManager.getService(Context.POWER_SERVICE);
- mIPowerManager = IPowerManager.Stub.asInterface(b);
- }
- return mIPowerManager;
- }
-
private IWindowManager getWindowManager() {
if (mIWindowManager == null) {
IBinder b = ServiceManager.getService(Context.WINDOW_SERVICE);
@@ -2729,12 +2725,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
}
policy.mLastMaximumTimeToLock = timeMs;
-
- try {
- getIPowerManager().setMaximumScreenOffTimeoutFromDeviceAdmin((int)timeMs);
- } catch (RemoteException e) {
- Slog.w(LOG_TAG, "Failure talking with power manager", e);
- }
+ mPowerManagerInternal.setMaximumScreenOffTimeoutFromDeviceAdmin((int)timeMs);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -2789,7 +2780,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
long ident = Binder.clearCallingIdentity();
try {
// Power off the display
- getIPowerManager().goToSleep(SystemClock.uptimeMillis(),
+ mPowerManager.goToSleep(SystemClock.uptimeMillis(),
PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN, 0);
// Ensure the device is locked
new LockPatternUtils(mContext).requireCredentialEntry(UserHandle.USER_ALL);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index d7f6130..4e6a8ea 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -147,7 +147,6 @@ public final class SystemServer {
private SystemServiceManager mSystemServiceManager;
// TODO: remove all of these references by improving dependency resolution and boot phases
- private Installer mInstaller;
private PowerManagerService mPowerManagerService;
private ActivityManagerService mActivityManagerService;
private DisplayManagerService mDisplayManagerService;
@@ -309,12 +308,13 @@ public final class SystemServer {
// Wait for installd to finish starting up so that it has a chance to
// create critical directories such as /data/user with the appropriate
// permissions. We need this to complete before we initialize other services.
- mInstaller = mSystemServiceManager.startService(Installer.class);
+ Installer installer = mSystemServiceManager.startService(Installer.class);
// Activity manager runs the show.
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
+ mActivityManagerService.setInstaller(installer);
// Power manager needs to be started early because other services need it.
// Native daemons may be watching for it to be registered so it must be ready
@@ -345,7 +345,7 @@ public final class SystemServer {
// Start the package manager.
Slog.i(TAG, "Package Manager");
- mPackageManagerService = PackageManagerService.main(mSystemContext, mInstaller,
+ mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
diff --git a/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java
new file mode 100644
index 0000000..bf0e75d
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/LockSettingsStorageTests.java
@@ -0,0 +1,330 @@
+/*
+ * 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.server;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.pm.UserInfo;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.FileUtils;
+import android.os.UserManager;
+import android.test.AndroidTestCase;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+
+public class LockSettingsStorageTests extends AndroidTestCase {
+ LockSettingsStorage mStorage;
+ File mStorageDir;
+
+ private File mDb;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mStorageDir = new File(getContext().getFilesDir(), "locksettings");
+ mDb = getContext().getDatabasePath("locksettings.db");
+
+ assertTrue(mStorageDir.exists() || mStorageDir.mkdirs());
+ assertTrue(FileUtils.deleteContents(mStorageDir));
+ assertTrue(!mDb.exists() || mDb.delete());
+
+ final Context ctx = getContext();
+ setContext(new ContextWrapper(ctx) {
+ @Override
+ public Object getSystemService(String name) {
+ if (USER_SERVICE.equals(name)) {
+ return new UserManager(ctx, null) {
+ @Override
+ public UserInfo getProfileParent(int userHandle) {
+ if (userHandle == 2) {
+ // User 2 is a profile of user 1.
+ return new UserInfo(1, "name", 0);
+ }
+ if (userHandle == 3) {
+ // User 3 is a profile of user 0.
+ return new UserInfo(0, "name", 0);
+ }
+ return null;
+ }
+ };
+ }
+ return super.getSystemService(name);
+ }
+ });
+
+ mStorage = new LockSettingsStorage(getContext(), new LockSettingsStorage.Callback() {
+ @Override
+ public void initialize(SQLiteDatabase db) {
+ mStorage.writeKeyValue(db, "initializedKey", "initialValue", 0);
+ }
+ }) {
+ @Override
+ String getLockPatternFilename(int userId) {
+ return new File(mStorageDir,
+ super.getLockPatternFilename(userId).replace('/', '-')).getAbsolutePath();
+ }
+
+ @Override
+ String getLockPasswordFilename(int userId) {
+ return new File(mStorageDir,
+ super.getLockPasswordFilename(userId).replace('/', '-')).getAbsolutePath();
+ }
+ };
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ mStorage.closeDatabase();
+ }
+
+ public void testKeyValue_InitializeWorked() {
+ assertEquals("initialValue", mStorage.readKeyValue("initializedKey", "default", 0));
+ mStorage.clearCache();
+ assertEquals("initialValue", mStorage.readKeyValue("initializedKey", "default", 0));
+ }
+
+ public void testKeyValue_WriteThenRead() {
+ mStorage.writeKeyValue("key", "value", 0);
+ assertEquals("value", mStorage.readKeyValue("key", "default", 0));
+ mStorage.clearCache();
+ assertEquals("value", mStorage.readKeyValue("key", "default", 0));
+ }
+
+ public void testKeyValue_DefaultValue() {
+ assertEquals("default", mStorage.readKeyValue("unititialized key", "default", 0));
+ assertEquals("default2", mStorage.readKeyValue("unititialized key", "default2", 0));
+ }
+
+ public void testKeyValue_Concurrency() {
+ final Object monitor = new Object();
+ List<Thread> threads = new ArrayList<>();
+ for (int i = 0; i < 100; i++) {
+ final int threadId = i;
+ threads.add(new Thread() {
+ @Override
+ public void run() {
+ synchronized (monitor) {
+ try {
+ monitor.wait();
+ } catch (InterruptedException e) {
+ return;
+ }
+ mStorage.writeKeyValue("key", "1 from thread " + threadId, 0);
+ mStorage.readKeyValue("key", "default", 0);
+ mStorage.writeKeyValue("key", "2 from thread " + threadId, 0);
+ mStorage.readKeyValue("key", "default", 0);
+ mStorage.writeKeyValue("key", "3 from thread " + threadId, 0);
+ mStorage.readKeyValue("key", "default", 0);
+ mStorage.writeKeyValue("key", "4 from thread " + threadId, 0);
+ mStorage.readKeyValue("key", "default", 0);
+ mStorage.writeKeyValue("key", "5 from thread " + threadId, 0);
+ mStorage.readKeyValue("key", "default", 0);
+ }
+ }
+ });
+ threads.get(i).start();
+ }
+ mStorage.writeKeyValue("key", "initalValue", 0);
+ synchronized (monitor) {
+ monitor.notifyAll();
+ }
+ for (int i = 0; i < threads.size(); i++) {
+ try {
+ threads.get(i).join();
+ } catch (InterruptedException e) {
+ }
+ }
+ assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0));
+ mStorage.clearCache();
+ assertEquals('5', mStorage.readKeyValue("key", "default", 0).charAt(0));
+ }
+
+ public void testKeyValue_CacheStarvedWriter() {
+ final CountDownLatch latch = new CountDownLatch(1);
+ List<Thread> threads = new ArrayList<>();
+ for (int i = 0; i < 100; i++) {
+ final int threadId = i;
+ threads.add(new Thread() {
+ @Override
+ public void run() {
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ return;
+ }
+ if (threadId == 50) {
+ mStorage.writeKeyValue("starvedWriterKey", "value", 0);
+ } else {
+ mStorage.readKeyValue("starvedWriterKey", "default", 0);
+ }
+ }
+ });
+ threads.get(i).start();
+ }
+ latch.countDown();
+ for (int i = 0; i < threads.size(); i++) {
+ try {
+ threads.get(i).join();
+ } catch (InterruptedException e) {
+ }
+ }
+ String cached = mStorage.readKeyValue("key", "default", 0);
+ mStorage.clearCache();
+ String storage = mStorage.readKeyValue("key", "default", 0);
+ assertEquals("Cached value didn't match stored value", storage, cached);
+ }
+
+ public void testRemoveUser() {
+ mStorage.writeKeyValue("key", "value", 0);
+ mStorage.writePasswordHash(new byte[]{1}, 0);
+ mStorage.writePatternHash(new byte[]{2}, 0);
+
+ mStorage.writeKeyValue("key", "value", 1);
+ mStorage.writePasswordHash(new byte[]{1}, 1);
+ mStorage.writePatternHash(new byte[]{2}, 1);
+
+ mStorage.removeUser(0);
+
+ assertEquals("value", mStorage.readKeyValue("key", "default", 1));
+ assertEquals("default", mStorage.readKeyValue("key", "default", 0));
+ assertNotNull(mStorage.readPasswordHash(1));
+ assertNull(mStorage.readPasswordHash(0));
+ assertNotNull(mStorage.readPatternHash(1));
+ assertNull(mStorage.readPatternHash(0));
+ }
+
+ public void testPassword_Default() {
+ assertNull(mStorage.readPasswordHash(0));
+ }
+
+ public void testPassword_Write() {
+ mStorage.writePasswordHash("thepassword".getBytes(), 0);
+
+ assertArrayEquals("thepassword".getBytes(), mStorage.readPasswordHash(0));
+ mStorage.clearCache();
+ assertArrayEquals("thepassword".getBytes(), mStorage.readPasswordHash(0));
+ }
+
+ public void testPassword_WriteProfileWritesParent() {
+ mStorage.writePasswordHash("parentpasswordd".getBytes(), 1);
+ mStorage.writePasswordHash("profilepassword".getBytes(), 2);
+
+ assertArrayEquals("profilepassword".getBytes(), mStorage.readPasswordHash(1));
+ assertArrayEquals("profilepassword".getBytes(), mStorage.readPasswordHash(2));
+ mStorage.clearCache();
+ assertArrayEquals("profilepassword".getBytes(), mStorage.readPasswordHash(1));
+ assertArrayEquals("profilepassword".getBytes(), mStorage.readPasswordHash(2));
+ }
+
+ public void testPassword_WriteParentWritesProfile() {
+ mStorage.writePasswordHash("profilepassword".getBytes(), 2);
+ mStorage.writePasswordHash("parentpasswordd".getBytes(), 1);
+
+ assertArrayEquals("parentpasswordd".getBytes(), mStorage.readPasswordHash(1));
+ assertArrayEquals("parentpasswordd".getBytes(), mStorage.readPasswordHash(2));
+ mStorage.clearCache();
+ assertArrayEquals("parentpasswordd".getBytes(), mStorage.readPasswordHash(1));
+ assertArrayEquals("parentpasswordd".getBytes(), mStorage.readPasswordHash(2));
+ }
+
+ public void testPattern_Default() {
+ assertNull(mStorage.readPasswordHash(0));
+ }
+
+ public void testPattern_Write() {
+ mStorage.writePatternHash("thepattern".getBytes(), 0);
+
+ assertArrayEquals("thepattern".getBytes(), mStorage.readPatternHash(0));
+ mStorage.clearCache();
+ assertArrayEquals("thepattern".getBytes(), mStorage.readPatternHash(0));
+ }
+
+ public void testPattern_WriteProfileWritesParent() {
+ mStorage.writePatternHash("parentpatternn".getBytes(), 1);
+ mStorage.writePatternHash("profilepattern".getBytes(), 2);
+
+ assertArrayEquals("profilepattern".getBytes(), mStorage.readPatternHash(1));
+ assertArrayEquals("profilepattern".getBytes(), mStorage.readPatternHash(2));
+ mStorage.clearCache();
+ assertArrayEquals("profilepattern".getBytes(), mStorage.readPatternHash(1));
+ assertArrayEquals("profilepattern".getBytes(), mStorage.readPatternHash(2));
+ }
+
+ public void testPattern_WriteParentWritesProfile() {
+ mStorage.writePatternHash("profilepattern".getBytes(), 2);
+ mStorage.writePatternHash("parentpatternn".getBytes(), 1);
+
+ assertArrayEquals("parentpatternn".getBytes(), mStorage.readPatternHash(1));
+ assertArrayEquals("parentpatternn".getBytes(), mStorage.readPatternHash(2));
+ mStorage.clearCache();
+ assertArrayEquals("parentpatternn".getBytes(), mStorage.readPatternHash(1));
+ assertArrayEquals("parentpatternn".getBytes(), mStorage.readPatternHash(2));
+ }
+
+ public void testPrefetch() {
+ mStorage.writeKeyValue("key", "toBeFetched", 0);
+ mStorage.writePatternHash("pattern".getBytes(), 0);
+ mStorage.writePasswordHash("password".getBytes(), 0);
+
+ mStorage.clearCache();
+ mStorage.prefetchUser(0);
+
+ assertEquals("toBeFetched", mStorage.readKeyValue("key", "default", 0));
+ assertArrayEquals("pattern".getBytes(), mStorage.readPatternHash(0));
+ assertArrayEquals("password".getBytes(), mStorage.readPasswordHash(0));
+ }
+
+ public void testFileLocation_Owner() {
+ LockSettingsStorage storage = new LockSettingsStorage(getContext(), null);
+
+ assertEquals("/data/system/gesture.key", storage.getLockPatternFilename(0));
+ assertEquals("/data/system/password.key", storage.getLockPasswordFilename(0));
+ }
+
+ public void testFileLocation_SecondaryUser() {
+ LockSettingsStorage storage = new LockSettingsStorage(getContext(), null);
+
+ assertEquals("/data/system/users/1/gesture.key", storage.getLockPatternFilename(1));
+ assertEquals("/data/system/users/1/password.key", storage.getLockPasswordFilename(1));
+ }
+
+ public void testFileLocation_ProfileToSecondary() {
+ LockSettingsStorage storage = new LockSettingsStorage(getContext(), null);
+
+ assertEquals("/data/system/users/1/gesture.key", storage.getLockPatternFilename(2));
+ assertEquals("/data/system/users/1/password.key", storage.getLockPasswordFilename(2));
+ }
+
+ public void testFileLocation_ProfileToOwner() {
+ LockSettingsStorage storage = new LockSettingsStorage(getContext(), null);
+
+ assertEquals("/data/system/gesture.key", storage.getLockPatternFilename(3));
+ assertEquals("/data/system/password.key", storage.getLockPasswordFilename(3));
+ }
+
+ private static void assertArrayEquals(byte[] expected, byte[] actual) {
+ if (!Arrays.equals(expected, actual)) {
+ fail("expected:<" + Arrays.toString(expected) +
+ "> but was:<" + Arrays.toString(actual) + ">");
+ }
+ }
+}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
index 098b3ef..26ced03 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
@@ -40,6 +40,7 @@ class UsageStatsDatabase {
private static final String TAG = "UsageStatsDatabase";
private static final boolean DEBUG = UsageStatsService.DEBUG;
private static final String BAK_SUFFIX = ".bak";
+ private static final String CHECKED_IN_SUFFIX = UsageStatsXml.CHECKED_IN_SUFFIX;
private final Object mLock = new Object();
private final File[] mIntervalDirs;
@@ -114,14 +115,17 @@ class UsageStatsDatabase {
final TimeSparseArray<AtomicFile> files =
mSortedStatFiles[UsageStatsManager.INTERVAL_DAILY];
final int fileCount = files.size();
- int start = 0;
- while (start < fileCount - 1) {
- if (!files.valueAt(start).getBaseFile().getName().endsWith("-c")) {
- break;
+
+ // We may have holes in the checkin (if there was an error)
+ // so find the last checked-in file and go from there.
+ int lastCheckin = -1;
+ for (int i = 0; i < fileCount - 1; i++) {
+ if (files.valueAt(i).getBaseFile().getPath().endsWith(CHECKED_IN_SUFFIX)) {
+ lastCheckin = i;
}
- start++;
}
+ final int start = lastCheckin + 1;
if (start == fileCount - 1) {
return true;
}
@@ -143,8 +147,8 @@ class UsageStatsDatabase {
// are marked as checked-in.
for (int i = start; i < fileCount - 1; i++) {
final AtomicFile file = files.valueAt(i);
- final File checkedInFile = new File(file.getBaseFile().getParent(),
- file.getBaseFile().getName() + "-c");
+ final File checkedInFile = new File(
+ file.getBaseFile().getPath() + CHECKED_IN_SUFFIX);
if (!file.getBaseFile().renameTo(checkedInFile)) {
// We must return success, as we've already marked some files as checked-in.
// It's better to repeat ourselves than to lose data.
@@ -152,6 +156,10 @@ class UsageStatsDatabase {
+ " as checked-in");
return true;
}
+
+ // AtomicFile needs to set a new backup path with the same -c extension, so
+ // we replace the old AtomicFile with the updated one.
+ files.setValueAt(i, new AtomicFile(checkedInFile));
}
}
return true;
@@ -240,8 +248,13 @@ class UsageStatsDatabase {
} catch (IOException e) {
// Ignore, this is just to make sure there are no backups.
}
- final File newFile = new File(file.getBaseFile().getParentFile(),
- Long.toString(newTime));
+
+ String newName = Long.toString(newTime);
+ if (file.getBaseFile().getName().endsWith(CHECKED_IN_SUFFIX)) {
+ newName = newName + CHECKED_IN_SUFFIX;
+ }
+
+ final File newFile = new File(file.getBaseFile().getParentFile(), newName);
Slog.i(TAG, "Moving file " + file.getBaseFile().getAbsolutePath() + " to "
+ newFile.getAbsolutePath());
file.getBaseFile().renameTo(newFile);
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXml.java b/services/usage/java/com/android/server/usage/UsageStatsXml.java
index 26148ce..186813e 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXml.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXml.java
@@ -31,17 +31,21 @@ public class UsageStatsXml {
private static final int CURRENT_VERSION = 1;
private static final String USAGESTATS_TAG = "usagestats";
private static final String VERSION_ATTR = "version";
- private static final String CHECKED_IN_SUFFIX = "-c";
+ static final String CHECKED_IN_SUFFIX = "-c";
public static long parseBeginTime(AtomicFile file) {
return parseBeginTime(file.getBaseFile());
}
public static long parseBeginTime(File file) {
- final String name = file.getName();
- if (name.endsWith(CHECKED_IN_SUFFIX)) {
- return Long.parseLong(
- name.substring(0, name.length() - CHECKED_IN_SUFFIX.length()));
+ String name = file.getName();
+
+ // Eat as many occurrences of -c as possible. This is due to a bug where -c
+ // would be appended more than once to a checked-in file, causing a crash
+ // on boot when indexing files since Long.parseLong() will puke on anything but
+ // a number.
+ while (name.endsWith(CHECKED_IN_SUFFIX)) {
+ name = name.substring(0, name.length() - CHECKED_IN_SUFFIX.length());
}
return Long.parseLong(name);
}
diff --git a/telecomm/java/android/telecom/AudioState.java b/telecomm/java/android/telecom/AudioState.java
index 43da38f..f78ce29 100644
--- a/telecomm/java/android/telecom/AudioState.java
+++ b/telecomm/java/android/telecom/AudioState.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +25,9 @@ import java.util.Locale;
/**
* Encapsulates the telecom audio state, including the current audio routing, supported audio
* routing and mute.
+ * @hide
*/
+@SystemApi
public final class AudioState implements Parcelable {
/** Direct the audio stream through the device's earpiece. */
public static final int ROUTE_EARPIECE = 0x00000001;
diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java
index 6480a8a..215c682 100644
--- a/telecomm/java/android/telecom/Conference.java
+++ b/telecomm/java/android/telecom/Conference.java
@@ -16,6 +16,8 @@
package android.telecom;
+import android.annotation.SystemApi;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -25,7 +27,9 @@ import java.util.concurrent.CopyOnWriteArraySet;
/**
* Represents a conference call which can contain any number of {@link Connection} objects.
+ * @hide
*/
+@SystemApi
public abstract class Conference {
/** @hide */
@@ -179,6 +183,13 @@ public abstract class Conference {
public void onAudioStateChanged(AudioState state) {}
/**
+ * Notifies this conference that a connection has been added to it.
+ *
+ * @param connection The newly added connection.
+ */
+ public void onConnectionAdded(Connection connection) {}
+
+ /**
* Sets state to be on hold.
*/
public final void setOnHold() {
@@ -238,6 +249,7 @@ public abstract class Conference {
if (connection != null && !mChildConnections.contains(connection)) {
if (connection.setConference(this)) {
mChildConnections.add(connection);
+ onConnectionAdded(connection);
for (Listener l : mListeners) {
l.onConnectionAdded(this, connection);
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 34d0660..63b44a6 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -19,6 +19,7 @@ package android.telecom;
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
@@ -43,7 +44,9 @@ import java.util.concurrent.ConcurrentHashMap;
* Implementations are then responsible for updating the state of the {@code Connection}, and
* must call {@link #destroy()} to signal to the framework that the {@code Connection} is no
* longer used and associated resources may be recovered.
+ * @hide
*/
+@SystemApi
public abstract class Connection {
public static final int STATE_INITIALIZING = 0;
@@ -83,8 +86,8 @@ public abstract class Connection {
Connection c, List<Connection> conferenceableConnections) {}
public void onConferenceChanged(Connection c, Conference conference) {}
/** @hide */
- public void onConferenceParticipantChanged(Connection c, ConferenceParticipant participant)
- {}
+ public void onConferenceParticipantsChanged(Connection c,
+ List<ConferenceParticipant> participants) {}
}
/** @hide */
@@ -921,7 +924,6 @@ public abstract class Connection {
mConference = conference;
if (mConnectionService != null && mConnectionService.containsConference(conference)) {
fireConferenceChanged();
- onConferenceChanged();
}
return true;
}
@@ -937,7 +939,6 @@ public abstract class Connection {
Log.d(this, "Conference reset");
mConference = null;
fireConferenceChanged();
- onConferenceChanged();
}
}
@@ -1030,11 +1031,6 @@ public abstract class Connection {
*/
public void onPostDialContinue(boolean proceed) {}
- /**
- * Notifies this Connection that the conference which is set on it has changed.
- */
- public void onConferenceChanged() {}
-
static String toLogSafePhoneNumber(String number) {
// For unknown number, log empty string.
if (number == null) {
@@ -1131,14 +1127,15 @@ public abstract class Connection {
}
/**
- * Notifies listeners of a change to a conference participant.
+ * Notifies listeners of a change to conference participant(s).
*
- * @param conferenceParticipant The participant.
+ * @param conferenceParticipants The participants.
* @hide
*/
- protected final void updateConferenceParticipant(ConferenceParticipant conferenceParticipant) {
+ protected final void updateConferenceParticipants(
+ List<ConferenceParticipant> conferenceParticipants) {
for (Listener l : mListeners) {
- l.onConferenceParticipantChanged(this, conferenceParticipant);
+ l.onConferenceParticipantsChanged(this, conferenceParticipants);
}
}
}
diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java
index 71b481b..f691c17 100644
--- a/telecomm/java/android/telecom/ConnectionRequest.java
+++ b/telecomm/java/android/telecom/ConnectionRequest.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
@@ -24,7 +25,9 @@ import android.os.Parcelable;
/**
* Simple data container encapsulating a request to some entity to
* create a new {@link Connection}.
+ * @hide
*/
+@SystemApi
public final class ConnectionRequest implements Parcelable {
// TODO: Token to limit recursive invocations
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 4648d78..48e6ff3 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -17,6 +17,7 @@
package android.telecom;
import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
@@ -71,7 +72,9 @@ import java.util.concurrent.ConcurrentHashMap;
* receives call-commands such as answer, reject, hold and disconnect.
* <p>
* When there are no more live calls, telecom will unbind from the {@code ConnectionService}.
+ * @hide
*/
+@SystemApi
public abstract class ConnectionService extends Service {
/**
* The {@link Intent} that must be declared as handled by the service.
@@ -1039,7 +1042,8 @@ public abstract class ConnectionService extends Service {
connection.setConnectionService(this);
}
- private void removeConnection(Connection connection) {
+ /** {@hide} */
+ protected void removeConnection(Connection connection) {
String id = mIdByConnection.get(connection);
connection.unsetConnectionService(this);
connection.removeConnectionListener(mConnectionListener);
diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java
index 73bcd0c..130d676 100644
--- a/telecomm/java/android/telecom/DisconnectCause.java
+++ b/telecomm/java/android/telecom/DisconnectCause.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.media.ToneGenerator;
@@ -29,7 +30,9 @@ import java.util.Objects;
* user. It is the responsibility of the {@link ConnectionService} to provide localized versions of
* the label and description. It also may contain a reason for the disconnect, which is intended for
* logging and not for display to the user.
+ * @hide
*/
+@SystemApi
public final class DisconnectCause implements Parcelable {
/** Disconnected because of an unknown or unspecified reason. */
diff --git a/telecomm/java/android/telecom/GatewayInfo.java b/telecomm/java/android/telecom/GatewayInfo.java
index 7105602..5b8e4ab 100644
--- a/telecomm/java/android/telecom/GatewayInfo.java
+++ b/telecomm/java/android/telecom/GatewayInfo.java
@@ -34,7 +34,9 @@ import android.text.TextUtils;
* <li> Call the appropriate gateway address.
* <li> Display information about how the call is being routed to the user.
* </ol>
+ * @hide
*/
+@SystemApi
public class GatewayInfo implements Parcelable {
private final String mGatewayProviderPackageName;
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 11da0f2..a85e84d 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -54,6 +54,7 @@ public abstract class InCallService extends Service {
private static final int MSG_SET_POST_DIAL_WAIT = 4;
private static final int MSG_ON_AUDIO_STATE_CHANGED = 5;
private static final int MSG_BRING_TO_FOREGROUND = 6;
+ private static final int MSG_ON_CAN_ADD_CALL_CHANGED = 7;
/** Default Handler used to consolidate binder method calls onto a single thread. */
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -91,6 +92,9 @@ public abstract class InCallService extends Service {
case MSG_BRING_TO_FOREGROUND:
mPhone.internalBringToForeground(msg.arg1 == 1);
break;
+ case MSG_ON_CAN_ADD_CALL_CHANGED:
+ mPhone.internalSetCanAddCall(msg.arg1 == 1);
+ break;
default:
break;
}
@@ -136,6 +140,12 @@ public abstract class InCallService extends Service {
public void bringToForeground(boolean showDialpad) {
mHandler.obtainMessage(MSG_BRING_TO_FOREGROUND, showDialpad ? 1 : 0, 0).sendToTarget();
}
+
+ @Override
+ public void onCanAddCallChanged(boolean canAddCall) {
+ mHandler.obtainMessage(MSG_ON_CAN_ADD_CALL_CHANGED, canAddCall ? 1 : 0, 0)
+ .sendToTarget();
+ }
}
private Phone mPhone;
diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java
index 5131790..6344181 100644
--- a/telecomm/java/android/telecom/Phone.java
+++ b/telecomm/java/android/telecom/Phone.java
@@ -74,6 +74,16 @@ public final class Phone {
* @param call A newly removed {@code Call}.
*/
public void onCallRemoved(Phone phone, Call call) { }
+
+ /**
+ * Called when the {@code Phone} ability to add more calls changes. If the phone cannot
+ * support more calls then {@code canAddCall} is set to {@code false}. If it can, then it
+ * is set to {@code true}.
+ *
+ * @param phone The {@code Phone} calling this method.
+ * @param canAddCall Indicates whether an additional call can be added.
+ */
+ public void onCanAddCallChanged(Phone phone, boolean canAddCall) { }
}
// A Map allows us to track each Call by its Telecom-specified call ID
@@ -92,6 +102,8 @@ public final class Phone {
private final List<Listener> mListeners = new CopyOnWriteArrayList<>();
+ private boolean mCanAddCall = true;
+
/** {@hide} */
Phone(InCallAdapter adapter) {
mInCallAdapter = adapter;
@@ -149,6 +161,14 @@ public final class Phone {
fireBringToForeground(showDialpad);
}
+ /** {@hide} */
+ final void internalSetCanAddCall(boolean canAddCall) {
+ if (mCanAddCall != canAddCall) {
+ mCanAddCall = canAddCall;
+ fireCanAddCallChanged(canAddCall);
+ }
+ }
+
/**
* Called to destroy the phone and cleanup any lingering calls.
* @hide
@@ -191,6 +211,15 @@ public final class Phone {
}
/**
+ * Returns if the {@code Phone} can support additional calls.
+ *
+ * @return Whether the phone supports adding more calls.
+ */
+ public final boolean canAddCall() {
+ return mCanAddCall;
+ }
+
+ /**
* Sets the microphone mute state. When this request is honored, there will be change to
* the {@link #getAudioState()}.
*
@@ -266,6 +295,12 @@ public final class Phone {
}
}
+ private void fireCanAddCallChanged(boolean canAddCall) {
+ for (Listener listener : mListeners) {
+ listener.onCanAddCallChanged(this, canAddCall);
+ }
+ }
+
private void checkCallTree(ParcelableCall parcelableCall) {
if (parcelableCall.getParentCallId() != null &&
!mCallByTelecomCallId.containsKey(parcelableCall.getParentCallId())) {
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 3fc1d3d..a49c204 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -45,7 +46,9 @@ import java.util.MissingResourceException;
* alternative options when placing a phone call. When building a {@link PhoneAccount}, the app
* should supply a valid {@link PhoneAccountHandle} that references the {@link ConnectionService}
* implementation Telecom will use to interact with the app.
+ * @hide
*/
+@SystemApi
public class PhoneAccount implements Parcelable {
/**
@@ -121,6 +124,11 @@ public class PhoneAccount implements Parcelable {
*/
public static final int NO_COLOR = -1;
+ /**
+ * Indicating no resource ID is set.
+ */
+ public static final int NO_RESOURCE_ID = -1;
+
private final PhoneAccountHandle mAccountHandle;
private final Uri mAddress;
private final Uri mSubscriptionAddress;
@@ -128,7 +136,8 @@ public class PhoneAccount implements Parcelable {
private final int mIconResId;
private final String mIconPackageName;
private final Bitmap mIconBitmap;
- private final int mColor;
+ private final int mIconTint;
+ private final int mHighlightColor;
private final CharSequence mLabel;
private final CharSequence mShortDescription;
private final List<String> mSupportedUriSchemes;
@@ -144,7 +153,8 @@ public class PhoneAccount implements Parcelable {
private int mIconResId;
private String mIconPackageName;
private Bitmap mIconBitmap;
- private int mColor = NO_COLOR;
+ private int mIconTint = NO_COLOR;
+ private int mHighlightColor = NO_COLOR;
private CharSequence mLabel;
private CharSequence mShortDescription;
private List<String> mSupportedUriSchemes = new ArrayList<String>();
@@ -171,7 +181,8 @@ public class PhoneAccount implements Parcelable {
mIconResId = phoneAccount.getIconResId();
mIconPackageName = phoneAccount.getIconPackageName();
mIconBitmap = phoneAccount.getIconBitmap();
- mColor = phoneAccount.getColor();
+ mIconTint = phoneAccount.getIconTint();
+ mHighlightColor = phoneAccount.getHighlightColor();
mLabel = phoneAccount.getLabel();
mShortDescription = phoneAccount.getShortDescription();
mSupportedUriSchemes.addAll(phoneAccount.getSupportedUriSchemes());
@@ -211,46 +222,76 @@ public class PhoneAccount implements Parcelable {
}
/**
- * Sets the icon resource ID. See {@link PhoneAccount#getIconResId}.
+ * Sets the icon. See {@link PhoneAccount#createIconDrawable}.
*
- * @param value The resource ID of the icon.
+ * @param packageContext The package from which to load an icon.
+ * @param iconResId The resource in {@code iconPackageName} representing the icon.
* @return The builder.
*/
- public Builder setIconResId(int value) {
- this.mIconResId = value;
- return this;
+ public Builder setIcon(Context packageContext, int iconResId) {
+ return setIcon(packageContext.getPackageName(), iconResId);
+ }
+
+ /**
+ * Sets the icon. See {@link PhoneAccount#createIconDrawable}.
+ *
+ * @param iconPackageName The package from which to load an icon.
+ * @param iconResId The resource in {@code iconPackageName} representing the icon.
+ * @return The builder.
+ */
+ public Builder setIcon(String iconPackageName, int iconResId) {
+ return setIcon(iconPackageName, iconResId, NO_COLOR);
}
/**
- * Sets the icon package name. See {@link PhoneAccount#getIconPackageName}.
+ * Sets the icon. See {@link PhoneAccount#createIconDrawable}.
*
- * @param value The name of the package from which to load the icon.
+ * @param packageContext The package from which to load an icon.
+ * @param iconResId The resource in {@code iconPackageName} representing the icon.
+ * @param iconTint A color with which to tint this icon.
* @return The builder.
*/
- public Builder setIconPackageName(String value) {
- this.mIconPackageName = value;
+ public Builder setIcon(Context packageContext, int iconResId, int iconTint) {
+ return setIcon(packageContext.getPackageName(), iconResId, iconTint);
+ }
+
+ /**
+ * Sets the icon. See {@link PhoneAccount#createIconDrawable}.
+ *
+ * @param iconPackageName The package from which to load an icon.
+ * @param iconResId The resource in {@code iconPackageName} representing the icon.
+ * @param iconTint A color with which to tint this icon.
+ * @return The builder.
+ */
+ public Builder setIcon(String iconPackageName, int iconResId, int iconTint) {
+ this.mIconPackageName = iconPackageName;
+ this.mIconResId = iconResId;
+ this.mIconTint = iconTint;
return this;
}
/**
- * Sets the icon bitmap. See {@link PhoneAccount#getIconBitmap}.
+ * Sets the icon. See {@link PhoneAccount#createIconDrawable}.
*
- * @param value The icon bitmap.
+ * @param iconBitmap The icon bitmap.
* @return The builder.
*/
- public Builder setIconBitmap(Bitmap value) {
- this.mIconBitmap = value;
+ public Builder setIcon(Bitmap iconBitmap) {
+ this.mIconBitmap = iconBitmap;
+ this.mIconPackageName = null;
+ this.mIconResId = NO_RESOURCE_ID;
+ this.mIconTint = NO_COLOR;
return this;
}
/**
- * Sets the color. See {@link PhoneAccount#getColor}.
+ * Sets the highlight color. See {@link PhoneAccount#getHighlightColor}.
*
- * @param value The resource ID of the icon.
+ * @param value The highlight color.
* @return The builder.
*/
- public Builder setColor(int value) {
- this.mColor = value;
+ public Builder setHighlightColor(int value) {
+ this.mHighlightColor = value;
return this;
}
@@ -315,7 +356,8 @@ public class PhoneAccount implements Parcelable {
mIconResId,
mIconPackageName,
mIconBitmap,
- mColor,
+ mIconTint,
+ mHighlightColor,
mLabel,
mShortDescription,
mSupportedUriSchemes);
@@ -330,7 +372,8 @@ public class PhoneAccount implements Parcelable {
int iconResId,
String iconPackageName,
Bitmap iconBitmap,
- int color,
+ int iconTint,
+ int highlightColor,
CharSequence label,
CharSequence shortDescription,
List<String> supportedUriSchemes) {
@@ -341,7 +384,8 @@ public class PhoneAccount implements Parcelable {
mIconResId = iconResId;
mIconPackageName = iconPackageName;
mIconBitmap = iconBitmap;
- mColor = color;
+ mIconTint = iconTint;
+ mHighlightColor = highlightColor;
mLabel = label;
mShortDescription = shortDescription;
mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes);
@@ -471,7 +515,7 @@ public class PhoneAccount implements Parcelable {
* this method of indicating the icon rather than using {@link #getIconBitmap()}, since it
* leads to less resource usage.
* <p>
- * Clients wishing to display a {@code PhoneAccount} should use {@link #getIcon(Context)}.
+ * Clients wishing to display a {@code PhoneAccount} should use {@link #createIconDrawable(Context)}.
*
* @return A resource ID.
*/
@@ -485,7 +529,7 @@ public class PhoneAccount implements Parcelable {
* If this property is {@code null}, the resource {@link #getIconResId()} will be loaded from
* the package in the {@link ComponentName} of the {@link #getAccountHandle()}.
* <p>
- * Clients wishing to display a {@code PhoneAccount} should use {@link #getIcon(Context)}.
+ * Clients wishing to display a {@code PhoneAccount} should use {@link #createIconDrawable(Context)}.
*
* @return A package name.
*/
@@ -494,12 +538,12 @@ public class PhoneAccount implements Parcelable {
}
/**
- * A highlight color to use in displaying information about this {@code PhoneAccount}.
+ * A tint to apply to the icon of this {@code PhoneAccount}.
*
* @return A hexadecimal color value.
*/
- public int getColor() {
- return mColor;
+ public int getIconTint() {
+ return mIconTint;
}
/**
@@ -508,7 +552,8 @@ public class PhoneAccount implements Parcelable {
* If this property is specified, it is to be considered the preferred icon. Otherwise, the
* resource specified by {@link #getIconResId()} should be used.
* <p>
- * Clients wishing to display a {@code PhoneAccount} should use {@link #getIcon(Context)}.
+ * Clients wishing to display a {@code PhoneAccount} should use
+ * {@link #createIconDrawable(Context)}.
*
* @return A bitmap.
*/
@@ -517,6 +562,15 @@ public class PhoneAccount implements Parcelable {
}
/**
+ * A highlight color to use in displaying information about this {@code PhoneAccount}.
+ *
+ * @return A hexadecimal color value.
+ */
+ public int getHighlightColor() {
+ return mHighlightColor;
+ }
+
+ /**
* Builds and returns an icon {@code Drawable} to represent this {@code PhoneAccount} in a user
* interface. Uses the properties {@link #getIconResId()}, {@link #getIconPackageName()}, and
* {@link #getIconBitmap()} as necessary.
@@ -525,25 +579,26 @@ public class PhoneAccount implements Parcelable {
*
* @return An icon for this {@code PhoneAccount}.
*/
- public Drawable getIcon(Context context) {
+ public Drawable createIconDrawable(Context context) {
if (mIconBitmap != null) {
return new BitmapDrawable(context.getResources(), mIconBitmap);
}
if (mIconResId != 0) {
- String packageName = mIconPackageName == null
- ? mAccountHandle.getComponentName().getPackageName()
- : mIconPackageName;
-
try {
- Context packageContext = context.createPackageContext(packageName, 0);
+ Context packageContext = context.createPackageContext(mIconPackageName, 0);
try {
- return packageContext.getDrawable(mIconResId);
+ Drawable iconDrawable = packageContext.getDrawable(mIconResId);
+ if (mIconTint != NO_COLOR) {
+ iconDrawable.setTint(mIconTint);
+ }
+ return iconDrawable;
} catch (NotFoundException | MissingResourceException e) {
- Log.e(this, e, "Cannot find icon %d in package %s", mIconResId, packageName);
+ Log.e(this, e, "Cannot find icon %d in package %s",
+ mIconResId, mIconPackageName);
}
} catch (PackageManager.NameNotFoundException e) {
- Log.w(this, "Cannot find package %s", packageName);
+ Log.w(this, "Cannot find package %s", mIconPackageName);
}
}
@@ -561,17 +616,37 @@ public class PhoneAccount implements Parcelable {
@Override
public void writeToParcel(Parcel out, int flags) {
- out.writeParcelable(mAccountHandle, 0);
- out.writeParcelable(mAddress, 0);
- out.writeParcelable(mSubscriptionAddress, 0);
+ if (mAccountHandle == null) {
+ out.writeInt(0);
+ } else {
+ out.writeInt(1);
+ mAccountHandle.writeToParcel(out, flags);
+ }
+ if (mAddress == null) {
+ out.writeInt(0);
+ } else {
+ out.writeInt(1);
+ mAddress.writeToParcel(out, flags);
+ }
+ if (mSubscriptionAddress == null) {
+ out.writeInt(0);
+ } else {
+ out.writeInt(1);
+ mSubscriptionAddress.writeToParcel(out, flags);
+ }
out.writeInt(mCapabilities);
out.writeInt(mIconResId);
out.writeString(mIconPackageName);
- out.writeParcelable(mIconBitmap, 0);
- out.writeInt(mColor);
+ if (mIconBitmap == null) {
+ out.writeInt(0);
+ } else {
+ mIconBitmap.writeToParcel(out, flags);
+ }
+ out.writeInt(mIconTint);
+ out.writeInt(mHighlightColor);
out.writeCharSequence(mLabel);
out.writeCharSequence(mShortDescription);
- out.writeList(mSupportedUriSchemes);
+ out.writeStringList(mSupportedUriSchemes);
}
public static final Creator<PhoneAccount> CREATOR
@@ -588,22 +663,34 @@ public class PhoneAccount implements Parcelable {
};
private PhoneAccount(Parcel in) {
- ClassLoader classLoader = PhoneAccount.class.getClassLoader();
-
- mAccountHandle = in.readParcelable(getClass().getClassLoader());
- mAddress = in.readParcelable(getClass().getClassLoader());
- mSubscriptionAddress = in.readParcelable(getClass().getClassLoader());
+ if (in.readInt() > 0) {
+ mAccountHandle = PhoneAccountHandle.CREATOR.createFromParcel(in);
+ } else {
+ mAccountHandle = null;
+ }
+ if (in.readInt() > 0) {
+ mAddress = Uri.CREATOR.createFromParcel(in);
+ } else {
+ mAddress = null;
+ }
+ if (in.readInt() > 0) {
+ mSubscriptionAddress = Uri.CREATOR.createFromParcel(in);
+ } else {
+ mSubscriptionAddress = null;
+ }
mCapabilities = in.readInt();
mIconResId = in.readInt();
mIconPackageName = in.readString();
- mIconBitmap = in.readParcelable(getClass().getClassLoader());
- mColor = in.readInt();
+ if (in.readInt() > 0) {
+ mIconBitmap = Bitmap.CREATOR.createFromParcel(in);
+ } else {
+ mIconBitmap = null;
+ }
+ mIconTint = in.readInt();
+ mHighlightColor = in.readInt();
mLabel = in.readCharSequence();
mShortDescription = in.readCharSequence();
-
- List<String> supportedUriSchemes = new ArrayList<>();
- in.readList(supportedUriSchemes, classLoader);
- mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes);
+ mSupportedUriSchemes = Collections.unmodifiableList(in.createStringArrayList());
}
@Override
diff --git a/telecomm/java/android/telecom/PhoneAccountHandle.java b/telecomm/java/android/telecom/PhoneAccountHandle.java
index bc4cc8c..7bcf147 100644
--- a/telecomm/java/android/telecom/PhoneAccountHandle.java
+++ b/telecomm/java/android/telecom/PhoneAccountHandle.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.os.Parcel;
import android.os.Parcelable;
@@ -33,7 +34,9 @@ import java.util.Objects;
*
* See {@link PhoneAccount},
* {@link TelecomManager#registerPhoneAccount TelecomManager.registerPhoneAccount}.
+ * @hide
*/
+@SystemApi
public class PhoneAccountHandle implements Parcelable {
private ComponentName mComponentName;
private String mId;
diff --git a/telecomm/java/android/telecom/PhoneCapabilities.java b/telecomm/java/android/telecom/PhoneCapabilities.java
index 3d3c6bd..feb7a95 100644
--- a/telecomm/java/android/telecom/PhoneCapabilities.java
+++ b/telecomm/java/android/telecom/PhoneCapabilities.java
@@ -16,10 +16,14 @@
package android.telecom;
+import android.annotation.SystemApi;
+
/**
* Defines capabilities for {@link Connection}s and {@link Conference}s such as hold, swap, and
* merge.
+ * @hide
*/
+@SystemApi
public final class PhoneCapabilities {
/** Call can currently be put on hold or unheld. */
public static final int HOLD = 0x00000001;
@@ -46,8 +50,10 @@ public final class PhoneCapabilities {
*/
public static final int SWAP_CONFERENCE = 0x00000008;
- /** Call currently supports adding another call to this one. */
- public static final int ADD_CALL = 0x00000010;
+ /**
+ * @hide
+ */
+ public static final int UNUSED = 0x00000010;
/** Call supports responding via text option. */
public static final int RESPOND_VIA_TEXT = 0x00000020;
@@ -96,7 +102,7 @@ public final class PhoneCapabilities {
public static final int DISCONNECT_FROM_CONFERENCE = 0x00002000;
public static final int ALL = HOLD | SUPPORT_HOLD | MERGE_CONFERENCE | SWAP_CONFERENCE
- | ADD_CALL | RESPOND_VIA_TEXT | MUTE | MANAGE_CONFERENCE | SEPARATE_FROM_CONFERENCE
+ | RESPOND_VIA_TEXT | MUTE | MANAGE_CONFERENCE | SEPARATE_FROM_CONFERENCE
| DISCONNECT_FROM_CONFERENCE;
/**
@@ -136,9 +142,6 @@ public final class PhoneCapabilities {
if (can(capabilities, SWAP_CONFERENCE)) {
builder.append(" SWAP_CONFERENCE");
}
- if (can(capabilities, ADD_CALL)) {
- builder.append(" ADD_CALL");
- }
if (can(capabilities, RESPOND_VIA_TEXT)) {
builder.append(" RESPOND_VIA_TEXT");
}
diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java
index eba7580..b548274 100644
--- a/telecomm/java/android/telecom/RemoteConference.java
+++ b/telecomm/java/android/telecom/RemoteConference.java
@@ -18,6 +18,7 @@ package android.telecom;
import com.android.internal.telecom.IConnectionService;
+import android.annotation.SystemApi;
import android.os.RemoteException;
import java.util.ArrayList;
@@ -29,7 +30,9 @@ import java.util.concurrent.CopyOnWriteArraySet;
/**
* Represents a conference call which can contain any number of {@link Connection} objects.
+ * @hide
*/
+@SystemApi
public final class RemoteConference {
public abstract static class Callback {
diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java
index 816e2bf..d70ddf6 100644
--- a/telecomm/java/android/telecom/RemoteConnection.java
+++ b/telecomm/java/android/telecom/RemoteConnection.java
@@ -20,6 +20,7 @@ import com.android.internal.telecom.IConnectionService;
import com.android.internal.telecom.IVideoCallback;
import com.android.internal.telecom.IVideoProvider;
+import android.annotation.SystemApi;
import android.net.Uri;
import android.os.IBinder;
import android.os.RemoteException;
@@ -37,7 +38,9 @@ import java.util.concurrent.ConcurrentHashMap;
*
* @see ConnectionService#createRemoteOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
* @see ConnectionService#createRemoteIncomingConnection(PhoneAccountHandle, ConnectionRequest)
+ * @hide
*/
+@SystemApi
public final class RemoteConnection {
public static abstract class Callback {
diff --git a/telecomm/java/android/telecom/StatusHints.java b/telecomm/java/android/telecom/StatusHints.java
index a32eae7..dd3a639 100644
--- a/telecomm/java/android/telecom/StatusHints.java
+++ b/telecomm/java/android/telecom/StatusHints.java
@@ -16,6 +16,7 @@
package android.telecom;
+import android.annotation.SystemApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -29,7 +30,9 @@ import java.util.Objects;
/**
* Contains status label and icon displayed in the in-call UI.
+ * @hide
*/
+@SystemApi
public final class StatusHints implements Parcelable {
private final ComponentName mPackageName;
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index d98a255..05108c7 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -33,8 +33,7 @@ import java.util.List;
/**
* Provides access to information about active calls and registration/call-management functionality.
- * Apps can use methods in this class to determine the current call state. Apps can also register new
- * {@link PhoneAccount}s and get a listing of existing {@link PhoneAccount}s.
+ * Apps can use methods in this class to determine the current call state.
* <p>
* Apps do not instantiate this class directly; instead, they retrieve a reference to an instance
* through {@link Context#getSystemService Context.getSystemService(Context.TELECOM_SERVICE)}.
@@ -71,7 +70,9 @@ public class TelecomManager {
/**
* The {@link android.content.Intent} action used to configure a
* {@link android.telecom.ConnectionService}.
+ * @hide
*/
+ @SystemApi
public static final String ACTION_CONNECTION_SERVICE_CONFIGURE =
"android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
@@ -84,7 +85,9 @@ public class TelecomManager {
/**
* The {@link android.content.Intent} action used to show the settings page used to configure
* {@link PhoneAccount} preferences.
+ * @hide
*/
+ @SystemApi
public static final String ACTION_CHANGE_PHONE_ACCOUNTS =
"android.telecom.action.CHANGE_PHONE_ACCOUNTS";
@@ -114,7 +117,9 @@ public class TelecomManager {
* {@link PhoneAccountHandle} to use when making the call.
* <p class="note">
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
+ * @hide
*/
+ @SystemApi
public static final String EXTRA_PHONE_ACCOUNT_HANDLE =
"android.telecom.extra.PHONE_ACCOUNT_HANDLE";
@@ -125,6 +130,7 @@ public class TelecomManager {
*
* @hide
*/
+ @SystemApi
public static final String EXTRA_INCOMING_CALL_EXTRAS =
"android.telecom.extra.INCOMING_CALL_EXTRAS";
@@ -136,6 +142,7 @@ public class TelecomManager {
*
* @hide
*/
+ @SystemApi
public static final String EXTRA_OUTGOING_CALL_EXTRAS =
"android.telecom.extra.OUTGOING_CALL_EXTRAS";
@@ -162,7 +169,9 @@ public class TelecomManager {
/**
* Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED}
* containing the component name of the associated connection service.
+ * @hide
*/
+ @SystemApi
public static final String EXTRA_CONNECTION_SERVICE =
"android.telecom.extra.CONNECTION_SERVICE";
@@ -197,7 +206,9 @@ public class TelecomManager {
* {@link ConnectionService}s which interact with {@link RemoteConnection}s should only populate
* this if the {@link android.telephony.TelephonyManager#getLine1Number()} value, as that is the
* user's expected caller ID.
+ * @hide
*/
+ @SystemApi
public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
/**
@@ -338,9 +349,9 @@ public class TelecomManager {
* @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
*/
+ @SystemApi
public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme) {
try {
if (isServiceConnected()) {
@@ -443,7 +454,9 @@ public class TelecomManager {
* {@code PhoneAccount}.
*
* @return The phone account handle of the current connection manager.
+ * @hide
*/
+ @SystemApi
public PhoneAccountHandle getConnectionManager() {
return getSimCallManager();
}
@@ -459,9 +472,9 @@ public class TelecomManager {
*
* @param uriScheme The URI scheme.
* @return A list of {@code PhoneAccountHandle} objects supporting the URI scheme.
- *
* @hide
*/
+ @SystemApi
public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme) {
try {
if (isServiceConnected()) {
@@ -500,7 +513,9 @@ public class TelecomManager {
*
* @return {@code true} if the device has more than one account registered and {@code false}
* otherwise.
+ * @hide
*/
+ @SystemApi
public boolean hasMultipleCallCapableAccounts() {
return getCallCapablePhoneAccounts().size() > 1;
}
@@ -509,7 +524,9 @@ public class TelecomManager {
* Returns a list of all {@link PhoneAccount}s registered for the calling package.
*
* @return A list of {@code PhoneAccountHandle} objects.
+ * @hide
*/
+ @SystemApi
public List<PhoneAccountHandle> getPhoneAccountsForPackage() {
try {
if (isServiceConnected()) {
@@ -527,7 +544,9 @@ public class TelecomManager {
*
* @param account The {@link PhoneAccountHandle}.
* @return The {@link PhoneAccount} object.
+ * @hide
*/
+ @SystemApi
public PhoneAccount getPhoneAccount(PhoneAccountHandle account) {
try {
if (isServiceConnected()) {
@@ -606,7 +625,10 @@ public class TelecomManager {
* {@link PhoneAccountHandle#getComponentName()} does not match the package name of the app.
*
* @param account The complete {@link PhoneAccount}.
+ *
+ * @hide
*/
+ @SystemApi
public void registerPhoneAccount(PhoneAccount account) {
try {
if (isServiceConnected()) {
@@ -621,7 +643,9 @@ public class TelecomManager {
* Remove a {@link PhoneAccount} registration from the system.
*
* @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister.
+ * @hide
*/
+ @SystemApi
public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
@@ -634,7 +658,9 @@ public class TelecomManager {
/**
* Remove all Accounts that belong to the calling package from the system.
+ * @hide
*/
+ @SystemApi
public void clearAccounts() {
try {
if (isServiceConnected()) {
@@ -857,7 +883,9 @@ public class TelecomManager {
* {@link #registerPhoneAccount}.
* @param extras A bundle that will be passed through to
* {@link ConnectionService#onCreateIncomingConnection}.
+ * @hide
*/
+ @SystemApi
public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) {
try {
if (isServiceConnected()) {
@@ -927,7 +955,9 @@ public class TelecomManager {
* @param accountHandle The handle for the account the MMI code should apply to.
* @param dialString The digits to dial.
* @return True if the digits were processed as an MMI code, false otherwise.
+ * @hide
*/
+ @SystemApi
public boolean handleMmi(PhoneAccountHandle accountHandle, String dialString) {
ITelecomService service = getTelecomService();
if (service != null) {
@@ -945,7 +975,9 @@ public class TelecomManager {
* {@code null} to return a URI which will use the default account.
* @return The URI (with the content:// scheme) specific to the specified {@link PhoneAccount}
* for the the content retrieve.
+ * @hide
*/
+ @SystemApi
public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle) {
ITelecomService service = getTelecomService();
if (service != null && accountHandle != null) {
diff --git a/telecomm/java/com/android/internal/telecom/IInCallService.aidl b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
index 35f6f65..d26f6cb 100644
--- a/telecomm/java/com/android/internal/telecom/IInCallService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallService.aidl
@@ -43,4 +43,6 @@ oneway interface IInCallService {
void onAudioStateChanged(in AudioState audioState);
void bringToForeground(boolean showDialpad);
+
+ void onCanAddCallChanged(boolean canAddCall);
}
diff --git a/telephony/java/android/telephony/SubInfoRecord.aidl b/telephony/java/android/telephony/SubscriptionInfo.aidl
index a2de676..1e13732 100755
--- a/telephony/java/android/telephony/SubInfoRecord.aidl
+++ b/telephony/java/android/telephony/SubscriptionInfo.aidl
@@ -16,4 +16,4 @@
package android.telephony;
-parcelable SubInfoRecord;
+parcelable SubscriptionInfo;
diff --git a/telephony/java/android/telephony/SubInfoRecord.java b/telephony/java/android/telephony/SubscriptionInfo.java
index e08f255..26f17c8 100644
--- a/telephony/java/android/telephony/SubInfoRecord.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -16,14 +16,22 @@
package android.telephony;
-import android.graphics.drawable.BitmapDrawable;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
+import android.graphics.Typeface;
import android.os.Parcel;
import android.os.Parcelable;
/**
* A Parcelable class for Subscription Information.
*/
-public class SubInfoRecord implements Parcelable {
+public class SubscriptionInfo implements Parcelable {
/**
* Subscription Identifier, this is a device unique number
@@ -48,15 +56,20 @@ public class SubInfoRecord implements Parcelable {
private CharSequence mDisplayName;
/**
+ * The string displayed to the user that identifies Subscription Provider Name
+ */
+ private CharSequence mCarrierName;
+
+ /**
* The source of the name, NAME_SOURCE_UNDEFINED, NAME_SOURCE_DEFAULT_SOURCE,
* NAME_SOURCE_SIM_SOURCE or NAME_SOURCE_USER_INPUT.
*/
private int mNameSource;
/**
- * The color to be used for when displaying to the user
+ * The color to be used for tinting the icon when displaying to the user
*/
- private int mColor;
+ private int mIconTint;
/**
* A number presented to the user identify this subscription
@@ -69,9 +82,9 @@ public class SubInfoRecord implements Parcelable {
private int mDataRoaming;
/**
- * SIM Icon resource identifiers. FIXME: Check with MTK what it really is
+ * SIM Icon bitmap
*/
- private int[] mSimIconRes;
+ private Bitmap mIconBitmap;
/**
* Mobile Country Code
@@ -85,36 +98,20 @@ public class SubInfoRecord implements Parcelable {
/**
* @hide
- public SubInfoRecord() {
- this.mId = SubscriptionManager.INVALID_SUB_ID;
- this.mIccId = "";
- this.mSimSlotIndex = SubscriptionManager.INVALID_SLOT_ID;
- this.mDisplayName = "";
- this.mNameSource = 0;
- this.mColor = 0;
- this.mNumber = "";
- this.mDataRoaming = 0;
- this.mSimIconRes = new int[2];
- this.mMcc = 0;
- this.mMnc = 0;
- }
*/
-
- /**
- * @hide
- */
- public SubInfoRecord(int id, String iccId, int simSlotIndex, CharSequence displayName,
- int nameSource, int color, String number, int roaming, int[] iconRes, int mcc,
- int mnc) {
+ public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
+ CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
+ Bitmap icon, int mcc, int mnc) {
this.mId = id;
this.mIccId = iccId;
this.mSimSlotIndex = simSlotIndex;
this.mDisplayName = displayName;
+ this.mCarrierName = carrierName;
this.mNameSource = nameSource;
- this.mColor = color;
+ this.mIconTint = iconTint;
this.mNumber = number;
this.mDataRoaming = roaming;
- this.mSimIconRes = iconRes;
+ this.mIconBitmap = icon;
this.mMcc = mcc;
this.mMnc = mnc;
}
@@ -156,6 +153,22 @@ public class SubInfoRecord implements Parcelable {
}
/**
+ * Returns the name displayed to the user that identifies Subscription provider name
+ * @hide
+ */
+ public CharSequence getCarrierName() {
+ return this.mCarrierName;
+ }
+
+ /**
+ * Sets the name displayed to the user that identifies Subscription provider name
+ * @hide
+ */
+ public void setCarrierName(CharSequence name) {
+ this.mCarrierName = name;
+ }
+
+ /**
* Return the source of the name, eg NAME_SOURCE_UNDEFINED, NAME_SOURCE_DEFAULT_SOURCE,
* NAME_SOURCE_SIM_SOURCE or NAME_SOURCE_USER_INPUT.
*/
@@ -164,21 +177,58 @@ public class SubInfoRecord implements Parcelable {
}
/**
- * Return the color to be used for when displaying to the user. This is the value of the color.
- * ex: 0x00ff00
+ * Creates and returns an icon {@code Bitmap} to represent this {@code SubscriptionInfo} in a user
+ * interface.
+ *
+ * @param context A {@code Context} to get the {@code DisplayMetrics}s from.
+ *
+ * @return A bitmap icon for this {@code SubscriptionInfo}.
*/
- public int getColor() {
- // Note: This color is currently an index into a list of drawables, but this is soon to
- // change.
- return this.mColor;
+ public Bitmap createIconBitmap(Context context) {
+ int width = mIconBitmap.getWidth();
+ int height = mIconBitmap.getHeight();
+
+ // Create a new bitmap of the same size because it will be modified.
+ Bitmap workingBitmap = Bitmap.createBitmap(context.getResources().getDisplayMetrics(),
+ width, height, mIconBitmap.getConfig());
+
+ Canvas canvas = new Canvas(workingBitmap);
+ Paint paint = new Paint();
+
+ // Tint the icon with the color.
+ paint.setColorFilter(new PorterDuffColorFilter(mIconTint, PorterDuff.Mode.SRC_ATOP));
+ canvas.drawBitmap(mIconBitmap, 0, 0, paint);
+ paint.setColorFilter(null);
+
+ // Write the sim slot index.
+ paint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL));
+ paint.setColor(Color.WHITE);
+ paint.setTextSize(12);
+ final String index = Integer.toString(mSimSlotIndex);
+ final Rect textBound = new Rect();
+ paint.getTextBounds(index, 0, 1, textBound);
+ final float xOffset = (width / 2.f) - textBound.centerX();
+ final float yOffset = (height / 2.f) - textBound.centerY();
+ canvas.drawText(index, xOffset, yOffset, paint);
+
+ return workingBitmap;
+ }
+
+ /**
+ * A highlight color to use in displaying information about this {@code PhoneAccount}.
+ *
+ * @return A hexadecimal color value.
+ */
+ public int getIconTint() {
+ return mIconTint;
}
/**
* Sets the color displayed to the user that identifies this subscription
* @hide
*/
- public void setColor(int color) {
- this.mColor = color;
+ public void setIconTint(int iconTint) {
+ this.mIconTint = iconTint;
}
/**
@@ -196,13 +246,6 @@ public class SubInfoRecord implements Parcelable {
}
/**
- * Return the icon used to identify this subscription.
- */
- public BitmapDrawable getIcon() {
- return new BitmapDrawable();
- }
-
- /**
* Returns the MCC.
*/
public int getMcc() {
@@ -216,29 +259,29 @@ public class SubInfoRecord implements Parcelable {
return this.mMnc;
}
- public static final Parcelable.Creator<SubInfoRecord> CREATOR = new Parcelable.Creator<SubInfoRecord>() {
+ public static final Parcelable.Creator<SubscriptionInfo> CREATOR = new Parcelable.Creator<SubscriptionInfo>() {
@Override
- public SubInfoRecord createFromParcel(Parcel source) {
+ public SubscriptionInfo createFromParcel(Parcel source) {
int id = source.readInt();
String iccId = source.readString();
int simSlotIndex = source.readInt();
CharSequence displayName = source.readCharSequence();
+ CharSequence carrierName = source.readCharSequence();
int nameSource = source.readInt();
- int color = source.readInt();
+ int iconTint = source.readInt();
String number = source.readString();
int dataRoaming = source.readInt();
- int[] iconRes = new int[2];
- source.readIntArray(iconRes);
int mcc = source.readInt();
int mnc = source.readInt();
+ Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source);
- return new SubInfoRecord(id, iccId, simSlotIndex, displayName, nameSource, color, number,
- dataRoaming, iconRes, mcc, mnc);
+ return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource,
+ iconTint, number, dataRoaming, iconBitmap, mcc, mnc);
}
@Override
- public SubInfoRecord[] newArray(int size) {
- return new SubInfoRecord[size];
+ public SubscriptionInfo[] newArray(int size) {
+ return new SubscriptionInfo[size];
}
};
@@ -248,13 +291,14 @@ public class SubInfoRecord implements Parcelable {
dest.writeString(mIccId);
dest.writeInt(mSimSlotIndex);
dest.writeCharSequence(mDisplayName);
+ dest.writeCharSequence(mCarrierName);
dest.writeInt(mNameSource);
- dest.writeInt(mColor);
- dest.writeString(mNumber.toString());
+ dest.writeInt(mIconTint);
+ dest.writeString(mNumber);
dest.writeInt(mDataRoaming);
- dest.writeIntArray(mSimIconRes);
dest.writeInt(mMcc);
dest.writeInt(mMnc);
+ mIconBitmap.writeToParcel(dest, flags);
}
@Override
@@ -265,8 +309,9 @@ public class SubInfoRecord implements Parcelable {
@Override
public String toString() {
return "{id=" + mId + ", iccId=" + mIccId + " simSlotIndex=" + mSimSlotIndex
- + " displayName=" + mDisplayName + " nameSource=" + mNameSource + " color=" + mColor
- + " number=" + mNumber + " dataRoaming=" + mDataRoaming + " simIconRes=" + mSimIconRes
- + " mcc " + mMcc + " mnc " + mMnc + "}";
+ + " displayName=" + mDisplayName + " carrierName=" + mCarrierName
+ + " nameSource=" + mNameSource + " iconTint=" + mIconTint + " number=" + mNumber
+ + " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc
+ + " mnc " + mMnc + "}";
}
}
diff --git a/telephony/java/android/telephony/SubscriptionListener.java b/telephony/java/android/telephony/SubscriptionListener.java
new file mode 100644
index 0000000..5c65333
--- /dev/null
+++ b/telephony/java/android/telephony/SubscriptionListener.java
@@ -0,0 +1,125 @@
+/*
+ * 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 android.telephony;
+
+import com.android.internal.telephony.ISub;
+import com.android.internal.telephony.ISubscriptionListener;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.telephony.Rlog;
+
+import java.util.List;
+
+/**
+ * A listener class for monitoring changes to Subscription state
+ * changes on the device.
+ * <p>
+ * Override the onXxxx methods in this class and passing to the listen method
+ * bitwise-or of the corresponding LISTEN_Xxxx bit flags below.
+ * <p>
+ * Note that access to some of the information is permission-protected. Your
+ * application won't receive updates for protected information unless it has
+ * the appropriate permissions declared in its manifest file. Where permissions
+ * apply, they are noted in the appropriate LISTEN_ flags.
+ */
+public class SubscriptionListener {
+ private static final String LOG_TAG = "SubscriptionListener";
+ private static final boolean DBG = false; // STOPSHIP if true
+
+ /**
+ * Permission for LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED
+ *
+ * @hide
+ */
+ public static final String PERMISSION_LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED =
+ android.Manifest.permission.READ_PHONE_STATE;
+
+ /**
+ * Listen for changes to the SubscriptionInoList when listening for this event
+ * it is guaranteed that on #onSubscriptionInfoChanged will be invoked. This initial
+ * invocation should be used to call SubscriptionManager.getActiveSubscriptionInfoList()
+ * to get the initial list.
+ *
+ * Permissions: android.Manifest.permission.READ_PHONE_STATE
+ * @see #onSubscriptionInfoChanged
+ */
+ public static final int LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED = 0x00000001;
+
+ private final Handler mHandler;
+
+ /**
+ * Create a SubscriptionLitener for the device.
+ *
+ * This class requires Looper.myLooper() not return null. To supply your
+ * own non-null looper use PhoneStateListener(Looper looper) below.
+ */
+ public SubscriptionListener() {
+ this(Looper.myLooper());
+ }
+
+ /**
+ * Create a PhoneStateListener for the Phone using the specified subscription
+ * and non-null Looper.
+ */
+ public SubscriptionListener(Looper looper) {
+ if (DBG) log("ctor: looper=" + looper);
+
+ ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
+ mHandler = new Handler(looper) {
+ @Override
+ public void handleMessage(Message msg) {
+ if (DBG) {
+ log("what=0x" + Integer.toHexString(msg.what) + " msg=" + msg);
+ }
+ switch (msg.what) {
+ case LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED:
+ SubscriptionListener.this.onSubscriptionInfoChanged();
+ break;
+ }
+ }
+ };
+ }
+
+ /**
+ * Callback invoked when there is any change to any SubscriptionInfo.
+ */
+ public void onSubscriptionInfoChanged() {
+ // default implementation empty
+ }
+
+ /**
+ * The callback methods need to be called on the handler thread where
+ * this object was created. If the binder did that for us it'd be nice.
+ */
+ ISubscriptionListener callback = new ISubscriptionListener.Stub() {
+ @Override
+ public void onSubscriptionInfoChanged() {
+ Message msg = Message.obtain(mHandler, LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED);
+ msg.sendToTarget();
+ }
+ };
+
+ private void log(String s) {
+ Rlog.d(LOG_TAG, s);
+ }
+}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 9cd533d..78ab6870 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -18,6 +18,7 @@ package android.telephony;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.BaseColumns;
@@ -26,6 +27,7 @@ import android.os.ServiceManager;
import android.os.RemoteException;
import com.android.internal.telephony.ISub;
+import com.android.internal.telephony.ITelephonyRegistry;
import com.android.internal.telephony.PhoneConstants;
import java.util.ArrayList;
@@ -43,28 +45,29 @@ public class SubscriptionManager implements BaseColumns {
private static final boolean DBG = true;
private static final boolean VDBG = false;
+ /** An invalid subscription identifier */
+ public static final int INVALID_SUB_ID = -1000;
+
/** An invalid phone identifier */
- public static final int INVALID_PHONE_ID = -1000;
+ /** @hide */
+ public static final int INVALID_PHONE_ID = -1;
+
+ /** An invalid slot identifier */
+ /** @hide */
+ public static final int INVALID_SLOT_ID = -1;
+
+ /** Indicates the caller wants the default sub id. */
+ /** @hide */
+ public static final int DEFAULT_SUB_ID = Integer.MAX_VALUE;
/** Indicates the caller wants the default phone id. */
+ /** @hide */
public static final int DEFAULT_PHONE_ID = Integer.MAX_VALUE;
- /** An invalid slot identifier */
- public static final int INVALID_SLOT_ID = -1000;
-
/** Indicates the caller wants the default slot id. */
/** @hide */
public static final int DEFAULT_SLOT_ID = Integer.MAX_VALUE;
- /** Indicates the user should be asked which subscription to use. */
- public static final int ASK_USER_SUB_ID = -1001;
-
- /** An invalid subscription identifier */
- public static final int INVALID_SUB_ID = -1000;
-
- /** Indicates the caller wants the default sub id. */
- public static final int DEFAULT_SUB_ID = Integer.MAX_VALUE;
-
/** Minimum possible subid that represents a subscription */
/** @hide */
public static final int MIN_SUB_ID_VALUE = 0;
@@ -77,31 +80,6 @@ public class SubscriptionManager implements BaseColumns {
/** @hide */
public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo");
- /** @hide */
- public static final int DEFAULT_INT_VALUE = -100;
-
- /** @hide */
- public static final String DEFAULT_STRING_VALUE = "N/A";
-
- /** @hide */
- public static final int EXTRA_VALUE_NEW_SIM = 1;
-
- /** @hide */
- public static final int EXTRA_VALUE_REMOVE_SIM = 2;
- /** @hide */
- public static final int EXTRA_VALUE_REPOSITION_SIM = 3;
- /** @hide */
- public static final int EXTRA_VALUE_NOCHANGE = 4;
-
- /** @hide */
- public static final String INTENT_KEY_DETECT_STATUS = "simDetectStatus";
- /** @hide */
- public static final String INTENT_KEY_SIM_COUNT = "simCount";
- /** @hide */
- public static final String INTENT_KEY_NEW_SIM_SLOT = "newSIMSlot";
- /** @hide */
- public static final String INTENT_KEY_NEW_SIM_STATUS = "newSIMStatus";
-
/**
* The ICC ID of a SIM.
* <P>Type: TEXT (String)</P>
@@ -116,6 +94,7 @@ public class SubscriptionManager implements BaseColumns {
public static final String SIM_ID = "sim_id";
/** SIM is not inserted */
+ /** @hide */
public static final int SIM_NOT_INSERTED = -1;
/**
@@ -126,6 +105,13 @@ public class SubscriptionManager implements BaseColumns {
public static final String DISPLAY_NAME = "display_name";
/**
+ * TelephonyProvider column name for the service provider name for the SIM.
+ * <P>Type: TEXT (String)</P>
+ */
+ /** @hide */
+ public static final String CARRIER_NAME = "carrier_name";
+
+ /**
* Default name resource
* @hide
*/
@@ -230,22 +216,17 @@ public class SubscriptionManager implements BaseColumns {
/**
* TelephonyProvider column name for the MCC associated with a SIM.
* <P>Type: INTEGER (int)</P>
+ * @hide
*/
public static final String MCC = "mcc";
/**
* TelephonyProvider column name for the MNC associated with a SIM.
* <P>Type: INTEGER (int)</P>
+ * @hide
*/
public static final String MNC = "mnc";
-
- private static final int RES_TYPE_BACKGROUND_DARK = 0;
-
- private static final int RES_TYPE_BACKGROUND_LIGHT = 1;
-
- private static final int[] sSimBackgroundDarkRes = setSimResource(RES_TYPE_BACKGROUND_DARK);
-
/**
* Broadcast Action: The user has changed one of the default subs related to
* data, phone calls, or sms</p>
@@ -261,17 +242,70 @@ public class SubscriptionManager implements BaseColumns {
}
/**
- * Get the SubInfoRecord associated with the subId
- * @param subId The unique SubInfoRecord index in database
- * @return SubInfoRecord, maybe null
+ * Register for changes to events defined by SubscriptionListener.LISTEN_Xxx. Some of
+ * the events will fire as registration completes, this could be before or after
+ * this method returns.
+ *
+ * @param listener an instance of SubscriptionListner with overridden methods the
+ * overridden method should match the bits defined in events.
+ * @param events is one or more of the SubscriptionListener.LISTEN_Xxx bits
+ */
+ public static void register(Context context, SubscriptionListener listener, int events) {
+ String pkgForDebug = context != null ? context.getPackageName() : "<unknown>";
+ if (DBG) {
+ logd("SubscriptionManager listen pkgForDebug=" + pkgForDebug
+ + " events=0x" + Integer.toHexString(events) + " listener=" + listener);
+ }
+ try {
+ // We use the TelephonyRegistry as its runs in the system and thus is always
+ // available where as SubscriptionController could crash and not be available
+ ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
+ "telephony.registry"));
+ if (tr != null) {
+ tr.registerSubscriptionListener(pkgForDebug, listener.callback, events);
+ }
+ } catch (RemoteException ex) {
+ // Should not happen
+ }
+ }
+
+ /**
+ * Unregister the listener.
+ *
+ * @param context
+ * @param listener
+ */
+ public static void unregister(Context context, SubscriptionListener listener) {
+ String pkgForDebug = context != null ? context.getPackageName() : "<unknown>";
+ if (DBG) {
+ logd("SubscriptionManager unregister pkgForDebug=" + pkgForDebug
+ + " listener=" + listener);
+ }
+ try {
+ // We use the TelephonyRegistry as its runs in the system and thus is always
+ // available where as SubscriptionController could crash and not be available
+ ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
+ "telephony.registry"));
+ if (tr != null) {
+ tr.unregisterSubscriptionListener(pkgForDebug, listener.callback);
+ }
+ } catch (RemoteException ex) {
+ // Should not happen
+ }
+ }
+
+ /**
+ * Get the SubscriptionInfo associated with the subId
+ * @param subId The unique SubscriptionInfo index in database
+ * @return SubscriptionInfo, maybe null
*/
- public static SubInfoRecord getSubInfoForSubscriber(int subId) {
+ public static SubscriptionInfo getSubscriptionInfoForSubscriber(int subId) {
if (!isValidSubId(subId)) {
- logd("[getSubInfoForSubscriberx]- invalid subId");
+ logd("[getSubscriptionInfoForSubscriber]- invalid subId");
return null;
}
- SubInfoRecord subInfo = null;
+ SubscriptionInfo subInfo = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -287,19 +321,19 @@ public class SubscriptionManager implements BaseColumns {
}
/**
- * Get the SubInfoRecord according to an IccId
+ * Get the SubscriptionInfo according to an IccId
* @param iccId the IccId of SIM card
- * @return SubInfoRecord List, maybe empty but not null
+ * @return SubscriptionInfo List, maybe empty but not null
* @hide
*/
- public static List<SubInfoRecord> getSubInfoUsingIccId(String iccId) {
- if (VDBG) logd("[getSubInfoUsingIccId]+ iccId=" + iccId);
+ public static List<SubscriptionInfo> getSubscriptionInfoUsingIccId(String iccId) {
+ if (VDBG) logd("[getSubscriptionInfoUsingIccId]+ iccId=" + iccId);
if (iccId == null) {
- logd("[getSubInfoUsingIccId]- null iccid");
+ logd("[getSubscriptionInfoUsingIccId]- null iccid");
return null;
}
- List<SubInfoRecord> result = null;
+ List<SubscriptionInfo> result = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -312,24 +346,24 @@ public class SubscriptionManager implements BaseColumns {
if (result == null) {
- result = new ArrayList<SubInfoRecord>();
+ result = new ArrayList<SubscriptionInfo>();
}
return result;
}
/**
- * Get the SubInfoRecord according to slotId
+ * Get the SubscriptionInfo according to slotId
* @param slotId the slot which the SIM is inserted
- * @return SubInfoRecord list, maybe empty but not null
+ * @return SubscriptionInfo list, maybe empty but not null
*/
- public static List<SubInfoRecord> getSubInfoUsingSlotId(int slotId) {
+ public static List<SubscriptionInfo> getSubscriptionInfoUsingSlotId(int slotId) {
// FIXME: Consider never returning null
if (!isValidSlotId(slotId)) {
- logd("[getSubInfoUsingSlotId]- invalid slotId");
+ logd("[getSubscriptionInfoUsingSlotId]- invalid slotId");
return null;
}
- List<SubInfoRecord> result = null;
+ List<SubscriptionInfo> result = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -342,21 +376,21 @@ public class SubscriptionManager implements BaseColumns {
if (result == null) {
- result = new ArrayList<SubInfoRecord>();
+ result = new ArrayList<SubscriptionInfo>();
}
return result;
}
/**
- * Get all the SubInfoRecord(s) in subInfo database
- * @return List of all SubInfoRecords in database, include those that were inserted before
+ * Get all the SubscriptionInfo(s) in subInfo database
+ * @return List of all SubscriptionInfos in database, include those that were inserted before
* maybe empty but not null.
* @hide
*/
- public static List<SubInfoRecord> getAllSubInfoList() {
- if (VDBG) logd("[getAllSubInfoList]+");
+ public static List<SubscriptionInfo> getAllSubscriptionInfoList() {
+ if (VDBG) logd("[getAllSubscriptionInfoList]+");
- List<SubInfoRecord> result = null;
+ List<SubscriptionInfo> result = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -368,17 +402,17 @@ public class SubscriptionManager implements BaseColumns {
}
if (result == null) {
- result = new ArrayList<SubInfoRecord>();
+ result = new ArrayList<SubscriptionInfo>();
}
return result;
}
/**
- * Get the SubInfoRecord(s) of the currently inserted SIM(s)
- * @return Array list of currently inserted SubInfoRecord(s) maybe empty but not null
+ * Get the SubscriptionInfo(s) of the currently inserted SIM(s)
+ * @return Array list of currently inserted SubscriptionInfo(s) maybe empty but not null
*/
- public static List<SubInfoRecord> getActiveSubInfoList() {
- List<SubInfoRecord> result = null;
+ public static List<SubscriptionInfo> getActiveSubscriptionInfoList() {
+ List<SubscriptionInfo> result = null;
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
@@ -390,7 +424,7 @@ public class SubscriptionManager implements BaseColumns {
}
if (result == null) {
- result = new ArrayList<SubInfoRecord>();
+ result = new ArrayList<SubscriptionInfo>();
}
return result;
}
@@ -400,8 +434,8 @@ public class SubscriptionManager implements BaseColumns {
* @return all SIM count in database, include what was inserted before
* @hide
*/
- public static int getAllSubInfoCount() {
- if (VDBG) logd("[getAllSubInfoCount]+");
+ public static int getAllSubscriptionInfoCount() {
+ if (VDBG) logd("[getAllSubscriptionInfoCount]+");
int result = 0;
@@ -422,7 +456,7 @@ public class SubscriptionManager implements BaseColumns {
* @return active SIM count
* @hide
*/
- public static int getActiveSubInfoCount() {
+ public static int getActiveSubscriptionInfoCount() {
int result = 0;
try {
@@ -438,19 +472,19 @@ public class SubscriptionManager implements BaseColumns {
}
/**
- * Add a new SubInfoRecord to subinfo database if needed
+ * Add a new SubscriptionInfo to subinfo database if needed
* @param iccId the IccId of the SIM card
* @param slotId the slot which the SIM is inserted
* @return the URL of the newly created row or the updated row
* @hide
*/
- public static Uri addSubInfoRecord(String iccId, int slotId) {
- if (VDBG) logd("[addSubInfoRecord]+ iccId:" + iccId + " slotId:" + slotId);
+ public static Uri addSubscriptionInfoRecord(String iccId, int slotId) {
+ if (VDBG) logd("[addSubscriptionInfoRecord]+ iccId:" + iccId + " slotId:" + slotId);
if (iccId == null) {
- logd("[addSubInfoRecord]- null iccId");
+ logd("[addSubscriptionInfoRecord]- null iccId");
}
if (!isValidSlotId(slotId)) {
- logd("[addSubInfoRecord]- invalid slotId");
+ logd("[addSubscriptionInfoRecord]- invalid slotId");
}
try {
@@ -469,17 +503,16 @@ public class SubscriptionManager implements BaseColumns {
}
/**
- * Set SIM color by simInfo index
- * @param color the rgb value of color of the SIM
+ * Set SIM icon tint color by simInfo index
+ * @param tint the rgb value of icon tint color of the SIM
* @param subId the unique SubInfoRecord index in database
* @return the number of records updated
* @hide
*/
- public static int setColor(int color, int subId) {
- if (VDBG) logd("[setColor]+ color:" + color + " subId:" + subId);
- int size = sSimBackgroundDarkRes.length;
+ public static int setIconTint(int tint, int subId) {
+ if (VDBG) logd("[setIconTint]+ tint:" + tint + " subId:" + subId);
if (!isValidSubId(subId)) {
- logd("[setColor]- fail");
+ logd("[setIconTint]- fail");
return -1;
}
@@ -488,7 +521,7 @@ public class SubscriptionManager implements BaseColumns {
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
if (iSub != null) {
- result = iSub.setColor(color, subId);
+ result = iSub.setIconTint(tint, subId);
}
} catch (RemoteException ex) {
// ignore it
@@ -501,7 +534,7 @@ public class SubscriptionManager implements BaseColumns {
/**
* Set display name by simInfo index
* @param displayName the display name of SIM card
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
* @hide
*/
@@ -512,7 +545,7 @@ public class SubscriptionManager implements BaseColumns {
/**
* Set display name by simInfo index with name source
* @param displayName the display name of SIM card
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @param nameSource 0: NAME_SOURCE_DEFAULT_SOURCE, 1: NAME_SOURCE_SIM_SOURCE,
* 2: NAME_SOURCE_USER_INPUT, -1 NAME_SOURCE_UNDEFINED
* @return the number of records updated or -1 if invalid subId
@@ -546,7 +579,7 @@ public class SubscriptionManager implements BaseColumns {
/**
* Set phone number by subId
* @param number the phone number of the SIM
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
* @hide
*/
@@ -572,38 +605,9 @@ public class SubscriptionManager implements BaseColumns {
}
/**
- * Set number display format. 0: none, 1: the first four digits, 2: the last four digits
- * @param format the display format of phone number
- * @param subId the unique SubInfoRecord index in database
- * @return the number of records updated
- * @hide
- */
- public static int setDisplayNumberFormat(int format, int subId) {
- if (VDBG) logd("[setDisplayNumberFormat]+ format:" + format + " subId:" + subId);
- if (format < 0 || !isValidSubId(subId)) {
- logd("[setDisplayNumberFormat]- fail, return -1");
- return -1;
- }
-
- int result = 0;
-
- try {
- ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
- if (iSub != null) {
- result = iSub.setDisplayNumberFormat(format, subId);
- }
- } catch (RemoteException ex) {
- // ignore it
- }
-
- return result;
-
- }
-
- /**
* Set data roaming by simInfo index
* @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
* @hide
*/
@@ -632,6 +636,7 @@ public class SubscriptionManager implements BaseColumns {
* Get slotId associated with the subscription.
* @return slotId as a positive integer or a negative value if an error either
* SIM_NOT_INSERTED or INVALID_SLOT_ID.
+ * @hide
*/
public static int getSlotId(int subId) {
if (!isValidSubId(subId)) {
@@ -697,31 +702,6 @@ public class SubscriptionManager implements BaseColumns {
}
- private static int[] setSimResource(int type) {
- int[] simResource = null;
-
- switch (type) {
- case RES_TYPE_BACKGROUND_DARK:
- simResource = new int[] {
- com.android.internal.R.drawable.sim_dark_blue,
- com.android.internal.R.drawable.sim_dark_orange,
- com.android.internal.R.drawable.sim_dark_green,
- com.android.internal.R.drawable.sim_dark_purple
- };
- break;
- case RES_TYPE_BACKGROUND_LIGHT:
- simResource = new int[] {
- com.android.internal.R.drawable.sim_light_blue,
- com.android.internal.R.drawable.sim_light_orange,
- com.android.internal.R.drawable.sim_light_green,
- com.android.internal.R.drawable.sim_light_purple
- };
- break;
- }
-
- return simResource;
- }
-
private static void logd(String msg) {
Rlog.d(LOG_TAG, "[SubManager] " + msg);
}
@@ -779,8 +759,8 @@ public class SubscriptionManager implements BaseColumns {
}
/** @hide */
- public static SubInfoRecord getDefaultVoiceSubInfo() {
- return getSubInfoForSubscriber(getDefaultVoiceSubId());
+ public static SubscriptionInfo getDefaultVoiceSubscriptionInfo() {
+ return getSubscriptionInfoForSubscriber(getDefaultVoiceSubId());
}
/** @hide */
@@ -790,6 +770,7 @@ public class SubscriptionManager implements BaseColumns {
/**
* @return subId of the DefaultSms subscription or the value INVALID_SUB_ID if an error.
+ * @hide
*/
public static int getDefaultSmsSubId() {
int subId = INVALID_SUB_ID;
@@ -821,8 +802,8 @@ public class SubscriptionManager implements BaseColumns {
}
/** @hide */
- public static SubInfoRecord getDefaultSmsSubInfo() {
- return getSubInfoForSubscriber(getDefaultSmsSubId());
+ public static SubscriptionInfo getDefaultSmsSubscriptionInfo() {
+ return getSubscriptionInfoForSubscriber(getDefaultSmsSubId());
}
/** @hide */
@@ -861,8 +842,8 @@ public class SubscriptionManager implements BaseColumns {
}
/** @hide */
- public static SubInfoRecord getDefaultDataSubInfo() {
- return getSubInfoForSubscriber(getDefaultDataSubId());
+ public static SubscriptionInfo getDefaultDataSubscriptionInfo() {
+ return getSubscriptionInfoForSubscriber(getDefaultDataSubId());
}
/** @hide */
@@ -871,7 +852,7 @@ public class SubscriptionManager implements BaseColumns {
}
/** @hide */
- public static void clearSubInfo() {
+ public static void clearSubscriptionInfo() {
try {
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
if (iSub != null) {
@@ -918,6 +899,7 @@ public class SubscriptionManager implements BaseColumns {
/**
* @return true if a valid subId else false
+ * @hide
*/
public static boolean isValidSubId(int subId) {
return subId > INVALID_SUB_ID ;
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 0246a2d..b06d44c 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3453,75 +3453,6 @@ public class TelephonyManager {
}
/**
- * Set whether Android should display a simplified Mobile Network Settings UI
- * for the current ICCID.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
- * Or the calling app has carrier privileges. @see #hasCarrierPrivileges
- *
- * @param enable true means enabling the simplified UI.
- * @hide
- */
- public void enableSimplifiedNetworkSettings(boolean enable) {
- enableSimplifiedNetworkSettingsForSubscriber(getDefaultSubscription(), enable);
- }
-
- /**
- * Set whether Android should display a simplified Mobile Network Settings UI
- * for the current ICCID.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
- * Or the calling app has carrier privileges. @see #hasCarrierPrivileges
- *
- * @param subId for which the simplified UI should be enabled or disabled.
- * @param enable true means enabling the simplified UI.
- * @hide
- */
- public void enableSimplifiedNetworkSettingsForSubscriber(int subId, boolean enable) {
- try {
- getITelephony().enableSimplifiedNetworkSettingsForSubscriber(subId, enable);
- } catch (RemoteException ex) {
- } catch (NullPointerException ex) {
- }
- }
-
- /**
- * Get whether a simplified Mobile Network Settings UI is enabled for the
- * current ICCID.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
- * @return true if the simplified UI is enabled.
- * @hide
- */
- public boolean getSimplifiedNetworkSettingsEnabled() {
- return getSimplifiedNetworkSettingsEnabledForSubscriber(getDefaultSubscription());
- }
-
- /**
- * Get whether a simplified Mobile Network Settings UI is enabled for the
- * current ICCID.
- * <p>
- * Requires Permission:
- * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- *
- * @param subId for which the simplified UI should be enabled or disabled.
- * @return true if the simplified UI is enabled.
- * @hide
- */
- public boolean getSimplifiedNetworkSettingsEnabledForSubscriber(int subId) {
- try {
- return getITelephony().getSimplifiedNetworkSettingsEnabledForSubscriber(subId);
- } catch (RemoteException ex) {
- } catch (NullPointerException ex) {
- }
- return false;
- }
-
- /**
* Returns the result and response from RIL for oem request
*
* @param oemReq the data is sent to ril.
diff --git a/telephony/java/com/android/ims/ImsCallProfile.java b/telephony/java/com/android/ims/ImsCallProfile.java
index 8b7901c..9de938a 100644
--- a/telephony/java/com/android/ims/ImsCallProfile.java
+++ b/telephony/java/com/android/ims/ImsCallProfile.java
@@ -114,6 +114,10 @@ public class ImsCallProfile implements Parcelable {
public static final String EXTRA_CALL_MODE_CHANGEABLE = "call_mode_changeable";
public static final String EXTRA_CONFERENCE_AVAIL = "conference_avail";
+ // Extra string for internal use only. OEMs should not use
+ // this for packing extras.
+ public static final String EXTRA_OEM_EXTRAS = "OemCallExtras";
+
/**
* Integer extra properties
* oir : Rule for originating identity (number) presentation, MO/MT.
@@ -151,6 +155,18 @@ public class ImsCallProfile implements Parcelable {
public static final int DIALSTRING_USSD = 2;
/**
+ * Values for causes that restrict call types
+ */
+ // Default cause not restricted at peer and HD is supported
+ public static final int CALL_RESTRICT_CAUSE_NONE = 0;
+ // Service not supported by RAT at peer
+ public static final int CALL_RESTRICT_CAUSE_RAT = 1;
+ // Service Disabled at peer
+ public static final int CALL_RESTRICT_CAUSE_DISABLED = 2;
+ // HD is not supported
+ public static final int CALL_RESTRICT_CAUSE_HD = 3;
+
+ /**
* String extra properties
* oi : Originating identity (number), MT only
* cna : Calling name
@@ -164,11 +180,10 @@ public class ImsCallProfile implements Parcelable {
public int mServiceType;
public int mCallType;
+ public int mRestrictCause = CALL_RESTRICT_CAUSE_NONE;
public Bundle mCallExtras;
public ImsStreamMediaProfile mMediaProfile;
-
-
public ImsCallProfile(Parcel in) {
readFromParcel(in);
}
diff --git a/telephony/java/com/android/ims/ImsStreamMediaProfile.java b/telephony/java/com/android/ims/ImsStreamMediaProfile.java
index 003499c..359b270 100644
--- a/telephony/java/com/android/ims/ImsStreamMediaProfile.java
+++ b/telephony/java/com/android/ims/ImsStreamMediaProfile.java
@@ -41,10 +41,18 @@ public class ImsStreamMediaProfile implements Parcelable {
* Audio information
*/
public static final int AUDIO_QUALITY_NONE = 0;
- public static final int AUDIO_QUALITY_AMR = (1 << 0);
- public static final int AUDIO_QUALITY_AMR_WB = (1 << 1);
-
- /**
+ public static final int AUDIO_QUALITY_AMR = 1;
+ public static final int AUDIO_QUALITY_AMR_WB = 2;
+ public static final int AUDIO_QUALITY_QCELP13K = 3;
+ public static final int AUDIO_QUALITY_EVRC = 4;
+ public static final int AUDIO_QUALITY_EVRC_B = 5;
+ public static final int AUDIO_QUALITY_EVRC_WB = 6;
+ public static final int AUDIO_QUALITY_EVRC_NW = 7;
+ public static final int AUDIO_QUALITY_GSM_EFR = 8;
+ public static final int AUDIO_QUALITY_GSM_FR = 9;
+ public static final int AUDIO_QUALITY_GSM_HR = 10;
+
+ /**
* Video information
*/
public static final int VIDEO_QUALITY_NONE = 0;
diff --git a/telephony/java/com/android/ims/internal/IImsCallSession.aidl b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
index 16b0cd5..d1946e3 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSession.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
@@ -55,6 +55,13 @@ interface IImsCallSession {
ImsCallProfile getLocalCallProfile();
/**
+ * Gets the remote call profile that this session is associated with
+ *
+ * @return the remote call profile that this session is associated with
+ */
+ ImsCallProfile getRemoteCallProfile();
+
+ /**
* Gets the value associated with the specified property of this session.
*
* @return the string value associated with the specified property
diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl
index daf850e..d82c492 100755
--- a/telephony/java/com/android/internal/telephony/ISub.aidl
+++ b/telephony/java/com/android/internal/telephony/ISub.aidl
@@ -17,41 +17,42 @@
package com.android.internal.telephony;
import android.app.PendingIntent;
-import android.telephony.SubInfoRecord;
+import android.telephony.SubscriptionInfo;
+import com.android.internal.telephony.ISubscriptionListener;
interface ISub {
/**
- * Get the SubInfoRecord according to an index
- * @param subId The unique SubInfoRecord index in database
- * @return SubInfoRecord, maybe null
+ * Get the SubscriptionInfo according to an index
+ * @param subId The unique SubscriptionInfo index in database
+ * @return SubscriptionInfo, maybe null
*/
- SubInfoRecord getSubInfoForSubscriber(int subId);
+ SubscriptionInfo getSubInfoForSubscriber(int subId);
/**
- * Get the SubInfoRecord according to an IccId
+ * Get the SubscriptionInfo according to an IccId
* @param iccId the IccId of SIM card
- * @return SubInfoRecord, maybe null
+ * @return SubscriptionInfo, maybe null
*/
- List<SubInfoRecord> getSubInfoUsingIccId(String iccId);
+ List<SubscriptionInfo> getSubInfoUsingIccId(String iccId);
/**
- * Get the SubInfoRecord according to slotId
+ * Get the SubscriptionInfo according to slotId
* @param slotId the slot which the SIM is inserted
- * @return SubInfoRecord, maybe null
+ * @return SubscriptionInfo, maybe null
*/
- List<SubInfoRecord> getSubInfoUsingSlotId(int slotId);
+ List<SubscriptionInfo> getSubInfoUsingSlotId(int slotId);
/**
- * Get all the SubInfoRecord(s) in subinfo database
+ * Get all the SubscriptionInfo(s) in subinfo database
* @return Array list of all SubInfoRecords in database, include thsoe that were inserted before
*/
- List<SubInfoRecord> getAllSubInfoList();
+ List<SubscriptionInfo> getAllSubInfoList();
/**
- * Get the SubInfoRecord(s) of the currently inserted SIM(s)
- * @return Array list of currently inserted SubInfoRecord(s)
+ * Get the SubscriptionInfo(s) of the currently inserted SIM(s)
+ * @return Array list of currently inserted SubscriptionInfo(s)
*/
- List<SubInfoRecord> getActiveSubInfoList();
+ List<SubscriptionInfo> getActiveSubInfoList();
/**
* Get the SUB count of all SUB(s) in subinfo database
@@ -66,7 +67,7 @@ interface ISub {
int getActiveSubInfoCount();
/**
- * Add a new SubInfoRecord to subinfo database if needed
+ * Add a new SubscriptionInfo to subinfo database if needed
* @param iccId the IccId of the SIM card
* @param slotId the slot which the SIM is inserted
* @return the URL of the newly created row or the updated row
@@ -74,17 +75,17 @@ interface ISub {
int addSubInfoRecord(String iccId, int slotId);
/**
- * Set SIM color by simInfo index
- * @param color the color of the SIM
- * @param subId the unique SubInfoRecord index in database
+ * Set SIM icon tint color by simInfo index
+ * @param tint the icon tint color of the SIM
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
*/
- int setColor(int color, int subId);
+ int setIconTint(int tint, int subId);
/**
* Set display name by simInfo index
* @param displayName the display name of SIM card
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
*/
int setDisplayName(String displayName, int subId);
@@ -92,7 +93,7 @@ interface ISub {
/**
* Set display name by simInfo index with name source
* @param displayName the display name of SIM card
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @param nameSource, 0: DEFAULT_SOURCE, 1: SIM_SOURCE, 2: USER_INPUT
* @return the number of records updated
*/
@@ -101,23 +102,15 @@ interface ISub {
/**
* Set phone number by subId
* @param number the phone number of the SIM
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
*/
int setDisplayNumber(String number, int subId);
/**
- * Set number display format. 0: none, 1: the first four digits, 2: the last four digits
- * @param format the display format of phone number
- * @param subId the unique SubInfoRecord index in database
- * @return the number of records updated
- */
- int setDisplayNumberFormat(int format, int subId);
-
- /**
* Set data roaming by simInfo index
* @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming
- * @param subId the unique SubInfoRecord index in database
+ * @param subId the unique SubscriptionInfo index in database
* @return the number of records updated
*/
int setDataRoaming(int roaming, int subId);
diff --git a/core/java/com/android/internal/widget/ILockSettingsObserver.aidl b/telephony/java/com/android/internal/telephony/ISubscriptionListener.aidl
index 6c354d8..4ccdea5 100644
--- a/core/java/com/android/internal/widget/ILockSettingsObserver.aidl
+++ b/telephony/java/com/android/internal/telephony/ISubscriptionListener.aidl
@@ -14,9 +14,11 @@
* limitations under the License.
*/
-package com.android.internal.widget;
+package com.android.internal.telephony;
-/** {@hide} */
-oneway interface ILockSettingsObserver {
- void onLockSettingChanged(in String key, in int userId);
+import android.telephony.SubscriptionInfo;
+
+oneway interface ISubscriptionListener {
+ void onSubscriptionInfoChanged();
}
+
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 13f0e3f..c50261d 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -727,24 +727,6 @@ interface ITelephony {
List<String> getCarrierPackageNamesForIntent(in Intent intent);
/**
- * Set whether Android should display a simplified Mobile Network Settings UI
- * for the current ICCID.
- *
- * @param subId for which the simplified UI should be enabled or disabled.
- * @param enable true means enabling the simplified UI.
- */
- void enableSimplifiedNetworkSettingsForSubscriber(int subId, boolean enable);
-
- /**
- * Get whether a simplified Mobile Network Settings UI is enabled for the
- * current ICCID.
- *
- * @param subId for which the simplified UI should be enabled or disabled.
- * @return true if the simplified UI is enabled.
- */
- boolean getSimplifiedNetworkSettingsEnabledForSubscriber(int subId);
-
- /**
* Set the line 1 phone number string and its alphatag for the current ICCID
* for display purpose only, for example, displayed in Phone Status. It won't
* change the actual MSISDN/MDN. To unset alphatag or number, pass in a null
diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index ee3f8b0..1a1f8fe 100644
--- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -27,8 +27,11 @@ import android.telephony.SignalStrength;
import android.telephony.CellInfo;
import android.telephony.VoLteServiceState;
import com.android.internal.telephony.IPhoneStateListener;
+import com.android.internal.telephony.ISubscriptionListener;
interface ITelephonyRegistry {
+ void registerSubscriptionListener(String pkg, ISubscriptionListener callback, int events);
+ void unregisterSubscriptionListener(String pkg, ISubscriptionListener callback);
void listen(String pkg, IPhoneStateListener callback, int events, boolean notifyNow);
void listenForSubscriber(in int subId, String pkg, IPhoneStateListener callback, int events,
boolean notifyNow);
@@ -63,4 +66,5 @@ interface ITelephonyRegistry {
void notifyDataConnectionRealTimeInfo(in DataConnectionRealTimeInfo dcRtInfo);
void notifyVoLteServiceStateChanged(in VoLteServiceState lteState);
void notifyOemHookRawEventForSubscriber(in int subId, in byte[] rawData);
+ void notifySubscriptionInfoChanged();
}
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index d05e7d1..c67e5d7 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -312,27 +312,7 @@ public class TelephonyIntents {
public static final String EXTRA_SPN = "spn";
/**
- * <p>Broadcast Action: It indicates one column of a siminfo record has been changed
- * The intent will have the following extra values:</p>
- * <ul>
- * <li><em>columnName</em> - The siminfo column that is updated.</li>
- * <li><em>stringContent</em> - The string value of the updated column.</li>
- * <li><em>intContent</em> - The int value of the updated column.</li>
- * </ul>
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
- */
- public static final String ACTION_SIMINFO_CONTENT_CHANGE
- = "android.intent.action.ACTION_SIMINFO_CONTENT_CHANGE";
-
- /**
* <p>Broadcast Action: It indicates one column of a subinfo record has been changed
- * The intent will have the following extra values:</p>
- * <ul>
- * <li><em>columnName</em> - The siminfo column that is updated.</li>
- * <li><em>stringContent</em> - The string value of the updated column.</li>
- * <li><em>intContent</em> - The int value of the updated column.</li>
- * </ul>
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
@@ -340,28 +320,14 @@ public class TelephonyIntents {
= "android.intent.action.ACTION_SUBINFO_CONTENT_CHANGE";
/**
- * <p>Broadcast Action: It indicates siminfo update is completed when SIM inserted state change
- * The intent will have the following extra values:</p>
- * <p class="note">This is a protected intent that can only be sent
- * by the system.
- */
- public static final String ACTION_SIMINFO_UPDATED
- = "android.intent.action.ACTION_SIMINFO_UPDATED";
-
- /**
* <p>Broadcast Action: It indicates subinfo record update is completed
* when SIM inserted state change
- * The intent will have the following extra values:</p>
* <p class="note">This is a protected intent that can only be sent
* by the system.
*/
public static final String ACTION_SUBINFO_RECORD_UPDATED
= "android.intent.action.ACTION_SUBINFO_RECORD_UPDATED";
- public static final String EXTRA_COLUMN_NAME = "columnName";
- public static final String EXTRA_INT_CONTENT = "intContent";
- public static final String EXTRA_STRING_CONTENT = "stringContent";
-
/**
* Broadcast Action: The default subscription has changed. This has the following
* extra values:</p>
diff --git a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
index 94874c8..b065b88 100644
--- a/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
+++ b/tests/ActivityTests/src/com/google/android/test/activity/ActivityTestMain.java
@@ -140,6 +140,8 @@ public class ActivityTestMain extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Log.i(TAG, "Referrer: " + getReferrer());
+
mAm = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
if (savedInstanceState != null) {
mOverrideConfig = savedInstanceState.getParcelable(KEY_CONFIGURATION);
diff --git a/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_start.xml b/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_start.xml
deleted file mode 100644
index c26c8ed..0000000
--- a/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_start.xml
+++ /dev/null
@@ -1,86 +0,0 @@
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="833"
- android:propertyName="translateX"
- android:valueFrom="144"
- android:valueTo="144"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="100"
- android:propertyName="translateX"
- android:valueFrom="144"
- android:valueTo="147.411817411"
- android:interpolator="@interpolator/ic_open_ball_start_translatex_interpolator" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="167"
- android:propertyName="translateY"
- android:valueFrom="144.58457376"
- android:valueTo="144.58457376"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="333"
- android:propertyName="translateY"
- android:valueFrom="144.58457376"
- android:valueTo="196.11111456"
- android:interpolator="@interpolator/ic_open_ball_start_translatey_interpolator_1" />
- <objectAnimator
- android:duration="333"
- android:propertyName="translateY"
- android:valueFrom="196.11111456"
- android:valueTo="196.11111456"
- android:interpolator="@interpolator/ic_open_ball_start_translatey_interpolator_2" />
- <objectAnimator
- android:duration="100"
- android:propertyName="translateY"
- android:valueFrom="196.11111456"
- android:valueTo="129.468428513"
- android:interpolator="@interpolator/ic_open_ball_start_translatey_interpolator_3" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="167"
- android:propertyName="scaleX"
- android:valueFrom="0"
- android:valueTo="0.71187984"
- android:interpolator="@interpolator/ic_open_ball_start_scalex_interpolator_1" />
- <objectAnimator
- android:duration="667"
- android:propertyName="scaleX"
- android:valueFrom="0.71187984"
- android:valueTo="0.71187984"
- android:interpolator="@interpolator/ic_open_ball_start_scalex_interpolator_2" />
- <objectAnimator
- android:duration="100"
- android:propertyName="scaleX"
- android:valueFrom="0.71187984"
- android:valueTo="0.586201598553"
- android:interpolator="@interpolator/ic_open_ball_start_scalex_interpolator_3" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="167"
- android:propertyName="scaleY"
- android:valueFrom="0"
- android:valueTo="0.71187984"
- android:interpolator="@interpolator/ic_open_ball_start_scaley_interpolator_1" />
- <objectAnimator
- android:duration="667"
- android:propertyName="scaleY"
- android:valueFrom="0.71187984"
- android:valueTo="0.71187984"
- android:interpolator="@interpolator/ic_open_ball_start_scaley_interpolator_2" />
- <objectAnimator
- android:duration="100"
- android:propertyName="scaleY"
- android:valueFrom="0.71187984"
- android:valueTo="0.586201598553"
- android:interpolator="@interpolator/ic_open_ball_start_scaley_interpolator_3" />
- </set>
-</set>
diff --git a/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_swoop.xml b/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_swoop.xml
deleted file mode 100644
index 5096514..0000000
--- a/tests/VectorDrawableTest/res/anim/ic_open_animation_ball_swoop.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="933"
- android:propertyName="rotation"
- android:valueFrom="-90"
- android:valueTo="-90"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="1367"
- android:propertyName="rotation"
- android:valueFrom="-90"
- android:valueTo="-87"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1.xml b/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1.xml
deleted file mode 100644
index ef8496e..0000000
--- a/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="500"
- android:propertyName="pathData"
- android:valueFrom="M 0,-17.3838043213 c -9.625,0.0 -17.0795440674,8.28025817871 -17.0795440674,17.4052734375 c 0.0,9.75645446777 7.51704406738,17.6295623779 17.0795440674,17.353515625 c 11.5579986572,-0.333648681641 17.2784118652,-8.72853088379 17.2784118652,-17.353515625 c 0.0,-8.62501525879 -7.65341186523,-17.4052734375 -17.2784118652,-17.4052734375 Z"
- android:valueTo="M 0,-17.3838043213 c -9.625,0.0 -17.0795440674,8.28025817871 -17.0795440674,17.4052734375 c 0.0,9.75645446777 7.51704406738,17.6295623779 17.0795440674,17.353515625 c 11.5579986572,-0.333648681641 17.2784118652,-8.72853088379 17.2784118652,-17.353515625 c 0.0,-8.62501525879 -7.65341186523,-17.4052734375 -17.2784118652,-17.4052734375 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="267"
- android:propertyName="pathData"
- android:valueFrom="M 0,-17.3838043213 c -9.625,0.0 -17.0795440674,8.28025817871 -17.0795440674,17.4052734375 c 0.0,9.75645446777 7.51704406738,17.6295623779 17.0795440674,17.353515625 c 11.5579986572,-0.333648681641 17.2784118652,-8.72853088379 17.2784118652,-17.353515625 c 0.0,-8.62501525879 -7.65341186523,-17.4052734375 -17.2784118652,-17.4052734375 Z"
- android:valueTo="M 0,-6 c -9.625,0 -23.5648803711,6.97859191895 -23.5648803711,16.1035919189 c 0.0,8.875 6.62738037109,8.39640808105 23.5648803711,8.39640808105 c 17.0625,0.0 23.8825073242,0.375 23.8825073242,-8.25 c 0.0,-8.625 -14.2574920654,-16.25 -23.8825073242,-16.25 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_open_path_1_pathdata_interpolator_1" />
- <objectAnimator
- android:duration="33"
- android:propertyName="pathData"
- android:valueFrom="M 0,-6 c -9.625,0 -23.5648803711,6.97859191895 -23.5648803711,16.1035919189 c 0.0,8.875 6.62738037109,8.39640808105 23.5648803711,8.39640808105 c 17.0625,0.0 23.8825073242,0.375 23.8825073242,-8.25 c 0.0,-8.625 -14.2574920654,-16.25 -23.8825073242,-16.25 Z"
- android:valueTo="M 0,-6 c -9.625,0 -23.5648803711,6.97859191895 -23.5648803711,16.1035919189 c 0.0,8.875 6.62738037109,8.39640808105 23.5648803711,8.39640808105 c 17.0625,0.0 23.8825073242,0.375 23.8825073242,-8.25 c 0.0,-8.625 -14.2574920654,-16.25 -23.8825073242,-16.25 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_open_path_1_pathdata_interpolator_2" />
- <objectAnimator
- android:duration="67"
- android:propertyName="pathData"
- android:valueFrom="M 0,-6 c -9.625,0 -23.5648803711,6.97859191895 -23.5648803711,16.1035919189 c 0.0,8.875 6.62738037109,8.39640808105 23.5648803711,8.39640808105 c 17.0625,0.0 23.8825073242,0.375 23.8825073242,-8.25 c 0.0,-8.625 -14.2574920654,-16.25 -23.8825073242,-16.25 Z"
- android:valueTo="M 0,-17.3838043213 c -9.625,0.0 -17.0795440674,8.28025817871 -17.0795440674,17.4052734375 c 0.0,9.75645446777 7.51704406738,17.6295623779 17.0795440674,17.353515625 c 11.5579986572,-0.333648681641 17.2784118652,-8.72853088379 17.2784118652,-17.353515625 c 0.0,-8.62501525879 -7.65341186523,-17.4052734375 -17.2784118652,-17.4052734375 Z"
- android:valueType="pathType"
- android:interpolator="@interpolator/ic_open_path_1_pathdata_interpolator_3" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="933"
- android:propertyName="fillAlpha"
- android:valueFrom="1"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="fillAlpha"
- android:valueFrom="1"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- </set>
-</set>
diff --git a/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1_1.xml b/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1_1.xml
deleted file mode 100644
index 4961204..0000000
--- a/tests/VectorDrawableTest/res/anim/ic_open_animation_path_1_1.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="917"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeAlpha"
- android:valueFrom="0"
- android:valueTo="1"
- android:interpolator="@android:interpolator/linear" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="917"
- android:propertyName="strokeWidth"
- android:valueFrom="0"
- android:valueTo="0"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="17"
- android:propertyName="strokeWidth"
- android:valueFrom="0"
- android:valueTo="20"
- android:interpolator="@android:interpolator/linear" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="933"
- android:propertyName="trimPathStart"
- android:valueFrom="0.06"
- android:valueTo="0.06"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="383"
- android:propertyName="trimPathStart"
- android:valueFrom="0.06"
- android:valueTo="0.19231"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="983"
- android:propertyName="trimPathStart"
- android:valueFrom="0.19231"
- android:valueTo="0.999"
- android:interpolator="@interpolator/ic_open_path_1_1_trimpathstart_interpolator_2" />
- </set>
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="933"
- android:propertyName="trimPathEnd"
- android:valueFrom="0.061"
- android:valueTo="0.061"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="300"
- android:propertyName="trimPathEnd"
- android:valueFrom="0.061"
- android:valueTo="0.19231"
- android:interpolator="@android:interpolator/linear" />
- <objectAnimator
- android:duration="1067"
- android:propertyName="trimPathEnd"
- android:valueFrom="0.19231"
- android:valueTo="1"
- android:interpolator="@interpolator/ic_open_path_1_1_trimpathend_interpolator_2" />
- </set>
-</set>
diff --git a/tests/VectorDrawableTest/res/drawable/ic_open.xml b/tests/VectorDrawableTest/res/drawable/ic_open.xml
deleted file mode 100644
index ad96094..0000000
--- a/tests/VectorDrawableTest/res/drawable/ic_open.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- 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:height="288dp"
- android:width="288dp"
- android:viewportHeight="288"
- android:viewportWidth="288" >
- <group
- android:name="ball_start"
- android:translateX="147.411817411"
- android:translateY="129.468428513"
- android:scaleX="0.586201598553"
- android:scaleY="0.586201598553" >
- <group
- android:name="shape_1"
- android:scaleX="0.76"
- android:scaleY="0.748114397321" >
- <path
- android:name="path_1"
- android:pathData="M 0,-17.3838043213 c -9.625,0.0 -17.0795440674,8.28025817871 -17.0795440674,17.4052734375 c 0.0,9.75645446777 7.51704406738,17.6295623779 17.0795440674,17.353515625 c 11.5579986572,-0.333648681641 17.2784118652,-8.72853088379 17.2784118652,-17.353515625 c 0.0,-8.62501525879 -7.65341186523,-17.4052734375 -17.2784118652,-17.4052734375 Z"
- android:fillColor="#FFFF9000"
- android:fillAlpha="0" />
- </group>
- </group>
- <group
- android:name="ball_swoop"
- android:translateX="144"
- android:translateY="144"
- android:scaleX="0.752248"
- android:scaleY="0.752248"
- android:rotation="-87.6585365854" >
- <path
- android:name="path_1_1"
- android:pathData="M -56.7679443359,1.03857421875 c 0.0,0.0 191.916503906,-13.9097290039 191.916503906,88.0704345703 c 0.0,58.4487304688 -83.6709594727,90.1372070312 -137.004882812,90.1372070312 c -82.1782226562,0.0 -177.867431641,-63.5512695312 -177.867431641,-178.207641602 c 0.0,-115.985717773 98.7650146484,-178.160949707 177.986938477,-178.160949707 c 76.2376251221,0.0 178.1640625,60.6796875 178.1640625,178.185058594 "
- android:strokeColor="#FFFF9000"
- android:strokeAlpha="1"
- android:strokeWidth="20"
- android:strokeLineCap="round"
- android:trimPathStart="0.93025"
- android:trimPathEnd="0.96248"
- android:trimPathOffset="0"
- android:fillColor="#00000000" />
- </group>
-</vector>
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_2.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_2.xml
deleted file mode 100644
index 5011ef9..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.0103034467173,0.0 0.701918866569,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_3.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_3.xml
deleted file mode 100644
index 7b0af97..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_scaley_interpolator_3.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.649706648701,0.0 0.884285938423,1.92358061843 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatex_interpolator.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatex_interpolator.xml
deleted file mode 100644
index ea11d1f..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatex_interpolator.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.353876322169,0.0 0.686452288267,-1.02094740172 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_1.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_1.xml
deleted file mode 100644
index 7bd5c49..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_1.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.754478769148,0.0 0.97,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_2.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_2.xml
deleted file mode 100644
index b0ab6e8..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.33333333,0.0 0.83333333333,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_3.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_3.xml
deleted file mode 100644
index 61060a6..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_ball_start_translatey_interpolator_3.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.324310863613,0.0 0.735625629425,-0.0161527278292 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathend_interpolator_2.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathend_interpolator_2.xml
deleted file mode 100644
index 7e19ef6..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathend_interpolator_2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.744517024668,0.120263649138 0.135947812437,0.994319475209 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathstart_interpolator_2.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathstart_interpolator_2.xml
deleted file mode 100644
index 1280715..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_1_trimpathstart_interpolator_2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.781904890372,0.126303002187 0.188007240906,0.953418294755 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_1.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_1.xml
deleted file mode 100644
index ddf966e..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_1.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.000100000000012,0.0 0.0,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_2.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_2.xml
deleted file mode 100644
index 624e304..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 9.99999999007e-05,0.0 0.0,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_3.xml b/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_3.xml
deleted file mode 100644
index 3ebee0b..0000000
--- a/tests/VectorDrawableTest/res/interpolator/ic_open_path_1_pathdata_interpolator_3.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- 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.
--->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:pathData="M 0 0 c 0.000100000000051,0.0 0.83333333333,1.0 1.0,1.0" />
diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
index 3045839..c4dfb84 100644
--- a/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
+++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/AnimatedVectorDrawableTest.java
@@ -26,7 +26,6 @@ public class AnimatedVectorDrawableTest extends Activity implements View.OnClick
private static final String LOGCAT = "AnimatedVectorDrawableTest";
protected int[] icon = {
- R.drawable.ic_open_animation,
R.drawable.ic_rotate_2_portrait_v2_animation,
R.drawable.ic_signal_airplane_v2_animation,
R.drawable.ic_hourglass_animation,
diff --git a/tools/aapt/AaptConfig.cpp b/tools/aapt/AaptConfig.cpp
index 848d9a1..e88c27a 100644
--- a/tools/aapt/AaptConfig.cpp
+++ b/tools/aapt/AaptConfig.cpp
@@ -21,6 +21,7 @@
#include "AaptAssets.h"
#include "AaptUtil.h"
#include "ResourceFilter.h"
+#include "SdkConstants.h"
using android::String8;
using android::Vector;
@@ -241,7 +242,7 @@ void applyVersionForCompatibility(ConfigDescription* config) {
uint16_t minSdk = 0;
if (config->density == ResTable_config::DENSITY_ANY) {
- minSdk = SDK_L;
+ minSdk = SDK_LOLLIPOP;
} else if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
|| config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY
|| config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
@@ -800,7 +801,7 @@ bool isDensityOnly(const ResTable_config& config) {
}
if (config.density == ResTable_config::DENSITY_ANY) {
- if (config.sdkVersion != SDK_L) {
+ if (config.sdkVersion != SDK_LOLLIPOP) {
// Someone modified the sdkVersion from the default, this is not safe to assume.
return false;
}
diff --git a/tools/aapt/Bundle.h b/tools/aapt/Bundle.h
index cb34448..0e130f4 100644
--- a/tools/aapt/Bundle.h
+++ b/tools/aapt/Bundle.h
@@ -14,18 +14,7 @@
#include <utils/String8.h>
#include <utils/Vector.h>
-enum {
- SDK_CUPCAKE = 3,
- SDK_DONUT = 4,
- SDK_ECLAIR = 5,
- SDK_ECLAIR_0_1 = 6,
- SDK_MR1 = 7,
- SDK_FROYO = 8,
- SDK_HONEYCOMB_MR2 = 13,
- SDK_ICE_CREAM_SANDWICH = 14,
- SDK_ICE_CREAM_SANDWICH_MR1 = 15,
- SDK_L = 21,
-};
+#include "SdkConstants.h"
/*
* Things we can do.
diff --git a/tools/aapt/ResourceFilter.cpp b/tools/aapt/ResourceFilter.cpp
index fc95e14..8693999 100644
--- a/tools/aapt/ResourceFilter.cpp
+++ b/tools/aapt/ResourceFilter.cpp
@@ -41,6 +41,13 @@ WeakResourceFilter::parse(const String8& str)
// Ignore the version
entry.second &= ~ResTable_config::CONFIG_VERSION;
+ // Ignore any densities. Those are best handled in --preferred-density
+ if ((entry.second & ResTable_config::CONFIG_DENSITY) != 0) {
+ fprintf(stderr, "warning: ignoring flag -c %s. Use --preferred-density instead.\n", entry.first.toString().string());
+ entry.first.density = 0;
+ entry.second &= ~ResTable_config::CONFIG_DENSITY;
+ }
+
mConfigMask |= entry.second;
}
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index beff604..bdc6586 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -10,6 +10,7 @@
#include "XMLNode.h"
#include "ResourceFilter.h"
#include "ResourceIdCache.h"
+#include "SdkConstants.h"
#include <androidfw/ResourceTypes.h>
#include <utils/ByteOrder.h>
@@ -4223,7 +4224,7 @@ static bool isMinSdkVersionLOrAbove(const Bundle* bundle) {
}
const int minSdk = atoi(bundle->getMinSdkVersion());
- if (minSdk >= SDK_L) {
+ if (minSdk >= SDK_LOLLIPOP) {
return true;
}
}
@@ -4314,7 +4315,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) {
}
const ConfigDescription& config = entries.keyAt(ei);
- if (config.sdkVersion >= SDK_L) {
+ if (config.sdkVersion >= SDK_LOLLIPOP) {
// We don't need to do anything if the resource is
// already qualified for version 21 or higher.
continue;
@@ -4336,9 +4337,9 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) {
}
// Duplicate the entry under the same configuration
- // but with sdkVersion == SDK_L.
+ // but with sdkVersion == SDK_LOLLIPOP.
ConfigDescription newConfig(config);
- newConfig.sdkVersion = SDK_L;
+ newConfig.sdkVersion = SDK_LOLLIPOP;
entriesToAdd.add(key_value_pair_t<ConfigDescription, sp<Entry> >(
newConfig, new Entry(*e)));
@@ -4361,7 +4362,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) {
if (bundle->getVerbose()) {
entriesToAdd[i].value->getPos()
.printf("using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.",
- SDK_L,
+ SDK_LOLLIPOP,
String8(p->getName()).string(),
String8(t->getName()).string(),
String8(entriesToAdd[i].value->getName()).string(),
@@ -4388,7 +4389,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle,
return NO_ERROR;
}
- if (target->getResourceType() == "" || target->getGroupEntry().toParams().sdkVersion >= SDK_L) {
+ if (target->getResourceType() == "" || target->getGroupEntry().toParams().sdkVersion >= SDK_LOLLIPOP) {
// Skip resources that have no type (AndroidManifest.xml) or are already version qualified with v21
// or higher.
return NO_ERROR;
@@ -4424,7 +4425,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle,
}
ConfigDescription newConfig(target->getGroupEntry().toParams());
- newConfig.sdkVersion = SDK_L;
+ newConfig.sdkVersion = SDK_LOLLIPOP;
// Look to see if we already have an overriding v21 configuration.
sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()),
@@ -4446,7 +4447,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle,
if (bundle->getVerbose()) {
SourcePos(target->getSourceFile(), -1).printf(
"using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.",
- SDK_L,
+ SDK_LOLLIPOP,
mAssets->getPackage().string(),
newFile->getResourceType().string(),
String8(resourceName).string(),
diff --git a/tools/aapt/SdkConstants.h b/tools/aapt/SdkConstants.h
new file mode 100644
index 0000000..7fd1030
--- /dev/null
+++ b/tools/aapt/SdkConstants.h
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+#ifndef H_AAPT_SDK_CONSTANTS
+#define H_AAPT_SDK_CONSTANTS
+
+enum {
+ SDK_CUPCAKE = 3,
+ SDK_DONUT = 4,
+ SDK_ECLAIR = 5,
+ SDK_ECLAIR_0_1 = 6,
+ SDK_ECLAIR_MR1 = 7,
+ SDK_FROYO = 8,
+ SDK_GINGERBREAD = 9,
+ SDK_GINGERBREAD_MR1 = 10,
+ SDK_HONEYCOMB = 11,
+ SDK_HONEYCOMB_MR1 = 12,
+ SDK_HONEYCOMB_MR2 = 13,
+ SDK_ICE_CREAM_SANDWICH = 14,
+ SDK_ICE_CREAM_SANDWICH_MR1 = 15,
+ SDK_JELLY_BEAN = 16,
+ SDK_JELLY_BEAN_MR1 = 17,
+ SDK_JELLY_BEAN_MR2 = 18,
+ SDK_KITKAT = 19,
+ SDK_KITKAT_WATCH = 20,
+ SDK_LOLLIPOP = 21,
+};
+
+#endif // H_AAPT_SDK_CONSTANTS
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-b.png b/tools/layoutlib/bridge/resources/icons/shadow-b.png
new file mode 100644
index 0000000..68f4f4b
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-b.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-bl.png b/tools/layoutlib/bridge/resources/icons/shadow-bl.png
new file mode 100644
index 0000000..ee7dbe8
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-bl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-br.png b/tools/layoutlib/bridge/resources/icons/shadow-br.png
new file mode 100644
index 0000000..c45ad77
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-br.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-l.png b/tools/layoutlib/bridge/resources/icons/shadow-l.png
new file mode 100644
index 0000000..77d0bd0
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-l.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-r.png b/tools/layoutlib/bridge/resources/icons/shadow-r.png
new file mode 100644
index 0000000..4af7a33
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-r.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-tl.png b/tools/layoutlib/bridge/resources/icons/shadow-tl.png
new file mode 100644
index 0000000..424fb36
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-tl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow-tr.png b/tools/layoutlib/bridge/resources/icons/shadow-tr.png
new file mode 100644
index 0000000..1fd0c77
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow-tr.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-b.png b/tools/layoutlib/bridge/resources/icons/shadow2-b.png
new file mode 100644
index 0000000..963973e
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-b.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-bl.png b/tools/layoutlib/bridge/resources/icons/shadow2-bl.png
new file mode 100644
index 0000000..7612487
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-bl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-br.png b/tools/layoutlib/bridge/resources/icons/shadow2-br.png
new file mode 100644
index 0000000..8e20252
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-br.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-l.png b/tools/layoutlib/bridge/resources/icons/shadow2-l.png
new file mode 100644
index 0000000..2db18a0
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-l.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-r.png b/tools/layoutlib/bridge/resources/icons/shadow2-r.png
new file mode 100644
index 0000000..8e026f1
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-r.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-tl.png b/tools/layoutlib/bridge/resources/icons/shadow2-tl.png
new file mode 100644
index 0000000..a8045ed
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-tl.png
Binary files differ
diff --git a/tools/layoutlib/bridge/resources/icons/shadow2-tr.png b/tools/layoutlib/bridge/resources/icons/shadow2-tr.png
new file mode 100644
index 0000000..590373c
--- /dev/null
+++ b/tools/layoutlib/bridge/resources/icons/shadow2-tr.png
Binary files differ
diff --git a/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java b/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java
index d8a6ffc..4475fa4 100644
--- a/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/animation/AnimatorInflater_Delegate.java
@@ -54,6 +54,6 @@ public class AnimatorInflater_Delegate {
/*package*/ static ValueAnimator loadAnimator(Resources res, Theme theme,
AttributeSet attrs, ValueAnimator anim, float pathErrorScale)
throws NotFoundException {
- return anim;
+ return AnimatorInflater.loadAnimator_Original(res, theme, attrs, anim, pathErrorScale);
}
}
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
index f4282ad..8d24d38 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java
@@ -141,7 +141,6 @@ public final class Bitmap_Delegate {
* Creates and returns a {@link Bitmap} initialized with the given stream content.
*
* @param input the stream from which to read the bitmap content
- * @param createFlags
* @param density the density associated with the bitmap
*
* @see Bitmap#isPremultiplied()
@@ -166,8 +165,7 @@ public final class Bitmap_Delegate {
* @see Bitmap#isMutable()
* @see Bitmap#getDensity()
*/
- public static Bitmap createBitmap(BufferedImage image, boolean isMutable,
- Density density) throws IOException {
+ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) {
return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density);
}
@@ -175,7 +173,6 @@ public final class Bitmap_Delegate {
* Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage}
*
* @param image the bitmap content
- * @param createFlags
* @param density the density associated with the bitmap
*
* @see Bitmap#isPremultiplied()
@@ -183,7 +180,7 @@ public final class Bitmap_Delegate {
* @see Bitmap#getDensity()
*/
public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags,
- Density density) throws IOException {
+ Density density) {
// create a delegate with the given image.
Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888);
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index c403ce6..5176419 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -228,6 +228,11 @@ public class IWindowManagerImpl implements IWindowManager {
}
@Override
+ public void overridePendingAppTransitionInPlace(String packageName, int anim) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
public void pauseKeyDispatching(IBinder arg0) throws RemoteException {
// TODO Auto-generated method stub
diff --git a/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java
new file mode 100644
index 0000000..6c949d9
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/RenderNode_Delegate.java
@@ -0,0 +1,72 @@
+/*
+ * 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 android.view;
+
+import com.android.layoutlib.bridge.impl.DelegateManager;
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+/**
+ * Delegate implementing the native methods of {@link RenderNode}
+ * <p/>
+ * Through the layoutlib_create tool, some native methods of RenderNode have been replaced by calls
+ * to methods of the same name in this delegate class.
+ *
+ * @see DelegateManager
+ */
+public class RenderNode_Delegate {
+
+
+ // ---- delegate manager ----
+ private static final DelegateManager<RenderNode_Delegate> sManager =
+ new DelegateManager<RenderNode_Delegate>(RenderNode_Delegate.class);
+
+
+ private float mLift;
+ @SuppressWarnings("UnusedDeclaration")
+ private String mName;
+
+ @LayoutlibDelegate
+ /*package*/ static long nCreate(String name) {
+ RenderNode_Delegate renderNodeDelegate = new RenderNode_Delegate();
+ renderNodeDelegate.mName = name;
+ return sManager.addNewDelegate(renderNodeDelegate);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static void nDestroyRenderNode(long renderNode) {
+ sManager.removeJavaReferenceFor(renderNode);
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static boolean nSetElevation(long renderNode, float lift) {
+ RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
+ if (delegate != null && delegate.mLift != lift) {
+ delegate.mLift = lift;
+ return true;
+ }
+ return false;
+ }
+
+ @LayoutlibDelegate
+ /*package*/ static float nGetElevation(long renderNode) {
+ RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
+ if (delegate != null) {
+ return delegate.mLift;
+ }
+ return 0f;
+ }
+}
diff --git a/tools/layoutlib/bridge/src/android/view/ShadowPainter.java b/tools/layoutlib/bridge/src/android/view/ShadowPainter.java
new file mode 100644
index 0000000..38846bd
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/ShadowPainter.java
@@ -0,0 +1,415 @@
+/*
+ * 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 android.view;
+
+import com.android.annotations.NonNull;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.imageio.ImageIO;
+
+public class ShadowPainter {
+
+ /**
+ * Adds a drop shadow to a semi-transparent image (of an arbitrary shape) and returns it as a
+ * new image. This method attempts to mimic the same visual characteristics as the rectangular
+ * shadow painting methods in this class, {@link #createRectangularDropShadow(java.awt.image.BufferedImage)}
+ * and {@link #createSmallRectangularDropShadow(java.awt.image.BufferedImage)}.
+ *
+ * @param source the source image
+ * @param shadowSize the size of the shadow, normally {@link #SHADOW_SIZE or {@link
+ * #SMALL_SHADOW_SIZE}}
+ *
+ * @return a new image with the shadow painted in
+ */
+ @NonNull
+ public static BufferedImage createDropShadow(BufferedImage source, int shadowSize) {
+ shadowSize /= 2; // make shadow size have the same meaning as in the other shadow paint methods in this class
+
+ return createDropShadow(source, shadowSize, 0.7f, 0);
+ }
+
+ /**
+ * Creates a drop shadow of a given image and returns a new image which shows the input image on
+ * top of its drop shadow.
+ * <p/>
+ * <b>NOTE: If the shape is rectangular and opaque, consider using {@link
+ * #drawRectangleShadow(Graphics2D, int, int, int, int)} instead.</b>
+ *
+ * @param source the source image to be shadowed
+ * @param shadowSize the size of the shadow in pixels
+ * @param shadowOpacity the opacity of the shadow, with 0=transparent and 1=opaque
+ * @param shadowRgb the RGB int to use for the shadow color
+ *
+ * @return a new image with the source image on top of its shadow
+ */
+ @SuppressWarnings({"SuspiciousNameCombination", "UnnecessaryLocalVariable"}) // Imported code
+ public static BufferedImage createDropShadow(BufferedImage source, int shadowSize,
+ float shadowOpacity, int shadowRgb) {
+
+ // This code is based on
+ // http://www.jroller.com/gfx/entry/non_rectangular_shadow
+
+ BufferedImage image;
+ int width = source.getWidth();
+ int height = source.getHeight();
+ image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE,
+ BufferedImage.TYPE_INT_ARGB);
+
+ Graphics2D g2 = image.createGraphics();
+ g2.drawImage(image, shadowSize, shadowSize, null);
+
+ int dstWidth = image.getWidth();
+ int dstHeight = image.getHeight();
+
+ int left = (shadowSize - 1) >> 1;
+ int right = shadowSize - left;
+ int xStart = left;
+ int xStop = dstWidth - right;
+ int yStart = left;
+ int yStop = dstHeight - right;
+
+ shadowRgb &= 0x00FFFFFF;
+
+ int[] aHistory = new int[shadowSize];
+ int historyIdx;
+
+ int aSum;
+
+ int[] dataBuffer = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
+ int lastPixelOffset = right * dstWidth;
+ float sumDivider = shadowOpacity / shadowSize;
+
+ // horizontal pass
+ for (int y = 0, bufferOffset = 0; y < dstHeight; y++, bufferOffset = y * dstWidth) {
+ aSum = 0;
+ historyIdx = 0;
+ for (int x = 0; x < shadowSize; x++, bufferOffset++) {
+ int a = dataBuffer[bufferOffset] >>> 24;
+ aHistory[x] = a;
+ aSum += a;
+ }
+
+ bufferOffset -= right;
+
+ for (int x = xStart; x < xStop; x++, bufferOffset++) {
+ int a = (int) (aSum * sumDivider);
+ dataBuffer[bufferOffset] = a << 24 | shadowRgb;
+
+ // subtract the oldest pixel from the sum
+ aSum -= aHistory[historyIdx];
+
+ // get the latest pixel
+ a = dataBuffer[bufferOffset + right] >>> 24;
+ aHistory[historyIdx] = a;
+ aSum += a;
+
+ if (++historyIdx >= shadowSize) {
+ historyIdx -= shadowSize;
+ }
+ }
+ }
+ // vertical pass
+ for (int x = 0, bufferOffset = 0; x < dstWidth; x++, bufferOffset = x) {
+ aSum = 0;
+ historyIdx = 0;
+ for (int y = 0; y < shadowSize; y++, bufferOffset += dstWidth) {
+ int a = dataBuffer[bufferOffset] >>> 24;
+ aHistory[y] = a;
+ aSum += a;
+ }
+
+ bufferOffset -= lastPixelOffset;
+
+ for (int y = yStart; y < yStop; y++, bufferOffset += dstWidth) {
+ int a = (int) (aSum * sumDivider);
+ dataBuffer[bufferOffset] = a << 24 | shadowRgb;
+
+ // subtract the oldest pixel from the sum
+ aSum -= aHistory[historyIdx];
+
+ // get the latest pixel
+ a = dataBuffer[bufferOffset + lastPixelOffset] >>> 24;
+ aHistory[historyIdx] = a;
+ aSum += a;
+
+ if (++historyIdx >= shadowSize) {
+ historyIdx -= shadowSize;
+ }
+ }
+ }
+
+ g2.drawImage(source, null, 0, 0);
+ g2.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a rectangular drop shadow (of size {@link #SHADOW_SIZE} by {@link #SHADOW_SIZE} around
+ * the given source and returns a new image with both combined
+ *
+ * @param source the source image
+ *
+ * @return the source image with a drop shadow on the bottom and right
+ */
+ @SuppressWarnings("UnusedDeclaration")
+ public static BufferedImage createRectangularDropShadow(BufferedImage source) {
+ int type = source.getType();
+ if (type == BufferedImage.TYPE_CUSTOM) {
+ type = BufferedImage.TYPE_INT_ARGB;
+ }
+
+ int width = source.getWidth();
+ int height = source.getHeight();
+ BufferedImage image;
+ image = new BufferedImage(width + SHADOW_SIZE, height + SHADOW_SIZE, type);
+ Graphics2D g = image.createGraphics();
+ g.drawImage(source, 0, 0, null);
+ drawRectangleShadow(image, 0, 0, width, height);
+ g.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a small rectangular drop shadow (of size {@link #SMALL_SHADOW_SIZE} by {@link
+ * #SMALL_SHADOW_SIZE} around the given source and returns a new image with both combined
+ *
+ * @param source the source image
+ *
+ * @return the source image with a drop shadow on the bottom and right
+ */
+ @SuppressWarnings("UnusedDeclaration")
+ public static BufferedImage createSmallRectangularDropShadow(BufferedImage source) {
+ int type = source.getType();
+ if (type == BufferedImage.TYPE_CUSTOM) {
+ type = BufferedImage.TYPE_INT_ARGB;
+ }
+
+ int width = source.getWidth();
+ int height = source.getHeight();
+
+ BufferedImage image;
+ image = new BufferedImage(width + SMALL_SHADOW_SIZE, height + SMALL_SHADOW_SIZE, type);
+
+ Graphics2D g = image.createGraphics();
+ g.drawImage(source, 0, 0, null);
+ drawSmallRectangleShadow(image, 0, 0, width, height);
+ g.dispose();
+
+ return image;
+ }
+
+ /**
+ * Draws a drop shadow for the given rectangle into the given context. It will not draw anything
+ * if the rectangle is smaller than a minimum determined by the assets used to draw the shadow
+ * graphics. The size of the shadow is {@link #SHADOW_SIZE}.
+ *
+ * @param image the image to draw the shadow into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawRectangleShadow(BufferedImage image,
+ int x, int y, int width, int height) {
+ Graphics2D gc = image.createGraphics();
+ try {
+ drawRectangleShadow(gc, x, y, width, height);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ /**
+ * Draws a small drop shadow for the given rectangle into the given context. It will not draw
+ * anything if the rectangle is smaller than a minimum determined by the assets used to draw the
+ * shadow graphics. The size of the shadow is {@link #SMALL_SHADOW_SIZE}.
+ *
+ * @param image the image to draw the shadow into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawSmallRectangleShadow(BufferedImage image,
+ int x, int y, int width, int height) {
+ Graphics2D gc = image.createGraphics();
+ try {
+ drawSmallRectangleShadow(gc, x, y, width, height);
+ } finally {
+ gc.dispose();
+ }
+ }
+
+ /**
+ * The width and height of the drop shadow painted by
+ * {@link #drawRectangleShadow(Graphics2D, int, int, int, int)}
+ */
+ public static final int SHADOW_SIZE = 20; // DO NOT EDIT. This corresponds to bitmap graphics
+
+ /**
+ * The width and height of the drop shadow painted by
+ * {@link #drawSmallRectangleShadow(Graphics2D, int, int, int, int)}
+ */
+ public static final int SMALL_SHADOW_SIZE = 10; // DO NOT EDIT. Corresponds to bitmap graphics
+
+ /**
+ * Draws a drop shadow for the given rectangle into the given context. It will not draw anything
+ * if the rectangle is smaller than a minimum determined by the assets used to draw the shadow
+ * graphics.
+ *
+ * @param gc the graphics context to draw into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawRectangleShadow(Graphics2D gc, int x, int y, int width, int height) {
+ assert ShadowBottomLeft != null;
+ assert ShadowBottomRight.getWidth(null) == SHADOW_SIZE;
+ assert ShadowBottomRight.getHeight(null) == SHADOW_SIZE;
+
+ int blWidth = ShadowBottomLeft.getWidth(null);
+ int trHeight = ShadowTopRight.getHeight(null);
+ if (width < blWidth) {
+ return;
+ }
+ if (height < trHeight) {
+ return;
+ }
+
+ gc.drawImage(ShadowBottomLeft, x - ShadowBottomLeft.getWidth(null), y + height, null);
+ gc.drawImage(ShadowBottomRight, x + width, y + height, null);
+ gc.drawImage(ShadowTopRight, x + width, y, null);
+ gc.drawImage(ShadowTopLeft, x - ShadowTopLeft.getWidth(null), y, null);
+ gc.drawImage(ShadowBottom,
+ x, y + height, x + width, y + height + ShadowBottom.getHeight(null),
+ 0, 0, ShadowBottom.getWidth(null), ShadowBottom.getHeight(null), null);
+ gc.drawImage(ShadowRight,
+ x + width, y + ShadowTopRight.getHeight(null), x + width + ShadowRight.getWidth(null), y + height,
+ 0, 0, ShadowRight.getWidth(null), ShadowRight.getHeight(null), null);
+ gc.drawImage(ShadowLeft,
+ x - ShadowLeft.getWidth(null), y + ShadowTopLeft.getHeight(null), x, y + height,
+ 0, 0, ShadowLeft.getWidth(null), ShadowLeft.getHeight(null), null);
+ }
+
+ /**
+ * Draws a small drop shadow for the given rectangle into the given context. It will not draw
+ * anything if the rectangle is smaller than a minimum determined by the assets used to draw the
+ * shadow graphics.
+ * <p/>
+ *
+ * @param gc the graphics context to draw into
+ * @param x the left coordinate of the left hand side of the rectangle
+ * @param y the top coordinate of the top of the rectangle
+ * @param width the width of the rectangle
+ * @param height the height of the rectangle
+ */
+ public static void drawSmallRectangleShadow(Graphics2D gc, int x, int y, int width,
+ int height) {
+ assert Shadow2BottomLeft != null;
+ assert Shadow2TopRight != null;
+ assert Shadow2BottomRight.getWidth(null) == SMALL_SHADOW_SIZE;
+ assert Shadow2BottomRight.getHeight(null) == SMALL_SHADOW_SIZE;
+
+ int blWidth = Shadow2BottomLeft.getWidth(null);
+ int trHeight = Shadow2TopRight.getHeight(null);
+ if (width < blWidth) {
+ return;
+ }
+ if (height < trHeight) {
+ return;
+ }
+
+ gc.drawImage(Shadow2BottomLeft, x - Shadow2BottomLeft.getWidth(null), y + height, null);
+ gc.drawImage(Shadow2BottomRight, x + width, y + height, null);
+ gc.drawImage(Shadow2TopRight, x + width, y, null);
+ gc.drawImage(Shadow2TopLeft, x - Shadow2TopLeft.getWidth(null), y, null);
+ gc.drawImage(Shadow2Bottom,
+ x, y + height, x + width, y + height + Shadow2Bottom.getHeight(null),
+ 0, 0, Shadow2Bottom.getWidth(null), Shadow2Bottom.getHeight(null), null);
+ gc.drawImage(Shadow2Right,
+ x + width, y + Shadow2TopRight.getHeight(null), x + width + Shadow2Right.getWidth(null), y + height,
+ 0, 0, Shadow2Right.getWidth(null), Shadow2Right.getHeight(null), null);
+ gc.drawImage(Shadow2Left,
+ x - Shadow2Left.getWidth(null), y + Shadow2TopLeft.getHeight(null), x, y + height,
+ 0, 0, Shadow2Left.getWidth(null), Shadow2Left.getHeight(null), null);
+ }
+
+ private static Image loadIcon(String name) {
+ InputStream inputStream = ShadowPainter.class.getResourceAsStream(name);
+ if (inputStream == null) {
+ throw new RuntimeException("Unable to load image for shadow: " + name);
+ }
+ try {
+ return ImageIO.read(inputStream);
+ } catch (IOException e) {
+ throw new RuntimeException("Unable to load image for shadow:" + name, e);
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ // ignore.
+ }
+ }
+ }
+
+ // Shadow graphics. This was generated by creating a drop shadow in
+ // Gimp, using the parameters x offset=10, y offset=10, blur radius=10,
+ // (for the small drop shadows x offset=10, y offset=10, blur radius=10)
+ // color=black, and opacity=51. These values attempt to make a shadow
+ // that is legible both for dark and light themes, on top of the
+ // canvas background (rgb(150,150,150). Darker shadows would tend to
+ // blend into the foreground for a dark holo screen, and lighter shadows
+ // would be hard to spot on the canvas background. If you make adjustments,
+ // make sure to check the shadow with both dark and light themes.
+ //
+ // After making the graphics, I cut out the top right, bottom left
+ // and bottom right corners as 20x20 images, and these are reproduced by
+ // painting them in the corresponding places in the target graphics context.
+ // I then grabbed a single horizontal gradient line from the middle of the
+ // right edge,and a single vertical gradient line from the bottom. These
+ // are then painted scaled/stretched in the target to fill the gaps between
+ // the three corner images.
+ //
+ // Filenames: bl=bottom left, b=bottom, br=bottom right, r=right, tr=top right
+
+ // Normal Drop Shadow
+ private static final Image ShadowBottom = loadIcon("/icons/shadow-b.png");
+ private static final Image ShadowBottomLeft = loadIcon("/icons/shadow-bl.png");
+ private static final Image ShadowBottomRight = loadIcon("/icons/shadow-br.png");
+ private static final Image ShadowRight = loadIcon("/icons/shadow-r.png");
+ private static final Image ShadowTopRight = loadIcon("/icons/shadow-tr.png");
+ private static final Image ShadowTopLeft = loadIcon("/icons/shadow-tl.png");
+ private static final Image ShadowLeft = loadIcon("/icons/shadow-l.png");
+
+ // Small Drop Shadow
+ private static final Image Shadow2Bottom = loadIcon("/icons/shadow2-b.png");
+ private static final Image Shadow2BottomLeft = loadIcon("/icons/shadow2-bl.png");
+ private static final Image Shadow2BottomRight = loadIcon("/icons/shadow2-br.png");
+ private static final Image Shadow2Right = loadIcon("/icons/shadow2-r.png");
+ private static final Image Shadow2TopRight = loadIcon("/icons/shadow2-tr.png");
+ private static final Image Shadow2TopLeft = loadIcon("/icons/shadow2-tl.png");
+ private static final Image Shadow2Left = loadIcon("/icons/shadow2-l.png");
+}
diff --git a/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java
new file mode 100644
index 0000000..a6c00f7
--- /dev/null
+++ b/tools/layoutlib/bridge/src/android/view/ViewGroup_Delegate.java
@@ -0,0 +1,205 @@
+/*
+ * 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 android.view;
+
+import com.android.annotations.NonNull;
+import com.android.layoutlib.bridge.android.BridgeContext;
+import com.android.resources.Density;
+import com.android.tools.layoutlib.annotations.LayoutlibDelegate;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap_Delegate;
+import android.graphics.Canvas;
+import android.graphics.Outline;
+import android.graphics.Path_Delegate;
+import android.graphics.Rect;
+import android.graphics.Region.Op;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.animation.Transformation;
+
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+
+/**
+ * Delegate used to provide new implementation of a select few methods of {@link ViewGroup}
+ * <p/>
+ * Through the layoutlib_create tool, the original methods of ViewGroup have been replaced by calls
+ * to methods of the same name in this delegate class.
+ */
+public class ViewGroup_Delegate {
+
+ /**
+ * Overrides the original drawChild call in ViewGroup to draw the shadow.
+ */
+ @LayoutlibDelegate
+ /*package*/ static boolean drawChild(ViewGroup thisVG, Canvas canvas, View child,
+ long drawingTime) {
+ boolean retVal = thisVG.drawChild_Original(canvas, child, drawingTime);
+ if (child.getZ() > thisVG.getZ()) {
+ ViewOutlineProvider outlineProvider = child.getOutlineProvider();
+ Outline outline = new Outline();
+ outlineProvider.getOutline(child, outline);
+
+ if (outline.mPath != null || (outline.mRect != null && !outline.mRect.isEmpty())) {
+ int restoreTo = transformCanvas(thisVG, canvas, child);
+ drawShadow(thisVG, canvas, child, outline);
+ canvas.restoreToCount(restoreTo);
+ }
+ }
+ return retVal;
+ }
+
+ private static void drawShadow(ViewGroup parent, Canvas canvas, View child,
+ Outline outline) {
+ BufferedImage shadow = null;
+ int x = 0;
+ if (outline.mRect != null) {
+ Shadow s = getRectShadow(parent, canvas, child, outline);
+ shadow = s.mShadow;
+ x = -s.mShadowWidth;
+ } else if (outline.mPath != null) {
+ shadow = getPathShadow(child, outline, canvas);
+ }
+ if (shadow == null) {
+ return;
+ }
+ Bitmap bitmap = Bitmap_Delegate.createBitmap(shadow, false,
+ Density.getEnum(canvas.getDensity()));
+ Rect clipBounds = canvas.getClipBounds();
+ Rect newBounds = new Rect(clipBounds);
+ newBounds.left = newBounds.left + x;
+ canvas.clipRect(newBounds, Op.REPLACE);
+ canvas.drawBitmap(bitmap, x, 0, null);
+ canvas.clipRect(clipBounds, Op.REPLACE);
+ }
+
+ private static Shadow getRectShadow(ViewGroup parent, Canvas canvas, View child,
+ Outline outline) {
+ BufferedImage shadow;
+ Rect clipBounds = canvas.getClipBounds();
+ if (clipBounds.isEmpty()) {
+ return null;
+ }
+ float height = child.getZ() - parent.getZ();
+ // Draw large shadow if difference in z index is more than 10dp
+ float largeShadowThreshold = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
+ getMetrics(child));
+ boolean largeShadow = height > largeShadowThreshold;
+ int shadowSize = largeShadow ? ShadowPainter.SHADOW_SIZE : ShadowPainter.SMALL_SHADOW_SIZE;
+ shadow = new BufferedImage(clipBounds.width() + shadowSize, clipBounds.height(),
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics2D graphics = shadow.createGraphics();
+ Rect rect = outline.mRect;
+ if (largeShadow) {
+ ShadowPainter.drawRectangleShadow(graphics,
+ rect.left + shadowSize, rect.top, rect.width(), rect.height());
+ } else {
+ ShadowPainter.drawSmallRectangleShadow(graphics,
+ rect.left + shadowSize, rect.top, rect.width(), rect.height());
+ }
+ graphics.dispose();
+ return new Shadow(shadow, shadowSize);
+ }
+
+ @NonNull
+ private static DisplayMetrics getMetrics(View view) {
+ Context context = view.getContext();
+ while (context instanceof ContextThemeWrapper) {
+ context = ((ContextThemeWrapper) context).getBaseContext();
+ }
+ if (context instanceof BridgeContext) {
+ return ((BridgeContext) context).getMetrics();
+ }
+ throw new RuntimeException("View " + view.getClass().getName() + " not created with the " +
+ "right context");
+ }
+
+ private static BufferedImage getPathShadow(View child, Outline outline, Canvas canvas) {
+ Rect clipBounds = canvas.getClipBounds();
+ BufferedImage image = new BufferedImage(clipBounds.width(), clipBounds.height(),
+ BufferedImage.TYPE_INT_ARGB);
+ Graphics2D graphics = image.createGraphics();
+ graphics.draw(Path_Delegate.getDelegate(outline.mPath.mNativePath).getJavaShape());
+ graphics.dispose();
+ return ShadowPainter.createDropShadow(image, ((int) child.getZ()));
+ }
+
+ // Copied from android.view.View#draw(Canvas, ViewGroup, long) and removed code paths
+ // which were never taken. Ideally, we should hook up the shadow code in the same method so
+ // that we don't have to transform the canvas twice.
+ private static int transformCanvas(ViewGroup thisVG, Canvas canvas, View child) {
+ final int restoreTo = canvas.save();
+ final boolean childHasIdentityMatrix = child.hasIdentityMatrix();
+ int flags = thisVG.mGroupFlags;
+ Transformation transformToApply = null;
+ boolean concatMatrix = false;
+ if ((flags & ViewGroup.FLAG_SUPPORT_STATIC_TRANSFORMATIONS) != 0) {
+ final Transformation t = thisVG.getChildTransformation();
+ final boolean hasTransform = thisVG.getChildStaticTransformation(child, t);
+ if (hasTransform) {
+ final int transformType = t.getTransformationType();
+ transformToApply = transformType != Transformation.TYPE_IDENTITY ? t : null;
+ concatMatrix = (transformType & Transformation.TYPE_MATRIX) != 0;
+ }
+ }
+ concatMatrix |= childHasIdentityMatrix;
+
+ child.computeScroll();
+ int sx = child.mScrollX;
+ int sy = child.mScrollY;
+
+ canvas.translate(child.mLeft - sx, child.mTop - sy);
+ float alpha = child.getAlpha() * child.getTransitionAlpha();
+
+ if (transformToApply != null || alpha < 1 || !childHasIdentityMatrix) {
+ if (transformToApply != null || !childHasIdentityMatrix) {
+ int transX = -sx;
+ int transY = -sy;
+
+ if (transformToApply != null) {
+ if (concatMatrix) {
+ // Undo the scroll translation, apply the transformation matrix,
+ // then redo the scroll translate to get the correct result.
+ canvas.translate(-transX, -transY);
+ canvas.concat(transformToApply.getMatrix());
+ canvas.translate(transX, transY);
+ }
+ if (!childHasIdentityMatrix) {
+ canvas.translate(-transX, -transY);
+ canvas.concat(child.getMatrix());
+ canvas.translate(transX, transY);
+ }
+ }
+
+ }
+ }
+ return restoreTo;
+ }
+
+ private static class Shadow {
+ public BufferedImage mShadow;
+ public int mShadowWidth;
+
+ public Shadow(BufferedImage shadow, int shadowWidth) {
+ mShadow = shadow;
+ mShadowWidth = shadowWidth;
+ }
+
+ }
+}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 3d3afa4..aeb70e9 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -479,6 +479,23 @@ public final class BridgeContext extends Context {
StyleResourceValue style = getStyleByDynamicId(resid);
if (style == null) {
+ // In some cases, style may not be a dynamic id, so we do a full search.
+ ResourceReference ref = resolveId(resid);
+ if (ref != null) {
+ if (ref.isFramework()) {
+ ref =
+ getRenderResources().getFrameworkResource(ResourceType.STYLE, ref.getName());
+ } else {
+ ref =
+ getRenderResources().getProjectResource(ResourceType.STYLE, ref.getName());
+ }
+ if (ref instanceof StyleResourceValue) {
+ style = ((StyleResourceValue) ref);
+ }
+ }
+ }
+
+ if (style == null) {
throw new Resources.NotFoundException();
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
index 05a6fd6..39ebdfc 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
@@ -116,11 +116,6 @@ public class BridgePowerManager implements IPowerManager {
}
@Override
- public void setMaximumScreenOffTimeoutFromDeviceAdmin(int arg0) throws RemoteException {
- // pass for now.
- }
-
- @Override
public void setStayOnSetting(int arg0) throws RemoteException {
// pass for now.
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
index 0ed6ab1..0f51d00 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
@@ -38,7 +38,7 @@ import android.view.WindowManager.LayoutParams;
public final class BridgeWindowSession implements IWindowSession {
@Override
- public int add(IWindow arg0, int seq, LayoutParams arg1, int arg2, Rect arg3,
+ public int add(IWindow arg0, int seq, LayoutParams arg1, int arg2, Rect arg3, Rect arg4,
InputChannel outInputchannel)
throws RemoteException {
// pass for now.
@@ -47,7 +47,7 @@ public final class BridgeWindowSession implements IWindowSession {
@Override
public int addToDisplay(IWindow arg0, int seq, LayoutParams arg1, int arg2, int displayId,
- Rect arg3, InputChannel outInputchannel)
+ Rect arg3, Rect arg4, InputChannel outInputchannel)
throws RemoteException {
// pass for now.
return 0;
@@ -55,7 +55,7 @@ public final class BridgeWindowSession implements IWindowSession {
@Override
public int addWithoutInputChannel(IWindow arg0, int seq, LayoutParams arg1, int arg2,
- Rect arg3)
+ Rect arg3, Rect arg4)
throws RemoteException {
// pass for now.
return 0;
@@ -63,7 +63,7 @@ public final class BridgeWindowSession implements IWindowSession {
@Override
public int addToDisplayWithoutInputChannel(IWindow arg0, int seq, LayoutParams arg1, int arg2,
- int displayId, Rect arg3)
+ int displayId, Rect arg3, Rect arg4)
throws RemoteException {
// pass for now.
return 0;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
index 57fd68e..2ff8d37 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/ActionBarLayout.java
@@ -18,6 +18,7 @@ package com.android.layoutlib.bridge.bars;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
+import com.android.ide.common.rendering.api.RenderResources;
import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.rendering.api.SessionParams;
import com.android.internal.R;
@@ -37,7 +38,6 @@ import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ActionMenuPresenter;
import android.widget.FrameLayout;
-import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
@@ -49,15 +49,23 @@ public class ActionBarLayout {
private static final String LAYOUT_ATTR_NAME = "windowActionBarFullscreenDecorLayout";
// The Action Bar
- @NonNull private CustomActionBarWrapper mActionBar;
+ @NonNull
+ private CustomActionBarWrapper mActionBar;
// Store another reference to the context so that we don't have to cast it repeatedly.
- @NonNull private final BridgeContext mBridgeContext;
+ @NonNull
+ private final BridgeContext mBridgeContext;
- @NonNull private FrameLayout mContentRoot;
+ @NonNull
+ private FrameLayout mContentRoot;
// A fake parent for measuring views.
- @Nullable private ViewGroup mMeasureParent;
+ @Nullable
+ private ViewGroup mMeasureParent;
+
+ // A Layout that contains the inflated action bar. The menu popup is added to this layout.
+ @NonNull
+ private final RelativeLayout mEnclosingLayout;
/**
* Inflate the action bar and attach it to {@code parentView}
@@ -90,20 +98,25 @@ public class ActionBarLayout {
if (layoutId == 0) {
throw new RuntimeException(error);
}
+ // Create a RelativeLayout to hold the action bar. The layout is needed so that we may
+ // add the menu popup to it.
+ mEnclosingLayout = new RelativeLayout(mBridgeContext);
+ setMatchParent(mEnclosingLayout);
+ parentView.addView(mEnclosingLayout);
+
// Inflate action bar layout.
- View decorContent = LayoutInflater.from(context).inflate(layoutId, parentView, true);
+ View decorContent = LayoutInflater.from(context).inflate(layoutId, mEnclosingLayout, true);
mActionBar = CustomActionBarWrapper.getActionBarWrapper(context, params, decorContent);
- FrameLayout contentRoot = (FrameLayout) parentView.findViewById(android.R.id.content);
+ FrameLayout contentRoot = (FrameLayout) mEnclosingLayout.findViewById(android.R.id.content);
// If something went wrong and we were not able to initialize the content root,
// just add a frame layout inside this and return.
if (contentRoot == null) {
contentRoot = new FrameLayout(context);
- contentRoot.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- parentView.addView(contentRoot);
+ setMatchParent(contentRoot);
+ mEnclosingLayout.addView(contentRoot);
mContentRoot = contentRoot;
} else {
mContentRoot = contentRoot;
@@ -112,70 +125,49 @@ public class ActionBarLayout {
}
}
+ private void setMatchParent(View view) {
+ view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT));
+ }
+
/**
* Creates a Popup and adds it to the content frame. It also adds another {@link FrameLayout} to
* the content frame which shall serve as the new content root.
*/
public void createMenuPopup() {
- assert mContentRoot.getId() == android.R.id.content
+ assert mEnclosingLayout.getChildCount() == 1
: "Action Bar Menus have already been created.";
if (!isOverflowPopupNeeded()) {
return;
}
- // Create a layout to hold the menus and the user's content.
- RelativeLayout layout = new RelativeLayout(mActionBar.getPopupContext());
- layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT));
- mContentRoot.addView(layout);
- // Create a layout for the user's content.
- FrameLayout contentRoot = new FrameLayout(mBridgeContext);
- contentRoot.setLayoutParams(new LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
- // Add contentRoot and menus to the layout.
- layout.addView(contentRoot);
- layout.addView(createMenuView());
- // ContentRoot is now the view we just created.
- mContentRoot = contentRoot;
- }
-
- /**
- * Returns a {@link LinearLayout} containing the menu list view to be embedded in a
- * {@link RelativeLayout}
- */
- @NonNull
- private View createMenuView() {
DisplayMetrics metrics = mBridgeContext.getMetrics();
MenuBuilder menu = mActionBar.getMenuBuilder();
OverflowMenuAdapter adapter = new OverflowMenuAdapter(menu, mActionBar.getPopupContext());
- LinearLayout layout = new LinearLayout(mActionBar.getPopupContext());
+ ListView listView = new ListView(mActionBar.getPopupContext(), null,
+ R.attr.dropDownListViewStyle);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
measureContentWidth(adapter), LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_END);
if (mActionBar.isSplit()) {
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
- // TODO: Find correct value instead of hardcoded 10dp.
- layoutParams.bottomMargin = getPixelValue("-10dp", metrics);
+ layoutParams.bottomMargin = getActionBarHeight() + mActionBar.getMenuPopupMargin();
} else {
- layoutParams.topMargin = getPixelValue("-10dp", metrics);
+ layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
+ layoutParams.topMargin = getActionBarHeight() + mActionBar.getMenuPopupMargin();
}
- layout.setLayoutParams(layoutParams);
+ layoutParams.setMarginEnd(getPixelValue("5dp", metrics));
+ listView.setLayoutParams(layoutParams);
+ listView.setAdapter(adapter);
final TypedArray a = mActionBar.getPopupContext().obtainStyledAttributes(null,
R.styleable.PopupWindow, R.attr.popupMenuStyle, 0);
- layout.setBackground(a.getDrawable(R.styleable.PopupWindow_popupBackground));
- layout.setDividerDrawable(a.getDrawable(R.attr.actionBarDivider));
+ listView.setBackground(a.getDrawable(R.styleable.PopupWindow_popupBackground));
+ listView.setDivider(a.getDrawable(R.attr.actionBarDivider));
a.recycle();
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.setDividerPadding(getPixelValue("12dp", metrics));
- layout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
-
- ListView listView = new ListView(mActionBar.getPopupContext(), null,
- R.attr.dropDownListViewStyle);
- listView.setAdapter(adapter);
- layout.addView(listView);
- return layout;
+ listView.setElevation(mActionBar.getMenuPopupElevation());
+ mEnclosingLayout.addView(listView);
}
private boolean isOverflowPopupNeeded() {
@@ -244,9 +236,30 @@ public class ActionBarLayout {
return maxWidth;
}
- private int getPixelValue(@NonNull String value, @NonNull DisplayMetrics metrics) {
+ static int getPixelValue(@NonNull String value, @NonNull DisplayMetrics metrics) {
TypedValue typedValue = ResourceHelper.getValue(null, value, false /*requireUnit*/);
return (int) typedValue.getDimension(metrics);
}
+ // TODO: This is duplicated from RenderSessionImpl.
+ private int getActionBarHeight() {
+ RenderResources resources = mBridgeContext.getRenderResources();
+ DisplayMetrics metrics = mBridgeContext.getMetrics();
+ ResourceValue value = resources.findItemInTheme("actionBarSize", true);
+
+ // resolve it
+ value = resources.resolveResValue(value);
+
+ if (value != null) {
+ // get the numerical value, if available
+ TypedValue typedValue = ResourceHelper.getValue("actionBarSize", value.getValue(),
+ true);
+ if (typedValue != null) {
+ // compute the pixel value based on the display metrics
+ return (int) typedValue.getDimension(metrics);
+
+ }
+ }
+ return 0;
+ }
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java
index 70b9cc3..6db722e 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomActionBarWrapper.java
@@ -65,18 +65,17 @@ public abstract class CustomActionBarWrapper {
* Returns a wrapper around different implementations of the Action Bar to provide a common API.
*
* @param decorContent the top level view returned by inflating
- * ?attr/windowActionBarFullscreenDecorLayout
+ * ?attr/windowActionBarFullscreenDecorLayout
*/
@NonNull
public static CustomActionBarWrapper getActionBarWrapper(@NonNull BridgeContext context,
@NonNull SessionParams params, @NonNull View decorContent) {
View view = decorContent.findViewById(R.id.action_bar);
if (view instanceof Toolbar) {
- return new ToolbarWrapper(context, params, ((Toolbar) view)
- );
+ return new ToolbarWrapper(context, params, ((Toolbar) view));
} else if (view instanceof ActionBarView) {
- return new WindowActionBarWrapper(context, params, decorContent, ((ActionBarView) view)
- );
+ return new WindowActionBarWrapper(context, params, decorContent,
+ ((ActionBarView) view));
} else {
throw new IllegalStateException("Can't make an action bar out of " +
view.getClass().getSimpleName());
@@ -174,6 +173,13 @@ public abstract class CustomActionBarWrapper {
@NonNull
abstract DecorToolbar getDecorToolbar();
+ abstract int getMenuPopupElevation();
+
+ /**
+ * Margin between the menu popup and the action bar.
+ */
+ abstract int getMenuPopupMargin();
+
// ---- The implementations ----
/**
@@ -226,25 +232,38 @@ public abstract class CustomActionBarWrapper {
DecorToolbar getDecorToolbar() {
return mToolbar.getWrapper();
}
+
+ @Override
+ int getMenuPopupElevation() {
+ return 10;
+ }
+
+ @Override
+ int getMenuPopupMargin() {
+ return 0;
+ }
}
/**
* Holo theme uses {@link WindowDecorActionBar} as the action bar. This wrapper provides
* access to it using a common API.
*/
- private static class WindowActionBarWrapper extends CustomActionBarWrapper{
+ private static class WindowActionBarWrapper extends CustomActionBarWrapper {
@NonNull
private final WindowDecorActionBar mActionBar;
+ @NonNull
private final ActionBarView mActionBarView;
+ @NonNull
+ private final View mDecorContentRoot;
private MenuBuilder mMenuBuilder;
public WindowActionBarWrapper(@NonNull BridgeContext context, @NonNull SessionParams params,
@NonNull View decorContentRoot, @NonNull ActionBarView actionBarView) {
- super(context, params, new WindowDecorActionBar(decorContentRoot)
- );
+ super(context, params, new WindowDecorActionBar(decorContentRoot));
mActionBarView = actionBarView;
mActionBar = ((WindowDecorActionBar) super.mActionBar);
+ mDecorContentRoot = decorContentRoot;
}
@Override
@@ -270,7 +289,7 @@ public abstract class CustomActionBarWrapper {
}
// Set action bar to be split, if needed.
- ViewGroup splitView = (ViewGroup) mActionBarView.findViewById(R.id.split_action_bar);
+ ViewGroup splitView = (ViewGroup) mDecorContentRoot.findViewById(R.id.split_action_bar);
if (splitView != null) {
mActionBarView.setSplitView(splitView);
Resources res = mContext.getResources();
@@ -314,6 +333,16 @@ public abstract class CustomActionBarWrapper {
return mActionBarView;
}
+ @Override
+ int getMenuPopupElevation() {
+ return 0;
+ }
+
+ @Override
+ int getMenuPopupMargin() {
+ return -ActionBarLayout.getPixelValue("10dp", mContext.getMetrics());
+ }
+
// TODO: Use an adapter, like List View to set up tabs.
@SuppressWarnings("deprecation") // For Tab
private void setupTabs(int num) {
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
index b677131..669e6b5 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java
@@ -57,63 +57,59 @@ public class RenderDrawable extends RenderAction<DrawableParams> {
public Result render() {
checkLock();
- try {
- // get the drawable resource value
- DrawableParams params = getParams();
- HardwareConfig hardwareConfig = params.getHardwareConfig();
- ResourceValue drawableResource = params.getDrawable();
-
- // resolve it
- BridgeContext context = getContext();
- drawableResource = context.getRenderResources().resolveResValue(drawableResource);
-
- if (drawableResource == null ||
- drawableResource.getResourceType() != ResourceType.DRAWABLE) {
- return Status.ERROR_NOT_A_DRAWABLE.createResult();
- }
+ // get the drawable resource value
+ DrawableParams params = getParams();
+ HardwareConfig hardwareConfig = params.getHardwareConfig();
+ ResourceValue drawableResource = params.getDrawable();
+
+ // resolve it
+ BridgeContext context = getContext();
+ drawableResource = context.getRenderResources().resolveResValue(drawableResource);
+
+ if (drawableResource == null ||
+ drawableResource.getResourceType() != ResourceType.DRAWABLE) {
+ return Status.ERROR_NOT_A_DRAWABLE.createResult();
+ }
- // create a simple FrameLayout
- FrameLayout content = new FrameLayout(context);
+ // create a simple FrameLayout
+ FrameLayout content = new FrameLayout(context);
- // get the actual Drawable object to draw
- Drawable d = ResourceHelper.getDrawable(drawableResource, context);
- content.setBackground(d);
+ // get the actual Drawable object to draw
+ Drawable d = ResourceHelper.getDrawable(drawableResource, context);
+ content.setBackground(d);
- // set the AttachInfo on the root view.
- AttachInfo_Accessor.setAttachInfo(content);
+ // set the AttachInfo on the root view.
+ AttachInfo_Accessor.setAttachInfo(content);
- // measure
- int w = hardwareConfig.getScreenWidth();
- int h = hardwareConfig.getScreenHeight();
- int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
- int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
- content.measure(w_spec, h_spec);
+ // measure
+ int w = hardwareConfig.getScreenWidth();
+ int h = hardwareConfig.getScreenHeight();
+ int w_spec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
+ int h_spec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
+ content.measure(w_spec, h_spec);
- // now do the layout.
- content.layout(0, 0, w, h);
+ // now do the layout.
+ content.layout(0, 0, w, h);
- // preDraw setup
- AttachInfo_Accessor.dispatchOnPreDraw(content);
+ // preDraw setup
+ AttachInfo_Accessor.dispatchOnPreDraw(content);
- // draw into a new image
- BufferedImage image = getImage(w, h);
+ // draw into a new image
+ BufferedImage image = getImage(w, h);
- // create an Android bitmap around the BufferedImage
- Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
- true /*isMutable*/, hardwareConfig.getDensity());
+ // create an Android bitmap around the BufferedImage
+ Bitmap bitmap = Bitmap_Delegate.createBitmap(image,
+ true /*isMutable*/, hardwareConfig.getDensity());
- // create a Canvas around the Android bitmap
- Canvas canvas = new Canvas(bitmap);
- canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
+ // create a Canvas around the Android bitmap
+ Canvas canvas = new Canvas(bitmap);
+ canvas.setDensity(hardwareConfig.getDensity().getDpiValue());
- // and draw
- content.draw(canvas);
+ // and draw
+ content.draw(canvas);
- return Status.SUCCESS.createResult(image);
- } catch (IOException e) {
- return ERROR_UNKNOWN.createResult(e.getMessage(), e);
- }
+ return Status.SUCCESS.createResult(image);
}
protected BufferedImage getImage(int w, int h) {
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
index 2fcdf34..4e6f456 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/CreateInfo.java
@@ -162,6 +162,11 @@ public final class CreateInfo implements ICreateInfo {
"android.view.WindowManagerGlobal#getWindowManagerService",
"android.view.inputmethod.InputMethodManager#getInstance",
"android.view.MenuInflater#registerMenu",
+ "android.view.RenderNode#nCreate",
+ "android.view.RenderNode#nDestroyRenderNode",
+ "android.view.RenderNode#nSetElevation",
+ "android.view.RenderNode#nGetElevation",
+ "android.view.ViewGroup#drawChild",
"com.android.internal.view.menu.MenuBuilder#createNewMenuItem",
"com.android.internal.util.XmlUtils#convertValueToInt",
"com.android.internal.textservice.ITextServicesManager$Stub#asInterface",
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
index 3d89c68..ae4a57d 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateClassAdapter.java
@@ -112,6 +112,7 @@ public class DelegateClassAdapter extends ClassVisitor {
// The implementation of this 'delegate' method is done in layoutlib_bridge.
int accessDelegate = access;
+ access = access & ~Opcodes.ACC_PRIVATE; // If private, make it package protected.
MethodVisitor mwOriginal = super.visitMethod(access, name + ORIGINAL_SUFFIX,
desc, signature, exceptions);
diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk
index dc48ea8..968d22b 100644
--- a/tools/split-select/Android.mk
+++ b/tools/split-select/Android.mk
@@ -34,7 +34,8 @@ sources := \
testSources := \
Grouper_test.cpp \
Rule_test.cpp \
- RuleGenerator_test.cpp
+ RuleGenerator_test.cpp \
+ TestRules.cpp
cIncludes := \
external/zlib \
diff --git a/tools/split-select/Rule.cpp b/tools/split-select/Rule.cpp
index 9559fe2..48d21ff 100644
--- a/tools/split-select/Rule.cpp
+++ b/tools/split-select/Rule.cpp
@@ -29,6 +29,16 @@ inline static void indentStr(String8& str, int indent) {
}
}
+Rule::Rule(const Rule& rhs)
+ : RefBase()
+ , op(rhs.op)
+ , key(rhs.key)
+ , negate(rhs.negate)
+ , stringArgs(rhs.stringArgs)
+ , longArgs(rhs.longArgs)
+ , subrules(rhs.subrules) {
+}
+
String8 Rule::toJson(int indent) const {
String8 str;
indentStr(str, indent);
diff --git a/tools/split-select/Rule.h b/tools/split-select/Rule.h
index 8029931..08a2075 100644
--- a/tools/split-select/Rule.h
+++ b/tools/split-select/Rule.h
@@ -28,6 +28,7 @@ namespace split {
struct Rule : public virtual android::RefBase {
inline Rule();
+ Rule(const Rule& rhs);
enum Operator {
LESS_THAN = 1,
diff --git a/tools/split-select/RuleGenerator.cpp b/tools/split-select/RuleGenerator.cpp
index b8f3bcb..83c9795 100644
--- a/tools/split-select/RuleGenerator.cpp
+++ b/tools/split-select/RuleGenerator.cpp
@@ -15,6 +15,7 @@
*/
#include "RuleGenerator.h"
+#include "aapt/SdkConstants.h"
#include <algorithm>
#include <cmath>
@@ -32,18 +33,21 @@ static inline int findMid(int l, int h) {
}
sp<Rule> RuleGenerator::generateDensity(const Vector<int>& allDensities, size_t index) {
- sp<Rule> densityRule = new Rule();
- densityRule->op = Rule::AND_SUBRULES;
-
- const bool anyDensity = allDensities[index] == ResTable_config::DENSITY_ANY;
- sp<Rule> any = new Rule();
- any->op = Rule::EQUALS;
- any->key = Rule::SCREEN_DENSITY;
- any->longArgs.add((int)ResTable_config::DENSITY_ANY);
- any->negate = !anyDensity;
- densityRule->subrules.add(any);
-
- if (!anyDensity) {
+ if (allDensities[index] != ResTable_config::DENSITY_ANY) {
+ sp<Rule> densityRule = new Rule();
+ densityRule->op = Rule::AND_SUBRULES;
+
+ const bool hasAnyDensity = std::find(allDensities.begin(),
+ allDensities.end(), (int) ResTable_config::DENSITY_ANY) != allDensities.end();
+
+ if (hasAnyDensity) {
+ sp<Rule> version = new Rule();
+ version->op = Rule::LESS_THAN;
+ version->key = Rule::SDK_VERSION;
+ version->longArgs.add((long) SDK_LOLLIPOP);
+ densityRule->subrules.add(version);
+ }
+
if (index > 0) {
sp<Rule> gt = new Rule();
gt->op = Rule::GREATER_THAN;
@@ -59,8 +63,14 @@ sp<Rule> RuleGenerator::generateDensity(const Vector<int>& allDensities, size_t
lt->longArgs.add(findMid(allDensities[index], allDensities[index + 1]));
densityRule->subrules.add(lt);
}
+ return densityRule;
+ } else {
+ // SDK_VERSION is handled elsewhere, so we always pick DENSITY_ANY if it's
+ // available.
+ sp<Rule> always = new Rule();
+ always->op = Rule::ALWAYS_TRUE;
+ return always;
}
- return densityRule;
}
sp<Rule> RuleGenerator::generateAbi(const Vector<abi::Variant>& splitAbis, size_t index) {
diff --git a/tools/split-select/RuleGenerator_test.cpp b/tools/split-select/RuleGenerator_test.cpp
index ee387be..470cadc 100644
--- a/tools/split-select/RuleGenerator_test.cpp
+++ b/tools/split-select/RuleGenerator_test.cpp
@@ -16,154 +16,95 @@
#include "RuleGenerator.h"
-#include <algorithm>
+#include "aapt/SdkConstants.h"
+#include "TestRules.h"
+
#include <gtest/gtest.h>
-#include <utils/String8.h>
+#include <utils/Vector.h>
using namespace android;
+using namespace split::test;
namespace split {
-static void expectDensityRule(const Vector<int>& densities, int density, int greaterThan, int lessThan);
-static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant, const char* a);
-static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant, const char* a, const char* b);
-
TEST(RuleGeneratorTest, testAbiRules) {
Vector<abi::Variant> abis;
- abis.add(abi::Variant_armeabi);
- abis.add(abi::Variant_armeabi_v7a);
- abis.add(abi::Variant_x86);
- std::sort(abis.begin(), abis.end());
-
- expectAbiRule(abis, abi::Variant_armeabi, "armeabi");
- expectAbiRule(abis, abi::Variant_armeabi_v7a, "armeabi-v7a", "arm64-v8a");
- expectAbiRule(abis, abi::Variant_x86, "x86", "x86_64");
-}
+ const ssize_t armeabiIndex = abis.add(abi::Variant_armeabi);
+ const ssize_t armeabi_v7aIndex = abis.add(abi::Variant_armeabi_v7a);
+ const ssize_t x86Index = abis.add(abi::Variant_x86);
-TEST(RuleGeneratorTest, testDensityRules) {
- Vector<int> densities;
- densities.add(ConfigDescription::DENSITY_HIGH);
- densities.add(ConfigDescription::DENSITY_XHIGH);
- densities.add(ConfigDescription::DENSITY_XXHIGH);
- densities.add(ConfigDescription::DENSITY_ANY);
-
- ASSERT_LT(263, ConfigDescription::DENSITY_XHIGH);
- ASSERT_GT(262, ConfigDescription::DENSITY_HIGH);
- ASSERT_LT(363, ConfigDescription::DENSITY_XXHIGH);
- ASSERT_GT(362, ConfigDescription::DENSITY_XHIGH);
-
- expectDensityRule(densities, ConfigDescription::DENSITY_HIGH, 0, 263);
- expectDensityRule(densities, ConfigDescription::DENSITY_XHIGH, 262, 363);
- expectDensityRule(densities, ConfigDescription::DENSITY_XXHIGH, 362, 0);
- expectDensityRule(densities, ConfigDescription::DENSITY_ANY, 0, 0);
-}
+ EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, armeabiIndex),
+ ContainsAnyRule(Rule::NATIVE_PLATFORM, "armeabi")
+ );
+
+ EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, armeabi_v7aIndex),
+ ContainsAnyRule(Rule::NATIVE_PLATFORM, "armeabi-v7a", "arm64-v8a")
+ );
-//
-// Helper methods.
-//
-
-static void expectDensityRule(const Vector<int>& densities, int density, int greaterThan, int lessThan) {
- const int* iter = std::find(densities.begin(), densities.end(), density);
- if (densities.end() == iter) {
- ADD_FAILURE() << density << "dpi was not in the density list.";
- return;
- }
-
- sp<Rule> rule = RuleGenerator::generateDensity(densities, iter - densities.begin());
- if (rule->op != Rule::AND_SUBRULES) {
- ADD_FAILURE() << "Op in rule for " << density << "dpi is not Rule::AND_SUBRULES.";
- return;
- }
-
- size_t index = 0;
-
- bool isAnyDpi = density == ConfigDescription::DENSITY_ANY;
-
- sp<Rule> anyDpiRule = rule->subrules[index++];
- EXPECT_EQ(Rule::EQUALS, anyDpiRule->op)
- << "for " << density << "dpi ANY DPI rule";
- EXPECT_EQ(Rule::SCREEN_DENSITY, anyDpiRule->key)
- << "for " << density << "dpi ANY DPI rule";
- EXPECT_EQ(isAnyDpi == false, anyDpiRule->negate)
- << "for " << density << "dpi ANY DPI rule";
- if (anyDpiRule->longArgs.size() == 1) {
- EXPECT_EQ(ConfigDescription::DENSITY_ANY, anyDpiRule->longArgs[0])
- << "for " << density << "dpi ANY DPI rule";
- } else {
- EXPECT_EQ(1u, anyDpiRule->longArgs.size())
- << "for " << density << "dpi ANY DPI rule";
- }
-
-
- if (greaterThan != 0) {
- sp<Rule> greaterThanRule = rule->subrules[index++];
- EXPECT_EQ(Rule::GREATER_THAN, greaterThanRule->op)
- << "for " << density << "dpi GREATER_THAN rule";
- EXPECT_EQ(Rule::SCREEN_DENSITY, greaterThanRule->key)
- << "for " << density << "dpi GREATER_THAN rule";
- if (greaterThanRule->longArgs.size() == 1) {
- EXPECT_EQ(greaterThan, greaterThanRule->longArgs[0])
- << "for " << density << "dpi GREATER_THAN rule";
- } else {
- EXPECT_EQ(1u, greaterThanRule->longArgs.size())
- << "for " << density << "dpi GREATER_THAN rule";
- }
- }
-
- if (lessThan != 0) {
- sp<Rule> lessThanRule = rule->subrules[index++];
- EXPECT_EQ(Rule::LESS_THAN, lessThanRule->op)
- << "for " << density << "dpi LESS_THAN rule";
- EXPECT_EQ(Rule::SCREEN_DENSITY, lessThanRule->key)
- << "for " << density << "dpi LESS_THAN rule";
- if (lessThanRule->longArgs.size() == 1) {
- EXPECT_EQ(lessThan, lessThanRule->longArgs[0])
- << "for " << density << "dpi LESS_THAN rule";
- } else {
- EXPECT_EQ(1u, lessThanRule->longArgs.size())
- << "for " << density << "dpi LESS_THAN rule";
- }
- }
+ EXPECT_RULES_EQ(RuleGenerator::generateAbi(abis, x86Index),
+ ContainsAnyRule(Rule::NATIVE_PLATFORM, "x86", "x86_64")
+ );
}
-static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant, const Vector<const char*>& matches) {
- const abi::Variant* iter = std::find(abis.begin(), abis.end(), variant);
- if (abis.end() == iter) {
- ADD_FAILURE() << abi::toString(variant) << " was not in the abi list.";
- return;
- }
-
- sp<Rule> rule = RuleGenerator::generateAbi(abis, iter - abis.begin());
-
- EXPECT_EQ(Rule::CONTAINS_ANY, rule->op)
- << "for " << abi::toString(variant) << " rule";
- EXPECT_EQ(Rule::NATIVE_PLATFORM, rule->key)
- << " for " << abi::toString(variant) << " rule";
- EXPECT_EQ(matches.size(), rule->stringArgs.size())
- << " for " << abi::toString(variant) << " rule";
-
- const size_t matchCount = matches.size();
- for (size_t i = 0; i < matchCount; i++) {
- const char* match = matches[i];
- if (rule->stringArgs.end() ==
- std::find(rule->stringArgs.begin(), rule->stringArgs.end(), String8(match))) {
- ADD_FAILURE() << "Rule for abi " << abi::toString(variant)
- << " does not contain match for expected abi " << match;
- }
- }
+TEST(RuleGeneratorTest, densityConstantsAreSane) {
+ EXPECT_LT(263, (int) ConfigDescription::DENSITY_XHIGH);
+ EXPECT_GT(262, (int) ConfigDescription::DENSITY_HIGH);
+ EXPECT_LT(363, (int) ConfigDescription::DENSITY_XXHIGH);
+ EXPECT_GT(362, (int) ConfigDescription::DENSITY_XHIGH);
}
-static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant, const char* a) {
- Vector<const char*> matches;
- matches.add(a);
- expectAbiRule(abis, variant, matches);
+TEST(RuleGeneratorTest, testDensityRules) {
+ Vector<int> densities;
+ const ssize_t highIndex = densities.add(ConfigDescription::DENSITY_HIGH);
+ const ssize_t xhighIndex = densities.add(ConfigDescription::DENSITY_XHIGH);
+ const ssize_t xxhighIndex = densities.add(ConfigDescription::DENSITY_XXHIGH);
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, highIndex),
+ AndRule()
+ .add(LtRule(Rule::SCREEN_DENSITY, 263))
+ );
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xhighIndex),
+ AndRule()
+ .add(GtRule(Rule::SCREEN_DENSITY, 262))
+ .add(LtRule(Rule::SCREEN_DENSITY, 363))
+ );
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xxhighIndex),
+ AndRule()
+ .add(GtRule(Rule::SCREEN_DENSITY, 362))
+ );
}
-static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant, const char* a, const char* b) {
- Vector<const char*> matches;
- matches.add(a);
- matches.add(b);
- expectAbiRule(abis, variant, matches);
+TEST(RuleGeneratorTest, testDensityRulesWithAnyDpi) {
+ Vector<int> densities;
+ const ssize_t highIndex = densities.add(ConfigDescription::DENSITY_HIGH);
+ const ssize_t xhighIndex = densities.add(ConfigDescription::DENSITY_XHIGH);
+ const ssize_t xxhighIndex = densities.add(ConfigDescription::DENSITY_XXHIGH);
+ const ssize_t anyIndex = densities.add(ConfigDescription::DENSITY_ANY);
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, highIndex),
+ AndRule()
+ .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
+ .add(LtRule(Rule::SCREEN_DENSITY, 263))
+ );
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xhighIndex),
+ AndRule()
+ .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
+ .add(GtRule(Rule::SCREEN_DENSITY, 262))
+ .add(LtRule(Rule::SCREEN_DENSITY, 363))
+ );
+
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, xxhighIndex),
+ AndRule()
+ .add(LtRule(Rule::SDK_VERSION, SDK_LOLLIPOP))
+ .add(GtRule(Rule::SCREEN_DENSITY, 362))
+ );
+
+ // We expect AlwaysTrue because anydpi always has attached v21 to the configuration
+ // and the rest of the rule generation code generates the sdk version checks.
+ EXPECT_RULES_EQ(RuleGenerator::generateDensity(densities, anyIndex), AlwaysTrue());
}
} // namespace split
diff --git a/tools/split-select/Rule_test.cpp b/tools/split-select/Rule_test.cpp
index aca7433..c6cff0d 100644
--- a/tools/split-select/Rule_test.cpp
+++ b/tools/split-select/Rule_test.cpp
@@ -17,42 +17,28 @@
#include "Rule.h"
#include "SplitDescription.h"
+#include "TestRules.h"
#include <algorithm>
-#include <string>
#include <gtest/gtest.h>
+#include <string>
#include <utils/String8.h>
using namespace android;
+using namespace split::test;
namespace split {
TEST(RuleTest, generatesValidJson) {
- sp<Rule> rule = new Rule();
- rule->op = Rule::AND_SUBRULES;
-
- sp<Rule> subrule = new Rule();
- subrule->op = Rule::EQUALS;
- subrule->key = Rule::SDK_VERSION;
- subrule->longArgs.add(7);
- rule->subrules.add(subrule);
-
- subrule = new Rule();
- subrule->op = Rule::OR_SUBRULES;
- rule->subrules.add(subrule);
-
- sp<Rule> subsubrule = new Rule();
- subsubrule->op = Rule::GREATER_THAN;
- subsubrule->key = Rule::SCREEN_DENSITY;
- subsubrule->longArgs.add(10);
- subrule->subrules.add(subsubrule);
-
- subsubrule = new Rule();
- subsubrule->op = Rule::LESS_THAN;
- subsubrule->key = Rule::SCREEN_DENSITY;
- subsubrule->longArgs.add(5);
- subrule->subrules.add(subsubrule);
-
+ Rule rule(AndRule()
+ .add(EqRule(Rule::SDK_VERSION, 7))
+ .add(OrRule()
+ .add(GtRule(Rule::SCREEN_DENSITY, 10))
+ .add(LtRule(Rule::SCREEN_DENSITY, 5))
+ )
+ );
+
+ // Expected
std::string expected(
"{"
" \"op\": \"AND_SUBRULES\","
@@ -79,69 +65,36 @@ TEST(RuleTest, generatesValidJson) {
" }"
" ]"
"}");
- // Trim
expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end());
- std::string result(rule->toJson().string());
-
- // Trim
+ // Result
+ std::string result(rule.toJson().string());
result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end());
ASSERT_EQ(expected, result);
}
TEST(RuleTest, simplifiesSingleSubruleRules) {
- sp<Rule> rule = new Rule();
- rule->op = Rule::AND_SUBRULES;
+ sp<Rule> rule = new Rule(AndRule()
+ .add(EqRule(Rule::SDK_VERSION, 7))
+ );
- sp<Rule> subrule = new Rule();
- subrule->op = Rule::EQUALS;
- subrule->key = Rule::SDK_VERSION;
- subrule->longArgs.add(7);
- rule->subrules.add(subrule);
-
- sp<Rule> simplified = Rule::simplify(rule);
- EXPECT_EQ(Rule::EQUALS, simplified->op);
- EXPECT_EQ(Rule::SDK_VERSION, simplified->key);
- ASSERT_EQ(1u, simplified->longArgs.size());
- EXPECT_EQ(7, simplified->longArgs[0]);
+ EXPECT_RULES_EQ(Rule::simplify(rule), EqRule(Rule::SDK_VERSION, 7));
}
TEST(RuleTest, simplifiesNestedSameOpSubrules) {
- sp<Rule> rule = new Rule();
- rule->op = Rule::AND_SUBRULES;
-
- sp<Rule> subrule = new Rule();
- subrule->op = Rule::AND_SUBRULES;
- rule->subrules.add(subrule);
-
- sp<Rule> subsubrule = new Rule();
- subsubrule->op = Rule::EQUALS;
- subsubrule->key = Rule::SDK_VERSION;
- subsubrule->longArgs.add(7);
- subrule->subrules.add(subsubrule);
-
- subrule = new Rule();
- subrule->op = Rule::EQUALS;
- subrule->key = Rule::SDK_VERSION;
- subrule->longArgs.add(8);
- rule->subrules.add(subrule);
-
- sp<Rule> simplified = Rule::simplify(rule);
- EXPECT_EQ(Rule::AND_SUBRULES, simplified->op);
- ASSERT_EQ(2u, simplified->subrules.size());
-
- sp<Rule> simplifiedSubrule = simplified->subrules[0];
- EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op);
- EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key);
- ASSERT_EQ(1u, simplifiedSubrule->longArgs.size());
- EXPECT_EQ(7, simplifiedSubrule->longArgs[0]);
-
- simplifiedSubrule = simplified->subrules[1];
- EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op);
- EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key);
- ASSERT_EQ(1u, simplifiedSubrule->longArgs.size());
- EXPECT_EQ(8, simplifiedSubrule->longArgs[0]);
+ sp<Rule> rule = new Rule(AndRule()
+ .add(AndRule()
+ .add(EqRule(Rule::SDK_VERSION, 7))
+ )
+ .add(EqRule(Rule::SDK_VERSION, 8))
+ );
+
+ EXPECT_RULES_EQ(Rule::simplify(rule),
+ AndRule()
+ .add(EqRule(Rule::SDK_VERSION, 7))
+ .add(EqRule(Rule::SDK_VERSION, 8))
+ );
}
} // namespace split
diff --git a/tools/split-select/TestRules.cpp b/tools/split-select/TestRules.cpp
new file mode 100644
index 0000000..86ccd6a
--- /dev/null
+++ b/tools/split-select/TestRules.cpp
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+
+#include "TestRules.h"
+
+#include <utils/String8.h>
+
+using android::String8;
+using android::sp;
+
+namespace split {
+namespace test {
+
+const Rule EqRule(Rule::Key key, long value) {
+ Rule rule;
+ rule.op = Rule::EQUALS;
+ rule.key = key;
+ rule.longArgs.add(value);
+ return rule;
+}
+
+const Rule GtRule(Rule::Key key, long value) {
+ Rule rule;
+ rule.op = Rule::GREATER_THAN;
+ rule.key = key;
+ rule.longArgs.add(value);
+ return rule;
+}
+
+const Rule LtRule(Rule::Key key, long value) {
+ Rule rule;
+ rule.op = Rule::LESS_THAN;
+ rule.key = key;
+ rule.longArgs.add(value);
+ return rule;
+}
+
+const Rule ContainsAnyRule(Rule::Key key, const char* str1) {
+ Rule rule;
+ rule.op = Rule::CONTAINS_ANY;
+ rule.key = key;
+ rule.stringArgs.add(String8(str1));
+ return rule;
+}
+
+const Rule ContainsAnyRule(Rule::Key key, const char* str1, const char* str2) {
+ Rule rule;
+ rule.op = Rule::CONTAINS_ANY;
+ rule.key = key;
+ rule.stringArgs.add(String8(str1));
+ rule.stringArgs.add(String8(str2));
+ return rule;
+}
+
+const Rule AlwaysTrue() {
+ Rule rule;
+ rule.op = Rule::ALWAYS_TRUE;
+ return rule;
+}
+
+::testing::AssertionResult RulePredFormat(
+ const char*, const char*,
+ const sp<Rule>& actual, const Rule& expected) {
+ const String8 expectedStr(expected.toJson());
+ const String8 actualStr(actual != NULL ? actual->toJson() : String8());
+
+ if (expectedStr != actualStr) {
+ return ::testing::AssertionFailure()
+ << "Expected: " << expectedStr.string() << "\n"
+ << " Actual: " << actualStr.string();
+ }
+ return ::testing::AssertionSuccess();
+}
+
+
+} // namespace test
+} // namespace split
diff --git a/tools/split-select/TestRules.h b/tools/split-select/TestRules.h
new file mode 100644
index 0000000..50b7ad1
--- /dev/null
+++ b/tools/split-select/TestRules.h
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+#ifndef H_AAPT_SPLIT_TEST_RULES
+#define H_AAPT_SPLIT_TEST_RULES
+
+#include "Rule.h"
+
+#include <gtest/gtest.h>
+
+namespace split {
+namespace test {
+
+struct AndRule : public Rule {
+ AndRule() {
+ op = Rule::AND_SUBRULES;
+ }
+
+ AndRule& add(const Rule& rhs) {
+ subrules.add(new Rule(rhs));
+ return *this;
+ }
+};
+
+struct OrRule : public Rule {
+ OrRule() {
+ op = Rule::OR_SUBRULES;
+ }
+
+ OrRule& add(const Rule& rhs) {
+ subrules.add(new Rule(rhs));
+ return *this;
+ }
+};
+
+const Rule EqRule(Rule::Key key, long value);
+const Rule LtRule(Rule::Key key, long value);
+const Rule GtRule(Rule::Key key, long value);
+const Rule ContainsAnyRule(Rule::Key key, const char* str1);
+const Rule ContainsAnyRule(Rule::Key key, const char* str1, const char* str2);
+const Rule AlwaysTrue();
+
+::testing::AssertionResult RulePredFormat(
+ const char* actualExpr, const char* expectedExpr,
+ const android::sp<Rule>& actual, const Rule& expected);
+
+#define EXPECT_RULES_EQ(actual, expected) \
+ EXPECT_PRED_FORMAT2(::split::test::RulePredFormat, actual, expected)
+
+} // namespace test
+} // namespace split
+
+#endif // H_AAPT_SPLIT_TEST_RULES
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 0db7658..0457dda 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -352,9 +352,9 @@ public class WifiConfiguration implements Parcelable {
/**
* @hide
- * last time we connected, this configuration had no internet access
+ * last time we connected, this configuration had validated internet access
*/
- public boolean noInternetAccess;
+ public boolean validatedInternetAccess;
/**
* @hide
@@ -642,6 +642,22 @@ public class WifiConfiguration implements Parcelable {
/**
* @hide
+ * Number of reports indicating no Internet Access
+ */
+ public int numNoInternetAccessReports;
+
+ /**
+ * @hide
+ * The WiFi configuration is considered to have no internet access for purpose of autojoining
+ * if there has been a report of it having no internet access, and, it never have had
+ * internet access in the past.
+ */
+ public boolean hasNoInternetAccess() {
+ return numNoInternetAccessReports > 0 && !validatedInternetAccess;
+ }
+
+ /**
+ * @hide
* Last time we blacklisted the configuration
*/
public long blackListTimestamp;
@@ -827,7 +843,7 @@ public class WifiConfiguration implements Parcelable {
selfAdded = false;
didSelfAdd = false;
ephemeral = false;
- noInternetAccess = false;
+ validatedInternetAccess = false;
mIpConfiguration = new IpConfiguration();
}
@@ -974,11 +990,15 @@ public class WifiConfiguration implements Parcelable {
if (this.numAssociation > 0) {
sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
}
+ if (this.numNoInternetAccessReports > 0) {
+ sbuf.append(" numNoInternetAccessReports ");
+ sbuf.append(this.numNoInternetAccessReports).append("\n");
+ }
if (this.didSelfAdd) sbuf.append(" didSelfAdd");
if (this.selfAdded) sbuf.append(" selfAdded");
- if (this.noInternetAccess) sbuf.append(" noInternetAccess");
+ if (this.validatedInternetAccess) sbuf.append(" validatedInternetAccess");
if (this.ephemeral) sbuf.append(" ephemeral");
- if (this.didSelfAdd || this.selfAdded || this.noInternetAccess || this.ephemeral) {
+ if (this.didSelfAdd || this.selfAdded || this.validatedInternetAccess || this.ephemeral) {
sbuf.append("\n");
}
sbuf.append(" KeyMgmt:");
@@ -1434,7 +1454,7 @@ public class WifiConfiguration implements Parcelable {
mCachedConfigKey = null; //force null configKey
autoJoinStatus = source.autoJoinStatus;
selfAdded = source.selfAdded;
- noInternetAccess = source.noInternetAccess;
+ validatedInternetAccess = source.validatedInternetAccess;
ephemeral = source.ephemeral;
if (source.visibility != null) {
visibility = new Visibility(source.visibility);
@@ -1468,6 +1488,7 @@ public class WifiConfiguration implements Parcelable {
= source.autoJoinUseAggressiveJoinAttemptThreshold;
autoJoinBailedDueToLowRssi = source.autoJoinBailedDueToLowRssi;
dirty = source.dirty;
+ numNoInternetAccessReports = source.numNoInternetAccessReports;
}
}
@@ -1511,7 +1532,7 @@ public class WifiConfiguration implements Parcelable {
dest.writeInt(autoJoinStatus);
dest.writeInt(selfAdded ? 1 : 0);
dest.writeInt(didSelfAdd ? 1 : 0);
- dest.writeInt(noInternetAccess ? 1 : 0);
+ dest.writeInt(validatedInternetAccess ? 1 : 0);
dest.writeInt(ephemeral ? 1 : 0);
dest.writeInt(creatorUid);
dest.writeInt(lastConnectUid);
@@ -1533,6 +1554,7 @@ public class WifiConfiguration implements Parcelable {
dest.writeInt(numUserTriggeredJoinAttempts);
dest.writeInt(autoJoinUseAggressiveJoinAttemptThreshold);
dest.writeInt(autoJoinBailedDueToLowRssi ? 1 : 0);
+ dest.writeInt(numNoInternetAccessReports);
}
/** Implement the Parcelable interface {@hide} */
@@ -1572,7 +1594,7 @@ public class WifiConfiguration implements Parcelable {
config.autoJoinStatus = in.readInt();
config.selfAdded = in.readInt() != 0;
config.didSelfAdd = in.readInt() != 0;
- config.noInternetAccess = in.readInt() != 0;
+ config.validatedInternetAccess = in.readInt() != 0;
config.ephemeral = in.readInt() != 0;
config.creatorUid = in.readInt();
config.lastConnectUid = in.readInt();
@@ -1594,6 +1616,7 @@ public class WifiConfiguration implements Parcelable {
config.numUserTriggeredJoinAttempts = in.readInt();
config.autoJoinUseAggressiveJoinAttemptThreshold = in.readInt();
config.autoJoinBailedDueToLowRssi = in.readInt() != 0;
+ config.numNoInternetAccessReports = in.readInt();
return config;
}