Merge "Prevent crash from null ApplicationInfo after package is removed." into nyc-dev
diff --git a/api/system-current.txt b/api/system-current.txt
index 3a2f29b..8240407 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -169,6 +169,7 @@
field public static final java.lang.String READ_INSTALL_SESSIONS = "android.permission.READ_INSTALL_SESSIONS";
field public static final java.lang.String READ_LOGS = "android.permission.READ_LOGS";
field public static final java.lang.String READ_NETWORK_USAGE_HISTORY = "android.permission.READ_NETWORK_USAGE_HISTORY";
+ field public static final java.lang.String READ_OEM_UNLOCK_STATE = "android.permission.READ_OEM_UNLOCK_STATE";
field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
field public static final java.lang.String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
field public static final java.lang.String READ_SEARCH_INDEXABLES = "android.permission.READ_SEARCH_INDEXABLES";
diff --git a/compiled-classes-phone b/compiled-classes-phone
index d6dab89..221d687 100644
--- a/compiled-classes-phone
+++ b/compiled-classes-phone
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2014 The Android Open Source Project
+# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -62,8 +62,6 @@
android.accounts.AuthenticatorDescription
android.accounts.AuthenticatorDescription$1
android.accounts.AuthenticatorException
-android.accounts.ChooseTypeAndAccountActivity
-android.accounts.ChooseTypeAndAccountActivity$1
android.accounts.IAccountAuthenticator
android.accounts.IAccountAuthenticator$Stub
android.accounts.IAccountAuthenticator$Stub$Proxy
@@ -141,6 +139,7 @@
android.animation.TypeEvaluator
android.animation.ValueAnimator
android.animation.ValueAnimator$AnimatorUpdateListener
+android.annotation.TargetApi
android.app.ActionBar
android.app.ActionBar$LayoutParams
android.app.ActionBar$OnMenuVisibilityListener
@@ -191,7 +190,6 @@
android.app.ActivityThread$ApplicationThread
android.app.ActivityThread$BindServiceData
android.app.ActivityThread$ContextCleanupInfo
-android.app.ActivityThread$CreateBackupAgentData
android.app.ActivityThread$CreateServiceData
android.app.ActivityThread$DropBoxReporter
android.app.ActivityThread$EventLoggingReporter
@@ -214,8 +212,8 @@
android.app.ActivityTransitionCoordinator$FixedEpicenterCallback
android.app.ActivityTransitionCoordinator$SharedElementOriginalState
android.app.ActivityTransitionState
-android.app.ActivityTransitionState$1
android.app.AlarmManager$AlarmClockInfo
+android.app.AlarmManager$AlarmClockInfo$1
android.app.AlarmManager$ListenerWrapper
android.app.AlarmManager$OnAlarmListener
android.app.AlertDialog
@@ -242,7 +240,6 @@
android.app.ApplicationThreadNative
android.app.ApplicationThreadProxy
android.app.AutomaticZenRule
-android.app.AutomaticZenRule$1
android.app.BackStackRecord
android.app.BackStackRecord$Op
android.app.BackStackRecord$TransitionState
@@ -264,7 +261,6 @@
android.app.DownloadManager$Request
android.app.EnterTransitionCoordinator
android.app.EnterTransitionCoordinator$1
-android.app.EnterTransitionCoordinator$2
android.app.EnterTransitionCoordinator$4
android.app.EnterTransitionCoordinator$5
android.app.EnterTransitionCoordinator$5$1
@@ -279,7 +275,7 @@
android.app.Fragment
android.app.Fragment$1
android.app.Fragment$SavedState
-android.app.Fragment$SavedState$1
+android.app.FragmentBreadCrumbs
android.app.FragmentContainer
android.app.FragmentController
android.app.FragmentHostCallback
@@ -290,6 +286,7 @@
android.app.FragmentManagerImpl$1
android.app.FragmentManagerImpl$2
android.app.FragmentManagerImpl$3
+android.app.FragmentManagerImpl$4
android.app.FragmentManagerImpl$5
android.app.FragmentManagerImpl$AnimateOnHWLayerIfNeededListener
android.app.FragmentManagerState
@@ -316,9 +313,6 @@
android.app.IAppTask$Stub
android.app.IAppTask$Stub$Proxy
android.app.IApplicationThread
-android.app.IBackupAgent
-android.app.IBackupAgent$Stub
-android.app.IBackupAgent$Stub$Proxy
android.app.IInstrumentationWatcher
android.app.IInstrumentationWatcher$Stub
android.app.INotificationManager
@@ -397,6 +391,7 @@
android.app.Notification$Extender
android.app.Notification$InboxStyle
android.app.Notification$MediaStyle
+android.app.Notification$MessagingStyle
android.app.Notification$Style
android.app.Notification$WearableExtender
android.app.NotificationManager
@@ -545,8 +540,6 @@
android.app.assist.AssistContent
android.app.assist.AssistStructure
android.app.backup.BackupAgent
-android.app.backup.BackupAgent$BackupServiceBinder
-android.app.backup.BackupAgent$SharedPrefsSynchronizer
android.app.backup.BackupAgentHelper
android.app.backup.BackupDataInput
android.app.backup.BackupDataInput$EntityHeader
@@ -587,8 +580,8 @@
android.app.job.JobParameters$1
android.app.job.JobScheduler
android.app.job.JobService
-android.app.job.JobService$1
android.app.job.JobService$JobHandler
+android.app.job.JobService$JobInterface
android.app.trust.IStrongAuthTracker
android.app.trust.IStrongAuthTracker$Stub
android.app.trust.IStrongAuthTracker$Stub$Proxy
@@ -630,26 +623,36 @@
android.bluetooth.BluetoothA2dp$1
android.bluetooth.BluetoothA2dp$2
android.bluetooth.BluetoothActivityEnergyInfo
+android.bluetooth.BluetoothActivityEnergyInfo$1
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothAdapter$1
+android.bluetooth.BluetoothAdapter$2
android.bluetooth.BluetoothAdapter$BluetoothStateChangeCallback
android.bluetooth.BluetoothAdapter$LeScanCallback
+android.bluetooth.BluetoothAudioConfig
android.bluetooth.BluetoothClass
android.bluetooth.BluetoothClass$1
android.bluetooth.BluetoothDevice
android.bluetooth.BluetoothDevice$1
android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothGattCallbackWrapper
+android.bluetooth.BluetoothGattCharacteristic
+android.bluetooth.BluetoothGattDescriptor
+android.bluetooth.BluetoothGattService
android.bluetooth.BluetoothHeadset
android.bluetooth.BluetoothHeadset$1
android.bluetooth.BluetoothHeadset$2
android.bluetooth.BluetoothHeadset$3
+android.bluetooth.BluetoothHealthAppConfiguration
android.bluetooth.BluetoothInputDevice
android.bluetooth.BluetoothInputDevice$1
android.bluetooth.BluetoothInputDevice$2
+android.bluetooth.BluetoothInputStream
android.bluetooth.BluetoothManager
android.bluetooth.BluetoothMap
android.bluetooth.BluetoothMap$1
android.bluetooth.BluetoothMap$2
+android.bluetooth.BluetoothOutputStream
android.bluetooth.BluetoothPan
android.bluetooth.BluetoothPan$1
android.bluetooth.BluetoothPan$2
@@ -660,6 +663,8 @@
android.bluetooth.BluetoothProfile
android.bluetooth.BluetoothProfile$ServiceListener
android.bluetooth.BluetoothServerSocket
+android.bluetooth.BluetoothSocket
+android.bluetooth.BluetoothSocket$SocketState
android.bluetooth.BluetoothUuid
android.bluetooth.IBluetooth
android.bluetooth.IBluetooth$Stub
@@ -667,16 +672,29 @@
android.bluetooth.IBluetoothA2dp
android.bluetooth.IBluetoothA2dp$Stub
android.bluetooth.IBluetoothA2dp$Stub$Proxy
+android.bluetooth.IBluetoothA2dpSink
+android.bluetooth.IBluetoothA2dpSink$Stub
android.bluetooth.IBluetoothCallback
android.bluetooth.IBluetoothCallback$Stub
+android.bluetooth.IBluetoothCallback$Stub$Proxy
android.bluetooth.IBluetoothGatt
android.bluetooth.IBluetoothGatt$Stub
android.bluetooth.IBluetoothGatt$Stub$Proxy
+android.bluetooth.IBluetoothGattCallback
+android.bluetooth.IBluetoothGattCallback$Stub
+android.bluetooth.IBluetoothGattCallback$Stub$Proxy
+android.bluetooth.IBluetoothGattServerCallback
android.bluetooth.IBluetoothHeadset
android.bluetooth.IBluetoothHeadset$Stub
android.bluetooth.IBluetoothHeadset$Stub$Proxy
+android.bluetooth.IBluetoothHeadsetClient
+android.bluetooth.IBluetoothHeadsetClient$Stub
android.bluetooth.IBluetoothHeadsetPhone
android.bluetooth.IBluetoothHeadsetPhone$Stub
+android.bluetooth.IBluetoothHeadsetPhone$Stub$Proxy
+android.bluetooth.IBluetoothHealth
+android.bluetooth.IBluetoothHealth$Stub
+android.bluetooth.IBluetoothHealthCallback
android.bluetooth.IBluetoothInputDevice
android.bluetooth.IBluetoothInputDevice$Stub
android.bluetooth.IBluetoothInputDevice$Stub$Proxy
@@ -695,19 +713,41 @@
android.bluetooth.IBluetoothPbap
android.bluetooth.IBluetoothPbap$Stub
android.bluetooth.IBluetoothPbap$Stub$Proxy
+android.bluetooth.IBluetoothPbapClient
+android.bluetooth.IBluetoothPbapClient$Stub
android.bluetooth.IBluetoothProfileServiceConnection
android.bluetooth.IBluetoothProfileServiceConnection$Stub
android.bluetooth.IBluetoothProfileServiceConnection$Stub$Proxy
+android.bluetooth.IBluetoothSap
+android.bluetooth.IBluetoothSap$Stub
android.bluetooth.IBluetoothStateChangeCallback
android.bluetooth.IBluetoothStateChangeCallback$Stub
android.bluetooth.IBluetoothStateChangeCallback$Stub$Proxy
android.bluetooth.OobData
+android.bluetooth.SdpMasRecord
+android.bluetooth.SdpMnsRecord
+android.bluetooth.SdpOppOpsRecord
+android.bluetooth.SdpPseRecord
+android.bluetooth.SdpRecord
+android.bluetooth.SdpSapsRecord
+android.bluetooth.UidTraffic
+android.bluetooth.UidTraffic$1
+android.bluetooth.le.AdvertiseData
+android.bluetooth.le.AdvertiseSettings
android.bluetooth.le.BluetoothLeAdvertiser
android.bluetooth.le.BluetoothLeScanner
+android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper
+android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1
+android.bluetooth.le.BluetoothLeUtils
android.bluetooth.le.ScanCallback
android.bluetooth.le.ScanFilter
+android.bluetooth.le.ScanFilter$1
android.bluetooth.le.ScanFilter$Builder
+android.bluetooth.le.ScanRecord
+android.bluetooth.le.ScanResult
+android.bluetooth.le.ScanResult$1
android.bluetooth.le.ScanSettings
+android.bluetooth.le.ScanSettings$1
android.bluetooth.le.ScanSettings$Builder
android.content.AbstractThreadedSyncAdapter
android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
@@ -739,7 +779,6 @@
android.content.ContentProvider$Transport
android.content.ContentProviderClient
android.content.ContentProviderClient$CursorWrapperInner
-android.content.ContentProviderClient$NotRespondingRunnable
android.content.ContentProviderNative
android.content.ContentProviderOperation
android.content.ContentProviderOperation$1
@@ -819,6 +858,7 @@
android.content.PeriodicSync$1
android.content.ReceiverCallNotAllowedException
android.content.RestrictionEntry
+android.content.RestrictionEntry$1
android.content.RestrictionsManager
android.content.SearchRecentSuggestionsProvider
android.content.SearchRecentSuggestionsProvider$DatabaseHelper
@@ -975,7 +1015,6 @@
android.content.pm.RegisteredServicesCache$1
android.content.pm.RegisteredServicesCache$2
android.content.pm.RegisteredServicesCache$3
-android.content.pm.RegisteredServicesCache$4
android.content.pm.RegisteredServicesCache$ServiceInfo
android.content.pm.RegisteredServicesCache$UserServices
android.content.pm.RegisteredServicesCacheListener
@@ -983,7 +1022,6 @@
android.content.pm.ResolveInfo$1
android.content.pm.ServiceInfo
android.content.pm.ServiceInfo$1
-android.content.pm.ShortcutInfo
android.content.pm.ShortcutManager
android.content.pm.ShortcutServiceInternal
android.content.pm.ShortcutServiceInternal$ShortcutChangeListener
@@ -1119,9 +1157,15 @@
android.ddm.DdmHandleThread
android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
+android.drm.DrmErrorEvent
+android.drm.DrmEvent
+android.drm.DrmInfoEvent
android.drm.DrmManagerClient
android.drm.DrmManagerClient$EventHandler
android.drm.DrmManagerClient$InfoHandler
+android.drm.DrmManagerClient$OnErrorListener
+android.drm.DrmManagerClient$OnEventListener
+android.drm.DrmManagerClient$OnInfoListener
android.drm.DrmOutputStream
android.drm.DrmSupportInfo
android.graphics.Atlas
@@ -1356,7 +1400,6 @@
android.hardware.Sensor
android.hardware.SensorEvent
android.hardware.SensorEventListener
-android.hardware.SensorEventListener2
android.hardware.SensorManager
android.hardware.SerialManager
android.hardware.SerialPort
@@ -1626,21 +1669,15 @@
android.hardware.location.ContextHubManager
android.hardware.location.ContextHubService
android.hardware.location.GeofenceHardware
-android.hardware.location.GeofenceHardware$GeofenceHardwareCallbackWrapper
android.hardware.location.GeofenceHardware$GeofenceHardwareMonitorCallbackWrapper
android.hardware.location.GeofenceHardwareCallback
android.hardware.location.GeofenceHardwareImpl
android.hardware.location.GeofenceHardwareImpl$1
android.hardware.location.GeofenceHardwareImpl$2
android.hardware.location.GeofenceHardwareImpl$3
-android.hardware.location.GeofenceHardwareImpl$GeofenceTransition
android.hardware.location.GeofenceHardwareImpl$Reaper
android.hardware.location.GeofenceHardwareMonitorCallback
-android.hardware.location.GeofenceHardwareMonitorEvent
-android.hardware.location.GeofenceHardwareMonitorEvent$1
-android.hardware.location.GeofenceHardwareRequest
android.hardware.location.GeofenceHardwareRequestParcelable
-android.hardware.location.GeofenceHardwareRequestParcelable$1
android.hardware.location.GeofenceHardwareService
android.hardware.location.GeofenceHardwareService$1
android.hardware.location.IActivityRecognitionHardware
@@ -1664,9 +1701,6 @@
android.hardware.location.IGeofenceHardware
android.hardware.location.IGeofenceHardware$Stub
android.hardware.location.IGeofenceHardware$Stub$Proxy
-android.hardware.location.IGeofenceHardwareCallback
-android.hardware.location.IGeofenceHardwareCallback$Stub
-android.hardware.location.IGeofenceHardwareCallback$Stub$Proxy
android.hardware.location.IGeofenceHardwareMonitorCallback
android.hardware.location.IGeofenceHardwareMonitorCallback$Stub
android.hardware.location.IGeofenceHardwareMonitorCallback$Stub$Proxy
@@ -1738,6 +1772,10 @@
android.hardware.usb.UsbRequest
android.icu.impl.BMPSet
android.icu.impl.CacheBase
+android.icu.impl.CacheValue
+android.icu.impl.CacheValue$NullValue
+android.icu.impl.CacheValue$SoftValue
+android.icu.impl.CacheValue$Strength
android.icu.impl.CalendarData
android.icu.impl.CalendarUtil
android.icu.impl.CharTrie
@@ -1845,7 +1883,6 @@
android.icu.impl.SimpleCache
android.icu.impl.SimplePatternFormatter
android.icu.impl.SoftCache
-android.icu.impl.SoftCache$SettableSoftReference
android.icu.impl.StandardPlural
android.icu.impl.StringPrepDataReader
android.icu.impl.TextTrieMap
@@ -1962,15 +1999,7 @@
android.icu.text.AlphabeticIndex$BucketList
android.icu.text.AlphabeticIndex$ImmutableIndex
android.icu.text.Bidi
-android.icu.text.Bidi$BracketData
android.icu.text.Bidi$ImpTabPair
-android.icu.text.Bidi$InsertPoints
-android.icu.text.Bidi$IsoRun
-android.icu.text.Bidi$LevState
-android.icu.text.Bidi$Opening
-android.icu.text.Bidi$Point
-android.icu.text.BidiLine
-android.icu.text.BidiRun
android.icu.text.BreakIterator
android.icu.text.BreakIterator$BreakIteratorCache
android.icu.text.BreakIterator$BreakIteratorServiceShim
@@ -2009,6 +2038,8 @@
android.icu.text.DecimalFormat
android.icu.text.DecimalFormat$Unit
android.icu.text.DecimalFormatSymbols
+android.icu.text.DecimalFormatSymbols$1
+android.icu.text.DecimalFormatSymbols$CacheData
android.icu.text.DigitList
android.icu.text.DisplayContext
android.icu.text.DisplayContext$Type
@@ -2187,13 +2218,11 @@
android.location.Country$1
android.location.CountryDetector
android.location.CountryDetector$ListenerTransport
-android.location.CountryDetector$ListenerTransport$1
android.location.CountryListener
android.location.Criteria
android.location.Criteria$1
android.location.FusedBatchOptions
android.location.FusedBatchOptions$1
-android.location.FusedBatchOptions$SourceTechnologies
android.location.Geocoder
android.location.GeocoderParams
android.location.GeocoderParams$1
@@ -2203,11 +2232,7 @@
android.location.GnssNavigationMessageCallbackTransport
android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
android.location.GnssStatus
-android.location.GnssStatusCallback
-android.location.GpsMeasurementsEvent
-android.location.GpsMeasurementsEvent$Listener
-android.location.GpsNavigationMessageEvent
-android.location.GpsNavigationMessageEvent$Listener
+android.location.GnssStatus$Callback
android.location.GpsSatellite
android.location.GpsStatus
android.location.GpsStatus$1
@@ -2265,7 +2290,6 @@
android.location.LocationProvider
android.location.LocationRequest
android.location.LocationRequest$1
-android.location.SettingInjectorService
android.media.AmrInputStream
android.media.AudioAttributes
android.media.AudioAttributes$1
@@ -2322,8 +2346,10 @@
android.media.EncoderCapabilities
android.media.ExifInterface
android.media.ExifInterface$ByteOrderAwarenessDataInputStream
-android.media.ExifInterface$ExifDataOutputStream
+android.media.ExifInterface$ByteOrderAwarenessDataOutputStream
+android.media.ExifInterface$ExifAttribute
android.media.ExifInterface$ExifTag
+android.media.ExifInterface$Rational
android.media.IAudioFocusDispatcher
android.media.IAudioFocusDispatcher$Stub
android.media.IAudioFocusDispatcher$Stub$Proxy
@@ -2343,10 +2369,6 @@
android.media.IMediaRouterService
android.media.IMediaRouterService$Stub
android.media.IMediaRouterService$Stub$Proxy
-android.media.IMediaScannerListener
-android.media.IMediaScannerListener$Stub
-android.media.IMediaScannerService
-android.media.IMediaScannerService$Stub
android.media.IRecordingConfigDispatcher
android.media.IRecordingConfigDispatcher$Stub
android.media.IRemoteVolumeController
@@ -2403,6 +2425,7 @@
android.media.MediaDescription$Builder
android.media.MediaDrm
android.media.MediaDrm$Certificate
+android.media.MediaDrm$CryptoSession
android.media.MediaDrm$EventHandler
android.media.MediaDrm$KeyRequest
android.media.MediaDrm$MediaDrmStateException
@@ -2415,7 +2438,6 @@
android.media.MediaFormat
android.media.MediaHTTPConnection
android.media.MediaHTTPService
-android.media.MediaInserter
android.media.MediaMetadata
android.media.MediaMetadata$1
android.media.MediaMetadata$Builder
@@ -2457,7 +2479,6 @@
android.media.MediaRouter$Static$Client$1
android.media.MediaRouter$UserRouteInfo
android.media.MediaRouter$VolumeCallback
-android.media.MediaRouter$VolumeCallbackInfo
android.media.MediaRouter$VolumeChangeReceiver
android.media.MediaRouter$WifiDisplayStatusChangedReceiver
android.media.MediaRouterClientState
@@ -2465,12 +2486,7 @@
android.media.MediaRouterClientState$RouteInfo
android.media.MediaRouterClientState$RouteInfo$1
android.media.MediaScanner
-android.media.MediaScanner$FileEntry
-android.media.MediaScanner$MediaBulkDeleter
-android.media.MediaScanner$MyMediaScannerClient
-android.media.MediaScannerClient
android.media.MediaScannerConnection
-android.media.MediaScannerConnection$1
android.media.MediaScannerConnection$MediaScannerConnectionClient
android.media.MediaScannerConnection$OnScanCompletedListener
android.media.MediaSync
@@ -2481,12 +2497,13 @@
android.media.NotProvisionedException
android.media.PlaybackParams
android.media.PlaybackParams$1
+android.media.PlayerBase
+android.media.PlayerBase$1
android.media.Rating
android.media.Rating$1
android.media.RemoteControlClient
android.media.RemoteControlClient$MetadataEditor
android.media.RemoteControlClient$OnMetadataUpdateListener
-android.media.RemoteControlClient$OnPlaybackPositionUpdateListener
android.media.RemoteDisplay
android.media.ResampleInputStream
android.media.Ringtone
@@ -2530,7 +2547,6 @@
android.media.audiofx.Virtualizer
android.media.audiofx.Virtualizer$Settings
android.media.audiofx.Visualizer
-android.media.audiofx.Visualizer$OnDataCaptureListener
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
@@ -2607,7 +2623,6 @@
android.media.tv.TvInputManager
android.media.tv.TvStreamConfig
android.media.tv.TvStreamConfig$Builder
-android.mtp.MtpConstants
android.mtp.MtpDatabase
android.mtp.MtpDevice
android.mtp.MtpDeviceInfo
@@ -2645,6 +2660,7 @@
android.net.IConnectivityManager$Stub$Proxy
android.net.IConnectivityMetricsLogger
android.net.IConnectivityMetricsLogger$Stub
+android.net.IConnectivityMetricsLogger$Stub$Proxy
android.net.IEthernetManager
android.net.IEthernetManager$Stub
android.net.IEthernetServiceListener
@@ -2661,6 +2677,7 @@
android.net.INetworkScoreCache$Stub
android.net.INetworkScoreService
android.net.INetworkScoreService$Stub
+android.net.INetworkScoreService$Stub$Proxy
android.net.INetworkStatsService
android.net.INetworkStatsService$Stub
android.net.INetworkStatsService$Stub$Proxy
@@ -2736,6 +2753,7 @@
android.net.ProxyInfo$1
android.net.RouteInfo
android.net.RouteInfo$1
+android.net.RssiCurve
android.net.SSLCertificateSocketFactory
android.net.SSLCertificateSocketFactory$1
android.net.SSLSessionCache
@@ -2759,6 +2777,7 @@
android.net.Uri$PathSegmentsBuilder
android.net.Uri$StringUri
android.net.UrlQuerySanitizer
+android.net.UrlQuerySanitizer$ValueSanitizer
android.net.WebAddress
android.net.WifiKey
android.net.WifiKey$1
@@ -2771,19 +2790,22 @@
android.net.http.SslCertificate
android.net.http.SslError
android.net.http.X509TrustManagerExtensions
-android.net.metrics.CaptivePortalCheckResultEvent
-android.net.metrics.CaptivePortalCheckResultEvent$1
-android.net.metrics.CaptivePortalStateChangeEvent
-android.net.metrics.CaptivePortalStateChangeEvent$1
-android.net.metrics.ConnectivityServiceChangeEvent
-android.net.metrics.ConnectivityServiceChangeEvent$1
+android.net.metrics.DefaultNetworkEvent
+android.net.metrics.DefaultNetworkEvent$1
android.net.metrics.DhcpClientEvent
android.net.metrics.DhcpClientEvent$1
+android.net.metrics.DnsEvent
+android.net.metrics.DnsEvent$1
android.net.metrics.IpConnectivityEvent
-android.net.metrics.IpReachabilityMonitorMessageEvent
-android.net.metrics.IpReachabilityMonitorMessageEvent$1
-android.net.metrics.IpReachabilityMonitorProbeEvent
-android.net.metrics.IpReachabilityMonitorProbeEvent$1
+android.net.metrics.IpManagerEvent
+android.net.metrics.IpManagerEvent$1
+android.net.metrics.IpReachabilityEvent
+android.net.metrics.IpReachabilityEvent$1
+android.net.metrics.NetworkEvent
+android.net.metrics.NetworkEvent$1
+android.net.metrics.ValidationProbeEvent
+android.net.metrics.ValidationProbeEvent$1
+android.net.metrics.ValidationProbeEvent$Decoder
android.net.nsd.INsdManager
android.net.nsd.INsdManager$Stub
android.net.nsd.NsdManager
@@ -2792,7 +2814,6 @@
android.net.sip.SipManager
android.net.sip.SipProfile
android.net.sip.SipProfile$Builder
-android.net.wifi.AnqpInformationElement
android.net.wifi.IRttManager
android.net.wifi.IRttManager$Stub
android.net.wifi.IRttManager$Stub$Proxy
@@ -2802,7 +2823,6 @@
android.net.wifi.IWifiScanner
android.net.wifi.IWifiScanner$Stub
android.net.wifi.IWifiScanner$Stub$Proxy
-android.net.wifi.RssiPacketCountInfo
android.net.wifi.RttManager
android.net.wifi.RttManager$RttCapabilities
android.net.wifi.RttManager$RttCapabilities$1
@@ -2817,7 +2837,6 @@
android.net.wifi.SupplicantState$1
android.net.wifi.WifiActivityEnergyInfo
android.net.wifi.WifiActivityEnergyInfo$1
-android.net.wifi.WifiChannel
android.net.wifi.WifiConfiguration
android.net.wifi.WifiConfiguration$1
android.net.wifi.WifiConfiguration$AuthAlgorithm
@@ -2849,7 +2868,7 @@
android.net.wifi.WifiScanner$OperationResult$1
android.net.wifi.WifiScanner$ParcelableScanData
android.net.wifi.WifiScanner$ParcelableScanData$1
-android.net.wifi.WifiScanner$PnoSettings$PnoNetwork
+android.net.wifi.WifiScanner$PnoScanListener
android.net.wifi.WifiScanner$ScanData
android.net.wifi.WifiScanner$ScanData$1
android.net.wifi.WifiScanner$ScanListener
@@ -2858,10 +2877,8 @@
android.net.wifi.WifiScanner$ServiceHandler
android.net.wifi.WifiSsid
android.net.wifi.WifiSsid$1
-android.net.wifi.WifiWakeReasonAndCounts
android.net.wifi.WpsInfo
android.net.wifi.WpsInfo$1
-android.net.wifi.WpsResult
android.net.wifi.nan.WifiNanManager
android.net.wifi.p2p.IWifiP2pManager
android.net.wifi.p2p.IWifiP2pManager$Stub
@@ -2904,6 +2921,7 @@
android.nfc.INfcTag$Stub
android.nfc.INfcTag$Stub$Proxy
android.nfc.INfcUnlockHandler
+android.nfc.ITagRemovedCallback
android.nfc.NdefMessage
android.nfc.NdefRecord
android.nfc.NfcActivityManager
@@ -2943,7 +2961,6 @@
android.opengl.EGLSurface
android.opengl.ETC1
android.opengl.ETC1Util
-android.opengl.GLDebugHelper
android.opengl.GLES10
android.opengl.GLES10Ext
android.opengl.GLES11
@@ -2965,7 +2982,6 @@
android.opengl.GLSurfaceView$GLThread
android.opengl.GLSurfaceView$GLThreadManager
android.opengl.GLSurfaceView$Renderer
-android.opengl.GLSurfaceView$SimpleEGLConfigChooser
android.opengl.GLU
android.opengl.GLUtils
android.opengl.Matrix
@@ -2982,6 +2998,7 @@
android.os.AsyncTask$WorkerRunnable
android.os.BadParcelableException
android.os.BaseBundle
+android.os.BaseBundle$NoImagePreloadHolder
android.os.BatteryManager
android.os.BatteryManagerInternal
android.os.BatteryProperties
@@ -2989,7 +3006,6 @@
android.os.BatteryStats
android.os.BatteryStats$BitDescription
android.os.BatteryStats$ControllerActivityCounter
-android.os.BatteryStats$Counter
android.os.BatteryStats$DailyItem
android.os.BatteryStats$HistoryEventTracker
android.os.BatteryStats$HistoryItem
@@ -3077,9 +3093,11 @@
android.os.IProgressListener$Stub
android.os.IRecoverySystem
android.os.IRecoverySystem$Stub
+android.os.IRecoverySystem$Stub$Proxy
android.os.IRecoverySystemProgressListener
android.os.IRemoteCallback
android.os.IRemoteCallback$Stub
+android.os.IRemoteCallback$Stub$Proxy
android.os.ISchedulingPolicyService
android.os.ISchedulingPolicyService$Stub
android.os.IServiceManager
@@ -3091,6 +3109,8 @@
android.os.IVibratorService
android.os.IVibratorService$Stub
android.os.IVibratorService$Stub$Proxy
+android.os.LocaleList
+android.os.LocaleList$1
android.os.Looper
android.os.MemoryFile
android.os.Message
@@ -3101,6 +3121,7 @@
android.os.MessageQueue$OnFileDescriptorEventListener
android.os.Messenger
android.os.Messenger$1
+android.os.NetworkOnMainThreadException
android.os.NullVibrator
android.os.OperationCanceledException
android.os.Parcel
@@ -3135,6 +3156,7 @@
android.os.Process$ProcessStartResult
android.os.Process$ZygoteState
android.os.RecoverySystem
+android.os.RecoverySystem$ProgressListener
android.os.Registrant
android.os.RegistrantList
android.os.RemoteCallback
@@ -3170,7 +3192,6 @@
android.os.StrictMode$Span
android.os.StrictMode$StrictModeDiskReadViolation
android.os.StrictMode$StrictModeDiskWriteViolation
-android.os.StrictMode$StrictModeResourceMismatchViolation
android.os.StrictMode$StrictModeViolation
android.os.StrictMode$ThreadPolicy
android.os.StrictMode$ThreadPolicy$Builder
@@ -3178,6 +3199,8 @@
android.os.StrictMode$ViolationInfo
android.os.StrictMode$VmPolicy
android.os.StrictMode$VmPolicy$Builder
+android.os.SynchronousResultReceiver
+android.os.SynchronousResultReceiver$Result
android.os.SystemClock
android.os.SystemProperties
android.os.SystemService
@@ -3190,6 +3213,7 @@
android.os.Trace
android.os.Trace$1
android.os.TransactionTooLargeException
+android.os.TransactionTracker
android.os.UEventObserver
android.os.UEventObserver$UEvent
android.os.UEventObserver$UEventThread
@@ -3241,9 +3265,6 @@
android.preference.PreferenceActivity$1
android.preference.PreferenceActivity$Header
android.preference.PreferenceActivity$Header$1
-android.preference.PreferenceActivity$HeaderAdapter
-android.preference.PreferenceActivity$HeaderAdapter$HeaderViewHolder
-android.preference.PreferenceCategory
android.preference.PreferenceFragment
android.preference.PreferenceFragment$1
android.preference.PreferenceFragment$2
@@ -3313,6 +3334,7 @@
android.print.PrintServicesLoader$1
android.print.PrintServicesLoader$MyHandler
android.print.PrinterId
+android.print.pdf.PrintedPdfDocument
android.printservice.IPrintServiceClient
android.printservice.IPrintServiceClient$Stub
android.printservice.PrintServiceInfo
@@ -3321,6 +3343,8 @@
android.provider.BaseColumns
android.provider.BlockedNumberContract
android.provider.BlockedNumberContract$BlockedNumbers
+android.provider.BlockedNumberContract$SystemContract
+android.provider.BlockedNumberContract$SystemContract$BlockSuppressionStatus
android.provider.CalendarContract
android.provider.CalendarContract$Attendees
android.provider.CalendarContract$AttendeesColumns
@@ -3349,9 +3373,6 @@
android.provider.CallLog
android.provider.CallLog$Calls
android.provider.Contacts
-android.provider.Contacts$ContactMethods
-android.provider.Contacts$ContactMethodsColumns
-android.provider.Contacts$PeopleColumns
android.provider.ContactsContract
android.provider.ContactsContract$AggregationExceptions
android.provider.ContactsContract$BaseSyncColumns
@@ -3426,7 +3447,6 @@
android.provider.MediaStore$Images$Thumbnails
android.provider.MediaStore$InternalThumbnails
android.provider.MediaStore$MediaColumns
-android.provider.MediaStore$Video
android.provider.MediaStore$Video$Media
android.provider.MediaStore$Video$Thumbnails
android.provider.MediaStore$Video$VideoColumns
@@ -3438,8 +3458,10 @@
android.provider.SearchRecentSuggestions
android.provider.SearchRecentSuggestions$1
android.provider.Settings
+android.provider.Settings$GenerationTracker
android.provider.Settings$Global
android.provider.Settings$NameValueCache
+android.provider.Settings$NameValueCache$-java_lang_String_getStringForUser_android_content_ContentResolver_cr_java_lang_String_name_int_userHandle_LambdaImpl0
android.provider.Settings$NameValueTable
android.provider.Settings$Secure
android.provider.Settings$SettingNotFoundException
@@ -3498,35 +3520,17 @@
android.security.KeyChain
android.security.KeyChain$1
android.security.KeyChain$KeyChainConnection
+android.security.KeyChainAliasCallback
android.security.KeyStore
-android.security.KeyStoreException
+android.security.KeyStore$State
android.security.NetworkSecurityPolicy
-android.security.keymaster.KeyCharacteristics
-android.security.keymaster.KeyCharacteristics$1
-android.security.keymaster.KeymasterArgument
-android.security.keymaster.KeymasterArgument$1
android.security.keymaster.KeymasterArguments
android.security.keymaster.KeymasterArguments$1
-android.security.keymaster.KeymasterBlobArgument
-android.security.keymaster.KeymasterBooleanArgument
-android.security.keymaster.KeymasterDateArgument
-android.security.keymaster.KeymasterDefs
-android.security.keymaster.KeymasterIntArgument
-android.security.keymaster.KeymasterLongArgument
-android.security.keymaster.OperationResult
-android.security.keymaster.OperationResult$1
android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
-android.security.keystore.AndroidKeyStoreCipherSpiBase
-android.security.keystore.AndroidKeyStoreKey
android.security.keystore.AndroidKeyStoreKeyGeneratorSpi
android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES
android.security.keystore.AndroidKeyStoreProvider
-android.security.keystore.AndroidKeyStoreSecretKey
-android.security.keystore.AndroidKeyStoreSecretKeyFactorySpi
android.security.keystore.AndroidKeyStoreSpi
-android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi
-android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC
-android.security.keystore.AndroidKeyStoreUnauthenticatedAESCipherSpi$CBC$PKCS7Padding
android.security.keystore.ArrayUtils
android.security.keystore.KeyGenParameterSpec
android.security.keystore.KeyGenParameterSpec$Builder
@@ -3534,17 +3538,8 @@
android.security.keystore.KeyPermanentlyInvalidatedException
android.security.keystore.KeyProperties
android.security.keystore.KeyProperties$BlockMode
-android.security.keystore.KeyProperties$Digest
android.security.keystore.KeyProperties$EncryptionPadding
-android.security.keystore.KeyProperties$KeyAlgorithm
-android.security.keystore.KeyProperties$Origin
android.security.keystore.KeyProperties$Purpose
-android.security.keystore.KeyStoreCryptoOperation
-android.security.keystore.KeyStoreCryptoOperationChunkedStreamer
-android.security.keystore.KeyStoreCryptoOperationChunkedStreamer$MainDataStream
-android.security.keystore.KeyStoreCryptoOperationChunkedStreamer$Stream
-android.security.keystore.KeyStoreCryptoOperationStreamer
-android.security.keystore.KeyStoreCryptoOperationUtils
android.security.keystore.KeymasterUtils
android.security.keystore.UserNotAuthenticatedException
android.security.keystore.Utils
@@ -3570,13 +3565,12 @@
android.security.net.config.RootTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
+android.security.net.config.TrustAnchor
android.security.net.config.TrustedCertificateStoreAdapter
android.security.net.config.UserCertificateSource
android.service.carrier.CarrierIdentifier
-android.service.carrier.CarrierIdentifier$1
android.service.carrier.ICarrierService
android.service.carrier.ICarrierService$Stub
-android.service.carrier.ICarrierService$Stub$Proxy
android.service.chooser.ChooserTarget
android.service.chooser.ChooserTargetService
android.service.dreams.DreamManagerInternal
@@ -3598,6 +3592,8 @@
android.service.gatekeeper.IGateKeeperService$Stub
android.service.gatekeeper.IGateKeeperService$Stub$Proxy
android.service.media.CameraPrewarmService
+android.service.media.MediaBrowserService
+android.service.notification.Adjustment
android.service.notification.Condition
android.service.notification.Condition$1
android.service.notification.ConditionProviderService
@@ -3620,7 +3616,6 @@
android.service.notification.NotificationListenerService$RankingMap
android.service.notification.NotificationListenerService$RankingMap$1
android.service.notification.NotificationRankerService
-android.service.notification.NotificationRankerService$Adjustment
android.service.notification.NotificationRankerService$MyHandler
android.service.notification.NotificationRankerService$NotificationRankingServiceWrapper
android.service.notification.NotificationRankingUpdate
@@ -3644,8 +3639,12 @@
android.service.quicksettings.IQSService$Stub
android.service.quicksettings.IQSTileService
android.service.quicksettings.Tile
+android.service.quicksettings.TileService
android.service.textservice.SpellCheckerService
android.service.textservice.SpellCheckerService$InternalISpellCheckerSession
+android.service.textservice.SpellCheckerService$SentenceLevelAdapter
+android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceTextInfoParams
+android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceWordItem
android.service.textservice.SpellCheckerService$Session
android.service.textservice.SpellCheckerService$SpellCheckerServiceBinder
android.service.trust.ITrustAgentService
@@ -3674,6 +3673,12 @@
android.service.voice.VoiceInteractionService$MyHandler
android.service.voice.VoiceInteractionServiceInfo
android.service.voice.VoiceInteractionSession
+android.service.vr.IVrManager
+android.service.vr.IVrManager$Stub
+android.service.vr.IVrManager$Stub$Proxy
+android.service.vr.IVrStateCallbacks
+android.service.vr.IVrStateCallbacks$Stub
+android.service.vr.IVrStateCallbacks$Stub$Proxy
android.service.wallpaper.IWallpaperConnection
android.service.wallpaper.IWallpaperConnection$Stub
android.service.wallpaper.IWallpaperConnection$Stub$Proxy
@@ -3751,6 +3756,7 @@
android.telecom.Call$8
android.telecom.Call$Callback
android.telecom.Call$Details
+android.telecom.Call$Listener
android.telecom.CallAudioState
android.telecom.CallAudioState$1
android.telecom.CallbackRecord
@@ -3760,7 +3766,6 @@
android.telecom.Connection
android.telecom.Connection$1
android.telecom.Connection$2
-android.telecom.Connection$FailureSignalingConnection
android.telecom.Connection$Listener
android.telecom.Connection$VideoProvider
android.telecom.ConnectionRequest
@@ -3806,33 +3811,35 @@
android.telecom.TelecomManager
android.telecom.VideoProfile
android.telecom.VideoProfile$1
+android.telecom.Voicemail
+android.telecom.Voicemail$Builder
android.telephony.CarrierConfigManager
+android.telephony.CellBroadcastMessage
+android.telephony.CellIdentityCdma
android.telephony.CellIdentityGsm
-android.telephony.CellIdentityGsm$1
android.telephony.CellIdentityLte
android.telephony.CellIdentityLte$1
android.telephony.CellIdentityWcdma
-android.telephony.CellIdentityWcdma$1
android.telephony.CellInfo
android.telephony.CellInfo$1
android.telephony.CellInfoCdma
android.telephony.CellInfoGsm
-android.telephony.CellInfoGsm$1
android.telephony.CellInfoLte
+android.telephony.CellInfoLte$1
android.telephony.CellInfoWcdma
-android.telephony.CellInfoWcdma$1
android.telephony.CellLocation
android.telephony.CellSignalStrength
android.telephony.CellSignalStrengthCdma
android.telephony.CellSignalStrengthGsm
-android.telephony.CellSignalStrengthGsm$1
android.telephony.CellSignalStrengthLte
+android.telephony.CellSignalStrengthLte$1
android.telephony.CellSignalStrengthWcdma
-android.telephony.CellSignalStrengthWcdma$1
android.telephony.DisconnectCause
android.telephony.IccOpenLogicalChannelResponse
android.telephony.ModemActivityInfo
android.telephony.ModemActivityInfo$1
+android.telephony.NeighboringCellInfo
+android.telephony.NeighboringCellInfo$1
android.telephony.PhoneNumberFormattingTextWatcher
android.telephony.PhoneNumberUtils
android.telephony.PhoneStateListener
@@ -3843,6 +3850,7 @@
android.telephony.PreciseDataConnectionState
android.telephony.PreciseDataConnectionState$1
android.telephony.RadioAccessFamily
+android.telephony.RadioAccessFamily$1
android.telephony.Rlog
android.telephony.ServiceState
android.telephony.ServiceState$1
@@ -3861,11 +3869,13 @@
android.telephony.TelephonyManager$MultiSimVariants
android.telephony.VoLteServiceState
android.telephony.VoLteServiceState$1
+android.telephony.cdma.CdmaCellLocation
android.telephony.gsm.GsmCellLocation
android.telephony.gsm.SmsMessage
android.text.AndroidBidi
android.text.AndroidCharacter
android.text.Annotation
+android.text.AutoText
android.text.BidiFormatter
android.text.BidiFormatter$DirectionalityEstimator
android.text.BoringLayout
@@ -3882,13 +3892,8 @@
android.text.Html$ImageGetter
android.text.Html$TagHandler
android.text.HtmlToSpannedConverter
-android.text.HtmlToSpannedConverter$Alignment
-android.text.HtmlToSpannedConverter$Background
android.text.HtmlToSpannedConverter$Bold
-android.text.HtmlToSpannedConverter$Foreground
android.text.HtmlToSpannedConverter$Href
-android.text.HtmlToSpannedConverter$Newline
-android.text.HtmlToSpannedConverter$Strikethrough
android.text.Hyphenator
android.text.InputFilter
android.text.InputFilter$LengthFilter
@@ -4085,6 +4090,7 @@
android.transition.TransitionManager$MultiListener$1
android.transition.TransitionPropagation
android.transition.TransitionSet
+android.transition.TransitionSet$1
android.transition.TransitionSet$TransitionSetListener
android.transition.TransitionUtils
android.transition.TransitionUtils$MatrixEvaluator
@@ -4109,6 +4115,7 @@
android.util.Base64$Coder
android.util.Base64$Decoder
android.util.Base64$Encoder
+android.util.Base64DataException
android.util.ContainerHelpers
android.util.DebugUtils
android.util.DisplayMetrics
@@ -4126,8 +4133,6 @@
android.util.KeyValueListParser
android.util.LocalLog
android.util.LocalLog$ReadOnlyLocalLog
-android.util.LocaleList
-android.util.LocaleList$1
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
@@ -4144,6 +4149,8 @@
android.util.MapCollections$MapIterator
android.util.MapCollections$ValuesCollection
android.util.MathUtils
+android.util.MemoryIntArray
+android.util.MemoryIntArray$1
android.util.MutableBoolean
android.util.MutableInt
android.util.MutableLong
@@ -4183,13 +4190,7 @@
android.util.Xml$Encoding
android.util.Xml$XmlSerializerFactory
android.util.apk.ApkSignatureSchemeV2Verifier
-android.util.apk.ApkSignatureSchemeV2Verifier$ByteBufferDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$DataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$MemoryMappedFileDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$SignatureInfo
android.util.apk.ApkSignatureSchemeV2Verifier$SignatureNotFoundException
-android.util.apk.ApkSignatureSchemeV2Verifier$VerbatimX509Certificate
-android.util.apk.ApkSignatureSchemeV2Verifier$WrappedX509Certificate
android.util.apk.ZipUtils
android.util.jar.StrictJarFile
android.util.jar.StrictJarFile$EntryIterator
@@ -4226,6 +4227,8 @@
android.view.Display
android.view.Display$ColorTransform
android.view.Display$ColorTransform$1
+android.view.Display$HdrCapabilities
+android.view.Display$HdrCapabilities$1
android.view.Display$Mode
android.view.Display$Mode$1
android.view.DisplayAdjustments
@@ -4233,6 +4236,7 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
+android.view.DragAndDropPermissions
android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
@@ -4257,6 +4261,7 @@
android.view.HardwareLayer
android.view.IAppTransitionAnimationSpecsFuture
android.view.IAppTransitionAnimationSpecsFuture$Stub
+android.view.IAppTransitionAnimationSpecsFuture$Stub$Proxy
android.view.IApplicationToken
android.view.IApplicationToken$Stub
android.view.IAssetAtlas
@@ -4330,6 +4335,7 @@
android.view.MotionEvent$PointerCoords
android.view.MotionEvent$PointerProperties
android.view.NotificationHeaderView
+android.view.NotificationHeaderView$1
android.view.NotificationHeaderView$HeaderTouchListener
android.view.OrientationEventListener
android.view.OrientationEventListener$SensorEventListenerImpl
@@ -4388,6 +4394,7 @@
android.view.View$AccessibilityDelegate
android.view.View$AttachInfo
android.view.View$AttachInfo$Callbacks
+android.view.View$AttachInfo$InvalidateInfo
android.view.View$BaseSavedState
android.view.View$BaseSavedState$1
android.view.View$CheckForLongPress
@@ -4536,6 +4543,7 @@
android.view.accessibility.AccessibilityNodeInfo
android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
android.view.accessibility.AccessibilityNodeInfo$CollectionInfo
+android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo
android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
android.view.accessibility.CaptioningManager
@@ -4559,10 +4567,12 @@
android.view.animation.Animation$3
android.view.animation.Animation$AnimationListener
android.view.animation.Animation$Description
+android.view.animation.Animation$NoImagePreloadHolder
android.view.animation.AnimationSet
android.view.animation.AnimationUtils
android.view.animation.BaseInterpolator
android.view.animation.ClipRectAnimation
+android.view.animation.CycleInterpolator
android.view.animation.DecelerateInterpolator
android.view.animation.GridLayoutAnimationController$AnimationParameters
android.view.animation.Interpolator
@@ -4580,8 +4590,8 @@
android.view.inputmethod.CompletionInfo$1
android.view.inputmethod.ComposingText
android.view.inputmethod.CorrectionInfo
+android.view.inputmethod.CorrectionInfo$1
android.view.inputmethod.CursorAnchorInfo
-android.view.inputmethod.CursorAnchorInfo$1
android.view.inputmethod.CursorAnchorInfo$Builder
android.view.inputmethod.EditorInfo
android.view.inputmethod.EditorInfo$1
@@ -4600,6 +4610,7 @@
android.view.inputmethod.InputMethodInfo$1
android.view.inputmethod.InputMethodManager
android.view.inputmethod.InputMethodManager$1
+android.view.inputmethod.InputMethodManager$2
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
android.view.inputmethod.InputMethodManager$FinishedInputEventCallback
android.view.inputmethod.InputMethodManager$H
@@ -4612,9 +4623,6 @@
android.view.inputmethod.InputMethodSubtype$1
android.view.inputmethod.InputMethodSubtype$InputMethodSubtypeBuilder
android.view.inputmethod.InputMethodSubtypeArray
-android.view.inputmethod.SparseRectFArray
-android.view.inputmethod.SparseRectFArray$1
-android.view.inputmethod.SparseRectFArray$SparseRectFArrayBuilder
android.view.textservice.SentenceSuggestionsInfo
android.view.textservice.SentenceSuggestionsInfo$1
android.view.textservice.SpellCheckerInfo
@@ -4632,26 +4640,20 @@
android.view.textservice.TextInfo
android.view.textservice.TextInfo$1
android.view.textservice.TextServicesManager
-android.webkit.ClientCertRequest
android.webkit.ConsoleMessage
android.webkit.ConsoleMessage$MessageLevel
android.webkit.CookieManager
android.webkit.CookieSyncManager
android.webkit.DownloadListener
-android.webkit.FindActionModeCallback
android.webkit.GeolocationPermissions
android.webkit.GeolocationPermissions$Callback
-android.webkit.HttpAuthHandler
android.webkit.IWebViewUpdateService
android.webkit.IWebViewUpdateService$Stub
android.webkit.IWebViewUpdateService$Stub$Proxy
android.webkit.JavascriptInterface
-android.webkit.JsDialogHelper
android.webkit.JsPromptResult
android.webkit.JsResult
-android.webkit.JsResult$ResultReceiver
android.webkit.MimeTypeMap
-android.webkit.PermissionRequest
android.webkit.ServiceWorkerController
android.webkit.SslErrorHandler
android.webkit.TokenBindingService
@@ -4660,7 +4662,6 @@
android.webkit.WebBackForwardList
android.webkit.WebChromeClient
android.webkit.WebChromeClient$CustomViewCallback
-android.webkit.WebChromeClient$FileChooserParams
android.webkit.WebHistoryItem
android.webkit.WebIconDatabase
android.webkit.WebMessage
@@ -4682,7 +4683,6 @@
android.webkit.WebView$PictureListener
android.webkit.WebView$PrivateAccess
android.webkit.WebView$VisualStateCallback
-android.webkit.WebView$WebViewTransport
android.webkit.WebViewClient
android.webkit.WebViewDatabase
android.webkit.WebViewDelegate
@@ -4694,6 +4694,7 @@
android.webkit.WebViewFactory$RelroFileCreator
android.webkit.WebViewFactoryProvider
android.webkit.WebViewFactoryProvider$Statics
+android.webkit.WebViewFragment
android.webkit.WebViewProvider
android.webkit.WebViewProvider$ScrollDelegate
android.webkit.WebViewProvider$ViewDelegate
@@ -4717,7 +4718,6 @@
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$PerformClick
android.widget.AbsListView$PositionScroller
-android.widget.AbsListView$PositionScroller$3
android.widget.AbsListView$RecycleBin
android.widget.AbsListView$RecyclerListener
android.widget.AbsListView$SavedState
@@ -4730,13 +4730,14 @@
android.widget.AbsSpinner$SavedState
android.widget.AbsSpinner$SavedState$1
android.widget.AbsoluteLayout
-android.widget.AbsoluteLayout$LayoutParams
android.widget.ActionMenuPresenter
android.widget.ActionMenuPresenter$1
android.widget.ActionMenuPresenter$2
android.widget.ActionMenuPresenter$ActionMenuPopupCallback
+android.widget.ActionMenuPresenter$OpenOverflowRunnable
android.widget.ActionMenuPresenter$OverflowMenuButton
android.widget.ActionMenuPresenter$OverflowMenuButton$1
+android.widget.ActionMenuPresenter$OverflowPopup
android.widget.ActionMenuPresenter$PopupPresenterCallback
android.widget.ActionMenuPresenter$SavedState
android.widget.ActionMenuPresenter$SavedState$1
@@ -4789,6 +4790,7 @@
android.widget.Editor$1
android.widget.Editor$2
android.widget.Editor$Blink
+android.widget.Editor$CorrectionHighlighter
android.widget.Editor$CursorAnchorInfoNotifier
android.widget.Editor$CursorController
android.widget.Editor$EditOperation
@@ -4883,6 +4885,9 @@
android.widget.MediaController$7
android.widget.MediaController$8
android.widget.MediaController$MediaPlayerControl
+android.widget.MenuItemHoverListener
+android.widget.MenuPopupWindow
+android.widget.MenuPopupWindow$MenuDropDownListView
android.widget.MultiAutoCompleteTextView
android.widget.MultiAutoCompleteTextView$Tokenizer
android.widget.NumberPicker
@@ -4936,6 +4941,7 @@
android.widget.RemoteViews$Action
android.widget.RemoteViews$ActionException
android.widget.RemoteViews$BitmapCache
+android.widget.RemoteViews$BitmapReflectionAction
android.widget.RemoteViews$LayoutParamAction
android.widget.RemoteViews$MemoryUsageCounter
android.widget.RemoteViews$MutablePair
@@ -4946,6 +4952,8 @@
android.widget.RemoteViews$SetDrawableParameters
android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViews$SetOnClickPendingIntent$1
+android.widget.RemoteViews$SetRemoteInputsAction
+android.widget.RemoteViews$TextViewDrawableAction
android.widget.RemoteViews$ViewGroupAction
android.widget.RemoteViews$ViewPaddingAction
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
@@ -4978,10 +4986,8 @@
android.widget.SeekBar
android.widget.SeekBar$OnSeekBarChangeListener
android.widget.SimpleAdapter
+android.widget.SimpleAdapter$ViewBinder
android.widget.SimpleCursorAdapter
-android.widget.SlidingDrawer
-android.widget.SlidingDrawer$1
-android.widget.SlidingDrawer$DrawerToggler
android.widget.Space
android.widget.SpellChecker
android.widget.SpellChecker$1
@@ -4992,8 +4998,6 @@
android.widget.Spinner$DropDownAdapter
android.widget.Spinner$DropdownPopup
android.widget.Spinner$DropdownPopup$1
-android.widget.Spinner$DropdownPopup$2
-android.widget.Spinner$DropdownPopup$3
android.widget.Spinner$SavedState
android.widget.Spinner$SavedState$1
android.widget.Spinner$SpinnerPopup
@@ -5009,7 +5013,6 @@
android.widget.TabHost$OnTabChangeListener
android.widget.TabHost$TabContentFactory
android.widget.TabHost$TabSpec
-android.widget.TabHost$ViewIdContentStrategy
android.widget.TabHost$ViewIndicatorStrategy
android.widget.TabWidget
android.widget.TabWidget$OnTabSelectionChanged
@@ -5032,10 +5035,6 @@
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
android.widget.TextView$Drawables
-android.widget.TextView$Marquee
-android.widget.TextView$Marquee$1
-android.widget.TextView$Marquee$2
-android.widget.TextView$Marquee$3
android.widget.TextView$OnEditorActionListener
android.widget.TextView$SavedState
android.widget.TextView$SavedState$1
@@ -5069,9 +5068,6 @@
android.widget.ViewFlipper$2
android.widget.ViewSwitcher
android.widget.WrapperListAdapter
-android.widget.ZoomButtonsController
-android.widget.ZoomButtonsController$OnZoomListener
-com.android.dex.Annotation
com.android.dex.ClassData
com.android.dex.ClassData$Method
com.android.dex.ClassDef
@@ -5087,9 +5083,6 @@
com.android.dex.Dex$TypeIndexToDescriptorTable
com.android.dex.DexException
com.android.dex.DexFormat
-com.android.dex.EncodedValue
-com.android.dex.EncodedValueCodec
-com.android.dex.EncodedValueReader
com.android.dex.FieldId
com.android.dex.Leb128
com.android.dex.MethodId
@@ -5097,16 +5090,13 @@
com.android.dex.TableOfContents
com.android.dex.TableOfContents$Section
com.android.dex.TypeList
-com.android.dex.util.ByteArrayByteInput
com.android.dex.util.ByteInput
com.android.dex.util.ByteOutput
com.android.dex.util.ExceptionWithContext
com.android.dex.util.FileUtils
-com.android.i18n.phonenumbers.AlternateFormatsCountryCodeSet
com.android.i18n.phonenumbers.AsYouTypeFormatter
com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap
com.android.i18n.phonenumbers.MetadataLoader
-com.android.i18n.phonenumbers.MetadataManager
com.android.i18n.phonenumbers.MetadataSource
com.android.i18n.phonenumbers.MultiFileMetadataSourceImpl
com.android.i18n.phonenumbers.NumberParseException
@@ -5124,25 +5114,28 @@
com.android.i18n.phonenumbers.PhoneNumberUtil$PhoneNumberFormat
com.android.i18n.phonenumbers.PhoneNumberUtil$PhoneNumberType
com.android.i18n.phonenumbers.PhoneNumberUtil$ValidationResult
+com.android.i18n.phonenumbers.Phonemetadata$NumberFormat
+com.android.i18n.phonenumbers.Phonemetadata$PhoneMetadata
+com.android.i18n.phonenumbers.Phonemetadata$PhoneMetadataCollection
+com.android.i18n.phonenumbers.Phonemetadata$PhoneNumberDesc
com.android.i18n.phonenumbers.Phonenumber$PhoneNumber
com.android.i18n.phonenumbers.Phonenumber$PhoneNumber$CountryCodeSource
com.android.i18n.phonenumbers.RegexCache
com.android.i18n.phonenumbers.RegexCache$LRUCache
com.android.i18n.phonenumbers.RegexCache$LRUCache$1
-com.android.i18n.phonenumbers.ShortNumbersRegionCodeSet
com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder
-com.android.i18n.phonenumbers.nano.Phonemetadata$NumberFormat
-com.android.i18n.phonenumbers.nano.Phonemetadata$PhoneMetadata
-com.android.i18n.phonenumbers.nano.Phonemetadata$PhoneMetadataCollection
-com.android.i18n.phonenumbers.nano.Phonemetadata$PhoneNumberDesc
com.android.i18n.phonenumbers.prefixmapper.DefaultMapStorage
com.android.i18n.phonenumbers.prefixmapper.MappingFileProvider
com.android.i18n.phonenumbers.prefixmapper.PhonePrefixMap
com.android.i18n.phonenumbers.prefixmapper.PhonePrefixMapStorageStrategy
com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader
+com.android.ims.ImsCall
+com.android.ims.ImsCall$ImsCallSessionListenerProxy
com.android.ims.ImsCall$Listener
com.android.ims.ImsCallForwardInfo
com.android.ims.ImsCallProfile
+com.android.ims.ImsCallProfile$1
+com.android.ims.ImsConferenceState
com.android.ims.ImsConfig
com.android.ims.ImsConfigListener
com.android.ims.ImsConfigListener$Stub
@@ -5151,6 +5144,7 @@
com.android.ims.ImsEcbm$ImsEcbmListenerProxy
com.android.ims.ImsEcbmStateListener
com.android.ims.ImsException
+com.android.ims.ImsExternalCallStateListener
com.android.ims.ImsManager
com.android.ims.ImsManager$1
com.android.ims.ImsManager$2
@@ -5159,8 +5153,14 @@
com.android.ims.ImsReasonInfo
com.android.ims.ImsReasonInfo$1
com.android.ims.ImsSsInfo
+com.android.ims.ImsStreamMediaProfile
+com.android.ims.ImsStreamMediaProfile$1
+com.android.ims.ImsSuppServiceNotification
+com.android.ims.internal.ICall
com.android.ims.internal.IImsCallSession
+com.android.ims.internal.IImsCallSession$Stub
com.android.ims.internal.IImsCallSessionListener
+com.android.ims.internal.IImsCallSessionListener$Stub
com.android.ims.internal.IImsConfig
com.android.ims.internal.IImsConfig$Stub
com.android.ims.internal.IImsEcbm
@@ -5176,6 +5176,11 @@
com.android.ims.internal.IImsUt$Stub
com.android.ims.internal.IImsUtListener
com.android.ims.internal.IImsUtListener$Stub
+com.android.ims.internal.IImsVideoCallProvider
+com.android.ims.internal.ImsCallSession
+com.android.ims.internal.ImsCallSession$IImsCallSessionListenerProxy
+com.android.ims.internal.ImsCallSession$Listener
+com.android.ims.internal.ImsCallSession$State
com.android.internal.R$styleable
com.android.internal.alsa.AlsaCardsParser
com.android.internal.alsa.AlsaCardsParser$AlsaCardRecord
@@ -5248,6 +5253,7 @@
com.android.internal.app.ToolbarActionBar$ActionMenuPresenterCallback
com.android.internal.app.ToolbarActionBar$MenuBuilderCallback
com.android.internal.app.ToolbarActionBar$ToolbarCallbackWrapper
+com.android.internal.app.UnlaunchableAppActivity
com.android.internal.app.WindowDecorActionBar
com.android.internal.app.WindowDecorActionBar$1
com.android.internal.app.WindowDecorActionBar$2
@@ -5337,11 +5343,11 @@
com.android.internal.os.BatteryStatsImpl$BatteryCallback
com.android.internal.os.BatteryStatsImpl$Clocks
com.android.internal.os.BatteryStatsImpl$ControllerActivityCounterImpl
-com.android.internal.os.BatteryStatsImpl$Counter
com.android.internal.os.BatteryStatsImpl$ExternalStatsSync
com.android.internal.os.BatteryStatsImpl$LongSamplingCounter
com.android.internal.os.BatteryStatsImpl$MyHandler
com.android.internal.os.BatteryStatsImpl$OverflowArrayMap
+com.android.internal.os.BatteryStatsImpl$PlatformIdleStateCallback
com.android.internal.os.BatteryStatsImpl$SamplingTimer
com.android.internal.os.BatteryStatsImpl$StopwatchTimer
com.android.internal.os.BatteryStatsImpl$SystemClocks
@@ -5382,6 +5388,7 @@
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
com.android.internal.os.MobileRadioPowerCalculator
+com.android.internal.os.PathClassLoaderFactory
com.android.internal.os.PowerCalculator
com.android.internal.os.PowerProfile
com.android.internal.os.PowerProfile$CpuClusterKey
@@ -5396,7 +5403,7 @@
com.android.internal.os.SensorPowerCalculator
com.android.internal.os.SomeArgs
com.android.internal.os.WakelockPowerCalculator
-com.android.internal.os.WifiPowerCalculator
+com.android.internal.os.WifiPowerEstimator
com.android.internal.os.Zygote
com.android.internal.os.ZygoteConnection
com.android.internal.os.ZygoteConnection$Arguments
@@ -5466,8 +5473,10 @@
com.android.internal.telecom.RemoteServiceCallback
com.android.internal.telecom.RemoteServiceCallback$Stub
com.android.internal.telecom.RemoteServiceCallback$Stub$Proxy
+com.android.internal.telephony.ATParseEx
com.android.internal.telephony.AsyncEmergencyContactNotifier
com.android.internal.telephony.BaseCommands
+com.android.internal.telephony.BlockChecker
com.android.internal.telephony.Call
com.android.internal.telephony.Call$SrvccState
com.android.internal.telephony.Call$State
@@ -5484,8 +5493,9 @@
com.android.internal.telephony.CarrierAppUtils
com.android.internal.telephony.CarrierServiceBindHelper
com.android.internal.telephony.CarrierServiceBindHelper$1
+com.android.internal.telephony.CarrierServiceBindHelper$2
com.android.internal.telephony.CarrierServiceBindHelper$AppBinding
-com.android.internal.telephony.CarrierServiceBindHelper$PackageChangedBroadcastReceiver
+com.android.internal.telephony.CarrierServiceBindHelper$CarrierServicePackageMonitor
com.android.internal.telephony.CellBroadcastHandler
com.android.internal.telephony.CellNetworkScanResult
com.android.internal.telephony.CommandException
@@ -5493,10 +5503,15 @@
com.android.internal.telephony.CommandsInterface
com.android.internal.telephony.CommandsInterface$RadioState
com.android.internal.telephony.Connection
+com.android.internal.telephony.Connection$Listener
+com.android.internal.telephony.Connection$ListenerBase
+com.android.internal.telephony.Connection$PostDialListener
+com.android.internal.telephony.Connection$PostDialState
com.android.internal.telephony.DctConstants$Activity
com.android.internal.telephony.DctConstants$State
com.android.internal.telephony.DebugService
com.android.internal.telephony.DefaultPhoneNotifier
+com.android.internal.telephony.DriverCall
com.android.internal.telephony.EncodeException
com.android.internal.telephony.GsmAlphabet
com.android.internal.telephony.GsmAlphabet$TextEncodingDetails
@@ -5515,6 +5530,7 @@
com.android.internal.telephony.IIccPhoneBook$Stub
com.android.internal.telephony.IMms
com.android.internal.telephony.IMms$Stub
+com.android.internal.telephony.IMms$Stub$Proxy
com.android.internal.telephony.IOnSubscriptionsChangedListener
com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub$Proxy
@@ -5533,12 +5549,6 @@
com.android.internal.telephony.ITelephony
com.android.internal.telephony.ITelephony$Stub
com.android.internal.telephony.ITelephony$Stub$Proxy
-com.android.internal.telephony.ITelephonyDebug
-com.android.internal.telephony.ITelephonyDebug$Stub
-com.android.internal.telephony.ITelephonyDebug$Stub$Proxy
-com.android.internal.telephony.ITelephonyDebugSubscriber
-com.android.internal.telephony.ITelephonyDebugSubscriber$Stub
-com.android.internal.telephony.ITelephonyDebugSubscriber$Stub$Proxy
com.android.internal.telephony.ITelephonyRegistry
com.android.internal.telephony.ITelephonyRegistry$Stub
com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
@@ -5557,16 +5567,20 @@
com.android.internal.telephony.InboundSmsHandler$DefaultState
com.android.internal.telephony.InboundSmsHandler$DeliveringState
com.android.internal.telephony.InboundSmsHandler$IdleState
+com.android.internal.telephony.InboundSmsHandler$SmsBroadcastReceiver
com.android.internal.telephony.InboundSmsHandler$StartupState
com.android.internal.telephony.InboundSmsHandler$WaitingState
+com.android.internal.telephony.InboundSmsTracker
com.android.internal.telephony.IntRangeManager
+com.android.internal.telephony.IntRangeManager$ClientRange
+com.android.internal.telephony.IntRangeManager$IntRange
com.android.internal.telephony.MccTable
+com.android.internal.telephony.MccTable$MccEntry
com.android.internal.telephony.MmiCode
com.android.internal.telephony.MmiCode$State
com.android.internal.telephony.OperatorInfo
com.android.internal.telephony.Phone
com.android.internal.telephony.Phone$1
-com.android.internal.telephony.PhoneBase
com.android.internal.telephony.PhoneConstants$DataState
com.android.internal.telephony.PhoneConstants$State
com.android.internal.telephony.PhoneFactory
@@ -5574,7 +5588,6 @@
com.android.internal.telephony.PhoneInternalInterface$DataActivityState
com.android.internal.telephony.PhoneInternalInterface$SuppService
com.android.internal.telephony.PhoneNotifier
-com.android.internal.telephony.PhoneProxy
com.android.internal.telephony.PhoneStateIntentReceiver
com.android.internal.telephony.PhoneSubInfoController
com.android.internal.telephony.PhoneSwitcher
@@ -5594,27 +5607,38 @@
com.android.internal.telephony.RadioCapability
com.android.internal.telephony.RestrictedState
com.android.internal.telephony.RetryManager
+com.android.internal.telephony.RetryManager$RetryRec
com.android.internal.telephony.SMSDispatcher
com.android.internal.telephony.SMSDispatcher$SettingsObserver
+com.android.internal.telephony.SMSDispatcher$SmsTracker
com.android.internal.telephony.ServiceStateTracker
com.android.internal.telephony.ServiceStateTracker$1
com.android.internal.telephony.ServiceStateTracker$2
com.android.internal.telephony.ServiceStateTracker$3
com.android.internal.telephony.ServiceStateTracker$CellInfoResult
com.android.internal.telephony.ServiceStateTracker$SstSubscriptionsChangedListener
+com.android.internal.telephony.SmsAddress
com.android.internal.telephony.SmsApplication
com.android.internal.telephony.SmsApplication$SmsApplicationData
com.android.internal.telephony.SmsApplication$SmsPackageMonitor
com.android.internal.telephony.SmsBroadcastUndelivered
com.android.internal.telephony.SmsBroadcastUndelivered$1
-com.android.internal.telephony.SmsBroadcastUndelivered$1$1
+com.android.internal.telephony.SmsBroadcastUndelivered$ScanRawTableThread
+com.android.internal.telephony.SmsConstants$MessageClass
+com.android.internal.telephony.SmsHeader
+com.android.internal.telephony.SmsHeader$PortAddrs
com.android.internal.telephony.SmsMessageBase
+com.android.internal.telephony.SmsMessageBase$SubmitPduBase
+com.android.internal.telephony.SmsNumberUtils
+com.android.internal.telephony.SmsResponse
com.android.internal.telephony.SmsStorageMonitor
com.android.internal.telephony.SmsStorageMonitor$1
com.android.internal.telephony.SmsUsageMonitor
com.android.internal.telephony.SmsUsageMonitor$SettingsObserver
com.android.internal.telephony.SmsUsageMonitor$SettingsObserverHandler
+com.android.internal.telephony.SmsUsageMonitor$ShortCodePatternMatcher
com.android.internal.telephony.SubscriptionController
+com.android.internal.telephony.SubscriptionController$1
com.android.internal.telephony.SubscriptionController$ScLocalLog
com.android.internal.telephony.SubscriptionInfoUpdater
com.android.internal.telephony.SubscriptionInfoUpdater$1
@@ -5625,10 +5649,7 @@
com.android.internal.telephony.TelephonyCapabilities
com.android.internal.telephony.TelephonyComponentFactory
com.android.internal.telephony.TelephonyDevController
-com.android.internal.telephony.TelephonyEvent
-com.android.internal.telephony.TelephonyEvent$1
com.android.internal.telephony.TelephonyEventLog
-com.android.internal.telephony.TelephonyEventLog$1
com.android.internal.telephony.TelephonyTester
com.android.internal.telephony.TelephonyTester$1
com.android.internal.telephony.UUSInfo
@@ -5641,8 +5662,15 @@
com.android.internal.telephony.WakeLockStateMachine$WaitingState
com.android.internal.telephony.WapPushOverSms
com.android.internal.telephony.cat.AppInterface
+com.android.internal.telephony.cat.CatException
com.android.internal.telephony.cat.CatLog
com.android.internal.telephony.cat.CatService
+com.android.internal.telephony.cat.CommandParamsFactory
+com.android.internal.telephony.cat.IconLoader
+com.android.internal.telephony.cat.ResultException
+com.android.internal.telephony.cat.RilMessageDecoder
+com.android.internal.telephony.cat.RilMessageDecoder$StateCmdParamsReady
+com.android.internal.telephony.cat.RilMessageDecoder$StateStart
com.android.internal.telephony.cdma.CdmaCallWaitingNotification
com.android.internal.telephony.cdma.CdmaInboundSmsHandler
com.android.internal.telephony.cdma.CdmaInformationRecords$CdmaDisplayInfoRec
@@ -5650,13 +5678,28 @@
com.android.internal.telephony.cdma.CdmaSMSDispatcher
com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler
com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler$1
+com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo
com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager
+com.android.internal.telephony.cdma.EriInfo
com.android.internal.telephony.cdma.EriManager
com.android.internal.telephony.cdma.EriManager$EriFile
com.android.internal.telephony.cdma.SignalToneUtil
com.android.internal.telephony.dataconnection.ApnContext
com.android.internal.telephony.dataconnection.ApnSetting
+com.android.internal.telephony.dataconnection.DataCallResponse
+com.android.internal.telephony.dataconnection.DataCallResponse$SetupResult
com.android.internal.telephony.dataconnection.DataConnection
+com.android.internal.telephony.dataconnection.DataConnection$ConnectionParams
+com.android.internal.telephony.dataconnection.DataConnection$DcActivatingState
+com.android.internal.telephony.dataconnection.DataConnection$DcActiveState
+com.android.internal.telephony.dataconnection.DataConnection$DcDefaultState
+com.android.internal.telephony.dataconnection.DataConnection$DcDisconnectingState
+com.android.internal.telephony.dataconnection.DataConnection$DcDisconnectionErrorCreatingConnection
+com.android.internal.telephony.dataconnection.DataConnection$DcInactiveState
+com.android.internal.telephony.dataconnection.DataConnection$DcNetworkAgent
+com.android.internal.telephony.dataconnection.DataConnection$DisconnectParams
+com.android.internal.telephony.dataconnection.DataConnection$UpdateLinkPropertyResult
+com.android.internal.telephony.dataconnection.DcAsyncChannel
com.android.internal.telephony.dataconnection.DcController
com.android.internal.telephony.dataconnection.DcController$1
com.android.internal.telephony.dataconnection.DcController$DccDefaultState
@@ -5673,17 +5716,30 @@
com.android.internal.telephony.dataconnection.DcTracker$3
com.android.internal.telephony.dataconnection.DcTracker$4
com.android.internal.telephony.dataconnection.DcTracker$ApnChangeObserver
+com.android.internal.telephony.dataconnection.DcTracker$DataAllowFailReason
+com.android.internal.telephony.dataconnection.DcTracker$DataAllowFailReasonType
com.android.internal.telephony.dataconnection.DcTracker$RetryFailures
+com.android.internal.telephony.dataconnection.DcTracker$SettingsObserver
com.android.internal.telephony.dataconnection.DcTracker$TxRxSum
com.android.internal.telephony.dataconnection.TelephonyNetworkFactory
com.android.internal.telephony.dataconnection.TelephonyNetworkFactory$InternalHandler
com.android.internal.telephony.gsm.GsmCellBroadcastHandler
com.android.internal.telephony.gsm.GsmInboundSmsHandler
com.android.internal.telephony.gsm.GsmSMSDispatcher
+com.android.internal.telephony.gsm.GsmSmsAddress
+com.android.internal.telephony.gsm.SimTlv
+com.android.internal.telephony.gsm.SmsBroadcastConfigInfo
com.android.internal.telephony.gsm.SmsMessage
+com.android.internal.telephony.gsm.SmsMessage$PduParser
+com.android.internal.telephony.gsm.SmsMessage$SubmitPdu
+com.android.internal.telephony.gsm.SuppServiceNotification
com.android.internal.telephony.gsm.UsimDataDownloadHandler
+com.android.internal.telephony.gsm.UsimPhoneBookManager
com.android.internal.telephony.imsphone.ImsExternalCallTracker
+com.android.internal.telephony.imsphone.ImsExternalCallTracker$ExternalCallStateListener
+com.android.internal.telephony.imsphone.ImsExternalCallTracker$ExternalConnectionListener
com.android.internal.telephony.imsphone.ImsExternalConnection
+com.android.internal.telephony.imsphone.ImsExternalConnection$Listener
com.android.internal.telephony.imsphone.ImsPhone
com.android.internal.telephony.imsphone.ImsPhone$1
com.android.internal.telephony.imsphone.ImsPhone$2
@@ -5698,24 +5754,62 @@
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$5
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$6
com.android.internal.telephony.imsphone.ImsPhoneCommandInterface
+com.android.internal.telephony.imsphone.ImsPhoneConnection
+com.android.internal.telephony.imsphone.ImsPhoneConnection$MyHandler
com.android.internal.telephony.imsphone.ImsPhoneFactory
+com.android.internal.telephony.imsphone.ImsPhoneMmiCode
+com.android.internal.telephony.imsphone.ImsPullCall
com.android.internal.telephony.sip.SipPhone
com.android.internal.telephony.sip.SipPhoneBase
com.android.internal.telephony.test.SimulatedRadioControl
+com.android.internal.telephony.uicc.AdnRecord
+com.android.internal.telephony.uicc.AdnRecord$1
+com.android.internal.telephony.uicc.AdnRecordCache
+com.android.internal.telephony.uicc.AdnRecordLoader
com.android.internal.telephony.uicc.IccCardApplicationStatus
+com.android.internal.telephony.uicc.IccCardApplicationStatus$AppState
com.android.internal.telephony.uicc.IccCardApplicationStatus$AppType
+com.android.internal.telephony.uicc.IccCardApplicationStatus$PersoSubState
com.android.internal.telephony.uicc.IccCardProxy
com.android.internal.telephony.uicc.IccCardStatus
com.android.internal.telephony.uicc.IccCardStatus$CardState
com.android.internal.telephony.uicc.IccCardStatus$PinState
com.android.internal.telephony.uicc.IccConstants
+com.android.internal.telephony.uicc.IccFileHandler
+com.android.internal.telephony.uicc.IccFileHandler$LoadLinearFixedContext
com.android.internal.telephony.uicc.IccIoResult
com.android.internal.telephony.uicc.IccRecords
+com.android.internal.telephony.uicc.IccRecords$IccRecordLoaded
+com.android.internal.telephony.uicc.IccServiceTable
com.android.internal.telephony.uicc.IccUtils
+com.android.internal.telephony.uicc.IsimFileHandler
+com.android.internal.telephony.uicc.IsimRecords
+com.android.internal.telephony.uicc.IsimUiccRecords
+com.android.internal.telephony.uicc.IsimUiccRecords$EfIsimDomainLoaded
+com.android.internal.telephony.uicc.IsimUiccRecords$EfIsimImpiLoaded
+com.android.internal.telephony.uicc.IsimUiccRecords$EfIsimImpuLoaded
+com.android.internal.telephony.uicc.IsimUiccRecords$EfIsimIstLoaded
+com.android.internal.telephony.uicc.IsimUiccRecords$EfIsimPcscfLoaded
+com.android.internal.telephony.uicc.SIMRecords
+com.android.internal.telephony.uicc.SIMRecords$1
+com.android.internal.telephony.uicc.SIMRecords$EfPlLoaded
+com.android.internal.telephony.uicc.SIMRecords$EfUsimLiLoaded
+com.android.internal.telephony.uicc.SIMRecords$GetSpnFsmState
+com.android.internal.telephony.uicc.SpnOverride
com.android.internal.telephony.uicc.UiccCard
com.android.internal.telephony.uicc.UiccCard$1
com.android.internal.telephony.uicc.UiccCardApplication
+com.android.internal.telephony.uicc.UiccCardApplication$1
+com.android.internal.telephony.uicc.UiccCarrierPrivilegeRules
+com.android.internal.telephony.uicc.UiccCarrierPrivilegeRules$1
com.android.internal.telephony.uicc.UiccController
+com.android.internal.telephony.uicc.UiccPkcs15
+com.android.internal.telephony.uicc.UiccPkcs15$FileHandler
+com.android.internal.telephony.uicc.UiccPkcs15$Pkcs15Selector
+com.android.internal.telephony.uicc.UsimFileHandler
+com.android.internal.telephony.uicc.UsimServiceTable
+com.android.internal.telephony.uicc.UsimServiceTable$UsimService
+com.android.internal.telephony.uicc.VoiceMailConstants
com.android.internal.textservice.ISpellCheckerService
com.android.internal.textservice.ISpellCheckerService$Stub
com.android.internal.textservice.ISpellCheckerService$Stub$Proxy
@@ -5765,10 +5859,12 @@
com.android.internal.util.MessageUtils
com.android.internal.util.NotificationColorUtil
com.android.internal.util.NotificationColorUtil$ColorUtilsFromCompat
+com.android.internal.util.ParcelableString
com.android.internal.util.Preconditions
com.android.internal.util.Predicate
com.android.internal.util.ProcFileReader
com.android.internal.util.ProgressReporter
+com.android.internal.util.RingBufferIndices
com.android.internal.util.ScreenShapeHelper
com.android.internal.util.State
com.android.internal.util.StateMachine
@@ -5823,6 +5919,7 @@
com.android.internal.view.InputConnectionWrapper$InputContextCallback
com.android.internal.view.RootViewSurfaceTaker
com.android.internal.view.RotationPolicy
+com.android.internal.view.RotationPolicy$1
com.android.internal.view.RotationPolicy$RotationPolicyListener
com.android.internal.view.RotationPolicy$RotationPolicyListener$1
com.android.internal.view.WindowManagerPolicyThread
@@ -5832,15 +5929,17 @@
com.android.internal.view.animation.NativeInterpolatorFactoryHelper
com.android.internal.view.menu.ActionMenuItem
com.android.internal.view.menu.ActionMenuItemView
-com.android.internal.view.menu.ActionMenuItemView$ActionMenuItemForwardingListener
com.android.internal.view.menu.ActionMenuItemView$PopupCallback
com.android.internal.view.menu.BaseMenuPresenter
com.android.internal.view.menu.ContextMenuBuilder
+com.android.internal.view.menu.ListMenuItemView
+com.android.internal.view.menu.MenuAdapter
com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
com.android.internal.view.menu.MenuBuilder$ItemInvoker
com.android.internal.view.menu.MenuHelper
com.android.internal.view.menu.MenuItemImpl
+com.android.internal.view.menu.MenuPopup
com.android.internal.view.menu.MenuPopupHelper
com.android.internal.view.menu.MenuPopupHelper$1
com.android.internal.view.menu.MenuPresenter
@@ -5848,6 +5947,9 @@
com.android.internal.view.menu.MenuView
com.android.internal.view.menu.MenuView$ItemView
com.android.internal.view.menu.ShowableListMenu
+com.android.internal.view.menu.StandardMenuPopup
+com.android.internal.view.menu.StandardMenuPopup$1
+com.android.internal.view.menu.StandardMenuPopup$2
com.android.internal.view.menu.SubMenuBuilder
com.android.internal.widget.AbsActionBarView
com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
@@ -5870,7 +5972,6 @@
com.android.internal.widget.DecorToolbar
com.android.internal.widget.DialogTitle
com.android.internal.widget.EditableInputConnection
-com.android.internal.widget.ExploreByTouchHelper
com.android.internal.widget.FloatingToolbar
com.android.internal.widget.FloatingToolbar$1
com.android.internal.widget.FloatingToolbar$2
@@ -5894,9 +5995,8 @@
com.android.internal.widget.ImageFloatingTextView
com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
com.android.internal.widget.LockPatternChecker
-com.android.internal.widget.LockPatternChecker$2
com.android.internal.widget.LockPatternChecker$3
-com.android.internal.widget.LockPatternChecker$4
+com.android.internal.widget.LockPatternChecker$5
com.android.internal.widget.LockPatternChecker$OnCheckCallback
com.android.internal.widget.LockPatternChecker$OnVerifyCallback
com.android.internal.widget.LockPatternUtils
@@ -5905,18 +6005,9 @@
com.android.internal.widget.LockPatternUtils$StrongAuthTracker
com.android.internal.widget.LockPatternUtils$StrongAuthTracker$1
com.android.internal.widget.LockPatternUtils$StrongAuthTracker$H
-com.android.internal.widget.LockPatternView
-com.android.internal.widget.LockPatternView$4
-com.android.internal.widget.LockPatternView$5
-com.android.internal.widget.LockPatternView$6
-com.android.internal.widget.LockPatternView$7
-com.android.internal.widget.LockPatternView$8
-com.android.internal.widget.LockPatternView$Cell
-com.android.internal.widget.LockPatternView$CellState
-com.android.internal.widget.LockPatternView$DisplayMode
-com.android.internal.widget.LockPatternView$OnPatternListener
-com.android.internal.widget.LockPatternView$PatternExploreByTouchHelper
com.android.internal.widget.MediaNotificationView
+com.android.internal.widget.NotificationActionListLayout
+com.android.internal.widget.NotificationActionListLayout$-void__clinit___LambdaImpl0
com.android.internal.widget.PasswordEntryKeyboard
com.android.internal.widget.PasswordEntryKeyboard$LatinKey
com.android.internal.widget.PasswordEntryKeyboardHelper
@@ -5941,14 +6032,10 @@
com.android.okhttp.Authenticator
com.android.okhttp.Cache
com.android.okhttp.Cache$1
-com.android.okhttp.Cache$CacheRequestImpl
-com.android.okhttp.Cache$CacheRequestImpl$1
-com.android.okhttp.Cache$Entry
com.android.okhttp.CacheControl
com.android.okhttp.CacheControl$Builder
com.android.okhttp.CertificatePinner
com.android.okhttp.CertificatePinner$Builder
-com.android.okhttp.Challenge
com.android.okhttp.CipherSuite
com.android.okhttp.ConfigAwareConnectionPool
com.android.okhttp.ConfigAwareConnectionPool$1
@@ -5986,8 +6073,6 @@
com.android.okhttp.internal.DiskLruCache$1
com.android.okhttp.internal.DiskLruCache$2
com.android.okhttp.internal.DiskLruCache$3
-com.android.okhttp.internal.DiskLruCache$Editor
-com.android.okhttp.internal.DiskLruCache$Editor$1
com.android.okhttp.internal.DiskLruCache$Entry
com.android.okhttp.internal.FaultHidingSink
com.android.okhttp.internal.Internal
@@ -6001,7 +6086,6 @@
com.android.okhttp.internal.Util
com.android.okhttp.internal.Util$1
com.android.okhttp.internal.http.AuthenticatorAdapter
-com.android.okhttp.internal.http.CacheRequest
com.android.okhttp.internal.http.CacheStrategy
com.android.okhttp.internal.http.CacheStrategy$Factory
com.android.okhttp.internal.http.HeaderParser
@@ -6014,7 +6098,6 @@
com.android.okhttp.internal.http.HttpConnection$UnknownLengthSource
com.android.okhttp.internal.http.HttpEngine
com.android.okhttp.internal.http.HttpEngine$1
-com.android.okhttp.internal.http.HttpEngine$2
com.android.okhttp.internal.http.HttpMethod
com.android.okhttp.internal.http.HttpTransport
com.android.okhttp.internal.http.OkHeaders
@@ -6037,7 +6120,6 @@
com.android.okhttp.okio.AsyncTimeout$1
com.android.okhttp.okio.AsyncTimeout$2
com.android.okhttp.okio.AsyncTimeout$Watchdog
-com.android.okhttp.okio.Base64
com.android.okhttp.okio.Buffer
com.android.okhttp.okio.BufferedSink
com.android.okhttp.okio.BufferedSource
@@ -6076,34 +6158,20 @@
com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
com.android.org.bouncycastle.crypto.AsymmetricBlockCipher
-com.android.org.bouncycastle.crypto.BlockCipher
-com.android.org.bouncycastle.crypto.BufferedBlockCipher
com.android.org.bouncycastle.crypto.CipherKeyGenerator
-com.android.org.bouncycastle.crypto.CipherParameters
com.android.org.bouncycastle.crypto.CryptoException
-com.android.org.bouncycastle.crypto.DataLengthException
com.android.org.bouncycastle.crypto.Digest
com.android.org.bouncycastle.crypto.ExtendedDigest
com.android.org.bouncycastle.crypto.InvalidCipherTextException
com.android.org.bouncycastle.crypto.KeyGenerationParameters
-com.android.org.bouncycastle.crypto.OutputLengthException
-com.android.org.bouncycastle.crypto.RuntimeCryptoException
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
com.android.org.bouncycastle.crypto.encodings.OAEPEncoding
-com.android.org.bouncycastle.crypto.engines.AESFastEngine
com.android.org.bouncycastle.crypto.engines.RSABlindedEngine
com.android.org.bouncycastle.crypto.engines.RSACoreEngine
-com.android.org.bouncycastle.crypto.modes.CBCBlockCipher
-com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
-com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
-com.android.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
-com.android.org.bouncycastle.crypto.params.KeyParameter
-com.android.org.bouncycastle.jcajce.PBKDFKey
-com.android.org.bouncycastle.jcajce.PKCS12Key
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
@@ -6141,8 +6209,6 @@
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
com.android.org.bouncycastle.jcajce.provider.symmetric.AES
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB$1
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
@@ -6160,14 +6226,7 @@
com.android.org.bouncycastle.jcajce.provider.symmetric.SymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.PBE
com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
@@ -6194,7 +6253,6 @@
com.android.org.conscrypt.ClientSessionContext$HostAndPort
com.android.org.conscrypt.CryptoUpcalls
com.android.org.conscrypt.FileClientSessionCache
-com.android.org.conscrypt.FileClientSessionCache$CacheFile
com.android.org.conscrypt.FileClientSessionCache$Impl
com.android.org.conscrypt.Hex
com.android.org.conscrypt.JSSEProvider
@@ -6261,6 +6319,7 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.PinEntryException
+com.android.org.conscrypt.PinListEntry
com.android.org.conscrypt.PinManagerException
com.android.org.conscrypt.Platform
com.android.org.conscrypt.SSLClientSessionCache
@@ -6276,13 +6335,12 @@
com.android.org.conscrypt.TrustedCertificateKeyStoreSpi
com.android.org.conscrypt.TrustedCertificateStore
com.android.org.conscrypt.TrustedCertificateStore$1
+com.android.org.conscrypt.TrustedCertificateStore$2
+com.android.org.conscrypt.TrustedCertificateStore$4
+com.android.org.conscrypt.TrustedCertificateStore$5
com.android.org.conscrypt.TrustedCertificateStore$CertSelector
com.android.org.conscrypt.util.ArrayUtils
-com.android.protobuf.nano.CodedInputByteBufferNano
-com.android.protobuf.nano.InternalNano
-com.android.protobuf.nano.InvalidProtocolBufferNanoException
-com.android.protobuf.nano.MessageNano
-com.android.protobuf.nano.WireFormatNano
+com.android.org.conscrypt.util.EmptyArray
com.android.server.AppWidgetBackupBridge
com.android.server.BootReceiver
com.android.server.BootReceiver$1
@@ -6315,6 +6373,9 @@
com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
com.google.android.mms.MmsException
+com.google.android.mms.pdu.GenericPdu
+com.google.android.mms.pdu.PduComposer
+com.google.android.mms.pdu.PduPersister
dalvik.system.BaseDexClassLoader
dalvik.system.BlockGuard
dalvik.system.BlockGuard$1
@@ -6417,8 +6478,6 @@
java.io.ObjectStreamField
java.io.OutputStream
java.io.OutputStreamWriter
-java.io.PipedInputStream
-java.io.PipedOutputStream
java.io.PrintStream
java.io.PrintWriter
java.io.PushbackInputStream
@@ -6429,7 +6488,6 @@
java.io.SerialCallbackContext
java.io.Serializable
java.io.SerializablePermission
-java.io.StreamCorruptedException
java.io.StringBufferInputStream
java.io.StringReader
java.io.StringWriter
@@ -6439,6 +6497,7 @@
java.io.Writer
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
+java.lang.AndroidHardcodedSystemProperties
java.lang.Appendable
java.lang.ArithmeticException
java.lang.ArrayIndexOutOfBoundsException
@@ -6452,6 +6511,10 @@
java.lang.CaseMapper
java.lang.CaseMapper$1
java.lang.CharSequence
+java.lang.CharSequence$-java_util_stream_IntStream_chars__LambdaImpl0
+java.lang.CharSequence$-java_util_stream_IntStream_codePoints__LambdaImpl0
+java.lang.CharSequence$1CharIterator
+java.lang.CharSequence$1CodePointIterator
java.lang.Character
java.lang.Character$CharacterCache
java.lang.Character$Subset
@@ -6459,7 +6522,6 @@
java.lang.Class
java.lang.Class$Caches
java.lang.ClassCastException
-java.lang.ClassCircularityError
java.lang.ClassLoader
java.lang.ClassLoader$SystemClassLoader
java.lang.ClassNotFoundException
@@ -6622,6 +6684,8 @@
java.math.BitLevel
java.math.Conversion
java.math.Division
+java.math.Logical
+java.math.MathContext
java.math.Multiplication
java.math.NativeBN
java.math.RoundingMode
@@ -6635,6 +6699,7 @@
java.net.ConnectException
java.net.CookieHandler
java.net.CookieManager
+java.net.CookieManager$CookiePathComparator
java.net.CookiePolicy
java.net.CookiePolicy$1
java.net.CookiePolicy$2
@@ -6766,9 +6831,6 @@
java.nio.channels.NetworkChannel
java.nio.channels.NonWritableChannelException
java.nio.channels.OverlappingFileLockException
-java.nio.channels.Pipe
-java.nio.channels.Pipe$SinkChannel
-java.nio.channels.Pipe$SourceChannel
java.nio.channels.ReadableByteChannel
java.nio.channels.ScatteringByteChannel
java.nio.channels.SeekableByteChannel
@@ -6903,8 +6965,10 @@
java.security.spec.ECField
java.security.spec.ECFieldF2m
java.security.spec.ECFieldFp
+java.security.spec.ECGenParameterSpec
java.security.spec.ECParameterSpec
java.security.spec.ECPoint
+java.security.spec.ECPrivateKeySpec
java.security.spec.ECPublicKeySpec
java.security.spec.EllipticCurve
java.security.spec.EncodedKeySpec
@@ -6958,6 +7022,7 @@
java.util.AbstractList$ListItr
java.util.AbstractMap
java.util.AbstractMap$1
+java.util.AbstractMap$1$1
java.util.AbstractMap$2
java.util.AbstractMap$2$1
java.util.AbstractMap$SimpleEntry
@@ -7070,7 +7135,6 @@
java.util.HashMap$EntrySet
java.util.HashMap$HashIterator
java.util.HashMap$HashMapEntry
-java.util.HashMap$Holder
java.util.HashMap$KeyIterator
java.util.HashMap$KeySet
java.util.HashMap$ValueIterator
@@ -7080,7 +7144,6 @@
java.util.Hashtable$EntrySet
java.util.Hashtable$Enumerator
java.util.Hashtable$HashtableEntry
-java.util.Hashtable$Holder
java.util.Hashtable$KeySet
java.util.Hashtable$ValueCollection
java.util.IdentityHashMap
@@ -7125,6 +7188,8 @@
java.util.Objects
java.util.Observable
java.util.Observer
+java.util.PrimitiveIterator
+java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
java.util.PriorityQueue$Itr
java.util.Properties
@@ -7169,6 +7234,7 @@
java.util.Spliterators$EmptySpliterator$OfLong
java.util.Spliterators$EmptySpliterator$OfRef
java.util.Stack
+java.util.StringJoiner
java.util.StringTokenizer
java.util.SubList
java.util.SubList$1
@@ -7207,19 +7273,23 @@
java.util.WeakHashMap$EntryIterator
java.util.WeakHashMap$EntrySet
java.util.WeakHashMap$HashIterator
-java.util.WeakHashMap$Holder
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$ValueIterator
java.util.WeakHashMap$Values
-java.util.XMLUtils
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.BlockingDeque
java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
java.util.concurrent.CancellationException
+java.util.concurrent.CompletableFuture
+java.util.concurrent.CompletableFuture$AltResult
+java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
+java.util.concurrent.CompletableFuture$Completion
+java.util.concurrent.CompletableFuture$Signaller
java.util.concurrent.CompletionService
+java.util.concurrent.CompletionStage
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentHashMap$BaseIterator
java.util.concurrent.ConcurrentHashMap$CollectionView
@@ -7245,9 +7315,14 @@
java.util.concurrent.ConcurrentSkipListMap
java.util.concurrent.ConcurrentSkipListMap$HeadIndex
java.util.concurrent.ConcurrentSkipListMap$Index
+java.util.concurrent.ConcurrentSkipListMap$Iter
+java.util.concurrent.ConcurrentSkipListMap$KeyIterator
java.util.concurrent.ConcurrentSkipListMap$KeySet
java.util.concurrent.ConcurrentSkipListMap$Node
java.util.concurrent.ConcurrentSkipListMap$SubMap
+java.util.concurrent.ConcurrentSkipListMap$ValueIterator
+java.util.concurrent.ConcurrentSkipListMap$Values
+java.util.concurrent.ConcurrentSkipListSet
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArrayList$CowIterator
java.util.concurrent.CopyOnWriteArraySet
@@ -7266,6 +7341,14 @@
java.util.concurrent.Executors$DelegatedScheduledExecutorService
java.util.concurrent.Executors$FinalizableDelegatedExecutorService
java.util.concurrent.Executors$RunnableAdapter
+java.util.concurrent.ForkJoinPool
+java.util.concurrent.ForkJoinPool$1
+java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory
+java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory
+java.util.concurrent.ForkJoinPool$ManagedBlocker
+java.util.concurrent.ForkJoinTask
+java.util.concurrent.ForkJoinTask$ExceptionNode
+java.util.concurrent.ForkJoinWorkerThread
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.FutureTask$WaitNode
@@ -7287,7 +7370,6 @@
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
java.util.concurrent.Semaphore
-java.util.concurrent.Semaphore$FairSync
java.util.concurrent.Semaphore$NonfairSync
java.util.concurrent.Semaphore$Sync
java.util.concurrent.SynchronousQueue
@@ -7401,6 +7483,7 @@
java.util.regex.PatternSyntaxException
java.util.spi.LocaleServiceProvider
java.util.stream.BaseStream
+java.util.stream.IntStream
java.util.stream.Stream
java.util.stream.StreamSupport
java.util.zip.Adler32
@@ -7423,6 +7506,7 @@
java.util.zip.ZipFile$1
java.util.zip.ZipFile$ZipFileInflaterInputStream
java.util.zip.ZipFile$ZipFileInputStream
+java.util.zip.ZipInputStream
java.util.zip.ZipOutputStream
javax.crypto.BadPaddingException
javax.crypto.Cipher
@@ -7432,6 +7516,7 @@
javax.crypto.Cipher$NeedToSet
javax.crypto.Cipher$SpiAndProviderUpdater
javax.crypto.Cipher$Transform
+javax.crypto.CipherInputStream
javax.crypto.CipherOutputStream
javax.crypto.CipherSpi
javax.crypto.EncryptedPrivateKeyInfo
@@ -7447,10 +7532,7 @@
javax.crypto.NullCipher
javax.crypto.SecretKey
javax.crypto.SecretKeyFactory
-javax.crypto.SecretKeyFactorySpi
javax.crypto.ShortBufferException
-javax.crypto.interfaces.PBEKey
-javax.crypto.spec.GCMParameterSpec
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.OAEPParameterSpec
javax.crypto.spec.PBEKeySpec
@@ -7570,7 +7652,6 @@
libcore.net.event.NetworkEventDispatcher
libcore.net.event.NetworkEventListener
libcore.reflect.AnnotatedElements
-libcore.reflect.AnnotationAccess
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
@@ -7614,6 +7695,25 @@
org.apache.harmony.xml.ExpatParser$CurrentAttributes
org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatReader
+org.apache.harmony.xml.dom.AttrImpl
+org.apache.harmony.xml.dom.CDATASectionImpl
+org.apache.harmony.xml.dom.CharacterDataImpl
+org.apache.harmony.xml.dom.CommentImpl
+org.apache.harmony.xml.dom.DOMImplementationImpl
+org.apache.harmony.xml.dom.DocumentImpl
+org.apache.harmony.xml.dom.DocumentTypeImpl
+org.apache.harmony.xml.dom.ElementImpl
+org.apache.harmony.xml.dom.ElementImpl$ElementAttrNamedNodeMapImpl
+org.apache.harmony.xml.dom.EntityReferenceImpl
+org.apache.harmony.xml.dom.InnerNodeImpl
+org.apache.harmony.xml.dom.LeafNodeImpl
+org.apache.harmony.xml.dom.NodeImpl
+org.apache.harmony.xml.dom.NodeImpl$1
+org.apache.harmony.xml.dom.NodeListImpl
+org.apache.harmony.xml.dom.ProcessingInstructionImpl
+org.apache.harmony.xml.dom.TextImpl
+org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
+org.apache.harmony.xml.parsers.DocumentBuilderImpl
org.apache.harmony.xml.parsers.SAXParserFactoryImpl
org.apache.harmony.xml.parsers.SAXParserImpl
org.apache.http.ConnectionClosedException
@@ -7649,6 +7749,7 @@
org.apache.http.ReasonPhraseCatalog
org.apache.http.RequestLine
org.apache.http.StatusLine
+org.apache.http.TokenIterator
org.apache.http.auth.AuthSchemeFactory
org.apache.http.auth.AuthSchemeRegistry
org.apache.http.auth.AuthState
@@ -7686,6 +7787,7 @@
org.apache.http.client.utils.URLEncodedUtils
org.apache.http.conn.BasicManagedEntity
org.apache.http.conn.ClientConnectionManager
+org.apache.http.conn.ClientConnectionManagerFactory
org.apache.http.conn.ClientConnectionOperator
org.apache.http.conn.ClientConnectionRequest
org.apache.http.conn.ConnectTimeoutException
@@ -7771,7 +7873,6 @@
org.apache.http.impl.client.DefaultTargetAuthenticationHandler
org.apache.http.impl.client.DefaultUserTokenHandler
org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RedirectLocations
org.apache.http.impl.client.RequestWrapper
org.apache.http.impl.client.RoutedRequest
org.apache.http.impl.client.TunnelRefusedException
@@ -7784,6 +7885,10 @@
org.apache.http.impl.conn.IdleConnectionHandler
org.apache.http.impl.conn.IdleConnectionHandler$TimeValues
org.apache.http.impl.conn.ProxySelectorRoutePlanner
+org.apache.http.impl.conn.SingleClientConnManager
+org.apache.http.impl.conn.SingleClientConnManager$1
+org.apache.http.impl.conn.SingleClientConnManager$ConnAdapter
+org.apache.http.impl.conn.SingleClientConnManager$PoolEntry
org.apache.http.impl.conn.tsccm.AbstractConnPool
org.apache.http.impl.conn.tsccm.BasicPoolEntry
org.apache.http.impl.conn.tsccm.BasicPoolEntryRef
@@ -7859,6 +7964,7 @@
org.apache.http.message.BasicHeaderElement
org.apache.http.message.BasicHeaderElementIterator
org.apache.http.message.BasicHeaderValueParser
+org.apache.http.message.BasicHttpEntityEnclosingRequest
org.apache.http.message.BasicHttpRequest
org.apache.http.message.BasicHttpResponse
org.apache.http.message.BasicLineFormatter
@@ -7867,6 +7973,7 @@
org.apache.http.message.BasicNameValuePair
org.apache.http.message.BasicRequestLine
org.apache.http.message.BasicStatusLine
+org.apache.http.message.BasicTokenIterator
org.apache.http.message.BufferedHeader
org.apache.http.message.HeaderGroup
org.apache.http.message.HeaderValueParser
@@ -7908,6 +8015,7 @@
org.apache.http.util.EncodingUtils
org.apache.http.util.EntityUtils
org.apache.http.util.LangUtils
+org.apache.http.util.VersionInfo
org.ccil.cowan.tagsoup.AttributesImpl
org.ccil.cowan.tagsoup.AutoDetector
org.ccil.cowan.tagsoup.Element
@@ -7931,11 +8039,23 @@
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.kxml2.io.KXmlSerializer
+org.w3c.dom.Attr
+org.w3c.dom.CDATASection
+org.w3c.dom.CharacterData
+org.w3c.dom.Comment
+org.w3c.dom.DOMException
+org.w3c.dom.DOMImplementation
org.w3c.dom.Document
+org.w3c.dom.DocumentFragment
+org.w3c.dom.DocumentType
org.w3c.dom.Element
+org.w3c.dom.EntityReference
org.w3c.dom.NamedNodeMap
org.w3c.dom.Node
org.w3c.dom.NodeList
+org.w3c.dom.ProcessingInstruction
+org.w3c.dom.Text
+org.w3c.dom.TypeInfo
org.xml.sax.Attributes
org.xml.sax.ContentHandler
org.xml.sax.DTDHandler
@@ -7984,22 +8104,20 @@
sun.net.ResourceManager
sun.net.spi.DefaultProxySelector
sun.net.spi.DefaultProxySelector$1
-sun.net.spi.DefaultProxySelector$2
sun.net.spi.DefaultProxySelector$NonProxyInfo
sun.net.spi.nameservice.NameService
sun.net.util.IPAddressUtil
sun.net.www.ParseUtil
sun.net.www.protocol.file.Handler
sun.net.www.protocol.jar.Handler
+sun.nio.ch.AbstractPollArrayWrapper
+sun.nio.ch.AbstractPollSelectorImpl
sun.nio.ch.AllocatedNativeObject
sun.nio.ch.ChannelInputStream
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
sun.nio.ch.DefaultSelectorProvider
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
-sun.nio.ch.EPollSelectorImpl
-sun.nio.ch.EPollSelectorProvider
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
sun.nio.ch.FileDescriptorHolderSocketImpl
@@ -8018,7 +8136,9 @@
sun.nio.ch.NativeThreadSet
sun.nio.ch.Net
sun.nio.ch.Net$1
-sun.nio.ch.PipeImpl
+sun.nio.ch.PollArrayWrapper
+sun.nio.ch.PollSelectorImpl
+sun.nio.ch.PollSelectorProvider
sun.nio.ch.SelChImpl
sun.nio.ch.SelectionKeyImpl
sun.nio.ch.SelectorImpl
@@ -8026,14 +8146,12 @@
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
-sun.nio.ch.SinkChannelImpl
sun.nio.ch.SocketAdaptor
sun.nio.ch.SocketAdaptor$1
sun.nio.ch.SocketAdaptor$2
sun.nio.ch.SocketAdaptor$SocketInputStream
sun.nio.ch.SocketChannelImpl
sun.nio.ch.SocketDispatcher
-sun.nio.ch.SourceChannelImpl
sun.nio.ch.Util
sun.nio.ch.Util$1
sun.nio.ch.Util$2
@@ -8116,6 +8234,7 @@
sun.security.util.MemoryCache$CacheEntry
sun.security.util.MemoryCache$SoftCacheEntry
sun.security.util.ObjectIdentifier
+sun.security.util.SecurityConstants
sun.security.util.SignatureFileVerifier
sun.security.util.UntrustedCertificates
sun.security.x509.AVA
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 4edf249..0c7ee2c 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -602,7 +602,9 @@
long currentTime = AnimationUtils.currentAnimationTimeMillis();
mStartTime = currentTime - seekTime;
mStartTimeCommitted = true; // do not allow start time to be compensated for jank
- if (!mRunning) {
+ if (!isPulsingInternal()) {
+ // If the animation loop hasn't started, the startTime will be adjusted in the first
+ // frame based on seek fraction.
mSeekFraction = fraction;
}
mOverallFraction = fraction;
@@ -980,6 +982,10 @@
mStarted = true;
mPaused = false;
mRunning = false;
+ // Resets mLastFrameTime when start() is called, so that if the animation was running,
+ // calling start() would put the animation in the
+ // started-but-not-yet-reached-the-first-frame phase.
+ mLastFrameTime = 0;
AnimationHandler animationHandler = AnimationHandler.getInstance();
animationHandler.addAnimationFrameCallback(this, (long) (mStartDelay * sDurationScale));
@@ -1095,7 +1101,7 @@
*/
@Override
public void reverse() {
- if (mRunning) {
+ if (isPulsingInternal()) {
long currentTime = AnimationUtils.currentAnimationTimeMillis();
long currentPlayTime = currentTime - mStartTime;
long timeLeft = getScaledDuration() - currentPlayTime;
@@ -1103,6 +1109,7 @@
mStartTimeCommitted = true; // do not allow start time to be compensated for jank
mReversing = !mReversing;
} else if (mStarted) {
+ mReversing = !mReversing;
end();
} else {
start(true);
@@ -1177,6 +1184,15 @@
}
/**
+ * Internal only: This tracks whether the animation has gotten on the animation loop. Note
+ * this is different than {@link #isRunning()} in that the latter tracks the time after start()
+ * is called (or after start delay if any), which may be before the animation loop starts.
+ */
+ private boolean isPulsingInternal() {
+ return mLastFrameTime > 0;
+ }
+
+ /**
* Returns the name of this animator for debugging purposes.
*/
String getNameForTrace() {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index ac5f3ef..13cf46d 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -57,6 +57,7 @@
import android.media.AudioManager;
import android.media.session.MediaController;
import android.net.Uri;
+import android.os.BadParcelableException;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -5006,13 +5007,18 @@
@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);
+ try {
+ 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);
+ }
+ } catch (BadParcelableException e) {
+ Log.w(TAG, "Cannot read referrer from intent;"
+ + " intent extras contain unknown custom Parcelable objects");
}
if (mReferrer != null) {
return new Uri.Builder().scheme("android-app").authority(mReferrer).build();
@@ -5952,7 +5958,7 @@
return false;
}
try {
- return ActivityManagerNative.getDefault().isTopOfTask(mToken);
+ return ActivityManagerNative.getDefault().isTopOfTask(getActivityToken());
} catch (RemoteException e) {
return false;
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 7198146..0728bdf 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -16,6 +16,8 @@
package android.app;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.app.assist.AssistContent;
import android.app.assist.AssistStructure;
import android.app.backup.BackupAgent;
@@ -1166,12 +1168,25 @@
@Override
public void dumpDbInfo(final FileDescriptor fd, final String[] args) {
if (mSystemThread) {
- // Ensure this invocation is asynchronous to prevent
- // writer waiting due to buffer cannot be consumed.
+ // Ensure this invocation is asynchronous to prevent writer waiting if buffer cannot
+ // be consumed. But it must duplicate the file descriptor first, since caller might
+ // be closing it.
+ final ParcelFileDescriptor dup;
+ try {
+ dup = ParcelFileDescriptor.dup(fd);
+ } catch (IOException e) {
+ Log.w(TAG, "Could not dup FD " + fd.getInt$());
+ return;
+ }
+
AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
@Override
public void run() {
- dumpDatabaseInfo(fd, args);
+ try {
+ dumpDatabaseInfo(dup.getFileDescriptor(), args);
+ } finally {
+ IoUtils.closeQuietly(dup);
+ }
}
});
} else {
@@ -4565,20 +4580,37 @@
}
/**
+ * Creates a new Configuration only if override would modify base. Otherwise returns base.
+ * @param base The base configuration.
+ * @param override The update to apply to the base configuration. Can be null.
+ * @return A Configuration representing base with override applied.
+ */
+ private static Configuration createNewConfigAndUpdateIfNotNull(@NonNull Configuration base,
+ @Nullable Configuration override) {
+ if (override == null) {
+ return base;
+ }
+ Configuration newConfig = new Configuration(base);
+ newConfig.updateFrom(override);
+ return newConfig;
+ }
+
+ /**
* Decides whether to update an Activity's configuration and whether to tell the
* Activity/Component about it.
* @param cb The component callback to notify of configuration change.
* @param activityToken The Activity binder token for which this configuration change happened.
* If the change is global, this is null.
* @param newConfig The new configuration.
- * @param overrideConfig The override config that differentiates the Activity's configuration
+ * @param amOverrideConfig The override config that differentiates the Activity's configuration
* from the base global configuration.
+ * This is supplied by ActivityManager.
* @param reportToActivity Notify the Activity of the change.
*/
private void performConfigurationChanged(ComponentCallbacks2 cb,
IBinder activityToken,
Configuration newConfig,
- Configuration overrideConfig,
+ Configuration amOverrideConfig,
boolean reportToActivity) {
// Only for Activity objects, check that they actually call up to their
// superclass implementation. ComponentCallbacks2 is an interface, so
@@ -4592,7 +4624,6 @@
if ((activity == null) || (activity.mCurrentConfig == null)) {
shouldChangeConfig = true;
} else {
-
// If the new config is the same as the config this Activity
// is already running with then don't bother calling
// onConfigurationChanged
@@ -4602,34 +4633,36 @@
}
}
- if (DEBUG_CONFIGURATION) {
- Slog.v(TAG, "Config callback " + cb + ": shouldChangeConfig=" + shouldChangeConfig);
- }
-
if (shouldChangeConfig) {
+ // Propagate the configuration change to the Activity and ResourcesManager.
+
+ // ContextThemeWrappers may override the configuration for that context.
+ // We must check and apply any overrides defined.
+ Configuration contextThemeWrapperOverrideConfig = null;
+ if (cb instanceof ContextThemeWrapper) {
+ final ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb;
+ contextThemeWrapperOverrideConfig = contextThemeWrapper.getOverrideConfiguration();
+ }
+
+ // We only update an Activity's configuration if this is not a global
+ // configuration change. This must also be done before the callback,
+ // or else we violate the contract that the new resources are available
+ // in {@link ComponentCallbacks2#onConfigurationChanged(Configuration)}.
if (activityToken != null) {
- // We only update an Activity's configuration if this is not a global
- // configuration change. This must also be done before the callback,
- // or else we violate the contract that the new resources are available
- // in {@link ComponentCallbacks2#onConfigurationChanged(Configuration)}.
- mResourcesManager.updateResourcesForActivity(activityToken, overrideConfig);
+ // Apply the ContextThemeWrapper override if necessary.
+ // NOTE: Make sure the configurations are not modified, as they are treated
+ // as immutable in many places.
+ final Configuration finalOverrideConfig = createNewConfigAndUpdateIfNotNull(
+ amOverrideConfig, contextThemeWrapperOverrideConfig);
+ mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig);
}
if (reportToActivity) {
- Configuration configToReport = newConfig;
-
- if (cb instanceof ContextThemeWrapper) {
- // ContextThemeWrappers may override the configuration for that context.
- // We must check and apply any overrides defined.
- ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb;
- final Configuration localOverrideConfig =
- contextThemeWrapper.getOverrideConfiguration();
- if (localOverrideConfig != null) {
- configToReport = new Configuration(newConfig);
- configToReport.updateFrom(localOverrideConfig);
- }
- }
-
+ // Apply the ContextThemeWrapper override if necessary.
+ // NOTE: Make sure the configurations are not modified, as they are treated
+ // as immutable in many places.
+ final Configuration configToReport = createNewConfigAndUpdateIfNotNull(
+ newConfig, contextThemeWrapperOverrideConfig);
cb.onConfigurationChanged(configToReport);
}
@@ -5247,7 +5280,7 @@
// code is loaded to prevent issues with instances of TLS objects being created before
// the provider is installed.
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "NetworkSecurityConfigProvider.install");
- NetworkSecurityConfigProvider.install(appContext, data.appInfo);
+ NetworkSecurityConfigProvider.install(appContext);
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// Continue loading instrumentation.
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index e526c17..1e4ffbe 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -1340,9 +1340,14 @@
/** @hide */
public void setUserRestriction(int code, boolean restricted, IBinder token,
String[] exceptionPackages) {
+ setUserRestrictionForUser(code, restricted, token, exceptionPackages, mContext.getUserId());
+ }
+
+ /** @hide */
+ public void setUserRestrictionForUser(int code, boolean restricted, IBinder token,
+ String[] exceptionPackages, int userId) {
try {
- mService.setUserRestriction(code, restricted, token, mContext.getUserId(),
- exceptionPackages);
+ mService.setUserRestriction(code, restricted, token, userId, exceptionPackages);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 87511ee..8cc1bc4 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1245,15 +1245,18 @@
return mContext.mMainThread.getSystemContext().getResources();
}
final boolean sameUid = (app.uid == Process.myUid());
- final Resources r = mContext.mMainThread.getTopLevelResources(
- sameUid ? app.sourceDir : app.publicSourceDir,
- sameUid ? app.splitSourceDirs : app.splitPublicSourceDirs,
- app.resourceDirs, app.sharedLibraryFiles, Display.DEFAULT_DISPLAY,
- mContext.mPackageInfo);
- if (r != null) {
- return r;
+ try {
+ return mContext.mMainThread.getTopLevelResources(
+ sameUid ? app.sourceDir : app.publicSourceDir,
+ sameUid ? app.splitSourceDirs : app.splitPublicSourceDirs,
+ app.resourceDirs, app.sharedLibraryFiles, Display.DEFAULT_DISPLAY,
+ mContext.mPackageInfo);
+ } catch (Resources.NotFoundException cause) {
+ final NameNotFoundException ex =
+ new NameNotFoundException("Unable to open " + app.publicSourceDir);
+ ex.initCause(cause);
+ throw ex;
}
- throw new NameNotFoundException("Unable to open " + app.publicSourceDir);
}
@Override
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 152f45e..0b62ed2 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -1191,14 +1191,18 @@
public void performReceive(Intent intent, int resultCode, String data,
Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
- if (ActivityThread.DEBUG_BROADCAST) {
- int seq = intent.getIntExtra("seq", -1);
- Slog.i(ActivityThread.TAG, "Enqueueing broadcast " + intent.getAction() + " seq=" + seq
- + " to " + mReceiver);
- }
- Args args = new Args(intent, resultCode, data, extras, ordered,
+ final Args args = new Args(intent, resultCode, data, extras, ordered,
sticky, sendingUser);
- if (!mActivityThread.post(args)) {
+ if (intent == null) {
+ Log.wtf(TAG, "Null intent received");
+ } else {
+ if (ActivityThread.DEBUG_BROADCAST) {
+ int seq = intent.getIntExtra("seq", -1);
+ Slog.i(ActivityThread.TAG, "Enqueueing broadcast " + intent.getAction()
+ + " seq=" + seq + " to " + mReceiver);
+ }
+ }
+ if (intent == null || !mActivityThread.post(args)) {
if (mRegistered && ordered) {
IActivityManager mgr = ActivityManagerNative.getDefault();
if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG,
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 83a2066..0fca78d 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -4570,12 +4570,21 @@
: mConversationTitle;
boolean hasTitle = !TextUtils.isEmpty(title);
- if (!hasTitle && mMessages.size() == 1) {
- CharSequence sender = mMessages.get(0).mSender;
- CharSequence text = mMessages.get(0).mText;
+ if (mMessages.size() == 1) {
+ // Special case for a single message: Use the big text style
+ // so the collapsed and expanded versions match nicely.
+ CharSequence bigTitle;
+ CharSequence text;
+ if (hasTitle) {
+ bigTitle = title;
+ text = makeMessageLine(mMessages.get(0));
+ } else {
+ bigTitle = mMessages.get(0).mSender;
+ text = mMessages.get(0).mText;
+ }
RemoteViews contentView = mBuilder.applyStandardTemplateWithActions(
mBuilder.getBigTextLayoutResource(),
- false /* progress */, sender, null /* text */);
+ false /* progress */, bigTitle, null /* text */);
BigTextStyle.applyBigTextContentView(mBuilder, contentView, text);
return contentView;
}
@@ -4601,6 +4610,8 @@
contentView.setInt(R.id.notification_messaging, "setNumIndentLines",
mBuilder.mN.mLargeIcon == null ? 0 : (hasTitle ? 1 : 2));
+ int contractedChildId = View.NO_ID;
+ Message contractedMessage = findLatestIncomingMessage();
int firstMessage = Math.max(0, mMessages.size() - rowIds.length);
while (firstMessage + i < mMessages.size() && i < rowIds.length) {
Message m = mMessages.get(firstMessage + i);
@@ -4609,8 +4620,15 @@
contentView.setViewVisibility(rowId, View.VISIBLE);
contentView.setTextViewText(rowId, makeMessageLine(m));
+ if (contractedMessage == m) {
+ contractedChildId = rowId;
+ }
+
i++;
}
+ // Record this here to allow transformation between the contracted and expanded views.
+ contentView.setInt(R.id.notification_messaging, "setContractedChildId",
+ contractedChildId);
return contentView;
}
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 31d254dc..a4688d1 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -156,7 +156,7 @@
* Protected so that tests can override and returns something a fixed value.
*/
@VisibleForTesting
- protected DisplayMetrics getDisplayMetrics(int displayId) {
+ protected @NonNull DisplayMetrics getDisplayMetrics(int displayId) {
DisplayMetrics dm = new DisplayMetrics();
final Display display =
getAdjustedDisplay(displayId, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS);
@@ -250,14 +250,14 @@
// already.
if (key.mResDir != null) {
if (assets.addAssetPath(key.mResDir) == 0) {
- throw new IllegalArgumentException("failed to add asset path " + key.mResDir);
+ throw new Resources.NotFoundException("failed to add asset path " + key.mResDir);
}
}
if (key.mSplitResDirs != null) {
for (final String splitResDir : key.mSplitResDirs) {
if (assets.addAssetPath(splitResDir) == 0) {
- throw new IllegalArgumentException(
+ throw new Resources.NotFoundException(
"failed to add split asset path " + splitResDir);
}
}
@@ -303,7 +303,7 @@
return config;
}
- private ResourcesImpl createResourcesImpl(@NonNull ResourcesKey key) {
+ private @NonNull ResourcesImpl createResourcesImpl(@NonNull ResourcesKey key) {
AssetManager assets = createAssetManager(key);
DisplayMetrics dm = getDisplayMetrics(key.mDisplayId);
Configuration config = generateConfig(key, dm);
@@ -359,7 +359,7 @@
* Gets an existing Resources object tied to this Activity, or creates one if it doesn't exist
* or the class loader is different.
*/
- private Resources getOrCreateResourcesForActivityLocked(@NonNull IBinder activityToken,
+ private @NonNull Resources getOrCreateResourcesForActivityLocked(@NonNull IBinder activityToken,
@NonNull ClassLoader classLoader, @NonNull ResourcesImpl impl) {
final ActivityResources activityResources = getOrCreateActivityResourcesStructLocked(
activityToken);
@@ -393,7 +393,7 @@
* Gets an existing Resources object if the class loader and ResourcesImpl are the same,
* otherwise creates a new Resources object.
*/
- private Resources getOrCreateResourcesLocked(@NonNull ClassLoader classLoader,
+ private @NonNull Resources getOrCreateResourcesLocked(@NonNull ClassLoader classLoader,
@NonNull ResourcesImpl impl) {
// Find an existing Resources that has this ResourcesImpl set.
final int refCount = mResourceReferences.size();
@@ -441,7 +441,7 @@
* {@link ClassLoader#getSystemClassLoader()} is used.
* @return a Resources object from which to access resources.
*/
- public Resources createBaseActivityResources(@NonNull IBinder activityToken,
+ public @NonNull Resources createBaseActivityResources(@NonNull IBinder activityToken,
@Nullable String resDir,
@Nullable String[] splitResDirs,
@Nullable String[] overlayDirs,
@@ -495,7 +495,7 @@
* {@link #applyConfigurationToResourcesLocked(Configuration, CompatibilityInfo)}
* is called.
*/
- private Resources getOrCreateResources(@Nullable IBinder activityToken,
+ private @NonNull Resources getOrCreateResources(@Nullable IBinder activityToken,
@NonNull ResourcesKey key, @NonNull ClassLoader classLoader) {
synchronized (this) {
if (DEBUG) {
@@ -603,7 +603,7 @@
* {@link ClassLoader#getSystemClassLoader()} is used.
* @return a Resources object from which to access resources.
*/
- public Resources getResources(@Nullable IBinder activityToken,
+ public @NonNull Resources getResources(@Nullable IBinder activityToken,
@Nullable String resDir,
@Nullable String[] splitResDirs,
@Nullable String[] overlayDirs,
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 18f93cd..7f467f0 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -1576,8 +1576,11 @@
final String whichProp;
final int defaultResId;
if (which == FLAG_LOCK) {
+ /* Factory-default lock wallpapers are not yet supported
whichProp = PROP_LOCK_WALLPAPER;
defaultResId = com.android.internal.R.drawable.default_lock_wallpaper;
+ */
+ return null;
} else {
whichProp = PROP_WALLPAPER;
defaultResId = com.android.internal.R.drawable.default_wallpaper;
diff --git a/core/java/android/app/admin/DevicePolicyManagerInternal.java b/core/java/android/app/admin/DevicePolicyManagerInternal.java
index 54a2f7a..e98bb7e 100644
--- a/core/java/android/app/admin/DevicePolicyManagerInternal.java
+++ b/core/java/android/app/admin/DevicePolicyManagerInternal.java
@@ -17,7 +17,6 @@
package android.app.admin;
import android.content.Intent;
-import android.os.UserHandle;
import java.util.List;
@@ -74,17 +73,6 @@
public abstract boolean isActiveAdminWithPolicy(int uid, int reqPolicy);
/**
- * Checks if a given package has a device or a profile owner for the given user.
- * <p>
- * <em>Note: does <b>not</b> support negative userIds like {@link UserHandle#USER_ALL}</em>
- *
- * @param packageName The package to check
- * @param userId the userId to check for.
- * @return true if package has a device or profile owner, false otherwise.
- */
- public abstract boolean hasDeviceOwnerOrProfileOwner(String packageName, int userId);
-
- /**
* Creates an intent to show the admin support dialog to let the user know that the package is
* suspended by the admin. This assumes that {@param packageName} is suspended by the
* device/profile owner. The caller should check if the package is suspended or not.
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 30da03c..bc79f41 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -29,7 +29,9 @@
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.Printer;
-
+import android.text.BidiFormatter;
+import android.text.TextPaint;
+import android.text.Html;
import java.text.Collator;
import java.util.Comparator;
@@ -44,7 +46,6 @@
*/
public class PackageItemInfo {
private static final float MAX_LABEL_SIZE_PX = 500f;
-
/**
* Public name of this item. From the "android:name" attribute.
*/
@@ -145,7 +146,7 @@
}
return packageName;
}
-
+
/**
* Same as {@link #loadLabel(PackageManager)} with the addition that
* the returned label is safe for being presented in the UI since it
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 13ebb82..14f7727 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -18,6 +18,7 @@
import android.content.ComponentName;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.util.SparseArray;
import java.util.List;
@@ -147,4 +148,16 @@
*/
public abstract ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
int userId);
+
+ /**
+ * Called by DeviceOwnerManagerService to set the package names of device owner and profile
+ * owners.
+ */
+ public abstract void setDeviceAndProfileOwnerPackages(
+ int deviceOwnerUserId, String deviceOwner, SparseArray<String> profileOwners);
+
+ /**
+ * Whether a package's data be cleared.
+ */
+ public abstract boolean canPackageBeWiped(int userId, String packageName);
}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 93fe73b..54a5968 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -126,9 +126,9 @@
* Returns the most appropriate default theme for the specified target SDK version.
* <ul>
* <li>Below API 11: Gingerbread
- * <li>APIs 11 thru 14: Holo
- * <li>APIs 14 thru XX: Device default dark
- * <li>API XX and above: Device default light with dark action bar
+ * <li>APIs 12 thru 14: Holo
+ * <li>APIs 15 thru 23: Device default dark
+ * <li>APIs 24 and above: Device default light with dark action bar
* </ul>
*
* @param curTheme The current theme, or 0 if not specified.
@@ -156,7 +156,7 @@
if (targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return holo;
}
- if (targetSdkVersion < Build.VERSION_CODES.CUR_DEVELOPMENT) {
+ if (targetSdkVersion < Build.VERSION_CODES.N) {
return dark;
}
return deviceDefault;
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 5743b4d..0cee114 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -1610,41 +1610,6 @@
}
public class CameraDeviceCallbacks extends ICameraDeviceCallbacks.Stub {
- //
- // Constants below need to be kept up-to-date with
- // frameworks/av/include/camera/camera2/ICameraDeviceCallbacks.h
- //
-
- //
- // Error codes for onCameraError
- //
-
- /**
- * Camera has been disconnected
- */
- public static final int ERROR_CAMERA_DISCONNECTED = 0;
- /**
- * Camera has encountered a device-level error
- * Matches CameraDevice.StateCallback#ERROR_CAMERA_DEVICE
- */
- public static final int ERROR_CAMERA_DEVICE = 1;
- /**
- * Camera has encountered a service-level error
- * Matches CameraDevice.StateCallback#ERROR_CAMERA_SERVICE
- */
- public static final int ERROR_CAMERA_SERVICE = 2;
- /**
- * Camera has encountered an error processing a single request.
- */
- public static final int ERROR_CAMERA_REQUEST = 3;
- /**
- * Camera has encountered an error producing metadata for a single capture
- */
- public static final int ERROR_CAMERA_RESULT = 4;
- /**
- * Camera has encountered an error producing an image buffer for a single capture
- */
- public static final int ERROR_CAMERA_BUFFER = 5;
@Override
public IBinder asBinder() {
@@ -1675,11 +1640,14 @@
case ERROR_CAMERA_DEVICE:
case ERROR_CAMERA_SERVICE:
mInError = true;
+ final int publicErrorCode = (errorCode == ERROR_CAMERA_DEVICE) ?
+ StateCallback.ERROR_CAMERA_DEVICE :
+ StateCallback.ERROR_CAMERA_SERVICE;
Runnable r = new Runnable() {
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()) {
- mDeviceCallback.onError(CameraDeviceImpl.this, errorCode);
+ mDeviceCallback.onError(CameraDeviceImpl.this, publicErrorCode);
}
}
};
@@ -2050,7 +2018,7 @@
public void run() {
if (!isClosed()) {
mDeviceCallback.onError(CameraDeviceImpl.this,
- CameraDeviceCallbacks.ERROR_CAMERA_SERVICE);
+ StateCallback.ERROR_CAMERA_SERVICE);
}
}
};
diff --git a/core/java/android/hardware/camera2/marshal/MarshalRegistry.java b/core/java/android/hardware/camera2/marshal/MarshalRegistry.java
index ba821e4..1565087 100644
--- a/core/java/android/hardware/camera2/marshal/MarshalRegistry.java
+++ b/core/java/android/hardware/camera2/marshal/MarshalRegistry.java
@@ -37,7 +37,9 @@
* @param queryable a non-{@code null} marshal queryable that supports marshaling {@code T}
*/
public static <T> void registerMarshalQueryable(MarshalQueryable<T> queryable) {
- sRegisteredMarshalQueryables.add(queryable);
+ synchronized(sMarshalLock) {
+ sRegisteredMarshalQueryables.add(queryable);
+ }
}
/**
@@ -54,47 +56,50 @@
*/
@SuppressWarnings("unchecked")
public static <T> Marshaler<T> getMarshaler(TypeReference<T> typeToken, int nativeType) {
- // TODO: can avoid making a new token each time by code-genning
- // the list of type tokens and native types from the keys (at the call sites)
- MarshalToken<T> marshalToken = new MarshalToken<T>(typeToken, nativeType);
+ synchronized(sMarshalLock) {
+ // TODO: can avoid making a new token each time by code-genning
+ // the list of type tokens and native types from the keys (at the call sites)
+ MarshalToken<T> marshalToken = new MarshalToken<T>(typeToken, nativeType);
- /*
- * Marshalers are instantiated lazily once they are looked up; successive lookups
- * will not instantiate new marshalers.
- */
- Marshaler<T> marshaler =
- (Marshaler<T>) sMarshalerMap.get(marshalToken);
-
- if (sRegisteredMarshalQueryables.size() == 0) {
- throw new AssertionError("No available query marshalers registered");
- }
-
- if (marshaler == null) {
- // Query each marshaler to see if they support the native/managed type combination
- for (MarshalQueryable<?> potentialMarshaler : sRegisteredMarshalQueryables) {
-
- MarshalQueryable<T> castedPotential =
- (MarshalQueryable<T>)potentialMarshaler;
-
- if (castedPotential.isTypeMappingSupported(typeToken, nativeType)) {
- marshaler = castedPotential.createMarshaler(typeToken, nativeType);
- break;
- }
- }
+ /*
+ * Marshalers are instantiated lazily once they are looked up; successive lookups
+ * will not instantiate new marshalers.
+ */
+ Marshaler<T> marshaler =
+ (Marshaler<T>) sMarshalerMap.get(marshalToken);
if (marshaler == null) {
- throw new UnsupportedOperationException(
+
+ if (sRegisteredMarshalQueryables.size() == 0) {
+ throw new AssertionError("No available query marshalers registered");
+ }
+
+ // Query each marshaler to see if they support the native/managed type combination
+ for (MarshalQueryable<?> potentialMarshaler : sRegisteredMarshalQueryables) {
+
+ MarshalQueryable<T> castedPotential =
+ (MarshalQueryable<T>)potentialMarshaler;
+
+ if (castedPotential.isTypeMappingSupported(typeToken, nativeType)) {
+ marshaler = castedPotential.createMarshaler(typeToken, nativeType);
+ break;
+ }
+ }
+
+ if (marshaler == null) {
+ throw new UnsupportedOperationException(
"Could not find marshaler that matches the requested " +
- "combination of type reference " +
- typeToken + " and native type " +
- MarshalHelpers.toStringNativeType(nativeType));
+ "combination of type reference " +
+ typeToken + " and native type " +
+ MarshalHelpers.toStringNativeType(nativeType));
+ }
+
+ // Only put when no cached version exists to avoid +0.5ms lookup per call.
+ sMarshalerMap.put(marshalToken, marshaler);
}
- // Only put when no cached version exists to avoid +0.5ms lookup per call.
- sMarshalerMap.put(marshalToken, marshaler);
+ return marshaler;
}
-
- return marshaler;
}
private static class MarshalToken<T> {
@@ -125,9 +130,12 @@
}
}
- private static List<MarshalQueryable<?>> sRegisteredMarshalQueryables =
+ // Control access to the static data structures below
+ private static final Object sMarshalLock = new Object();
+
+ private static final List<MarshalQueryable<?>> sRegisteredMarshalQueryables =
new ArrayList<MarshalQueryable<?>>();
- private static HashMap<MarshalToken<?>, Marshaler<?>> sMarshalerMap =
+ private static final HashMap<MarshalToken<?>, Marshaler<?>> sMarshalerMap =
new HashMap<MarshalToken<?>, Marshaler<?>>();
private MarshalRegistry() {
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index ea5ae32..f4bf3ea 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -176,7 +176,7 @@
/**
* Current version of checkin data format.
*/
- static final String CHECKIN_VERSION = "17";
+ static final String CHECKIN_VERSION = "18";
/**
* Old version, we hit 9 and ran out of room, need to remove.
@@ -2371,6 +2371,20 @@
};
/**
+ * Return the counter keeping track of the amount of battery discharge while the screen was off,
+ * measured in micro-Ampere-hours. This will be non-zero only if the device's battery has
+ * a coulomb counter.
+ */
+ public abstract LongCounter getDischargeScreenOffCoulombCounter();
+
+ /**
+ * Return the counter keeping track of the amount of battery discharge measured in
+ * micro-Ampere-hours. This will be non-zero only if the device's battery has
+ * a coulomb counter.
+ */
+ public abstract LongCounter getDischargeCoulombCounter();
+
+ /**
* Return the array of discharge step durations.
*/
public abstract LevelStepTracker getDischargeLevelStepTracker();
@@ -2805,6 +2819,9 @@
rawRealtime, which);
final int connChanges = getNumConnectivityChange(which);
final long phoneOnTime = getPhoneOnTime(rawRealtime, which);
+ final long dischargeCount = getDischargeCoulombCounter().getCountLocked(which);
+ final long dischargeScreenOffCount = getDischargeScreenOffCoulombCounter()
+ .getCountLocked(which);
final StringBuilder sb = new StringBuilder(128);
@@ -2820,6 +2837,7 @@
totalRealtime / 1000, totalUptime / 1000,
getStartClockTime(),
whichBatteryScreenOffRealtime / 1000, whichBatteryScreenOffUptime / 1000);
+
// Calculate wakelock times across all uids.
long fullWakeLockTimeTotal = 0;
@@ -2969,12 +2987,14 @@
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
getDischargeStartLevel()-getDischargeCurrentLevel(),
getDischargeStartLevel()-getDischargeCurrentLevel(),
- getDischargeAmountScreenOn(), getDischargeAmountScreenOff());
+ getDischargeAmountScreenOn(), getDischargeAmountScreenOff(),
+ dischargeCount / 1000, dischargeScreenOffCount / 1000);
} else {
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
getLowDischargeAmountSinceCharge(), getHighDischargeAmountSinceCharge(),
getDischargeAmountScreenOnSinceCharge(),
- getDischargeAmountScreenOffSinceCharge());
+ getDischargeAmountScreenOffSinceCharge(),
+ dischargeCount / 1000, dischargeScreenOffCount / 1000);
}
if (reqUid < 0) {
@@ -3371,6 +3391,39 @@
formatTimeMs(sb, chargeTimeRemaining / 1000);
pw.println(sb.toString());
}
+
+ final LongCounter dischargeCounter = getDischargeCoulombCounter();
+ final long dischargeCount = dischargeCounter.getCountLocked(which);
+ if (dischargeCount >= 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Discharge: ");
+ sb.append(BatteryStatsHelper.makemAh(dischargeCount / 1000.0));
+ sb.append(" mAh");
+ pw.println(sb.toString());
+ }
+
+ final LongCounter dischargeScreenOffCounter = getDischargeScreenOffCoulombCounter();
+ final long dischargeScreenOffCount = dischargeScreenOffCounter.getCountLocked(which);
+ if (dischargeScreenOffCount >= 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Screen off discharge: ");
+ sb.append(BatteryStatsHelper.makemAh(dischargeScreenOffCount / 1000.0));
+ sb.append(" mAh");
+ pw.println(sb.toString());
+ }
+
+ final long dischargeScreenOnCount = dischargeCount - dischargeScreenOffCount;
+ if (dischargeScreenOnCount >= 0) {
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Screen on discharge: ");
+ sb.append(BatteryStatsHelper.makemAh(dischargeScreenOnCount / 1000.0));
+ sb.append(" mAh");
+ pw.println(sb.toString());
+ }
+
pw.print(" Start clock time: ");
pw.println(DateFormat.format("yyyy-MM-dd-HH-mm-ss", getStartClockTime()).toString());
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 4abbf0e..7ff01da 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -687,13 +687,15 @@
}
}
- // Read last_install; then report time for update and I/O to tron.
+ // Read last_install; then report time (in seconds) and I/O (in MiB) for
+ // this update to tron.
// Only report on the reboots immediately after an OTA update.
private static void parseLastInstallLog(Context context) {
try (BufferedReader in = new BufferedReader(new FileReader(LAST_INSTALL_FILE))) {
String line = null;
- int bytesWritten = -1, bytesStashed = -1;
+ int bytesWrittenInMiB = -1, bytesStashedInMiB = -1;
int timeTotal = -1;
+ int sourceVersion = -1;
while ((line = in.readLine()) != null) {
// Here is an example of lines in last_install:
// ...
@@ -705,20 +707,37 @@
continue;
}
String numString = line.substring(numIndex + 1).trim();
- int parsedNum;
+ long parsedNum;
try {
- parsedNum = Integer.parseInt(numString);
+ parsedNum = Long.parseLong(numString);
} catch (NumberFormatException ignored) {
Log.e(TAG, "Failed to parse numbers in " + line);
continue;
}
+ final int MiB = 1024 * 1024;
+ int scaled;
+ try {
+ if (line.startsWith("bytes")) {
+ scaled = Math.toIntExact(parsedNum / MiB);
+ } else {
+ scaled = Math.toIntExact(parsedNum);
+ }
+ } catch (ArithmeticException ignored) {
+ Log.e(TAG, "Number overflows in " + line);
+ continue;
+ }
+
if (line.startsWith("time")) {
- timeTotal = parsedNum;
+ timeTotal = scaled;
+ } else if (line.startsWith("source_version")) {
+ sourceVersion = scaled;
} else if (line.startsWith("bytes_written")) {
- bytesWritten = (bytesWritten == -1) ? parsedNum : bytesWritten + parsedNum;
+ bytesWrittenInMiB = (bytesWrittenInMiB == -1) ? scaled :
+ bytesWrittenInMiB + scaled;
} else if (line.startsWith("bytes_stashed")) {
- bytesStashed = (bytesStashed == -1) ? parsedNum : bytesStashed + parsedNum;
+ bytesStashedInMiB = (bytesStashedInMiB == -1) ? scaled :
+ bytesStashedInMiB + scaled;
}
}
@@ -726,15 +745,18 @@
if (timeTotal != -1) {
MetricsLogger.histogram(context, "ota_time_total", timeTotal);
}
- if (bytesWritten != -1) {
- MetricsLogger.histogram(context, "ota_bytes_written", bytesWritten);
+ if (sourceVersion != -1) {
+ MetricsLogger.histogram(context, "ota_source_version", sourceVersion);
}
- if (bytesStashed != -1) {
- MetricsLogger.histogram(context, "ota_bytes_stashed", bytesStashed);
+ if (bytesWrittenInMiB != -1) {
+ MetricsLogger.histogram(context, "ota_written_in_MiBs", bytesWrittenInMiB);
+ }
+ if (bytesStashedInMiB != -1) {
+ MetricsLogger.histogram(context, "ota_stashed_in_MiBs", bytesStashedInMiB);
}
- } catch (IOException ignored) {
- Log.e(TAG, "Failed to read lines in last_install", ignored);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to read lines in last_install", e);
}
}
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index f3dc432..7146448 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -2021,7 +2021,7 @@
}
/**
- * Returns a {@code Bundle} containing any saved application restrictions for this user, for the
+ * Returns a {@link Bundle} containing any saved application restrictions for this user, for the
* given package name. Only an application with this package name can call this method.
*
* <p>The returned {@link Bundle} consists of key-value pairs, as defined by the application,
@@ -2034,8 +2034,8 @@
* </ul>
*
* @param packageName the package name of the calling application
- * @return a {@code Bundle} with the restrictions for that package, or {@code null} if there
- * are no saved restrictions.
+ * @return a {@link Bundle} with the restrictions for that package, or an empty {@link Bundle}
+ * if there are no saved restrictions.
*
* @see #KEY_RESTRICTIONS_PENDING
*/
diff --git a/core/java/android/security/net/config/ManifestConfigSource.java b/core/java/android/security/net/config/ManifestConfigSource.java
index d59b5e3..92bddb7 100644
--- a/core/java/android/security/net/config/ManifestConfigSource.java
+++ b/core/java/android/security/net/config/ManifestConfigSource.java
@@ -29,13 +29,19 @@
private final Object mLock = new Object();
private final Context mContext;
- private final ApplicationInfo mInfo;
+ private final int mApplicationInfoFlags;
+ private final int mTargetSdkVersion;
+ private final int mConfigResourceId;
private ConfigSource mConfigSource;
- public ManifestConfigSource(Context context, ApplicationInfo info) {
+ public ManifestConfigSource(Context context) {
mContext = context;
- mInfo = info;
+ // Cache values because ApplicationInfo is mutable and apps do modify it :(
+ ApplicationInfo info = context.getApplicationInfo();
+ mApplicationInfoFlags = info.flags;
+ mTargetSdkVersion = info.targetSdkVersion;
+ mConfigResourceId = info.networkSecurityConfigRes;
}
@Override
@@ -53,29 +59,24 @@
if (mConfigSource != null) {
return mConfigSource;
}
- int targetSdkVersion = mInfo.targetSdkVersion;
- int configResourceId = 0;
- if (mInfo != null) {
- configResourceId = mInfo.networkSecurityConfigRes;
- }
ConfigSource source;
- if (configResourceId != 0) {
- boolean debugBuild = (mInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ if (mConfigResourceId != 0) {
+ boolean debugBuild = (mApplicationInfoFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
if (DBG) {
Log.d(LOG_TAG, "Using Network Security Config from resource "
- + mContext.getResources().getResourceEntryName(configResourceId)
+ + mContext.getResources().getResourceEntryName(mConfigResourceId)
+ " debugBuild: " + debugBuild);
}
- source = new XmlConfigSource(mContext, configResourceId, debugBuild,
- targetSdkVersion);
+ source = new XmlConfigSource(mContext, mConfigResourceId, debugBuild,
+ mTargetSdkVersion);
} else {
if (DBG) {
Log.d(LOG_TAG, "No Network Security Config specified, using platform default");
}
boolean usesCleartextTraffic =
- (mInfo.flags & ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC) != 0;
- source = new DefaultConfigSource(usesCleartextTraffic, targetSdkVersion);
+ (mApplicationInfoFlags & ApplicationInfo.FLAG_USES_CLEARTEXT_TRAFFIC) != 0;
+ source = new DefaultConfigSource(usesCleartextTraffic, mTargetSdkVersion);
}
mConfigSource = source;
return mConfigSource;
diff --git a/core/java/android/security/net/config/NetworkSecurityConfigProvider.java b/core/java/android/security/net/config/NetworkSecurityConfigProvider.java
index 4c51cc3..0f66873 100644
--- a/core/java/android/security/net/config/NetworkSecurityConfigProvider.java
+++ b/core/java/android/security/net/config/NetworkSecurityConfigProvider.java
@@ -17,7 +17,6 @@
package android.security.net.config;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import java.security.Security;
import java.security.Provider;
@@ -33,8 +32,8 @@
put("Alg.Alias.TrustManagerFactory.X509", "PKIX");
}
- public static void install(Context context, ApplicationInfo info) {
- ApplicationConfig config = new ApplicationConfig(new ManifestConfigSource(context, info));
+ public static void install(Context context) {
+ ApplicationConfig config = new ApplicationConfig(new ManifestConfigSource(context));
ApplicationConfig.setDefaultInstance(config);
int pos = Security.insertProviderAt(new NetworkSecurityConfigProvider(), 1);
if (pos != 1) {
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 787202e..dc8e4b9 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -19,7 +19,6 @@
import android.annotation.Nullable;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.text.style.ParagraphStyle;
import android.util.Log;
import com.android.internal.util.ArrayUtils;
@@ -554,7 +553,8 @@
if (adjustSelection) {
boolean changed = false;
if (selectionStart > start && selectionStart < end) {
- final int offset = (selectionStart - start) * newLen / origLen;
+ final long diff = selectionStart - start;
+ final int offset = Math.toIntExact(diff * newLen / origLen);
selectionStart = start + offset;
changed = true;
@@ -562,7 +562,8 @@
Spanned.SPAN_POINT_POINT);
}
if (selectionEnd > start && selectionEnd < end) {
- final int offset = (selectionEnd - start) * newLen / origLen;
+ final long diff = selectionEnd - start;
+ final int offset = Math.toIntExact(diff * newLen / origLen);
selectionEnd = start + offset;
changed = true;
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index b4131b4..415e70c 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -51,6 +51,7 @@
private static native void nativeSetLayer(long nativeObject, int zorder);
private static native void nativeSetPosition(long nativeObject, float x, float y);
+ private static native void nativeSetPositionAppliesWithResize(long nativeObject);
private static native void nativeSetSize(long nativeObject, int w, int h);
private static native void nativeSetTransparentRegionHint(long nativeObject, Region region);
private static native void nativeSetAlpha(long nativeObject, float alpha);
@@ -407,6 +408,16 @@
nativeSetPosition(mNativeObject, x, y);
}
+ /**
+ * If the size changes in this transaction, position updates specified
+ * in this transaction will not complete until a buffer of the new size
+ * arrives.
+ */
+ public void setPositionAppliesWithResize() {
+ checkNotReleased();
+ nativeSetPositionAppliesWithResize(mNativeObject);
+ }
+
public void setSize(int w, int h) {
checkNotReleased();
nativeSetSize(mNativeObject, w, h);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 88605db..5f6ee09 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -20538,6 +20538,10 @@
if (ViewDebug.DEBUG_DRAG) {
Log.d(VIEW_LOG_TAG, "startDragAndDrop: data=" + data + " flags=" + flags);
}
+ if (mAttachInfo == null) {
+ Log.w(VIEW_LOG_TAG, "startDragAndDrop called on a detached view.");
+ return false;
+ }
boolean okay = false;
Point shadowSize = new Point();
@@ -20614,6 +20618,10 @@
if (ViewDebug.DEBUG_DRAG) {
Log.d(VIEW_LOG_TAG, "cancelDragAndDrop");
}
+ if (mAttachInfo == null) {
+ Log.w(VIEW_LOG_TAG, "cancelDragAndDrop called on a detached view.");
+ return;
+ }
if (mAttachInfo.mDragToken != null) {
try {
mAttachInfo.mSession.cancelDragAndDrop(mAttachInfo.mDragToken);
@@ -20636,6 +20644,10 @@
if (ViewDebug.DEBUG_DRAG) {
Log.d(VIEW_LOG_TAG, "updateDragShadow");
}
+ if (mAttachInfo == null) {
+ Log.w(VIEW_LOG_TAG, "updateDragShadow called on a detached view.");
+ return;
+ }
if (mAttachInfo.mDragToken != null) {
try {
Canvas canvas = mAttachInfo.mDragSurface.lockCanvas(null);
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 4742818..19b1cf3 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1938,7 +1938,7 @@
mSurfaceHolder.setSurfaceFrameSize(mWidth, mHeight);
mSurfaceHolder.mSurfaceLock.unlock();
if (mSurface.isValid()) {
- if (!hadSurface || surfaceGenerationId != mSurface.getGenerationId()) {
+ if (!hadSurface) {
mSurfaceHolder.ungetCallbacks();
mIsCreating = true;
@@ -1951,7 +1951,7 @@
}
surfaceChanged = true;
}
- if (surfaceChanged) {
+ if (surfaceChanged || surfaceGenerationId != mSurface.getGenerationId()) {
mSurfaceHolderCallback.surfaceChanged(mSurfaceHolder,
lp.format, mWidth, mHeight);
SurfaceHolder.Callback callbacks[] = mSurfaceHolder.getCallbacks();
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 8b02352..07d38d7 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -108,7 +108,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 144 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 146 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -509,6 +509,9 @@
int mDischargeAmountScreenOff;
int mDischargeAmountScreenOffSinceCharge;
+ private LongSamplingCounter mDischargeScreenOffCounter;
+ private LongSamplingCounter mDischargeCounter;
+
static final int MAX_LEVEL_STEPS = 200;
int mInitStepMode = 0;
@@ -565,6 +568,16 @@
return mWakeupReasonStats;
}
+ @Override
+ public LongCounter getDischargeScreenOffCoulombCounter() {
+ return mDischargeScreenOffCounter;
+ }
+
+ @Override
+ public LongCounter getDischargeCoulombCounter() {
+ return mDischargeCounter;
+ }
+
public BatteryStatsImpl() {
this(new SystemClocks());
}
@@ -912,7 +925,6 @@
final TimeBase mTimeBase;
long mCount;
long mLoadedCount;
- long mLastCount;
long mUnpluggedCount;
long mPluggedCount;
@@ -921,7 +933,6 @@
mPluggedCount = in.readLong();
mCount = mPluggedCount;
mLoadedCount = in.readLong();
- mLastCount = 0;
mUnpluggedCount = in.readLong();
timeBase.add(this);
}
@@ -949,20 +960,19 @@
}
public long getCountLocked(int which) {
- long val = mCount;
+ long val = mTimeBase.isRunning() ? mCount : mPluggedCount;
if (which == STATS_SINCE_UNPLUGGED) {
val -= mUnpluggedCount;
} else if (which != STATS_SINCE_CHARGED) {
val -= mLoadedCount;
}
-
return val;
}
@Override
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mCount=" + mCount
- + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
+ + " mLoadedCount=" + mLoadedCount
+ " mUnpluggedCount=" + mUnpluggedCount
+ " mPluggedCount=" + mPluggedCount);
}
@@ -976,7 +986,7 @@
*/
void reset(boolean detachIfReset) {
mCount = 0;
- mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
+ mLoadedCount = mPluggedCount = mUnpluggedCount = 0;
if (detachIfReset) {
detach();
}
@@ -993,7 +1003,6 @@
void readSummaryFromParcelLocked(Parcel in) {
mLoadedCount = in.readLong();
mCount = mLoadedCount;
- mLastCount = 0;
mUnpluggedCount = mPluggedCount = mLoadedCount;
}
}
@@ -7566,6 +7575,8 @@
mFlashlightOnTimer = new StopwatchTimer(mClocks, null, -9, null, mOnBatteryTimeBase);
mCameraOnTimer = new StopwatchTimer(mClocks, null, -13, null, mOnBatteryTimeBase);
mBluetoothScanTimer = new StopwatchTimer(mClocks, null, -14, null, mOnBatteryTimeBase);
+ mDischargeScreenOffCounter = new LongSamplingCounter(mOnBatteryScreenOffTimeBase);
+ mDischargeCounter = new LongSamplingCounter(mOnBatteryTimeBase);
mOnBattery = mOnBatteryInternal = false;
long uptime = mClocks.uptimeMillis() * 1000;
long realtime = mClocks.elapsedRealtime() * 1000;
@@ -8123,6 +8134,8 @@
mDischargeAmountScreenOffSinceCharge = 0;
mDischargeStepTracker.init();
mChargeStepTracker.init();
+ mDischargeScreenOffCounter.reset(false);
+ mDischargeCounter.reset(false);
}
public void resetAllStatsCmdLocked() {
@@ -9327,6 +9340,7 @@
mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG;
mHistoryCur.batteryStatus = (byte)status;
mHistoryCur.batteryLevel = (byte)level;
+ mHistoryCur.batteryChargeUAh = chargeUAh;
mMaxChargeStepLevel = mMinDischargeStepLevel =
mLastChargeStepLevel = mLastDischargeStepLevel = level;
mLastChargingStateLevel = level;
@@ -9358,6 +9372,12 @@
mHistoryCur.batteryPlugType = (byte)plugType;
mHistoryCur.batteryTemperature = (short)temp;
mHistoryCur.batteryVoltage = (char)volt;
+ if (chargeUAh < mHistoryCur.batteryChargeUAh) {
+ // Only record discharges
+ final long chargeDiff = mHistoryCur.batteryChargeUAh - chargeUAh;
+ mDischargeCounter.addCountLocked(chargeDiff);
+ mDischargeScreenOffCounter.addCountLocked(chargeDiff);
+ }
mHistoryCur.batteryChargeUAh = chargeUAh;
setOnBatteryLocked(elapsedRealtime, uptime, onBattery, oldStatus, level);
} else {
@@ -9394,6 +9414,12 @@
}
if (chargeUAh >= (mHistoryCur.batteryChargeUAh+10)
|| chargeUAh <= (mHistoryCur.batteryChargeUAh-10)) {
+ if (chargeUAh < mHistoryCur.batteryChargeUAh) {
+ // Only record discharges
+ final long chargeDiff = mHistoryCur.batteryChargeUAh - chargeUAh;
+ mDischargeCounter.addCountLocked(chargeDiff);
+ mDischargeScreenOffCounter.addCountLocked(chargeDiff);
+ }
mHistoryCur.batteryChargeUAh = chargeUAh;
changed = true;
}
@@ -10075,6 +10101,8 @@
mChargeStepTracker.readFromParcel(in);
mDailyDischargeStepTracker.readFromParcel(in);
mDailyChargeStepTracker.readFromParcel(in);
+ mDischargeCounter.readSummaryFromParcelLocked(in);
+ mDischargeScreenOffCounter.readSummaryFromParcelLocked(in);
int NPKG = in.readInt();
if (NPKG > 0) {
mDailyPackageChanges = new ArrayList<>(NPKG);
@@ -10425,6 +10453,8 @@
mChargeStepTracker.writeToParcel(out);
mDailyDischargeStepTracker.writeToParcel(out);
mDailyChargeStepTracker.writeToParcel(out);
+ mDischargeCounter.writeSummaryFromParcelLocked(out);
+ mDischargeScreenOffCounter.writeSummaryFromParcelLocked(out);
if (mDailyPackageChanges != null) {
final int NPKG = mDailyPackageChanges.size();
out.writeInt(NPKG);
@@ -10880,6 +10910,8 @@
mDischargeAmountScreenOffSinceCharge = in.readInt();
mDischargeStepTracker.readFromParcel(in);
mChargeStepTracker.readFromParcel(in);
+ mDischargeCounter = new LongSamplingCounter(mOnBatteryTimeBase, in);
+ mDischargeScreenOffCounter = new LongSamplingCounter(mOnBatteryTimeBase, in);
mLastWriteTime = in.readLong();
mKernelWakelockStats.clear();
@@ -11028,6 +11060,8 @@
out.writeInt(mDischargeAmountScreenOffSinceCharge);
mDischargeStepTracker.writeToParcel(out);
mChargeStepTracker.writeToParcel(out);
+ mDischargeCounter.writeToParcel(out);
+ mDischargeScreenOffCounter.writeToParcel(out);
out.writeLong(mLastWriteTime);
if (inclUids) {
diff --git a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
index 5d3043c..c828d11 100644
--- a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
@@ -84,7 +84,8 @@
powerMaUs = 0;
}
- if (callback != null) {
+ // Only report if there is a callback and if this is not the first read.
+ if (callback != null && mLastTimeReadUs != 0) {
long userTimeDeltaUs = userTimeUs;
long systemTimeDeltaUs = systemTimeUs;
long powerDeltaMaUs = powerMaUs;
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 7e38d9b..3cf7a4e 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -1550,7 +1550,13 @@
private ActionMode createStandaloneActionMode(ActionMode.Callback callback) {
endOnGoingFadeAnimation();
cleanupPrimaryActionMode();
- if (mPrimaryActionModeView == null) {
+ // We want to create new mPrimaryActionModeView in two cases: if there is no existing
+ // instance at all, or if there is one, but it is detached from window. The latter case
+ // might happen when app is resized in multi-window mode and decor view is preserved
+ // along with the main app window. Keeping mPrimaryActionModeView reference doesn't cause
+ // app memory leaks because killMode() is called when the dismiss animation ends and from
+ // cleanupPrimaryActionMode() invocation above.
+ if (mPrimaryActionModeView == null || !mPrimaryActionModeView.isAttachedToWindow()) {
if (mWindow.isFloating()) {
// Use the action bar theme.
final TypedValue outValue = new TypedValue();
@@ -1616,6 +1622,7 @@
ViewStub stub = (ViewStub) findViewById(R.id.action_mode_bar_stub);
if (stub != null) {
mPrimaryActionModeView = (ActionBarContextView) stub.inflate();
+ mPrimaryActionModePopup = null;
}
}
}
@@ -2278,9 +2285,14 @@
}
if (mPrimaryActionModeView != null) {
endOnGoingFadeAnimation();
+ // Store action mode view reference, so we can access it safely when animation
+ // ends. mPrimaryActionModePopup is set together with mPrimaryActionModeView,
+ // so no need to store reference to it in separate variable.
+ final ActionBarContextView lastActionModeView = mPrimaryActionModeView;
mFadeAnim = ObjectAnimator.ofFloat(mPrimaryActionModeView, View.ALPHA,
1f, 0f);
mFadeAnim.addListener(new Animator.AnimatorListener() {
+
@Override
public void onAnimationStart(Animator animation) {
@@ -2288,12 +2300,17 @@
@Override
public void onAnimationEnd(Animator animation) {
- mPrimaryActionModeView.setVisibility(GONE);
- if (mPrimaryActionModePopup != null) {
- mPrimaryActionModePopup.dismiss();
+ // If mPrimaryActionModeView has changed - it means that we've
+ // cleared the content while preserving decor view. We don't
+ // want to change the state of new instances accidentally here.
+ if (lastActionModeView == mPrimaryActionModeView) {
+ lastActionModeView.setVisibility(GONE);
+ if (mPrimaryActionModePopup != null) {
+ mPrimaryActionModePopup.dismiss();
+ }
+ lastActionModeView.killMode();
+ mFadeAnim = null;
}
- mPrimaryActionModeView.removeAllViews();
- mFadeAnim = null;
}
@Override
diff --git a/core/java/com/android/internal/util/FastPrintWriter.java b/core/java/com/android/internal/util/FastPrintWriter.java
index e46e6b0..dc3832a 100644
--- a/core/java/com/android/internal/util/FastPrintWriter.java
+++ b/core/java/com/android/internal/util/FastPrintWriter.java
@@ -345,7 +345,7 @@
if (mOutputStream != null) {
CharBuffer charBuffer = CharBuffer.wrap(mText, 0, mPos);
CoderResult result = mCharset.encode(charBuffer, mBytes, true);
- while (true) {
+ while (!mIoError) {
if (result.isError()) {
throw new IOException(result.toString());
} else if (result.isOverflow()) {
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 1beea8c..2e0dfa5 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -916,23 +916,6 @@
}
/**
- * Gets whether the device is encrypted.
- *
- * @return Whether the device is encrypted.
- */
- public static boolean isDeviceEncrypted() {
- IMountService mountService = IMountService.Stub.asInterface(
- ServiceManager.getService("mount"));
- try {
- return mountService.getEncryptionState() != IMountService.ENCRYPTION_STATE_NONE
- && mountService.getPasswordType() != StorageManager.CRYPT_TYPE_DEFAULT;
- } catch (RemoteException re) {
- Log.e(TAG, "Error getting encryption state", re);
- }
- return true;
- }
-
- /**
* Determine if the device supports encryption, even if it's set to default. This
* differs from isDeviceEncrypted() in that it returns true even if the device is
* encrypted with the default password.
diff --git a/core/java/com/android/internal/widget/MessagingLinearLayout.java b/core/java/com/android/internal/widget/MessagingLinearLayout.java
index dc7b7f5..d2a43b7 100644
--- a/core/java/com/android/internal/widget/MessagingLinearLayout.java
+++ b/core/java/com/android/internal/widget/MessagingLinearLayout.java
@@ -48,6 +48,11 @@
private int mIndentLines;
+ /**
+ * Id of the child that's also visible in the contracted layout.
+ */
+ private int mContractedChildId;
+
public MessagingLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -255,14 +260,29 @@
return copy;
}
- @RemotableViewMethod
/**
* Sets how many lines should be indented to avoid a floating image.
*/
+ @RemotableViewMethod
public void setNumIndentLines(int numberLines) {
mIndentLines = numberLines;
}
+ /**
+ * Set id of the child that's also visible in the contracted layout.
+ */
+ @RemotableViewMethod
+ public void setContractedChildId(int contractedChildId) {
+ mContractedChildId = contractedChildId;
+ }
+
+ /**
+ * Get id of the child that's also visible in the contracted layout.
+ */
+ public int getContractedChildId() {
+ return mContractedChildId;
+ }
+
public static class LayoutParams extends MarginLayoutParams {
boolean hide = false;
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index a9ed9dc..ff75677 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -248,6 +248,15 @@
}
}
+static void nativeSetPositionAppliesWithResize(JNIEnv* env, jclass clazz,
+ jlong nativeObject) {
+ SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
+ status_t err = ctrl->setPositionAppliesWithResize();
+ if (err < 0 && err != NO_INIT) {
+ doThrowIAE(env);
+ }
+}
+
static void nativeSetSize(JNIEnv* env, jclass clazz, jlong nativeObject, jint w, jint h) {
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
status_t err = ctrl->setSize(w, h);
@@ -658,6 +667,8 @@
(void*)nativeSetLayer },
{"nativeSetPosition", "(JFF)V",
(void*)nativeSetPosition },
+ {"nativeSetPositionAppliesWithResize", "(J)V",
+ (void*)nativeSetPositionAppliesWithResize },
{"nativeSetSize", "(JII)V",
(void*)nativeSetSize },
{"nativeSetTransparentRegionHint", "(JLandroid/graphics/Region;)V",
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6c289dc..e9a3409 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -360,6 +360,7 @@
<!-- Added in N -->
<protected-broadcast android:name="android.intent.action.ANR" />
<protected-broadcast android:name="android.intent.action.CALL" />
+ <protected-broadcast android:name="android.intent.action.CALL_PRIVILEGED" />
<protected-broadcast android:name="android.intent.action.DROPBOX_ENTRY_ADDED" />
<protected-broadcast android:name="android.intent.action.INPUT_METHOD_CHANGED" />
<protected-broadcast android:name="android.intent.action.internal_sim_state_changed" />
@@ -480,6 +481,7 @@
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_AVAILABLE" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_UNAVAILABLE" />
+ <protected-broadcast android:name="com.android.server.pm.DISABLE_QUIET_MODE_AFTER_UNLOCK" />
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
@@ -1416,6 +1418,11 @@
<permission android:name="android.permission.DVB_DEVICE"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows reading the OEM unlock state
+ @hide <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.READ_OEM_UNLOCK_STATE"
+ android:protectionLevel="signature|privileged" />
+
<!-- @hide Allows enabling/disabling OEM unlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OEM_UNLOCK_STATE"
@@ -1616,6 +1623,14 @@
<permission android:name="android.permission.MANAGE_USERS"
android:protectionLevel="signature|privileged" />
+ <!-- @hide Allows an application to create, remove users and get the list of
+ users on the device. Applications holding this permission can only create restricted,
+ guest, managed, and ephemeral users. For creating other kind of users,
+ {@link android.Manifest.permission#MANAGE_USERS} is needed.
+ This permission is not available to third party applications. -->
+ <permission android:name="android.permission.CREATE_USERS"
+ android:protectionLevel="signature" />
+
<!-- @hide Allows an application to set the profile owners and the device owner.
This permission is not available to third party applications.-->
<permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 86f5595..c03fb5b 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Maak oorloop toe"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimeer"</string>
<string name="close_button_text" msgid="3937902162644062866">"Maak toe"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> gekies</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> gekies</item>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 678c7cd..55f0f2a 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"አሁን"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ደ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ደ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ </item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ </item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ሰ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ሰ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ </item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ </item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ቀ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ቀ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ </item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ </item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ዓ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ዓ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ </item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ </item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ደ ውስጥ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃ ውስጥ</item>
+ <item quantity="other"> በ <xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች ውስጥ</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ሰ ውስጥ</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ቀ ውስጥ</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
- <item quantity="other">በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
+ <item quantity="one"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
+ <item quantity="other"> በ<xliff:g id="COUNT_1">%d</xliff:g> ዓ ውስጥ</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one">ከ<xliff:g id="COUNT_1">%d</xliff:g> ደቂቃዎች በፊት</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ትርፍ ፍሰትን ዝጋ"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"አስፋ"</string>
<string name="close_button_text" msgid="3937902162644062866">"ዝጋ"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>፦ <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጧል</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጠዋል</item>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 4491a75..bd6de2e 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -888,12 +888,12 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"الآن"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>دقيقة</item>
<item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>دقيقة</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>دقيقة</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
@@ -904,52 +904,52 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ساعة</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
<item quantity="two">يومان <xliff:g id="COUNT_1">%d</xliff:g></item>
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
<item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>يوم</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> عام</item>
<item quantity="two">عامان <xliff:g id="COUNT_1">%d</xliff:g></item>
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> أعوام</item>
<item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> عامًا</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> عام</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> عام</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>عام</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>عام</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="zero">في <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
+ <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
<item quantity="two">في دقيقتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في <xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
+ <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> دقائق</item>
<item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="other">في <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
- <item quantity="one">في <xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
+ <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
+ <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> دقيقة</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="zero">في <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
+ <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
<item quantity="two">في ساعتين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
<item quantity="few">في <xliff:g id="COUNT_1">%d</xliff:g> ساعات</item>
<item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="other">في <xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
- <item quantity="one">في <xliff:g id="COUNT_0">%d</xliff:g> ساعة</item>
+ <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g> ساعة</item>
+ <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g>ساعة</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="zero">في <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
+ <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
<item quantity="two">في يومين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في <xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
- <item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
- <item quantity="other">في <xliff:g id="COUNT_1">%d</xliff:g> يوم</item>
- <item quantity="one">في <xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
+ <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> أيام</item>
+ <item quantity="many">في<xliff:g id="COUNT_1">%d</xliff:g> يومًا</item>
+ <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g>يوم</item>
+ <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> يوم</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="zero">في <xliff:g id="COUNT_1">%d</xliff:g> عام</item>
+ <item quantity="zero">في<xliff:g id="COUNT_1">%d</xliff:g> عام</item>
<item quantity="two">في عامين (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="few">في <xliff:g id="COUNT_1">%d</xliff:g> أعوام</item>
- <item quantity="many">في <xliff:g id="COUNT_1">%d</xliff:g> عامًا</item>
- <item quantity="other">في <xliff:g id="COUNT_1">%d</xliff:g> عام</item>
- <item quantity="one">في <xliff:g id="COUNT_0">%d</xliff:g> عام</item>
+ <item quantity="few">في<xliff:g id="COUNT_1">%d</xliff:g> أعوام</item>
+ <item quantity="many">في<xliff:g id="COUNT_1">%d</xliff:g> عامًا</item>
+ <item quantity="other">في<xliff:g id="COUNT_1">%d</xliff:g>عام</item>
+ <item quantity="one">في<xliff:g id="COUNT_0">%d</xliff:g> عام</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="zero">قبل <xliff:g id="COUNT_1">%d</xliff:g> دقيقة</item>
@@ -1758,8 +1758,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"إغلاق التجاوز"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"تكبير"</string>
<string name="close_button_text" msgid="3937902162644062866">"إغلاق"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="zero">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g> من العناصر</item>
<item quantity="two">تم تحديد عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index d2196fd..17712b0 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -860,32 +860,32 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"indi"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dəq</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dəq</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>saat</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>saat</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>st</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>st</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>gün</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>gün</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>il</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>il</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>i</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>i</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dəqiqədə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dəqiqədə</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d-də</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d-də</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>saata</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>saata</item>
+ <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>s-da</item>
+ <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>s-da</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>gündə</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>gündə</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g-də</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g-də</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ildə</item>
@@ -1301,7 +1301,7 @@
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Kilidi açmaq üçün vurun."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Parolların səsləndirilməsi üçün qulaqlıqları taxın."</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"Nöqtə."</string>
- <string name="action_bar_home_description" msgid="5293600496601490216">"Evə gedin"</string>
+ <string name="action_bar_home_description" msgid="5293600496601490216">"Evə naviqasiya et"</string>
<string name="action_bar_up_description" msgid="2237496562952152589">"Yuxarı gedin"</string>
<string name="action_menu_overflow_description" msgid="2295659037509008453">"Digər variantlar"</string>
<string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Yüklənməni qapadın"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Böyüdün"</string>
<string name="close_button_text" msgid="3937902162644062866">"Qapadın"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seçilib</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seçilib</item>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 1d05cc3..1620f63 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -878,8 +878,8 @@
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dana</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dan</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> god</item>
@@ -898,8 +898,8 @@
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dana</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> dan</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> god</item>
@@ -1653,8 +1653,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvori preklopni meni"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Uvećaj"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zatvori"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Izabrana je <xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item>
<item quantity="few">Izabrane su <xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item>
diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml
index b754101..6cdef81 100644
--- a/core/res/res/values-be-rBY/strings.xml
+++ b/core/res/res/values-be-rBY/strings.xml
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Закрыць лішак"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Разгарнуць"</string>
<string name="close_button_text" msgid="3937902162644062866">"Закрыць"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> выбраны</item>
<item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> выбрана</item>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 912a3f4..ef9d524 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затваряне на менюто при препълване"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Увеличаване"</string>
<string name="close_button_text" msgid="3937902162644062866">"Затваряне"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"„<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>“: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">Избрахте <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">Избрахте <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index ef5f177..97e61c9 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"এখন"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মিনিট</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মিনিট</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘণ্টা</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘণ্টা</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দিন</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দিন</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>বছর</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>বছর</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মিনিটের মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মিনিটের মধ্যে</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>মি</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘন্টার মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘন্টার মধ্যে</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ঘ</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দিনের মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দিনের মধ্যে</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>দি</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>বছরের মধ্যে</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>বছরের মধ্যে</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ব</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>মিনিট আগে</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ওভারফ্লো বন্ধ করুন"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"বড় করুন"</string>
<string name="close_button_text" msgid="3937902162644062866">"বন্ধ করুন"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item>
diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml
index c12832a..bd14448 100644
--- a/core/res/res/values-bs-rBA/strings.xml
+++ b/core/res/res/values-bs-rBA/strings.xml
@@ -868,38 +868,38 @@
<string name="now_string_shortest" msgid="8912796667087856402">"sada"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
@@ -1658,8 +1658,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvori preklopni meni"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Povećaj maksimalno"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zatvori"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka je odabrana</item>
<item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke su odabrane</item>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 9727146..44a8f3b 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tanca el menú addicional"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximitza"</string>
<string name="close_button_text" msgid="3937902162644062866">"Tanca"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">Seleccionats: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">Seleccionats: <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 039c2df..ba33ccd 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zavřít rozbalovací nabídku"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximalizovat"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zavřít"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item>
<item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index f0684e4..6cd8d9f 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -860,32 +860,32 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"nu"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> t.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>t.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>t.</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> dag</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dage</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> t.</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> t.</item>
+ <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>t.</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>t.</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> dag</item>
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> dage</item>
+ <item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Luk overløb"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimér"</string>
<string name="close_button_text" msgid="3937902162644062866">"Luk"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>valgt</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valgt</item>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 80439ae..616d2b8 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -243,23 +243,23 @@
<string name="user_owner_label" msgid="1119010402169916617">"Zu \"Privat\" wechseln"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"Zu \"Arbeit\" wechseln"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf Kontakte zuzugreifen"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf deine Kontakte zugreifen"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Standort"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zuzugreifen"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"auf den Standort deines Geräts zugreifen"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf Kalender zuzugreifen"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"auf deinen Kalender zugreifen"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS zu senden und abzurufen"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS senden und abrufen"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Speicher"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"auf Fotos, Medien und Dateien auf deinem Gerät zuzugreifen"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"auf Fotos, Medien und Dateien auf deinem Gerät zugreifen"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"Audio aufzunehmen"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"Audio aufnehmen"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"Bilder und Videos aufzunehmen"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"Bilder und Videos aufnehmen"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe zu tätigen und zu verwalten"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"Telefonanrufe tätigen und verwalten"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Körpersensoren"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zuzugreifen"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"auf Sensordaten zu deinen Vitaldaten zugreifen"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen & Entdecken\" aktivieren"</string>
@@ -639,13 +639,13 @@
<string name="orgTypeOther" msgid="3951781131570124082">"Sonstige"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Benutzerdefiniert"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"Benutzerdefiniert"</string>
- <string name="relationTypeAssistant" msgid="6274334825195379076">"Assistent"</string>
+ <string name="relationTypeAssistant" msgid="6274334825195379076">"Kollege"</string>
<string name="relationTypeBrother" msgid="8757913506784067713">"Bruder"</string>
<string name="relationTypeChild" msgid="1890746277276881626">"Kind"</string>
<string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Lebenspartner"</string>
<string name="relationTypeFather" msgid="5228034687082050725">"Vater"</string>
<string name="relationTypeFriend" msgid="7313106762483391262">"Freund"</string>
- <string name="relationTypeManager" msgid="6365677861610137895">"Vorgesetzter"</string>
+ <string name="relationTypeManager" msgid="6365677861610137895">"Chef"</string>
<string name="relationTypeMother" msgid="4578571352962758304">"Mutter"</string>
<string name="relationTypeParent" msgid="4755635567562925226">"Elternteil"</string>
<string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
@@ -860,20 +860,20 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"jetzt"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> T.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> T.</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> J.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> J.</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
<item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> min</item>
@@ -884,12 +884,12 @@
<item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> d</item>
+ <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> T.</item>
+ <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> T.</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> a</item>
+ <item quantity="other">in <xliff:g id="COUNT_1">%d</xliff:g> J.</item>
+ <item quantity="one">in <xliff:g id="COUNT_0">%d</xliff:g> J.</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other">vor <xliff:g id="COUNT_1">%d</xliff:g> Minuten</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Überlauf schließen"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximieren"</string>
<string name="close_button_text" msgid="3937902162644062866">"Schließen"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ausgewählt</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ausgewählt</item>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f2a9017..49ba0cf 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -253,7 +253,7 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"Αποθηκευτικός χώρος"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"έχει πρόσβαση στις φωτογραφίες/πολυμέσα/αρχεία στη συσκευή σας"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Μικρόφωνο"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"εγγραφή ήχου"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ηχογραφεί"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Κάμερα"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"γίνεται λήψη φωτογραφιών και εγγραφή βίντεο"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Τηλέφωνο"</string>
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"τώρα"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> λ.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> λ.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> λ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> λ</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ω.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ω.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ω</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ω</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ημ.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ημ.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ημ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ημ</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ε.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ε.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ε</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ε</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> λ.</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> λ.</item>
+ <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> λ</item>
+ <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> λ</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ω.</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ω.</item>
+ <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ω</item>
+ <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ω</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ημ.</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ημ.</item>
+ <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ημ</item>
+ <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ημ</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ε.</item>
- <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ε.</item>
+ <item quantity="other">σε <xliff:g id="COUNT_1">%d</xliff:g> ε</item>
+ <item quantity="one">σε <xliff:g id="COUNT_0">%d</xliff:g> ε</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other">πριν από <xliff:g id="COUNT_1">%d</xliff:g> λεπτά</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Κλείσιμο υπερχείλισης"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Μεγιστοποίηση"</string>
<string name="close_button_text" msgid="3937902162644062866">"Κλείσιμο"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">Επιλέχτηκαν <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">Επιλέχτηκε <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 65d6a8d..2f9fb4b 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximise"</string>
<string name="close_button_text" msgid="3937902162644062866">"Close"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 65d6a8d..2f9fb4b 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximise"</string>
<string name="close_button_text" msgid="3937902162644062866">"Close"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 65d6a8d..2f9fb4b 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Close overflow"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximise"</string>
<string name="close_button_text" msgid="3937902162644062866">"Close"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 191c090..2f76a33 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -868,12 +868,12 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> día</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> años</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> año</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
<item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> min</item>
@@ -884,8 +884,8 @@
<item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> días</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> día</item>
+ <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> años</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Cerrar la barra de herramientas flotante adicional"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Cerrar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos seleccionados</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento seleccionado</item>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 7f3d91b..89efca1 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Cerrar menú adicional"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Cerrar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seleccionados</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seleccionado</item>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index f909a95..d8f6773 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"praegu"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> p</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> p</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min pärast</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m pärast</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m pärast</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h pärast</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h pärast</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h pärast</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> p pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> p pärast</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p pärast</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p pärast</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a pärast</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a pärast</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a pärast</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a pärast</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minutit tagasi</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Ületäite sulgemine"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimeeri"</string>
<string name="close_button_text" msgid="3937902162644062866">"Sule"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> on valitud</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> on valitud</item>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index f6a0092..6e5b178 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"orain"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> egun</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> egun</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> e</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> e</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> urte</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> urte</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min barru</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m barru</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m barru</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h barru</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h barru</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h barru</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> egun barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> egun barru</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> e barru</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> e barru</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> urte barru</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> urte barru</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u barru</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u barru</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other">Duela <xliff:g id="COUNT_1">%d</xliff:g> minutu</item>
@@ -1425,7 +1425,7 @@
<string name="user_switched" msgid="3768006783166984410">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailera aldatzen…"</string>
<string name="user_logging_out_message" msgid="8939524935808875155">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzailearen saioa amaitzen…"</string>
- <string name="owner_name" msgid="2716755460376028154">"Jabea"</string>
+ <string name="owner_name" msgid="2716755460376028154">"jabea"</string>
<string name="error_message_title" msgid="4510373083082500195">"Errorea"</string>
<string name="error_message_change_not_allowed" msgid="1347282344200417578">"Zure administratzaileak ez du aldaketa egiteko baimena eman"</string>
<string name="app_not_found" msgid="3429141853498927379">"Ez da ekintza gauza dezakeen aplikaziorik aurkitu"</string>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Itxi gainfluxua"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizatu"</string>
<string name="close_button_text" msgid="3937902162644062866">"Itxi"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> hautatuta</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> hautatuta</item>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 191d121..01b636d 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"اکنون"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> روز</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> روز</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>روز</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>روز</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> سال</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>سال</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>سال</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> دقیقه</item>
+ <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
+ <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>دقیقه</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> ساعت</item>
+ <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
+ <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>ساعت</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> روز</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> روز</item>
+ <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>روز</item>
+ <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>روز</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item>
- <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item>
+ <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g>سال</item>
+ <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g>سال</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> دقیقه پیش</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"بستن منوی سرریز"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"بزرگ کردن"</string>
<string name="close_button_text" msgid="3937902162644062866">"بستن"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> انتخاب شد</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> انتخاب شد</item>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 051dce1..e59165e 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -876,20 +876,20 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> v</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min:n päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min:n päästä</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min päästä</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min päästä</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t:n päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> t:n päästä</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> t päästä</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> t päästä</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pv:n päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pv:n päästä</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> pv päästä</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> pv päästä</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> v:n päästä</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> v:n päästä</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> v päästä</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> v päästä</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuuttia sitten</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Sulje ylivuoto"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Suurenna"</string>
<string name="close_button_text" msgid="3937902162644062866">"Sulje"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valittu</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> valittu</item>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d379812..20d4e8a 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -537,7 +537,7 @@
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"Définir le serveur mandataire global du mobile"</string>
<string name="policydesc_setGlobalProxy" msgid="8459859731153370499">"Indiquer le mandataire global à utiliser pour l\'appareil lorsque la politique est activée. Seul le propriétaire de l\'appareil peut définir le mandataire global."</string>
<string name="policylab_expirePassword" msgid="5610055012328825874">"Déf. expir. m. passe verr. écr."</string>
- <string name="policydesc_expirePassword" msgid="5367525762204416046">"Modifier la fréquence de modification du mot de passe, du NIP ou du motif de verrouillage de l\'écran."</string>
+ <string name="policydesc_expirePassword" msgid="5367525762204416046">"Modifier la fréquence de modification du mot de passe, du NIP ou du schéma de verrouillage de l\'écran."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"Définir cryptage du stockage"</string>
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Exiger le chiffrement des données d\'application stockées"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Désactiver les appareils photo"</string>
@@ -731,7 +731,7 @@
<string name="lockscreen_access_pattern_cell_added" msgid="6756031208359292487">"Cellule ajoutée."</string>
<string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"Cellule <xliff:g id="CELL_INDEX">%1$s</xliff:g> ajoutée"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"Schéma terminé."</string>
- <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zone du motif"</string>
+ <string name="lockscreen_access_pattern_area" msgid="400813207572953209">"Zone du schéma"</string>
<string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s. Widget %2$d sur %3$d."</string>
<string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"Ajouter un widget"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"Vide"</string>
@@ -1610,7 +1610,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"La demande SS a été modifiée et est maintenant une nouvelle demande SS."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil professionnel"</string>
<string name="expand_button_content_description" msgid="5855955413376384681">"Bouton Développer"</string>
- <string name="expand_action_accessibility" msgid="5307730695723718254">"basculer le développement"</string>
+ <string name="expand_action_accessibility" msgid="5307730695723718254">"activer/désactiver le développement"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Port USB de l\'appareil Android"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"Port USB"</string>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fermer la barre d\'outils en superposition"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Agrandir"</string>
<string name="close_button_text" msgid="3937902162644062866">"Fermer"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 786b186..b7daaf4 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -860,8 +860,8 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"mainten."</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -876,8 +876,8 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fermer la barre d\'outils en superposition"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Agrandir"</string>
<string name="close_button_text" msgid="3937902162644062866">"Fermer"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index 809d5ec..fcccc55 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -860,8 +860,8 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"agora"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -876,8 +876,8 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
<item quantity="other">en <xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Pechar barra de ferramentas adicional"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Pechar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">Seleccionáronse <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">Seleccionouse <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index d1f7514..f9dee58ff2 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -876,20 +876,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>વ</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>મિ. માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>મિ. માં</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>મિ માં</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>મિ માં</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ક. માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ક. માં</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ક માં</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ક માં</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>દિ. માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>દિ. માં</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>દિ માં</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>દિ માં</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>વ. માં</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>વ. માં</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>વ માં</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>વ માં</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> મિનિટ પહેલાં</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ઓવરફ્લો બંધ કરો"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"મહત્તમ કરો"</string>
<string name="close_button_text" msgid="3937902162644062866">"બંધ કરો"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 805d9e1..4b0664f 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -860,12 +860,12 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"अभी"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मि.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मि.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मि</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मि</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घं.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घं.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घं</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घं</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिन</item>
@@ -876,12 +876,12 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मिनट में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनट में</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मि में</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मि में</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घंटे में</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घंटे में</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> घं में</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घं में</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> दिन में</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओवरफ़्लो बंद करें"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"बड़ा करें"</string>
<string name="close_button_text" msgid="3937902162644062866">"बंद करें"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index b875f28..766d10b 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -867,44 +867,44 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"sad"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> min</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g> g</item>
+ <item quantity="one">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="few">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="other">za <xliff:g id="COUNT_1">%d</xliff:g>g</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one">prije <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
@@ -1653,8 +1653,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvori dodatni izbornik"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimiziraj"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zatvori"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrana</item>
<item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> odabrane</item>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index d903f9c..5609b1f 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"most"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> p</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> p</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ó</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ó</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ó</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ó</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> n</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> n</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> é</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> é</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>é</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>é</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> percen belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> percen belül</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>p múlva</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>p múlva</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> órán belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> órán belül</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ó múlva</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ó múlva</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> napon belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> napon belül</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n múlva</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n múlva</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> éven belül</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> éven belül</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>é múlva</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>é múlva</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> perccel ezelőtt</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"További elemeket tartalmazó eszköztár bezárása"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Teljes méret"</string>
<string name="close_button_text" msgid="3937902162644062866">"Bezárás"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kiválasztva</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kiválasztva</item>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index 30f0737..ee89493 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -21,7 +21,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="byteShort" msgid="8340973892742019101">"Բ"</string>
- <string name="kilobyteShort" msgid="5973789783504771878">"ԿԲ"</string>
+ <string name="kilobyteShort" msgid="5973789783504771878">"կԲ"</string>
<string name="megabyteShort" msgid="6355851576770428922">"ՄԲ"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"ԳԲ"</string>
<string name="terabyteShort" msgid="231613018159186962">"ՏԲ"</string>
@@ -547,8 +547,8 @@
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"Տուն"</item>
<item msgid="869923650527136615">"Բջջային"</item>
- <item msgid="7897544654242874543">"Աշխատանքային"</item>
- <item msgid="1103601433382158155">"Աշխատանքային ֆաքս"</item>
+ <item msgid="7897544654242874543">"Աշխատանք"</item>
+ <item msgid="1103601433382158155">"Աշխ․ ֆաքս"</item>
<item msgid="1735177144948329370">"Տան ֆաքս"</item>
<item msgid="603878674477207394">"Փեյջեր"</item>
<item msgid="1650824275177931637">"Այլ"</item>
@@ -556,24 +556,24 @@
</string-array>
<string-array name="emailAddressTypes">
<item msgid="8073994352956129127">"Տուն"</item>
- <item msgid="7084237356602625604">"Աշխատանքային"</item>
+ <item msgid="7084237356602625604">"Աշխատանք"</item>
<item msgid="1112044410659011023">"Այլ"</item>
<item msgid="2374913952870110618">"Հատուկ"</item>
</string-array>
<string-array name="postalAddressTypes">
<item msgid="6880257626740047286">"Տան"</item>
- <item msgid="5629153956045109251">"Աշխատանքային"</item>
+ <item msgid="5629153956045109251">"Աշխատանք"</item>
<item msgid="4966604264500343469">"Այլ"</item>
<item msgid="4932682847595299369">"Հատուկ"</item>
</string-array>
<string-array name="imAddressTypes">
<item msgid="1738585194601476694">"Տուն"</item>
- <item msgid="1359644565647383708">"Աշխատանքային"</item>
+ <item msgid="1359644565647383708">"Աշխատանք"</item>
<item msgid="7868549401053615677">"Այլ"</item>
<item msgid="3145118944639869809">"Հատուկ"</item>
</string-array>
<string-array name="organizationTypes">
- <item msgid="7546335612189115615">"Աշխատանքային"</item>
+ <item msgid="7546335612189115615">"Աշխատանք"</item>
<item msgid="4378074129049520373">"Այլ"</item>
<item msgid="3455047468583965104">"Հատուկ"</item>
</string-array>
@@ -590,8 +590,8 @@
<string name="phoneTypeCustom" msgid="1644738059053355820">"Հատուկ"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"Տուն"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Բջջային"</string>
- <string name="phoneTypeWork" msgid="8863939667059911633">"Աշխատանքային"</string>
- <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Աշխատանքային ֆաքս"</string>
+ <string name="phoneTypeWork" msgid="8863939667059911633">"Աշխատանք"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Աշխ․ ֆաքս"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"Տան ֆաքս"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Փեյջեր"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Այլ"</string>
@@ -604,8 +604,8 @@
<string name="phoneTypeRadio" msgid="4093738079908667513">"Ռադիո"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Տելեքս"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY TDD"</string>
- <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Աշխատանքային բջջային համար"</string>
- <string name="phoneTypeWorkPager" msgid="649938731231157056">"Աշխատանքային փեյջեր"</string>
+ <string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Աշխ․ բջջային"</string>
+ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Աշխ․ փեյջեր"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Օգնական"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
<string name="eventTypeCustom" msgid="7837586198458073404">"Հատուկ"</string>
@@ -614,16 +614,16 @@
<string name="eventTypeOther" msgid="7388178939010143077">"Այլ"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Հատուկ"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Տուն"</string>
- <string name="emailTypeWork" msgid="3548058059601149973">"Աշխատանքային"</string>
+ <string name="emailTypeWork" msgid="3548058059601149973">"Աշխատանք"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Այլ"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Բջջային"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Հատուկ"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Տուն"</string>
- <string name="postalTypeWork" msgid="5268172772387694495">"Աշխատանքային"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"Աշխատանք"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Այլ"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Հատուկ"</string>
<string name="imTypeHome" msgid="6241181032954263892">"Տուն"</string>
- <string name="imTypeWork" msgid="1371489290242433090">"Աշխատանքային"</string>
+ <string name="imTypeWork" msgid="1371489290242433090">"Աշխատանք"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Այլ"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Հատուկ"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
@@ -635,7 +635,7 @@
<string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
<string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
- <string name="orgTypeWork" msgid="29268870505363872">"Աշխատանքային"</string>
+ <string name="orgTypeWork" msgid="29268870505363872">"Աշխատանք"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Այլ"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Հատուկ"</string>
<string name="relationTypeCustom" msgid="3542403679827297300">"Հատուկ"</string>
@@ -655,7 +655,7 @@
<string name="relationTypeSpouse" msgid="394136939428698117">"Ամուսին"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Հատուկ"</string>
<string name="sipAddressTypeHome" msgid="6093598181069359295">"Տուն"</string>
- <string name="sipAddressTypeWork" msgid="6920725730797099047">"Աշխատանքային"</string>
+ <string name="sipAddressTypeWork" msgid="6920725730797099047">"Աշխատանք"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Այլ"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"Այս կոնտակտը դիտելու համար համապատասխան ծրագիր չկա:"</string>
<string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Մուտքագրեք PIN կոդը"</string>
@@ -973,7 +973,7 @@
<string name="whichEditApplicationNamed" msgid="1775815530156447790">"Խմբագրել հետևյալով՝ %1$s"</string>
<string name="whichEditApplicationLabel" msgid="7183524181625290300">"Փոփոխել"</string>
<string name="whichSendApplication" msgid="6902512414057341668">"Կիսվել"</string>
- <string name="whichSendApplicationNamed" msgid="2799370240005424391">"Տարածել ըստ %1$s"</string>
+ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"Կիսվել %1$s-ի միջոցով"</string>
<string name="whichSendApplicationLabel" msgid="4579076294675975354">"Տրամադրել"</string>
<string name="whichSendToApplication" msgid="8272422260066642057">"Ուղարկել այս հավելվածով"</string>
<string name="whichSendToApplicationNamed" msgid="7768387871529295325">"Ուղարկել %1$s հավելվածով"</string>
@@ -995,7 +995,7 @@
<string name="aerr_application_repeated" msgid="3146328699537439573">"<xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածի աշխատանքը շարունակաբար ընդհատվում է"</string>
<string name="aerr_process_repeated" msgid="6235302956890402259">"<xliff:g id="PROCESS">%1$s</xliff:g> գործընթացը շարունակաբար ընդհատվում է"</string>
<string name="aerr_restart" msgid="7581308074153624475">"Կրկին բացել հավելվածը"</string>
- <string name="aerr_report" msgid="5371800241488400617">"Ուղարկել կարծիք"</string>
+ <string name="aerr_report" msgid="5371800241488400617">"Կարծիք հայտնել"</string>
<string name="aerr_close" msgid="2991640326563991340">"Փակել"</string>
<string name="aerr_mute" msgid="1974781923723235953">"Անջատել ձայնը մինչև սարքի վերագործարկումը"</string>
<string name="aerr_wait" msgid="3199956902437040261">"Սպասել"</string>
@@ -1610,7 +1610,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS հարցումը փոխվել է նոր SS հարցման:"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Աշխատանքային պրոֆիլ"</string>
<string name="expand_button_content_description" msgid="5855955413376384681">"«Ընդարձակել» կոճակ"</string>
- <string name="expand_action_accessibility" msgid="5307730695723718254">"փոխարկել ընդլայնումը"</string>
+ <string name="expand_action_accessibility" msgid="5307730695723718254">"Կոծկել/Ընդարձակել"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB արտաքին միացք"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB արտաքին միացք"</string>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Փակել ավելորդ տեղեկությունները"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Մեծացնել"</string>
<string name="close_button_text" msgid="3937902162644062866">"Փակել"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>՝ <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="other">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 3f09da9..da0afc8 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tutup luapan"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimalkan"</string>
<string name="close_button_text" msgid="3937902162644062866">"Tutup"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 6ac8315..661f5b5 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -858,34 +858,34 @@
<item quantity="one"><xliff:g id="COUNT">%d</xliff:g> klukkustund</item>
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> klukkustundir</item>
</plurals>
- <string name="now_string_shortest" msgid="8912796667087856402">"núna"</string>
+ <string name="now_string_shortest" msgid="8912796667087856402">"nú"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> mín.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> mín.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> klst.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> klst.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> k.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> k.</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ár</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ár</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> á.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> á.</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> mín.</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> mín.</item>
+ <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
+ <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> m.</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> klst.</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> klst.</item>
+ <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> k.</item>
+ <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> k.</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
+ <item quantity="other">eftir <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">eftir <xliff:g id="COUNT_1">%d</xliff:g> ár</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Loka viðbótaratriðum"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Stækka"</string>
<string name="close_button_text" msgid="3937902162644062866">"Loka"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> valið</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valin</item>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index e007296..d32e959 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Chiudi overflow"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Ingrandisci"</string>
<string name="close_button_text" msgid="3937902162644062866">"Chiudi"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> file selezionati</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> file selezionato</item>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 1840617..254bba9 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"סגור את האפשרויות הנוספות"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"הגדל"</string>
<string name="close_button_text" msgid="3937902162644062866">"סגור"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="two">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="many">בחרת <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 30e1950..c7529b7 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"オーバーフローを閉じる"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"最大化"</string>
<string name="close_button_text" msgid="3937902162644062866">"閉じる"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>件選択済み</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>件選択済み</item>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 713b218..5f5ded9 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"გადავსების დახურვა"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"მაქსიმალური ზომა"</string>
<string name="close_button_text" msgid="3937902162644062866">"დახურვა"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> შერჩეული</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> შერჩეული</item>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index e46b9d9..c5c19c8 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"қазір"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> м.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> м.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>м</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>м</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> с.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> с.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> к.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> к.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ж.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ж.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> м.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> м.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>м</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>м</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> с.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> с.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> к.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> к.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ж.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ж.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> минут бұрын</item>
@@ -1613,7 +1613,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сұрауы жаңа SS сұрауына өзгертілді."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жұмыс профилі"</string>
<string name="expand_button_content_description" msgid="5855955413376384681">"Жаю түймесі"</string>
- <string name="expand_action_accessibility" msgid="5307730695723718254">"жаюды ажырата қосу"</string>
+ <string name="expand_action_accessibility" msgid="5307730695723718254">"жаю/жию"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB перифериялық порты"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB перифериялық порты"</string>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Артық толуды жабу"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Жазу"</string>
<string name="close_button_text" msgid="3937902162644062866">"Жабу"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> таңдалды</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> таңдалды</item>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 4dd3828..36ed267 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1620,8 +1620,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"បិទលើសចំណុះ"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ពង្រីក"</string>
<string name="close_button_text" msgid="3937902162644062866">"បិទ"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>៖ <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">បានជ្រើស <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">បានជ្រើស <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 58f8cfd..b898e14 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -876,20 +876,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ವ</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ ನಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ ನಲ್ಲಿ</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ.ದಲ್ಲಿ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ನಿ.ದಲ್ಲಿ</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ ನಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ ನಲ್ಲಿ</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ.ಯಲ್ಲಿ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ಗಂ.ಯಲ್ಲಿ</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ ನಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ ನಲ್ಲಿ</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ.ದಲ್ಲಿ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ದಿ.ದಲ್ಲಿ</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ವ ನಲ್ಲಿ</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ವ ನಲ್ಲಿ</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ವ.ದಲ್ಲಿ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ವ.ದಲ್ಲಿ</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> ನಿಮಿಷಗಳ ಹಿಂದೆ</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ಓವರ್ಫ್ಲೋ ಮುಚ್ಚು"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ಹಿಗ್ಗಿಸು"</string>
<string name="close_button_text" msgid="3937902162644062866">"ಮುಚ್ಚು"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 9dbec79..8a4dbc9 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"오버플로우 닫기"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"최대화"</string>
<string name="close_button_text" msgid="3937902162644062866">"닫기"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>개 선택됨</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>개 선택됨</item>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 023fc5e..3ffc2b7 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -545,7 +545,7 @@
<string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"Экрн клпснн айрм функцялрн өчр"</string>
<string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"Экранды кулпулоо функцияларынын айрымдарын колдонууга тыюу салуу"</string>
<string-array name="phoneTypes">
- <item msgid="8901098336658710359">"Башкы бет"</item>
+ <item msgid="8901098336658710359">"Үй"</item>
<item msgid="869923650527136615">"Мобилдик"</item>
<item msgid="7897544654242874543">"Жумуш"</item>
<item msgid="1103601433382158155">"Жумуш факсы"</item>
@@ -555,19 +555,19 @@
<item msgid="9192514806975898961">"Өзгөчө"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"Башкы бет"</item>
+ <item msgid="8073994352956129127">"Үй"</item>
<item msgid="7084237356602625604">"Жумуш"</item>
<item msgid="1112044410659011023">"Башка"</item>
<item msgid="2374913952870110618">"Өзгөчө"</item>
</string-array>
<string-array name="postalAddressTypes">
- <item msgid="6880257626740047286">"Башкы бет"</item>
+ <item msgid="6880257626740047286">"Үй"</item>
<item msgid="5629153956045109251">"Жумуш"</item>
<item msgid="4966604264500343469">"Башка"</item>
<item msgid="4932682847595299369">"Өзгөчө"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"Башкы бет"</item>
+ <item msgid="1738585194601476694">"Үй"</item>
<item msgid="1359644565647383708">"Жумуш"</item>
<item msgid="7868549401053615677">"Башка"</item>
<item msgid="3145118944639869809">"Өзгөчө"</item>
@@ -588,7 +588,7 @@
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Өзгөчө"</string>
- <string name="phoneTypeHome" msgid="2570923463033985887">"Башкы бет"</string>
+ <string name="phoneTypeHome" msgid="2570923463033985887">"Үй"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Мобилдик"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Жумуш"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Жумуш факсы"</string>
@@ -613,16 +613,16 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Маараке"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Башка"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Өзгөчө"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Башкы бет"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Жеке"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Жумуш"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Башка"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Мобилдик"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Өзгөчө"</string>
- <string name="postalTypeHome" msgid="8165756977184483097">"Башкы бет"</string>
+ <string name="postalTypeHome" msgid="8165756977184483097">"Үй"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Жумуш"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Башка"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Өзгөчө"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"Башкы бет"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Үй"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Жумуш"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Башка"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Өзгөчө"</string>
@@ -654,7 +654,7 @@
<string name="relationTypeSister" msgid="1735983554479076481">"Эже-сиңди"</string>
<string name="relationTypeSpouse" msgid="394136939428698117">"Жубай"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Өзгөчө"</string>
- <string name="sipAddressTypeHome" msgid="6093598181069359295">"Башкы бет"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"Үй"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Жумуш"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Башка"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"Байланышты көрсөтүүчү эч бир колдонмо жок."</string>
@@ -860,24 +860,24 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"азыр"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мүн.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> мүн.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мүн.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мүн.</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> с.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> с.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>с.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>с.</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> к.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> к.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>к.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>к.</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ж.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ж.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ж.</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ж.</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> мүн. кийин</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> мүн. кийин</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мүн. кийин</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мүн. кийин</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> с. кийин</item>
@@ -1613,7 +1613,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS сурамы жаңы SS сурамына өзгөртүлдү."</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"Жумуш профили"</string>
<string name="expand_button_content_description" msgid="5855955413376384681">"Жайып көрсөтүү баскычы"</string>
- <string name="expand_action_accessibility" msgid="5307730695723718254">"жайып көрсөтүү баскычын которуштуруу"</string>
+ <string name="expand_action_accessibility" msgid="5307730695723718254">"жайып көрсөтүү же жыйыштыруу"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB Сырткы оюкча"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB Сырткы оюкча"</string>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Ашып-ташууну жабуу"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Чоңойтуу"</string>
<string name="close_button_text" msgid="3937902162644062866">"Жабуу"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> тандалды</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> тандалды</item>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 8727747..6fda52a 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ປິດການໄຫຼລົ້ນອອກມາ"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ຂະຫຍາຍອອກ"</string>
<string name="close_button_text" msgid="3937902162644062866">"ປິດ"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ຖືກເລືອກແລ້ວ</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ຖືກເລືອກແລ້ວ</item>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index f6a3283..0b062d1 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -874,16 +874,16 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"dabar"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> val.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> val.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
@@ -898,16 +898,16 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m.</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
+ <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g> val.</item>
- <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g> val.</item>
+ <item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="many">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">po <xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="one">po <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Uždaryti perpildymo sritį"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Padidinti"</string>
<string name="close_button_text" msgid="3937902162644062866">"Uždaryti"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
<item quantity="few">Pasir. <xliff:g id="COUNT_1">%1$d</xliff:g> elem.</item>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 339da74..47f1f26 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -867,39 +867,39 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"tagad"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d.</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g> g.</item>
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> g.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g.</item>
+ <item quantity="zero"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g.</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
+ <item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
+ <item quantity="one">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
+ <item quantity="other">pēc <xliff:g id="COUNT_1">%d</xliff:g>d.</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="zero">pēc <xliff:g id="COUNT_1">%d</xliff:g> g.</item>
@@ -1653,8 +1653,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Aizvērt pārpildes izvēlni"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimizēt"</string>
<string name="close_button_text" msgid="3937902162644062866">"Aizvērt"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item>
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīts</item>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index 7528921..845a42d 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1623,8 +1623,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затвори прелевање"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Зголеми"</string>
<string name="close_button_text" msgid="3937902162644062866">"Затвори"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> е избрана</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> се избрани</item>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index ebc5216..7b18d91 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -860,32 +860,32 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"ഇപ്പോൾ"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മീറ്റർ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മിനിറ്റ്</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മി</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മി</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മണിക്കൂർ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മണിക്കൂർ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മ</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദിവസം</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദിവസം</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദി</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദി</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>വർഷം</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>വർഷം</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>വർ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>വ</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മീറ്ററിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മീറ്ററിൽ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മിനിറ്റിൽ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മിനിറ്റിൽ</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>മണിക്കൂറിൽ</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>മണിക്കൂറിൽ</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദിവസത്തിൽ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദിവസത്തിൽ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ദിനത്തിൽ</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ദിനത്തിൽ</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>വർഷത്തിൽ</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ഓവർഫ്ലോ അടയ്ക്കുക"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"വലുതാക്കുക"</string>
<string name="close_button_text" msgid="3937902162644062866">"അടയ്ക്കുക"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index dee1661..baf95b1 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -860,12 +860,12 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"одоо"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>минут</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>минут</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>мин</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>мин</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>цаг</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>цаг</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ц</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ц</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>хоног</item>
@@ -876,19 +876,19 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>жил</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>минутад</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>минутад</item>
+ <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>мин</item>
+ <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>мин</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>цагт</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>цагт</item>
+ <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>цаг</item>
+ <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>цаг</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>хоногт</item>
- <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>хоногт</item>
+ <item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>хоног</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>жилд</item>
+ <item quantity="other"> <xliff:g id="COUNT_1">%d</xliff:g>жил</item>
<item quantity="one"> <xliff:g id="COUNT_0">%d</xliff:g>жилд</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
@@ -1616,8 +1616,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Илүү цонхнуудыг хаах"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Томруулах"</string>
<string name="close_button_text" msgid="3937902162644062866">"Хаах"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> сонгосон</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> сонгосон</item>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index ee6b13d..e2d11c8 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -876,20 +876,20 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>व</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>मिनिटामध्ये</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मिनिटांमध्ये</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>मि मध्ये</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मि मध्ये</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>तासामध्ये</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>तासांमध्ये</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>ता मध्ये</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ता मध्ये</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>दिवसामध्ये</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दिवसांमध्ये</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>दि मध्ये</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दि मध्ये</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>वर्षामध्ये</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>वर्षांमध्ये</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>व मध्ये</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>व मध्ये</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> मिनिटापूर्वी</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओव्हरफ्लो बंद करा"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"मोठे करा"</string>
<string name="close_button_text" msgid="3937902162644062866">"बंद करा"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडला</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडले</item>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 2486b94..8945524 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Tutup limpahan"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimumkan"</string>
<string name="close_button_text" msgid="3937902162644062866">"Tutup"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index fcc09fc..76ac215 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ကိရိယာဘားအပိုအား ပိတ်ရန်"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"အများဆုံး လုပ်ပေးရန်"</string>
<string name="close_button_text" msgid="3937902162644062866">"ပိတ်ရန်"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>− <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ရွေးချယ်ပြီးပါပြီ</item>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a108a3a..860ff12 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -253,7 +253,7 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"åpne bilder, medieinnhold og filer på enheten din"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"spill inn lyd"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ta opp lyd"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ta bilder og ta opp video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Lukk overflytsmenyen"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimer"</string>
<string name="close_button_text" msgid="3937902162644062866">"Lukk"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g><xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> er valgt</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> er valgt</item>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 5502393..1ea7dbf 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -243,19 +243,19 @@
<string name="user_owner_label" msgid="1119010402169916617">"व्यक्तिगत प्रोफाइलमा स्विच गर्नुहोस्"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"कार्य प्रोफाइलमा स्विच गर्नुहोस्"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमा पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"स्थान"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थान पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"यस यन्त्रको स्थानमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"पात्रो"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईँको पात्रोमा पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"तपाईँको पात्रोमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"भण्डारण"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईँको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूको पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"तपाईँको यन्त्रमा तस्बिर, मिडिया, र फाइलहरूमाथि पहुँच गर्नुहोस्"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफोन"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"अडियो रेकर्ड गर्नुहोस्"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"क्यामेरा"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"तस्बिर तथा भिडियो रेकर्ड गर्नुहोस्"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"तस्बिर खिच्नुहोस् तथा भिडियो रेकर्ड गर्नुहोस्"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"अहिले"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनेट</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मिनेट</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनेट</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घन्टा</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>घन्टा</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> घन्टा</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिन</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दिन</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिन</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्ष</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>वर्ष</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्ष</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनेटमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> मिनेटमा</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>मिनेटमा</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>मिनेटमा</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> घन्टामा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> घन्टामा</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>घन्टामा</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> दिनमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> दिनमा</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>दिनमा</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>दिनमा</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> वर्षमा</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> वर्षमा</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>वर्षमा</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>वर्षमा</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> मिनेट अघि</item>
@@ -1624,8 +1624,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ओभरफ्लो बन्द गर्नुहोस्"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ठूलो बनाउनुहोस्"</string>
<string name="close_button_text" msgid="3937902162644062866">"बन्द गर्नुहोस्"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयन गरियो</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> चयन गरियो</item>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index f2e863a..c3eee67 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"nu"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> u</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> u</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>u</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>u</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> j</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>j</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>j</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> m</item>
+ <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> u</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> u</item>
+ <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>u</item>
+ <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>u</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> d</item>
+ <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g> j</item>
+ <item quantity="other">over <xliff:g id="COUNT_1">%d</xliff:g>j</item>
+ <item quantity="one">over <xliff:g id="COUNT_0">%d</xliff:g>j</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuten geleden</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Overloop sluiten"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximaliseren"</string>
<string name="close_button_text" msgid="3937902162644062866">"Sluiten"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> geselecteerd</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> geselecteerd</item>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index 89a3dcf..d9156b5 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -243,23 +243,23 @@
<string name="user_owner_label" msgid="1119010402169916617">"ਨਿੱਜੀ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="managed_profile_label" msgid="5289992269827577857">"ਕੰਮ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"ਸੰਪਰਕ"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਐਕਸੈਸ ਕਰੋ"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"ਟਿਕਾਣਾ"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਤੱਕ ਪਹੁੰਚੋ"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"ਇਸ ਡੀਵਾਈਸ ਦੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ਕੈਲੰਡਰ"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਆਪਣੇ ਕੈਲੰਡਰ ਦੀ ਐਕਸੈਸ ਕਰੋ"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"ਤੁਹਾਡੇ ਕੈਲੰਡਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦਿਖਾਓ"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ਸਟੋਰੇਜ"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"ਆਪਣੀ ਡੀਵਾਈਸ ’ਤੇ ਫੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣ"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"ਆਪਣੀ ਡੀਵਾਈਸ ’ਤੇ ਫੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"ਮਾਈਕ੍ਰੋਫੋਨ"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ਔਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"ਕੈਮਰਾ"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"ਤਸਵੀਰਾਂ ਖਿੱਚੋ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰੋ"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"ਤਸਵੀਰਾਂ ਲੈਣ ਅਤੇ ਵੀਡੀਓ ਰਿਕਾਰਡ ਕਰਨ"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ਫੋਨ"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਪ੍ਰਬੰਧਿਤ ਕਰੋ"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"ਫ਼ੋਨ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ਸਰੀਰ ਸੰਵੇਦਕ"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਮਹੱਤਵਪੂਰਣ ਲੱਛਣਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡੈਟਾ ਤੱਕ ਪਹੁੰਚ"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ਆਪਣੇ ਸਰੀਰ ਦੇ ਅਹਿਮ ਚਿੰਨ੍ਹਾਂ ਬਾਰੇ ਸੰਵੇਦਕ ਡੈਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ਵਿੰਡੋ ਸਮੱਗਰੀ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ਇੱਕ ਵਿੰਡੋ ਦੀ ਸਮੱਗਰੀ ਦੀ ਜਾਂਚ ਕਰੋ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਇੰਟਰੈਕਟ ਕਰ ਰਹੇ ਹੋ।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"ਐਕਸਪਲੋਰ ਬਾਇ ਟਚ ਚਾਲੂ ਕਰੋ"</string>
@@ -278,10 +278,10 @@
<string name="permdesc_statusBarService" msgid="716113660795976060">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਬਾਰ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"ਸਥਿਤੀ ਬਾਰ ਦਾ ਵਿਸਤਾਰ/ਨਸ਼ਟ ਕਰੋ"</string>
<string name="permdesc_expandStatusBar" msgid="6917549437129401132">"ਐਪ ਨੂੰ ਸਥਿਤੀ ਬਾਰ ਦਾ ਵਿਸਤਾਰ ਕਰਨ ਜਾਂ ਨਸ਼ਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_install_shortcut" msgid="4279070216371564234">"ਸ਼ੌਰਟਕਟ ਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="permdesc_install_shortcut" msgid="8341295916286736996">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ੌਰਟਕਟ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ਸ਼ੌਰਟਕਟ ਅਣਇੰਸਟੌਲ ਕਰੋ"</string>
- <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ੌਰਟਕਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_install_shortcut" msgid="4279070216371564234">"ਸ਼ਾਰਟਕੱਟ ਇੰਸਟੌਲ ਕਰੋ"</string>
+ <string name="permdesc_install_shortcut" msgid="8341295916286736996">"ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਜੋੜਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
+ <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ਸ਼ਾਰਟਕੱਟ ਅਣਇੰਸਟੌਲ ਕਰੋ"</string>
+ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਉਪਭੋਗਤਾ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਹੋਮਸਕ੍ਰੀਨ ਸ਼ਾਰਟਕੱਟ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"ਆਊਟਗੋਇੰਗ ਕਾਲਾਂ ਰੀਰੂਟ ਕਰੋ"</string>
<string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"ਐਪ ਨੂੰ ਇੱਕ ਵੱਖ ਨੰਬਰ ਨਾਲ ਕਾਲ ਰੀਡਾਇਰੈਕਟ ਕਰਨ ਜਾਂ ਕਾਲ ਨੂੰ ਪੂਰਾ ਰੋਕਣ ਦੀ ਚੋਣ ਨਾਲ ਇੱਕ ਆਊਟਗੋਇੰਗ ਕਾਲ ਦੇ ਦੌਰਾਨ ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨੰਬਰ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"ਟੈਕਸਟ ਸੁਨੇਹੇ (SMS) ਪ੍ਰਾਪਤ ਕਰੋ"</string>
@@ -292,7 +292,7 @@
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਵੱਲੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਸੈਲ ਪ੍ਰਸਾਰਨ ਸੁਨੇਹੇ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸੈਲ ਪ੍ਰਸਾਰਨ ਚਿਤਾਵਨੀਆਂ ਤੁਹਾਨੂੰ ਐਮਰਜੈਂਸੀ ਸਥਿਤੀਆਂ ਦੀ ਚਿਤਾਵਨੀ ਦੇਣ ਲਈ ਕੁਝ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਤੇ ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਜਾਂ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾ ਸਕਦੇ ਹਨ ਜਦੋਂ ਇੱਕ ਐਮਰਜੈਂਸੀ ਸੈਲ ਪ੍ਰਸਾਰਨ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਫੀਡਸ ਪੜ੍ਹੋ"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ਐਪ ਨੂੰ ਵਰਤਮਾਨ ਵਿੱਚ ਸਿੰਕ ਕੀਤੇ ਫੀਡਸ ਬਾਰੇ ਵੇਰਵੇ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
- <string name="permlab_sendSms" msgid="7544599214260982981">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦਿਖਾਓ"</string>
+ <string name="permlab_sendSms" msgid="7544599214260982981">"SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"ਐਪ ਨੂੰ SMS ਸੁਨੇਹੇ ਭੇਜਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦੇ ਸਿੱਟੇ ਵਜੋਂ ਅਕਲਪਿਤ ਖ਼ਰਚੇ ਪੈ ਸਕਦੇ ਹਨ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਪੁਸ਼ਟੀ ਤੋਂ ਬਿਨਾਂ ਸੁਨੇਹੇ ਭੇਜ ਕੇ ਤੁਹਾਨੂੰ ਖ਼ਰਚੇ ਪਾ ਸਕਦੇ ਹਨ।"</string>
<string name="permlab_readSms" msgid="8745086572213270480">"ਤੁਹਾਡੇ ਟੈਕਸਟ ਸੁਨੇਹੇ (SMS ਜਾਂ MMS) ਪੜ੍ਹੋ"</string>
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਟੈਬਲੇਟ ਜਾਂ SIM ਕਾਰਡ ਤੇ ਸਟੋਰ ਕੀਤੇ SMS ਸੁਨੇਹੇ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਐਪ ਨੂੰ ਸਾਰੇ SMS ਸੁਨੇਹੇ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ, ਸਮੱਗਰੀ ਜਾਂ ਗੁਪਤਤਾ ਤੇ ਧਿਆਨ ਦਿੱਤੇ ਬਿਨਾਂ।"</string>
@@ -1300,7 +1300,7 @@
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨੂੰ ਲੌਂਚ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
- <string name="content_description_sliding_handle" msgid="415975056159262248">"ਹੈਂਡਲ ਸਲਾਈਡ ਕਰ ਰਿਹਾ ਹੈ। ਛੋਹਵੋ & ਹੋਲਡ ਕਰੋ।"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"ਹੈਂਡਲ ਸਲਾਈਡ ਕਰ ਰਿਹਾ ਹੈ। ਸਪੱਰਸ਼ ਕਰੋ & ਹੋਲਡ ਕਰੋ।"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਸਵਾਈਪ ਕਰੋ।"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"ਬੋਲੀਆਂ ਗਈਆਂ ਪਾਸਵਰਡ ਕੁੰਜੀਆਂ ਸੁਣਨ ਲਈ ਇੱਕ ਹੈਡਸੈਟ ਪਲਗ ਇਨ ਕਰੋ।"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ਬਿੰਦੀ।"</string>
@@ -1368,7 +1368,7 @@
<string name="media_route_chooser_searching" msgid="4776236202610828706">"ਡਿਵਾਈਸਾਂ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ…"</string>
<string name="media_route_chooser_extended_settings" msgid="87015534236701604">"ਸੈਟਿੰਗਾਂ"</string>
<string name="media_route_controller_disconnect" msgid="8966120286374158649">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
- <string name="media_route_status_scanning" msgid="7279908761758293783">"ਸਕੈਨ ਕਰ ਰਿਹਾ ਹੈ..."</string>
+ <string name="media_route_status_scanning" msgid="7279908761758293783">"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
<string name="media_route_status_connecting" msgid="6422571716007825440">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
<string name="media_route_status_available" msgid="6983258067194649391">"ਉਪਲਬਧ"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
@@ -1550,7 +1550,7 @@
<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_pattern" msgid="4182192144797225137">"ਅਨਪਿਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅਨਲੌਕ ਪੈਟਰਨ ਵਾਸਤੇ ਪੁੱਛੋ"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ਅਨਪਿਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਮੰਗੋ"</string>
<string name="package_installed_device_owner" msgid="8420696545959087545">"ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਇੰਸਟੌਲ ਕੀਤਾ ਗਿਆ"</string>
<string name="package_updated_device_owner" msgid="8856631322440187071">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਪਡੇਟ ਕੀਤਾ ਗਿਆ"</string>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ਓਵਰਫਲੋ ਬੰਦ ਕਰੋ"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ਵੱਡਾ ਕਰੋ"</string>
<string name="close_button_text" msgid="3937902162644062866">"ਬੰਦ ਕਰੋ"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣਿਆ ਗਿਆ</item>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index e04965b..2291d037 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zamknij rozszerzony pasek"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksymalizuj"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zamknij"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="few">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="many">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 2531e10..6907a6c 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fechar barra flutuante"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 70c09d4..fe136c3 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fechar excesso"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 2531e10..6907a6c 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Fechar barra flutuante"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizar"</string>
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 58aef52..fe19d39 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="byteShort" msgid="8340973892742019101">"O"</string>
+ <string name="byteShort" msgid="8340973892742019101">"B"</string>
<string name="kilobyteShort" msgid="5973789783504771878">"KB"</string>
<string name="megabyteShort" msgid="6355851576770428922">"MB"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"GB"</string>
@@ -867,9 +867,9 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"acum"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min.</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
@@ -878,33 +878,33 @@
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de zile</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> zile</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> zi</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> de ani</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ani</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> an</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> min.</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> min.</item>
+ <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> min.</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> h</item>
+ <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de zile</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
+ <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
+ <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> zile</item>
+ <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> zi</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="few">peste <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
- <item quantity="other">peste <xliff:g id="COUNT_1">%d</xliff:g> de ani</item>
- <item quantity="one">peste <xliff:g id="COUNT_0">%d</xliff:g> an</item>
+ <item quantity="few">în <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
+ <item quantity="other">în <xliff:g id="COUNT_1">%d</xliff:g> ani</item>
+ <item quantity="one">în <xliff:g id="COUNT_0">%d</xliff:g> an</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="few">acum <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
@@ -1653,8 +1653,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Închideți meniul suplimentar"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximizați"</string>
<string name="close_button_text" msgid="3937902162644062866">"Închideți"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index e65983d..e885d70 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Закрыть дополнительное меню"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Развернуть"</string>
<string name="close_button_text" msgid="3937902162644062866">"Закрыть"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="few">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index b3ff46a..5626d47d 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -862,36 +862,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"දැන්"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one">මි <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">මි <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">මි<xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="other">මි<xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one">පැ <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">පැ <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">පැ<xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="other">පැ<xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one">දි <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="other">දි <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="other">දි<xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="one">ව <xliff:g id="COUNT_1">%d</xliff:g></item>
<item quantity="other">ව <xliff:g id="COUNT_1">%d</xliff:g></item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">මි <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">මි <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="one">මි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="other">මි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">පැ <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">පැ <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="one">පැ<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="other">පැ<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">දි <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">දි <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="one">දි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="other">දි<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">ව <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
- <item quantity="other">ව <xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="one">ව<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
+ <item quantity="other">ව<xliff:g id="COUNT_1">%d</xliff:g>කදී</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one">මිනිත්තු <xliff:g id="COUNT_1">%d</xliff:g>කට පෙර</item>
@@ -1620,8 +1620,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ඉතිරී යාම වසන්න"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"විහිදන්න"</string>
<string name="close_button_text" msgid="3937902162644062866">"වසන්න"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ක් තෝරන ලදි</item>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 6cc715e..54337ba 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -874,52 +874,52 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"teraz"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> h</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d.</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> r.</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> r.</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> r.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> r.</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>r</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>min</item>
+ <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>min</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> h</item>
+ <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> d.</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> d.</item>
+ <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g> r.</item>
- <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>r.</item>
- <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g> r.</item>
- <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g> r.</item>
+ <item quantity="few">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="many">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="other">o <xliff:g id="COUNT_1">%d</xliff:g>r</item>
+ <item quantity="one">o <xliff:g id="COUNT_0">%d</xliff:g>r</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="few">pred <xliff:g id="COUNT_1">%d</xliff:g> minútami</item>
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zatvoriť rozbaľovaciu ponuku"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximalizovať"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zavrieť"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="few">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="many">Vybrané: <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 2e6dc31..f13d1aa 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -561,7 +561,7 @@
<item msgid="9192514806975898961">"Po meri"</item>
</string-array>
<string-array name="emailAddressTypes">
- <item msgid="8073994352956129127">"Doma"</item>
+ <item msgid="8073994352956129127">"Dom"</item>
<item msgid="7084237356602625604">"Služba"</item>
<item msgid="1112044410659011023">"Drugo"</item>
<item msgid="2374913952870110618">"Po meri"</item>
@@ -573,7 +573,7 @@
<item msgid="4932682847595299369">"Po meri"</item>
</string-array>
<string-array name="imAddressTypes">
- <item msgid="1738585194601476694">"Začetna stran"</item>
+ <item msgid="1738585194601476694">"Dom"</item>
<item msgid="1359644565647383708">"Služba"</item>
<item msgid="7868549401053615677">"Drugo"</item>
<item msgid="3145118944639869809">"Po meri"</item>
@@ -619,7 +619,7 @@
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Obletnica"</string>
<string name="eventTypeOther" msgid="7388178939010143077">"Drugo"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Po meri"</string>
- <string name="emailTypeHome" msgid="449227236140433919">"Začetna stran"</string>
+ <string name="emailTypeHome" msgid="449227236140433919">"Dom"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Služba"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Drugo"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Mobilni"</string>
@@ -628,7 +628,7 @@
<string name="postalTypeWork" msgid="5268172772387694495">"Služba"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Drugo"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Po meri"</string>
- <string name="imTypeHome" msgid="6241181032954263892">"Začetna stran"</string>
+ <string name="imTypeHome" msgid="6241181032954263892">"Dom"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Služba"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Drugo"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Po meri"</string>
@@ -660,7 +660,7 @@
<string name="relationTypeSister" msgid="1735983554479076481">"Sestra"</string>
<string name="relationTypeSpouse" msgid="394136939428698117">"Zakonski partner"</string>
<string name="sipAddressTypeCustom" msgid="2473580593111590945">"Po meri"</string>
- <string name="sipAddressTypeHome" msgid="6093598181069359295">"Domov"</string>
+ <string name="sipAddressTypeHome" msgid="6093598181069359295">"Dom"</string>
<string name="sipAddressTypeWork" msgid="6920725730797099047">"Služba"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"Drugo"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"Ni aplikacije za ogled tega stika."</string>
@@ -874,46 +874,46 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"zdaj"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> l</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> l</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
+ <item quantity="two"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>l</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> min</item>
+ <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g> d</item>
+ <item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="two">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="few">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="other">čez <xliff:g id="COUNT_1">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">čez <xliff:g id="COUNT_1">%d</xliff:g> l</item>
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Zapri presežni element"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimiziraj"</string>
<string name="close_button_text" msgid="3937902162644062866">"Zapri"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> izbran</item>
<item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrana</item>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index 09304c5..c3911eb 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -251,7 +251,7 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"dërgo dhe shiko mesazhet SMS"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Hapësira e ruajtjes"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"qasu te fotografitë, përmbajtjet audio-vizuale dhe skedarët në pajisje"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"qasjen te fotografitë, përmbajtjet audio-vizuale dhe skedarët në pajisje"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofoni"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"regjistro audio"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"tani"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> orë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> orë</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>o</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>o</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ditë</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ditë</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> vite</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> vit</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>v</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>v</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g> orë</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g> orë</item>
+ <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>o</item>
+ <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>o</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g> ditë</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g> ditë</item>
+ <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g> vite</item>
- <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g> vit</item>
+ <item quantity="other">në <xliff:g id="COUNT_1">%d</xliff:g>v</item>
+ <item quantity="one">në <xliff:g id="COUNT_0">%d</xliff:g>v</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> minuta më parë</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Mbylle tejkalimin"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimizo"</string>
<string name="close_button_text" msgid="3937902162644062866">"Mbyll"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> të zgjedhura</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> i zgjedhur</item>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index c0d875d..5b6dcd4 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -878,8 +878,8 @@
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дана</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дан</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
@@ -898,8 +898,8 @@
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
- <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
- <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> дана</item>
+ <item quantity="few">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
+ <item quantity="other">за <xliff:g id="COUNT_1">%d</xliff:g> дан</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="one">за <xliff:g id="COUNT_1">%d</xliff:g> год</item>
@@ -1653,8 +1653,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Затвори преклопни мени"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Увећај"</string>
<string name="close_button_text" msgid="3937902162644062866">"Затвори"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Изабрана је <xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item>
<item quantity="few">Изабране су <xliff:g id="COUNT_1">%1$d</xliff:g> ставке</item>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 3f06683..9f78411 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"nu"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> tim.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> tim.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> d</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> år</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>å</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>å</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> min</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> min</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> m</item>
+ <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> tim.</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> tim.</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> h</item>
+ <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
<item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> d</item>
<item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> år</item>
- <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> år</item>
+ <item quantity="other">om <xliff:g id="COUNT_1">%d</xliff:g> å</item>
+ <item quantity="one">om <xliff:g id="COUNT_0">%d</xliff:g> å</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other">för <xliff:g id="COUNT_1">%d</xliff:g> minuter sedan</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Dölj utökat verktygsfält"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maximera"</string>
<string name="close_button_text" msgid="3937902162644062866">"Stäng"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> har valts</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> har valts</item>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 84a94e4..7ceef61 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -858,36 +858,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"sasa"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other">Dak <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Dak <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other">Saa <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Saa <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other">Siku <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">Siku <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other">miaka <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">mwaka <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">kwa dak <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">kwa dak <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other">dak <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">dak <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">kwa saa <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">kwa saa <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other">saa <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">saa <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">kwa siku <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">kwa siku <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other">siku <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">siku <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">kwa miaka <xliff:g id="COUNT_1">%d</xliff:g></item>
- <item quantity="one">kwa maka <xliff:g id="COUNT_0">%d</xliff:g></item>
+ <item quantity="other">miaka <xliff:g id="COUNT_1">%d</xliff:g></item>
+ <item quantity="one">mwaka <xliff:g id="COUNT_0">%d</xliff:g></item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other">Dakika <xliff:g id="COUNT_1">%d</xliff:g> zilizopita</item>
@@ -1616,8 +1616,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Funga vipengee vya ziada"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Panua"</string>
<string name="close_button_text" msgid="3937902162644062866">"Funga"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> vimechaguliwa</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kimechaguliwa</item>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 291db37..35f4254 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -692,8 +692,8 @@
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"இடைநிறுத்து"</string>
<string name="lockscreen_transport_play_description" msgid="1901258823643886401">"இயக்கு"</string>
<string name="lockscreen_transport_stop_description" msgid="5907083260651210034">"நிறுத்து"</string>
- <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"மீண்டும் காட்டு"</string>
- <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"வேகமாக முன்செல்"</string>
+ <string name="lockscreen_transport_rew_description" msgid="6944412838651990410">"பின்னே செல்"</string>
+ <string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"முன்னே செல்"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"அவசர அழைப்புகள் மட்டும்"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"நெட்வொர்க் பூட்டப்பட்டது"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"சிம் கார்டு PUK பூட்டுதல் செய்யப்பட்டுள்ளது."</string>
@@ -803,7 +803,7 @@
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்துதல்"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்த, பயன்பாட்டை அனுமதிக்கிறது. இடத் தகவலை தன்னிச்சையான இணையதளங்களுக்கு அனுப்புவதை அனுமதிக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
<string name="save_password_message" msgid="767344687139195790">"இந்தக் கடவுச்சொல்லை உலாவி நினைவில்கொள்ள விரும்புகிறீர்களா?"</string>
- <string name="save_password_notnow" msgid="6389675316706699758">"இப்பொழுது இல்லை"</string>
+ <string name="save_password_notnow" msgid="6389675316706699758">"இப்போது இல்லை"</string>
<string name="save_password_remember" msgid="6491879678996749466">"நினைவில்கொள்"</string>
<string name="save_password_never" msgid="8274330296785855105">"எப்போதும் வேண்டாம்"</string>
<string name="open_permission_deny" msgid="7374036708316629800">"இந்தப் பக்கத்தைத் திறக்க, உங்களிடம் அனுமதி இல்லை."</string>
@@ -858,7 +858,7 @@
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> மணிநேரம்</item>
<item quantity="one">1 மணிநேரம்</item>
</plurals>
- <string name="now_string_shortest" msgid="8912796667087856402">"இப்போது"</string>
+ <string name="now_string_shortest" msgid="8912796667087856402">"உடனே"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>நி</item>
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>நி</item>
@@ -876,20 +876,20 @@
<item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ஆ</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நிமிடங்களில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நிமிடத்தில்</item>
+ <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>நி</item>
+ <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>நி</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> மணிநேரத்தில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> மணிநேரத்தில்</item>
+ <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>ம</item>
+ <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>ம</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நாட்களில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> நாளில்</item>
+ <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>நா</item>
+ <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>நா</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ஆண்டுகளில்</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ஆண்டில்</item>
+ <item quantity="other">இன்னும் <xliff:g id="COUNT_1">%d</xliff:g>ஆ</item>
+ <item quantity="one">இன்னும் <xliff:g id="COUNT_0">%d</xliff:g>ஆ</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> நிமிடங்களுக்கு முன்பு</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"மேல்தோன்றலை மூடு"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"பெரிதாக்கு"</string>
<string name="close_button_text" msgid="3937902162644062866">"மூடு"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டது</item>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 7890aa7..bee79de 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"ఇప్పుడు"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ని.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ని.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ని</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ని</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> గం.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> గం.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>గం</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>గం</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> రో.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> రో.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>రో</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>రో</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> సం.</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> సం.</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>సం</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>సం</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ని.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ని.లో</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ని.లో</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ని.లో</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> గం.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> గం.లో</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>గంటల్లో</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>గంటలో</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> రో.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> రో.లో</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>రోజుల్లో</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>రోజులో</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> సం.లో</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> సం.లో</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>సం.లో</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>సం.లో</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> నిమిషాల క్రితం</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"అతివ్యాప్తిని మూసివేస్తుంది"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"గరిష్టీకరించు"</string>
<string name="close_button_text" msgid="3937902162644062866">"మూసివేయి"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఎంచుకోబడ్డాయి</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఎంచుకోబడింది</item>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index deb9fae..ef1f9a1 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"ปิดรายการเพิ่มเติม"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"ขยายใหญ่สุด"</string>
<string name="close_button_text" msgid="3937902162644062866">"ปิด"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">เลือกไว้ <xliff:g id="COUNT_1">%1$d</xliff:g> รายการ</item>
<item quantity="one">เลือกไว้ <xliff:g id="COUNT_0">%1$d</xliff:g> รายการ</item>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 65cac8a..1bdc63a 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Isara ang overflow"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"I-maximize"</string>
<string name="close_button_text" msgid="3937902162644062866">"Isara"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 59044b9..8f2dc75 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"şimdi"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dk</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dk</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dk</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dk</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> sa</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> sa</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>sa</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>sa</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> g</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> y</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> y</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dk içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> dk içinde</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>dk içinde</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>dk içinde</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> sa içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> sa içinde</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>sa içinde</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>sa içinde</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> g içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> g içinde</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>g içinde</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>g içinde</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> y içinde</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> y içinde</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y içinde</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y içinde</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> dakika önce</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Taşan araç çubuğunu kapat"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Ekranı Kapla"</string>
<string name="close_button_text" msgid="3937902162644062866">"Kapat"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe seçildi</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe seçildi</item>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 27ad633..57ff67f 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -20,7 +20,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="byteShort" msgid="8340973892742019101">"Б"</string>
+ <string name="byteShort" msgid="8340973892742019101">"б"</string>
<string name="kilobyteShort" msgid="5973789783504771878">"Кб"</string>
<string name="megabyteShort" msgid="6355851576770428922">"Мб"</string>
<string name="gigabyteShort" msgid="3259882455212193214">"Гб"</string>
@@ -886,16 +886,16 @@
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> год</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> днів</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> дня</item>
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> д</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> рік</item>
- <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> роки</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> років</item>
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> року</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> р</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
<item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> хв</item>
@@ -910,16 +910,16 @@
<item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> год</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> день</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> дні</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> днів</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> дня</item>
+ <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
+ <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> д</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> рік</item>
- <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> роки</item>
- <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> років</item>
- <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> року</item>
+ <item quantity="one">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
+ <item quantity="few">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
+ <item quantity="many">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
+ <item quantity="other">через <xliff:g id="COUNT_1">%d</xliff:g> р</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> хвилину тому</item>
@@ -1688,8 +1688,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Закрити розширені інструменти"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Розгорнути"</string>
<string name="close_button_text" msgid="3937902162644062866">"Закрити"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="few">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index cf3e668..a2dd131 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"ابھی"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> منٹ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> منٹ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> گھنٹے</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> گھنٹہ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دن</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دن</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> سال</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> منٹ میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> منٹ میں</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m میں</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m میں</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> گھنٹے میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> گھنٹہ میں</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h میں</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h میں</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> دن میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> دن میں</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d میں</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d میں</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> سال میں</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> سال میں</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>y میں</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>y میں</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> منٹ قبل</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"اوورفلو بند کریں"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"بڑا کریں"</string>
<string name="close_button_text" msgid="3937902162644062866">"بند کریں"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> منتخب کردہ</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> منتخب کردہ</item>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 7d59aef..fb39be2 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -1089,7 +1089,7 @@
<string name="wifi_p2p_from_message" msgid="570389174731951769">"Kimdan:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"Kimga:"</string>
<string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"So‘ralgan PIN kodni kiriting:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN-kod:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN kod:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"Planshet <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ga ulanganligi tufayli vaqtincha Wi-Fi tarmog‘idan uzildi."</string>
<string name="wifi_p2p_frequency_conflict_message" product="tv" msgid="3087858235069421128">"Televizor <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasiga ulangan vaqtda Wi-Fi tarmog‘idan vaqtinchalik uziladi"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"Telefon <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ga ulanganligi tufayli vaqtincha Wi-Fi tarmog‘idan uzildi."</string>
@@ -1527,7 +1527,7 @@
<string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yangi PIN kodni tasdiqlash"</string>
<string name="restr_pin_create_pin" msgid="8017600000263450337">"Cheklovlarni o‘zgartirish uchun PIN-kod yaratish"</string>
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-kod mos kelmadi. Qayta urinib ko‘ring."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-kod juda qisqa. Kamida 4 raqamli bo‘lishi kerak."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN kod kamida 4 ta raqamdan iborat bo‘lishi shart."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688">
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring</item>
<item quantity="one">1 soniyadan so‘ng qayta urinib ko‘ring</item>
@@ -1621,8 +1621,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Qalqib turuvchi asboblar panelini yopish"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Maksimallashtirish"</string>
<string name="close_button_text" msgid="3937902162644062866">"Yopish"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta tanlandi</item>
<item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta tanlandi</item>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 25729f0..9ad9737 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"bây giờ"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> phút</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> phút</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ph</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ph</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> giờ</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> giờ</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> ngày</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> ngày</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>ng</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>ng</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> năm</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> năm</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>n</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>n</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other">trong <xliff:g id="COUNT_1">%d</xliff:g>ph</item>
- <item quantity="one">trong <xliff:g id="COUNT_0">%d</xliff:g>ph</item>
+ <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>ph</item>
+ <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>ph</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other">trong <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">trong <xliff:g id="COUNT_0">%d</xliff:g>h</item>
+ <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>h</item>
+ <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other">trong <xliff:g id="COUNT_1">%d</xliff:g> ngày</item>
- <item quantity="one">trong <xliff:g id="COUNT_0">%d</xliff:g> ngày</item>
+ <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>ng</item>
+ <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>ng</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other">trong <xliff:g id="COUNT_1">%d</xliff:g> năm</item>
- <item quantity="one">trong <xliff:g id="COUNT_0">%d</xliff:g> năm</item>
+ <item quantity="other">sau <xliff:g id="COUNT_1">%d</xliff:g>n</item>
+ <item quantity="one">sau <xliff:g id="COUNT_0">%d</xliff:g>n</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> phút trước</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Đóng tràn"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Tối đa hóa"</string>
<string name="close_button_text" msgid="3937902162644062866">"Đóng"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">Đã chọn <xliff:g id="COUNT_1">%1$d</xliff:g></item>
<item quantity="one">Đã chọn <xliff:g id="COUNT_0">%1$d</xliff:g></item>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 32dffe5..9336182 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1610,8 +1610,7 @@
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"SS 请求已修改为新的 SS 请求。"</string>
<string name="notification_work_profile_content_description" msgid="4600554564103770764">"工作资料"</string>
<string name="expand_button_content_description" msgid="5855955413376384681">"展开按钮"</string>
- <!-- no translation found for expand_action_accessibility (5307730695723718254) -->
- <skip />
+ <string name="expand_action_accessibility" msgid="5307730695723718254">"切换展开模式"</string>
<string name="usb_midi_peripheral_name" msgid="7221113987741003817">"Android USB 外设端口"</string>
<string name="usb_midi_peripheral_manufacturer_name" msgid="7176526170008970168">"Android"</string>
<string name="usb_midi_peripheral_product_name" msgid="4971827859165280403">"USB 外设端口"</string>
@@ -1619,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"关闭工具栏溢出"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"最大化"</string>
<string name="close_button_text" msgid="3937902162644062866">"关闭"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>:<xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">已选择 <xliff:g id="COUNT_1">%1$d</xliff:g> 项</item>
<item quantity="one">已选择 <xliff:g id="COUNT_0">%1$d</xliff:g> 项</item>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 5baeb84..d7b705b 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -860,32 +860,32 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"現在"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘後</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘後</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時後</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時後</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天後</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天後</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天後</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年後</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"關閉工具列溢位功能"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"最大化"</string>
<string name="close_button_text" msgid="3937902162644062866">"關閉"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>:<xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item>
<item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 83f487f..cef8b98 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -860,36 +860,36 @@
</plurals>
<string name="now_string_shortest" msgid="8912796667087856402">"現在"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘內</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 分鐘內</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>分鐘後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>分鐘後</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 小時內</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 小時內</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>小時後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>小時後</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 天內</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 天內</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>天後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>天後</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
- <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 年內</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g> 年內</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>年後</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>年後</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> 分鐘前</item>
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"關閉溢出模式"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"最大化"</string>
<string name="close_button_text" msgid="3937902162644062866">"關閉"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>:<xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item>
<item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 5a96623..7720b5e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1618,8 +1618,7 @@
<string name="floating_toolbar_close_overflow_description" msgid="559796923090723804">"Vala ukuchichima"</string>
<string name="maximize_button_text" msgid="7543285286182446254">"Khulisa"</string>
<string name="close_button_text" msgid="3937902162644062866">"Vala"</string>
- <!-- no translation found for notification_messaging_title_template (3452480118762691020) -->
- <skip />
+ <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item>
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index aecda44..998eea5 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -174,6 +174,7 @@
<!-- Window attributes -->
<item name="windowBackground">@drawable/screen_background_selector_dark</item>
+ <item name="windowBackgroundFallback">?attr/colorBackground</item>
<item name="windowClipToOutline">false</item>
<item name="windowFrame">@null</item>
<item name="windowNoTitle">false</item>
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index 741e85c..ae858fe 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -841,6 +841,10 @@
to: /studio/run/index.html#instant-run
- from: /r/studio-ui/test-recorder.html
to: http://tools.android.com/tech-docs/test-recorder
+- from: /r/studio-ui/export-licenses.html
+ to: http://tools.android.com/tech-docs/new-build-system/license
+- from: /r/studio-ui/experimental-to-stable-gradle.html
+ to: http://tools.android.com/tech-docs/new-build-system/gradle-experimental/experimental-to-stable-gradle
- from: /reference/org/apache/http/...
to: /about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client
- from: /shareables/...
@@ -903,7 +907,7 @@
- from: /tools/debugging/ddms.html
to: /studio/profile/ddms.html
- from: /tools/debugging/debugging-log.html
- to: /studio/debug/log.html
+ to: /studio/command-line/logcat.html
- from: /tools/debugging/debugging-memory.html
to: /studio/profile/investigate-ram.html
- from: /tools/debugging/debugging-studio.html
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index fff2608..911e256 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -59,7 +59,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 2, 2016.
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016.
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
@@ -81,7 +81,7 @@
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 2, 2016.
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016.
<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
@@ -101,7 +101,7 @@
<img alt="" style="float:right"
-src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A49.6%2C41.4%2C9.0&chco=c4df9b%2C6fad0c&cht=p&chs=400x250">
+src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A48.6%2C41.8%2C9.6&chco=c4df9b%2C6fad0c&cht=p&chs=400x250">
<p>To declare which version of OpenGL ES your application requires, you should use the {@code
android:glEsVersion} attribute of the <a
@@ -119,21 +119,21 @@
</tr>
<tr>
<td>2.0</td>
-<td>49.6%</td>
+<td>48.6%</td>
</tr>
<tr>
<td>3.0</td>
-<td>41.4%</td>
+<td>41.8%</td>
</tr>
<tr>
<td>3.1</td>
-<td>9.0%</td>
+<td>9.6%</td>
</tr>
</table>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 2, 2016</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 6, 2016</em></p>
@@ -147,28 +147,28 @@
"Large": {
"hdpi": "0.5",
"ldpi": "0.2",
- "mdpi": "4.6",
+ "mdpi": "4.5",
"tvdpi": "2.2",
"xhdpi": "0.5"
},
"Normal": {
"hdpi": "41.1",
- "mdpi": "4.5",
+ "mdpi": "4.2",
"tvdpi": "0.1",
- "xhdpi": "24.9",
- "xxhdpi": "15.1"
+ "xhdpi": "25.6",
+ "xxhdpi": "15.0"
},
"Small": {
- "ldpi": "2.1"
+ "ldpi": "2.0"
},
"Xlarge": {
"hdpi": "0.3",
- "mdpi": "3.2",
+ "mdpi": "3.1",
"xhdpi": "0.7"
}
},
- "densitychart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chs=400x250&cht=p&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chd=t%3A2.3%2C12.3%2C2.3%2C41.9%2C26.1%2C15.1&chf=bg%2Cs%2C00000000",
- "layoutchart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chs=400x250&cht=p&chl=Xlarge%7CLarge%7CNormal%7CSmall&chd=t%3A4.2%2C8.0%2C85.7%2C2.1&chf=bg%2Cs%2C00000000"
+ "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C11.8%2C2.3%2C41.9%2C26.8%2C15.0&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi",
+ "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.1%2C7.9%2C86.0%2C2.0&chl=Xlarge%7CLarge%7CNormal%7CSmall"
}
];
@@ -176,7 +176,7 @@
var VERSION_DATA =
[
{
- "chart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chs=500x250&cht=p&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat%7CLollipop%7CMarshmallow&chd=t%3A0.1%2C2.2%2C2.0%2C20.1%2C32.5%2C35.6%2C7.5&chf=bg%2Cs%2C00000000",
+ "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A0.1%2C2.0%2C1.9%2C18.9%2C31.6%2C35.4%2C10.1&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat%7CLollipop%7CMarshmallow",
"data": [
{
"api": 8,
@@ -186,47 +186,47 @@
{
"api": 10,
"name": "Gingerbread",
- "perc": "2.2"
+ "perc": "2.0"
},
{
"api": 15,
"name": "Ice Cream Sandwich",
- "perc": "2.0"
+ "perc": "1.9"
},
{
"api": 16,
"name": "Jelly Bean",
- "perc": "7.2"
+ "perc": "6.8"
},
{
"api": 17,
"name": "Jelly Bean",
- "perc": "10.0"
+ "perc": "9.4"
},
{
"api": 18,
"name": "Jelly Bean",
- "perc": "2.9"
+ "perc": "2.7"
},
{
"api": 19,
"name": "KitKat",
- "perc": "32.5"
+ "perc": "31.6"
},
{
"api": 21,
"name": "Lollipop",
- "perc": "16.2"
+ "perc": "15.4"
},
{
"api": 22,
"name": "Lollipop",
- "perc": "19.4"
+ "perc": "20.0"
},
{
"api": 23,
"name": "Marshmallow",
- "perc": "7.5"
+ "perc": "10.1"
}
]
}
diff --git a/docs/html/distribute/index.jd b/docs/html/distribute/index.jd
index 6384773..424983d 100644
--- a/docs/html/distribute/index.jd
+++ b/docs/html/distribute/index.jd
@@ -67,7 +67,9 @@
</li>
<li class="dac-tab-view" data-tab-view="type">
+ <!--
<div class="dac-filter-item" data-filter-value="type:distribute" data-filter-name="Articles"></div>
+ -->
<div class="dac-filter-item" data-filter-value="type:youtube" data-filter-name="Videos"></div>
<div class="dac-filter-item" data-filter-value="type:blog" data-filter-name="Blog posts"></div>
</li>
@@ -78,7 +80,7 @@
</div>
<div class="resource-flow-layout col-16" id="latest-resources"
- data-query="type:distribute, type:youtube+tag:googleplay, type:blog+tag:googleplay+tag:featured"
+ data-query="type:youtube+tag:googleplay, type:blog+tag:googleplay+tag:featured"
data-sortOrder="-timestamp"
data-cardSizes="6x6"
data-items-per-page="6"
diff --git a/docs/html/guide/practices/screens_support.jd b/docs/html/guide/practices/screens_support.jd
index 1335790..4d93c83 100644
--- a/docs/html/guide/practices/screens_support.jd
+++ b/docs/html/guide/practices/screens_support.jd
@@ -677,7 +677,7 @@
<li>48x48 (1.0x baseline) for medium-density</li>
<li>72x72 (1.5x) for high-density</li>
<li>96x96 (2.0x) for extra-high-density</li>
- <li>180x180 (3.0x) for extra-extra-high-density</li>
+ <li>144x144 (3.0x) for extra-extra-high-density</li>
<li>192x192 (4.0x) for extra-extra-extra-high-density (launcher icon only; see
<a href="#xxxhdpi-note">note</a> above)</li>
</ul>
diff --git a/docs/html/ndk/guides/graphics/getting-started.jd b/docs/html/ndk/guides/graphics/getting-started.jd
index 145e534..0c2d939 100644
--- a/docs/html/ndk/guides/graphics/getting-started.jd
+++ b/docs/html/ndk/guides/graphics/getting-started.jd
@@ -137,7 +137,7 @@
<ol style="1">
<li>Select your project in the Android Studio <em>Project</em> panel.</li>
-<li>From the <strong>Build</strong> menu, choose <strong>Make Module <module-name> </strong>.</li>
+<li>From the <strong>Build</strong> menu, choose <strong>Make Module <module-name> </strong>; or select <strong> Build APK </strong> to generate APK.</li>
<li>Resolve any dependency issues, and then compile. As Figure 2 shows, you can select individual projects to compile by choosing them from the configuration pulldown.</li>
<img src="../images/config-pulldown.png"
diff --git a/docs/html/ndk/guides/graphics/validation-layer.jd b/docs/html/ndk/guides/graphics/validation-layer.jd
index beac1c0..1a7d832 100644
--- a/docs/html/ndk/guides/graphics/validation-layer.jd
+++ b/docs/html/ndk/guides/graphics/validation-layer.jd
@@ -6,19 +6,8 @@
<h2>On this page</h2>
<ol>
+ <li><a href="#ilp">Add Validation Layers to Project</a></li>
<li><a href="#gls">Getting Layer Source</a></li>
- <li><a href="#ias">Android Studio Integration</a>
- <ol>
- <li><a href="#asbl">Building Layers</a></li>
- <li><a href="#asil">Installing Layers</a></li>
- </ol>
- </li>
- <li><a href="#cli">Integrating on the Command Line</a>
- <ol>
- <li><a href="#clibl">Building Layers</a></li>
- <li><a href="#cliil">Installing Layers</a></li>
- </ol>
- </li>
<li><a href="#verifying">Verifying Layer Build</a></li>
<li><a href="#enabling">Enabling Layers</a></li>
<li><a href="#debug">Enabling the Debug Callback</a></li>
@@ -52,272 +41,94 @@
<p>
This page explains how to:
<ul>
+ <li>Integrate NDK's Layer Binaries.</li>
<li>Get source code for validation layers.</li>
- <li>Build the layers.</li>
- <li>Incorporate the layers into your app.</li>
+ <li>Verifying Layer Build.</li>
+ <li>Enabling Layers in Vulkan Application.</li>
+
</ul>
</p>
+<h2 id="ilp">Add Validation Layers to Project</h2>
+
+<p>
+ NDK release 12 and higher includes pre-built validation layer binaries. At
+ instance and device creation time, when requested by your application, the
+ Vulkan loader finds them in the APK installed location and loads them.
+</p>
+
+<p>
+ To use the pre-built validation layer binaries, either modify the gradle build
+ configuration of your project or manually add the binaries into the JNI
+ libraries directory of your project.
+</p>
+
+
+<h3 id="vl-gradle">Adding validation layers with Gradle</h3>
+
+<p>
+ You can add the validation layer your project using either Andorid Studio's
+ support for CMake and Ndk-build, or using Studio's experimental plugin for
+ Gradle. In general, you should use the CMake and Ndk-build configuration.
+</p>
+
+
+<p>
+ To add the libraries using Android Studio's support for CMake/Ndk-build,
+ add the following to your project's gradle configuration:
+</p>
+
+<pre class="no-pretty-print">
+sourceSets {
+ main {
+ jniLibs {
+ srcDir "${your-ndk-dir}/sources/third_party/vulkan/src/build-android/jniLibs"
+ }
+ }
+}</pre>
+
+<p>
+ To add the libraries using Android Studio's experimental plugin for Gradle,
+ add the following to your project's gradle configuration:
+</p>
+
+<pre class="no-pretty-print">
+sources {
+ main {
+ jniLibs {
+ source.srcDir "${your-ndk-dir}/sources/third_party/vulkan/src/build-android/jniLibs"
+ }
+ }
+}</pre>
+
+
+<h3 id="vl-jni-lib">Adding validation layers to JNI libraries</h3>
+
+<p>
+ If configuring your project's gradle build file is not working, you can
+ manually add the validation layer binaries to your project's JNI libraries
+ directory by using the following command line options:
+</p>
+
+<pre class="no-pretty-print">
+$ cd ${your-app-project-root}
+$ mkdir -p app/src/main
+$ cp -fr ${your-ndk-dir}/sources/third_party/vulkan/src/build-android/jniLibs app/src/main/
+</pre>
+
+
<h2 id="gls">Getting Layer Source</h2>
<p>
-This section explains how to build layers from source.
-If you have precompiled layers, you can skip this section, and instead read about how to
-install your layers using <a href="#asil">Android Studio</a> or from the <a href="cliil">
-command line</a>.
-</p>
-<h3 id="ftn">From the NDK (Recommended)</h3>
-
-<p>
-<a href="{@docRoot}ndk/downloads/index.html">NDK Revision 12</a> and later contains source
-code for Android validation layers that is known-good, and ready to build. This code resides under
-the {@code <ndk-root>/sources/third_party/vulkan/src/build-android/generated/gradle-build}
-directory. This version of the layers should be sufficient for most needs. If so, your next task is
-to <a href="#building">build them</a>. Alternatively, you can pull source code from the
-Khronos Group repository.
-</pre>
-</p>
-
-<h3 id="ftr">From the repository</h3>
-
-<p>
-Although we recommend that you use the source code provided with the NDK, you can also pull more
-recent versions of the source code directly from the
+If your app needs the latest validation layer, you can pull the latest source from the Khronos Group
<a class="external-link" href="https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers">
-GitHub repository</a> belonging to the Khronos Group. To do so, perform the following steps.
+GitHub repository</a> and follow the build instructions there.
</p>
-<ol style="1">
-<li>
-Clone the Vulkan directory by entering the following command in your terminal window:
-
-<pre class="no-pretty-print">
-$ git clone git@github.com:KhronosGroup/Vulkan-LoaderAndValidationLayers.git
-</pre>
-
-<p class="note"><strong>Note: </strong>You must have a private SSH key associated with
-GitHub, or this command fails with a {@code Permission denied (publickey)} message.</p>
-</li>
-
-<li>
-Navigate to the directory containing the layer source code, and
-check out the repo's stable Android branch, called {@code android_layers}:
-
-<pre class="no-pretty-print">
-$ cd Vulkan-LoaderAndValidationLayers
-$ git checkout android_layers
-</pre>
-</li>
-
-<li>
-Begin preparation for building by entering the following commands on the command line:
-<ul>
- <li>For Linux or OS X:
- <ul>
- <li>
- <pre class="no-pretty-print">
-$ cd build-android
-$ ./android-generate</pre>
- </li>
- </ul>
- </li>
-
- <li>For Windows:
- <ul>
- <li>
-<pre class="no-pretty-print">
-> cd build-android
-> android-generate.bat</pre>
- </li>
- </ul>
- </li>
-</ul>
-</li>
-
-<li>
-Continue by following the build instructions for your platform.
-These instructions are in the {@code BUILD.md} file contained in the local instance of the
-repository you cloned.
-</li>
-</ul>
-
-</ol>
-
-<h3 id="ias">Android Studio Integration</h3>
-<p>
-Android Studio builds the validation layers when it builds the rest of the app.
-This flow makes it easier for you to trace through the layers at runtime. Each layer's
-source code corresponds to a single Gradle project, which you can specify directly in your Android
-Studio app. For example, there is a {@code build.gradle} project for threading, and another
-one for parameter validation.
-</p>
-
-<h4 id="asbl">Building layers</h4>
-
-<p>
-To integrate layers directory into Android Studio application, perform these steps:
-</p>
-<li>
-Add layers to your Android Studio application's project by specifying their corresponding
-Gradle projects in {@code settings.gradle}, which is normally a peer to app directory.
-The following example shows how to do this, based on the assumption that you're
-<a href="#ftn">using the {@code build.gradle} files from the NDK</a>.
-
-<pre>
-// configure your path to the source code generated on your machine
-def layerProjRoot = file('/path/to/ndk-root/.../build-android/generated/gradle-build')
-String[] layers = ['threading',
- 'parameter_validation',
- 'object_tracker',
- 'core_validation',
- 'device_limits',
- 'image',
- 'swapchain',
- 'unique_objects']
-for (layer in layers) {
- include ":"+ layer
- project(":" + layer.toString()).projectDir = new File("${layerProjRoot}/${layer}")
-}
-</pre>
-</li>
-
-Your next step is to provide the built layers to the app by installing them.
-
-<h4 id="asil">Installing layers</h4>
-
-<li>
-To install your layers, add the layer Gradle projects to your application's jniLibs dependencies
-in your {@code build.gradle} module. This module normally resides under the {@code app/} directory.
-The following example shows how to do this:
-
-<pre>
-android.sources {
- main {
- jni { ... }
- jniLibs {
- dependencies {
- project ":threading"
- project ":parameter_validation"
- project ":object_tracker"
- project ":core_validation"
- project ":device_limits"
- project ":image"
- project ":swapchain"
- project ":unique_objects"
- }
- }
- }
-} // android.sources
-</pre>
-</li>
-<li>
-Develop, build, and debug as you usually would. When you build, Android Studio automatically
-builds the layers and copies them into your APK.
-</li>
-<li>
-Debug your application. Android Studio allows you to trace through the layer source code.
-</li>
-<li>
-For best performance, remove the layers before you do your release build.
-</li>
-</ol>
-
-
-<h3 id="cli">From the Command Line</h3>
-
-This section explains how to build and install your layers if your project does not use
-Android Studio.
-
-<h4 id="clibl">Building layers</h4>
-
-<p>
-To build validation layers on Linux or OS X, enter these commands on the command line:
-</p>
-<ul>
-<li>
-Using Gradle:
-<pre class="no-pretty-print">
-$ cd generated/gradle-build
-$ # configure SDK and NDK path in local.properties
-$ gradlew assembleAllDebug
-</pre>
-</li>
-<li>
-Using Android makefiles:
-<pre class="no-pretty-print">
-$ ndk-build</pre>
-</li>
-</ul>
-
-<p>
-To build validation layers on Windows, enter these commands on the command line:
-</p>
-<ul>
-<li>
-Using Gradle:
-<pre class="no-pretty-print">
-> cd generated\gradle-build
-> REM configure SDK and NDK path in local.properties
-> gradlew.bat assembleAllDebug
-</pre>
-</li>
-<li>
-Using Android makefiles:
-<pre class="no-pretty-print">
-> ndk-build.cmd
-</pre>
-</li>
-</ul>
-
-
-
-</p>
-</li>
-</ol>
-
-<h4 id="cliil">Installing layers</h4>
-
-<p>
-After building the layers, you must provide them to your app. To do so, you must first
-create a {@code jniLibs} folder in your app's project directory under
-{@code ./src/main/}, and copy the libs to it. The following example shows how to do this.
-</p>
-
-<pre class="no-pretty-print">
-$ mkdir ./src/main/jniLibs
-</pre>
-
-<p>
-The next step depends on whether you are using Gradle or Android makefiles. If you're using
-Gradle, each built layer resides in its own directory. Consolidate the layers into a single
-directory, as the following example shows:
-</p>
-
-<pre class="no-pretty-print">
-$ cp -r .../build-android/generated/gradle-build/threading/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/parameter_validation/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/object_tracker/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/core_validation/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/device_limits/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/image/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/swapchain/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-$ cp -r .../build-android/generated/gradle-build/unique_objects/build/outputs/native/debug/all/lib/* ./src/main/jniLibs/
-</pre>
-
-If you're using Android makefiles, the built layers reside in {@code lib} folders,
-with one {@code lib} folder under each architecture’s root directory. Consolidate the
-makefiles under the {@code jniLibs} directory as this example shows:
-</p>
-<pre class="no-pretty-print">
-$ cp -r .../build-android/libs/* ./src/main/jniLibs/
-</pre>
-</li>
-</ol>
-
<h2 id="verifying">Verifying Layer Build</h2>
<p>
-Regardless of whether you build using Gradle or Android makefiles, the build process produces
-a file structure like the following:
+Regardless of whether you build with NDK's prebuilt layers or you build from the latest source code,
+the build process produces final file structure like the following:
</p>
<pre class="no-pretty-print">
@@ -571,6 +382,7 @@
</pre>
+<p>
Once your app has registered and enabled the debug callback, the system routes debugging
messages to a callback that you register. An example of such a callback appears below:
</p>
diff --git a/docs/html/preview/features/data-saver.jd b/docs/html/preview/features/data-saver.jd
index 761556e..abc47ea 100644
--- a/docs/html/preview/features/data-saver.jd
+++ b/docs/html/preview/features/data-saver.jd
@@ -179,10 +179,13 @@
Testing with Android Debug Bridge Commands
</h2>
-The <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a>
-provides a few commands that you can use to check and configure network
-permissions:
-
+<p>
+ The <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (ADB)</a>
+ provides a few commands that you can use to test your app in Data Saver
+ conditions. You can check and configure network
+ permissions or set wireless networks as metered to test your app on unmetered
+ networks.
+</p>
<dl>
<dt>
<code>$ adb shell dumpsys netpolicy</code>
@@ -231,4 +234,23 @@
Removes the specified package UID from the whitelist to block background
metered data usage while Data Saver is enabled.
</dd>
+
+ <dt>
+ <code>$ adb shell cmd netpolicy list wifi-networks</code>
+ </dt>
+
+ <dd>
+ Lists all wifi networks, displaying whether they're metered.
+ </dd>
+
+
+ <dt>
+ <code>$ adb shell cmd netpolicy set metered-network <WIFI_SSID>
+ true</code>
+ </dt>
+
+ <dd>
+ Sets wifi with the specified SSID as metered, allowing you to simulate a
+ metered network on an unmetered network.
+ </dd>
</dl>
\ No newline at end of file
diff --git a/docs/html/preview/features/multi-window.jd b/docs/html/preview/features/multi-window.jd
index a4f389a..ca5bd0d 100644
--- a/docs/html/preview/features/multi-window.jd
+++ b/docs/html/preview/features/multi-window.jd
@@ -471,7 +471,7 @@
</dd>
<dt>
- <code>Activity.requestDropPermissions()</code>
+ <code>Activity.requestDragAndDropPermissions()</code>
</dt>
<dd>
diff --git a/docs/html/preview/features/picture-in-picture.jd b/docs/html/preview/features/picture-in-picture.jd
index 893f8c1..c089feb 100644
--- a/docs/html/preview/features/picture-in-picture.jd
+++ b/docs/html/preview/features/picture-in-picture.jd
@@ -150,11 +150,20 @@
Picture-in-picture</h2>
<p>When your activity switches to PIP, the system considers the activity in a
-paused state, and calls your activity's <code>onPause()</code> method. Video
-playback should not be paused and should continue playing if the activity is
-paused due to PIP mode. Check for PIP in your activity's
-<code>onPause()</code> method and handle playback appropriately, for
-example:</p>
+paused state, and calls your activity's {@link android.app.Activity#onPause
+onPause()} method. Video playback should not be paused and should continue
+playing if the activity is paused due to PIP mode.</p>
+
+<p>In Android N, you should pause and resume video playback when the system
+calls your activity's {@link android.app.Activity#onStop onStop()} and
+{@link android.app.Activity#onStart onStart()}. By doing this, you can avoid
+having to check if your app is in PIP mode in
+{@link android.app.Activity#onPause onPause()} and explicitly
+continuing playback.</p>
+
+<p>If you have to pause playback in your {@link android.app.Activity#onPause
+onPause()} implementation, check for PIP mode by calling {@code
+isInPictureInPictureMode()} and handle playback appropriately, for example:</p>
<pre>
@Override
@@ -170,7 +179,8 @@
</pre>
<p>When your activity switches out of PIP mode back to full-screen mode, the
-system resumes your activity and calls your <code>onResume()</code> method.</p>
+system resumes your activity and calls your
+{@link android.app.Activity#onResume onResume()} method.</p>
<h2 id="single_playback">Using a Single Playback Activity for
Picture-in-picture</h2>
@@ -211,3 +221,11 @@
<p>When an activity is in PIP mode, by default it doesn't get input focus. To
receive input events while in PIP mode, use
<code>MediaSession.setMediaButtonReceiver()</code>.</p>
+
+<p>When your app is in PIP mode, video playback in the PIP window can cause
+audio interference with another app, such as a music player app or voice search
+app. To avoid this, request audio focus when you start playing the video,
+and handle audio focus change notifications, as described in
+<a href="{@docRoot}training/managing-audio/audio-focus.html">Managing Audio
+Focus</a>. If you receive notification of audio focus loss when in PIP mode,
+pause or stop video playback.</p>
\ No newline at end of file
diff --git a/docs/html/preview/index.jd b/docs/html/preview/index.jd
index b0631ad..918de48 100644
--- a/docs/html/preview/index.jd
+++ b/docs/html/preview/index.jd
@@ -57,7 +57,7 @@
<div id="useUpdatedTemplates" style="display:none" class="dac-section dac-slim dac-gray dac-expand">
<div class="wrap dac-offset-parent">
- <a class="dac-fab dac-scroll-button" data-scroll-button href="#build-apps">
+ <a class="dac-fab dac-scroll-button" data-scroll-button href="#latest">
<i class="dac-sprite dac-arrow-down-gray"></i>
</a>
<ul class="dac-actions">
diff --git a/docs/html/preview/j8-jack.jd b/docs/html/preview/j8-jack.jd
index 1f10efa..4ea016d 100644
--- a/docs/html/preview/j8-jack.jd
+++ b/docs/html/preview/j8-jack.jd
@@ -72,14 +72,25 @@
"https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html">
Method References</a> (also available on API level 23 and lower)
</li>
+
+ <li>
+ <a class="external-link" href=
+ "https://docs.oracle.com/javase/tutorial/java/annotations/type_annotations.html">
+ Type Annotations</a> (also available on API level 23 and lower)
+ </li>
</ul>
<p class="note">
- <strong>Note:</strong> To test lambda expressions and method references on
- earlier versions of Android, go to your {@code build.gradle}
- file, and set {@code compileSdkVersion} and {@code targetSdkVersion} to 23 or
- lower. You will still need to <a href="#configuration">enable the Jack
- toolchain</a> to use these Java 8 features.
+ <strong>Note:</strong> Type annotation information is only available at
+ compile time, and not during runtime.
+</p>
+
+<p>
+ To test lambda expressions, method references, and type annotations on
+ earlier versions of Android, go to your {@code build.gradle} file, and set
+ {@code compileSdkVersion} and {@code targetSdkVersion} to 23 or lower. You
+ will still need to <a href="#configuration">enable the Jack toolchain</a> to
+ use these Java 8 features.
</p>
<p>
@@ -108,8 +119,8 @@
</li>
<li>and Reflection APIs associated with repeatable annotations, such as
- <a class="external-link" href=
- "https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotationsByType-java.lang.Class-">
+ <a class="external-link" href=
+ "https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html#getAnnotationsByType-java.lang.Class-">
{@code AnnotatedElement.getAnnotationsByType(Class)}</a>
</li>
</ul>
diff --git a/docs/html/topic/libraries/support-library/features.jd b/docs/html/topic/libraries/support-library/features.jd
index d9616d9..584bef8 100755
--- a/docs/html/topic/libraries/support-library/features.jd
+++ b/docs/html/topic/libraries/support-library/features.jd
@@ -619,7 +619,7 @@
<a href="{@docRoot}reference/android/support/customtabs/CustomTabsService.html">Custom Tabs
Service</a>
and
-<a href="{@docRoot}reference/android/support/customtabs/CustomTabsSCallback.html">Custom Tabs
+<a href="{@docRoot}reference/android/support/customtabs/CustomTabsCallback.html">Custom Tabs
Callback</a>. </p>
diff --git a/docs/html/topic/libraries/testing-support-library/index.jd b/docs/html/topic/libraries/testing-support-library/index.jd
index 8b23f73..941f5c3 100644
--- a/docs/html/topic/libraries/testing-support-library/index.jd
+++ b/docs/html/topic/libraries/testing-support-library/index.jd
@@ -523,7 +523,7 @@
mDevice = UiDevice.getInstance(getInstrumentation());
// Perform a short press on the HOME button
-mDevice().pressHome();
+mDevice.pressHome();
// Bring up the default launcher by searching for
// a UI component that matches the content-description for the launcher button
diff --git a/docs/html/training/appbar/setting-up.jd b/docs/html/training/appbar/setting-up.jd
index cc963c6..cf564d0 100644
--- a/docs/html/training/appbar/setting-up.jd
+++ b/docs/html/training/appbar/setting-up.jd
@@ -68,7 +68,7 @@
as your activity's app bar:
<ol>
- <li>Add the the
+ <li>Add the
<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7
appcompat</a> support library to your project, as described in <a href=
"{@docRoot}tools/support-library/setup.html">Support Library Setup</a>.
diff --git a/docs/html/training/auto/audio/index.jd b/docs/html/training/auto/audio/index.jd
index 9144900..aa20e3a 100644
--- a/docs/html/training/auto/audio/index.jd
+++ b/docs/html/training/auto/audio/index.jd
@@ -20,6 +20,7 @@
<li><a href="#overview">Provide Audio Services</a></li>
<li><a href="#config_manifest">Configure Your Manifest</a></li>
<li><a href="#isconnected">Determine if Your App is Connected</a></li>
+ <li><a href="#alarm">Handle Alarms</a></li>
<li><a href="#implement_browser">Build a Browser Service</a></li>
<li><a href="#implement_callback">Implement Play Controls</a></li>
<li><a href="#support_voice">Support Voice Actions</a></li>
@@ -239,6 +240,44 @@
registerReceiver(receiver, filter);
</pre>
+<h2 id="alarm">Handle Alarms</h2>
+<p>
+To prevent user distraction, Android Auto media apps must not start playing audio
+ through the car speakers unless a user consciously starts playback (such as
+ when the user presses play in your app). Even a user-scheduled alarm from the
+ media app must not start playing music through the car speakers.
+ If your media app has an alarm feature, the app should determine if the phone
+ is in
+<a href="{@docRoot}reference/android/content/res/Configuration.html#UI_MODE_TYPE_CAR">car mode</a>
+before playing any audio. Your app can do this by calling
+<a href="{@docRoot}reference/android/app/UiModeManager.html">UiModeManager.getCurrentModeType()</a>,
+ which checks whether the device is running in car mode.
+</p>
+
+<p>
+If the device is in car mode, media apps that support alarms must do one of the
+following things:
+
+<ul>
+<li>Disable the alarm.</li>
+<li>Play the alarm over
+<a href="{@docRoot}reference/android/media/AudioManager.html">STREAM_ALARM</a>,
+ and provide a UI on the phone screen to disable the alarm.</li>
+</ul>
+
+The following code snippet checks whether an app is running in car mode:
+<pre>
+ public static boolean isCarUiMode(Context c) {
+ UiModeManager uiModeManager = (UiModeManager) c.getSystemService(Context.UI_MODE_SERVICE);
+ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR) {
+ LogHelper.d(TAG, "Running in Car mode");
+ return true;
+ } else {
+ LogHelper.d(TAG, "Running on a non-Car mode");
+ return false;
+ }
+ }
+</pre>
<h2 id="implement_browser">Build a Browser Service</h2>
diff --git a/docs/html/training/testing/performance.jd b/docs/html/training/testing/performance.jd
index 8592c0f..0c0ab7f 100644
--- a/docs/html/training/testing/performance.jd
+++ b/docs/html/training/testing/performance.jd
@@ -437,15 +437,25 @@
</p>
<ul>
- <li>Rendering Performance 101
+ <li>
+ <a class="external-link" href="https://www.youtube.com/watch?v=HXQhu6qfTVU">
+ Rendering Performance 101</a>
</li>
- <li>Why 60fps?
+ <li>
+ <a class="external-link" href="https://www.youtube.com/watch?v=CaMTIgxCSqU">
+ Why 60fps?</a>
</li>
- <li>Android UI and the GPU
+ <li>
+ <a class="external-link" href="https://www.youtube.com/watch?v=WH9AFhgwmDw">
+ Android, UI, and the GPU</a>
</li>
- <li>Invalidations Layouts and performance
+ <li>
+ <a class="external-link" href="https://www.youtube.com/watch?v=we6poP0kw6E">
+ Invalidations, Layouts, and Performance</a>
</li>
- <li>Analyzing UI Performance with Systrace
+ <li>
+ <a href="{@docRoot}studio/profile/systrace.html">
+ Analyzing UI Performance with Systrace</a>
</li>
</ul>
diff --git a/docs/html/training/wearables/data-layer/events.jd b/docs/html/training/wearables/data-layer/events.jd
index 9bed9d5..20f219d 100644
--- a/docs/html/training/wearables/data-layer/events.jd
+++ b/docs/html/training/wearables/data-layer/events.jd
@@ -22,21 +22,21 @@
<h2 id="Wait">Wait for the Status of Data Layer Calls</h2>
<p>You'll notice that calls to the Data Layer API sometimes return a
-<a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>,
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>,
such as
-<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest)"><code>putDataItem()</code></a>.
-As soon as the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a> is created,
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest)"><code>putDataItem()</code></a>.
+As soon as the <a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a> is created,
the operation is queued in the background. If you do nothing else after this, the operation
eventually completes silently. However, you'll usually want to do something with the result
after the operation completes, so the
-<a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>
lets you wait for the result status, either synchronously or asynchronously.
</p>
<h3 id="async-waiting">Asynchronous calls</h3>
<p>If your code is running on the main UI thread, do not make blocking calls
to the Data Layer API. You can run the calls asynchronously by adding a callback method
-to the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a> object,
+to the <a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a> object,
which fires when the operation is completed:</p>
<pre>
pendingResult.setResultCallback(new ResultCallback<DataItemResult>() {
@@ -51,12 +51,12 @@
<h3 id="sync-waiting">Synchronous calls</h3>
<p>If your code is running on a separate handler thread in a background service (which is the case
-in a <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>),
+in a <a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService.html"><code>WearableListenerService</code></a>),
it's fine for the calls to block. In this case, you can call
-<a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html#await()"><code>await()</code></a>
-on the <a href="{@docRoot}reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html#await()"><code>await()</code></a>
+on the <a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/PendingResult.html"><code>PendingResult</code></a>
object, which blocks until the request completes and returns a
-<a href="{@docRoot}reference/com/google/android/gms/common/api/Result.html"><code>Result</code></a>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/Result.html"><code>Result</code></a>
object:
</p>
@@ -79,7 +79,7 @@
</p>
<ul>
<li>Create a service that extends <a href
-="https://developer.android.com/reference/com/google/android/gms/wearable/WearableListenerService.html">
+="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService.html">
{@code WearableListenerService}</a>.</li>
<li>Create an activity that implements <a
href="https://developer.android.com/reference/com/google/android/gms/wearable/DataApi.DataListener.html">
@@ -215,7 +215,7 @@
<p>
An intent filter for the
-<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService.html">
{@code WearableListenerService}</a> example shown in the previous section might look like this:
<pre>
@@ -250,14 +250,14 @@
or path prefix, you must specify a wildcard or specific host.
If you do not do so, the system ignores the path you specified.
</p>
+
<p>
For more information on the filter types that Wear supports, see the
API reference documentation for <a
href="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService">
{@code WearableListenerService}</a>.
-
-
</p>
+
<p>
For more information on data filters and matching rules, see the API reference
documentation for the <a
@@ -265,7 +265,6 @@
manifest element.
</p>
-
<p>When matching intent filters, there are two important rules to remember:</p>
<ul>
<li>If a scheme is not specified for the intent filter, the system ignores
@@ -282,10 +281,10 @@
implementing one or more of the following interfaces:
</p>
<ul>
- <li><a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.DataListener.html"><code>
+ <li><a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.DataListener.html"><code>
DataApi.DataListener</code></a></li>
- <li><a href="{@docRoot}reference/com/google/android/gms/wearable/MessageApi.MessageListener.html">
+ <li><a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi.MessageListener.html">
<code>MessageApi.MessageListener</code></a></li>
<li><a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/CapabilityApi.CapabilityListener.html">{@code CapabilityApi.CapabilityListener}</a></li>
@@ -295,21 +294,21 @@
<ol>
<li>Implement the desired interfaces.</li>
<li>In {@link android.app.Activity#onCreate onCreate()}, create an instance of
-<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html"><code>GoogleApiClient</code>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.html"><code>GoogleApiClient</code>
</a>to work with the Data Layer API.</li>
<li>
-In {@link android.app.Activity#onStart onStart()}, call <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">
+In {@link android.app.Activity#onStart onStart()}, call <a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">
<code>connect()</code></a> to connect the client to Google Play services.
</li>
<li>When the connection to Google Play services is established, the system calls
-<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)"><code>onConnected()</code></a>. This is where you call
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)"><code>onConnected()</code></a>. This is where you call
-<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)">
<code>DataApi.addListener()</code></a>,
-<a href="{@docRoot}android/reference/com/google/android/gms/wearable/CapabilityApi.CapabilityListener">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener, android.net.Uri, int)">
<code>MessageApi.addListener()</code></a>, or
<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/CapabilityApi.html#addListener(com.google.android.gms.common.api.GoogleApiClient,%20com.google.android.gms.wearable.CapabilityApi.CapabilityListener,%20android.net.Uri,%20int)">
@@ -317,14 +316,16 @@
interested in listening for data layer events.</li>
<li>In {@link android.app.Activity#onStop onStop()}, unregister any listeners with
-<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)"><code>DataApi.removeListener()</code></a>,
-<a href="{@docRoot}reference/com/google/android/gms/wearable/MessageApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener)"><code>MessageApi.removeListener()</code></a>, or
-<a href="http://developer.android.com/reference/com/google/android/gms/wearable/MessageApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient,%20com.google.android.gms.wearable.MessageApi.MessageListener)">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.DataApi.DataListener)"><code>DataApi.removeListener()</code></a>,
+
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.MessageApi.MessageListener)"><code>MessageApi.removeListener()</code></a>, or
+
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/CapabilityApi.html#removeListener(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.CapabilityApi.CapabilityListener)">
{@code CapabilityApi.removeListener()}</a>.</li>
<p>An alternative to adding listeners in
-<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)"><code>onConnected()</code></a>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)"><code>onConnected()</code></a>
and removing them in
{@link android.app.Activity#onStop onStop()} is to add a filtered listener in an activity’s {@link android.app.Activity#onResume onResume()} and
remove it in {@link android.app.Activity#onPause onPause()}, so as to only receive data that is relevant to the
@@ -332,18 +333,18 @@
<li>Implement
-<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.DataListener.html#onDataChanged(com.google.android.gms.wearable.DataEventBuffer)">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.DataListener.html#onDataChanged(com.google.android.gms.wearable.DataEventBuffer)">
<code>onDataChanged()</code></a>,
<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/MessageApi.MessageListener.html#onMessageReceived(com.google.android.gms.wearable.MessageEvent)">
<code>onMessageReceived()</code></a>,
<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService.html#onCapabilityChanged(com.google.android.gms.wearable.CapabilityInfo)">
{@code onCapabilityChanged()}</a>,
-or methods from <a href="http://developer.android.com/reference/com/google/android/gms/wearable/ChannelApi.ChannelListener.html">
+or methods from <a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/ChannelApi.ChannelListener.html">
Channel API listener methods</a>, depending on the interfaces that you implemented.</li>
</ol>
<p>Here's an example that implements
-<a href="{@docRoot}reference/com/google/android/gms/wearable/DataApi.DataListener.html"><code>DataApi.DataListener</code></a>:</p>
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/DataApi.DataListener.html"><code>DataApi.DataListener</code></a>:</p>
<pre>
public class MainActivity extends Activity implements
@@ -403,7 +404,7 @@
<h3>Using Filters with Listener Activities</h3>
<p>
Just as you can specify intent filters for manifest-based
-<a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html">
+<a href="https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService.html">
<code>WearableListenerService</code></a> objects, you can also use intent filters when registering a
listener through the Wearable API. The same rules are applicable to both
API-based listeners manifest-based listeners.
@@ -411,7 +412,7 @@
<p>
A common pattern is to register a listener with a specific path or path prefix
-in an activity’s{@link android.app.Activity#onResume onResume()} method, and to
+in an activity’s {@link android.app.Activity#onResume onResume()} method, and to
remove the listener in the activity’s {@link android.app.Activity#onPause onPause()} method.
Implementing listeners in this fashion allows your application to more selectively receive events,
improving its design and efficiency.
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index faf6a52..c9d4af6 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -256,6 +256,7 @@
tests/unit/MatrixTests.cpp \
tests/unit/OffscreenBufferPoolTests.cpp \
tests/unit/RenderNodeTests.cpp \
+ tests/unit/RenderPropertiesTests.cpp \
tests/unit/SkiaBehaviorTests.cpp \
tests/unit/SnapshotTests.cpp \
tests/unit/StringUtilsTests.cpp \
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index ea2e15b..6db345a 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -66,8 +66,13 @@
offscreenBuffer->texture.id(), 0);
GL_CHECKPOINT(LOW);
- LOG_ALWAYS_FATAL_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE,
- "framebuffer incomplete!");
+ int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ LOG_ALWAYS_FATAL_IF(status != GL_FRAMEBUFFER_COMPLETE,
+ "framebuffer incomplete, status %d, textureId %d, size %dx%d",
+ status,
+ offscreenBuffer->texture.id(),
+ offscreenBuffer->texture.width(),
+ offscreenBuffer->texture.height());
// Change the viewport & ortho projection
setViewport(offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight);
diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp
index cb8e55f..b8a5ce6 100644
--- a/libs/hwui/FrameBuilder.cpp
+++ b/libs/hwui/FrameBuilder.cpp
@@ -86,7 +86,9 @@
ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u",
layerNode->getName(), layerNode->getWidth(), layerNode->getHeight());
- const Rect& layerDamage = layers.entries()[i].damage;
+ Rect layerDamage = layers.entries()[i].damage;
+ // TODO: ensure layer damage can't be larger than layer
+ layerDamage.doIntersect(0, 0, layer->viewportWidth, layer->viewportHeight);
layerNode->computeOrdering();
// map current light center into RenderNode's coordinate space
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 6e848fd..be2dab9 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -319,6 +319,8 @@
transformUpdateNeeded = true;
} else if (!layerMatchesWidthAndHeight(mLayer, getWidth(), getHeight())) {
#if HWUI_NEW_OPS
+ // TODO: remove now irrelevant, currently enqueued damage (respecting damage ordering)
+ // Or, ideally, maintain damage between frames on node/layer so ordering is always correct
RenderState& renderState = mLayer->renderState;
if (properties().fitsOnLayer()) {
mLayer = renderState.layerPool().resize(mLayer, getWidth(), getHeight());
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 3952798..696cc29 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -611,7 +611,9 @@
bool fitsOnLayer() const {
const DeviceInfo* deviceInfo = DeviceInfo::get();
return mPrimitiveFields.mWidth <= deviceInfo->maxTextureSize()
- && mPrimitiveFields.mHeight <= deviceInfo->maxTextureSize();
+ && mPrimitiveFields.mHeight <= deviceInfo->maxTextureSize()
+ && mPrimitiveFields.mWidth > 0
+ && mPrimitiveFields.mHeight > 0;
}
bool promotedToLayer() const {
diff --git a/libs/hwui/tests/unit/RenderPropertiesTests.cpp b/libs/hwui/tests/unit/RenderPropertiesTests.cpp
new file mode 100644
index 0000000..9001098
--- /dev/null
+++ b/libs/hwui/tests/unit/RenderPropertiesTests.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 The Android Open 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 <gtest/gtest.h>
+
+#include <RenderProperties.h>
+
+using namespace android;
+using namespace android::uirenderer;
+
+TEST(RenderProperties, layerValidity) {
+ DeviceInfo::initialize();
+
+ const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
+ ASSERT_LE(2048, maxTextureSize);
+ ASSERT_GT(100000, maxTextureSize);
+
+ RenderProperties props;
+
+ // simple cases that all should fit on layers
+ props.setLeftTopRightBottom(0, 0, 100, 100);
+ ASSERT_TRUE(props.fitsOnLayer());
+ props.setLeftTopRightBottom(100, 2000, 300, 4000);
+ ASSERT_TRUE(props.fitsOnLayer());
+ props.setLeftTopRightBottom(-10, -10, 510, 512);
+ ASSERT_TRUE(props.fitsOnLayer());
+
+ // Too big - can't have layer bigger than max texture size
+ props.setLeftTopRightBottom(0, 0, maxTextureSize + 1, maxTextureSize + 1);
+ ASSERT_FALSE(props.fitsOnLayer());
+
+ // Too small - can't have 0 dimen layer
+ props.setLeftTopRightBottom(0, 0, 100, 0);
+ ASSERT_FALSE(props.fitsOnLayer());
+}
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 10cec1f..ecc4a0d 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -780,6 +780,8 @@
super.updateWindow(force, redrawNeeded);
relayoutSessionOverlayView();
}};
+ // The surface view's content should be treated as secure all the time.
+ mSurfaceView.setSecure(true);
mSurfaceView.getHolder().addCallback(mSurfaceHolderCallback);
if (mWindowZOrder == ZORDER_MEDIA_OVERLAY) {
mSurfaceView.setZOrderMediaOverlay(true);
diff --git a/packages/CtsShim/CtsShim.apk b/packages/CtsShim/CtsShim.apk
index 18e8e33..40f7dbd 100644
--- a/packages/CtsShim/CtsShim.apk
+++ b/packages/CtsShim/CtsShim.apk
Binary files differ
diff --git a/packages/CtsShim/build/README b/packages/CtsShim/build/README
index a352840..1f154e1 100644
--- a/packages/CtsShim/build/README
+++ b/packages/CtsShim/build/README
@@ -26,6 +26,8 @@
cts/hostsidetests/appsecurity/test-apps/PrivilegedUpdateApp
$ cp out/target/product/shamu/system/priv-app/CtsShimPriv/CtsShimPriv.apk \
frameworks/base/packages/CtsShim
+ $ cp out/target/product/shamu/system/app/CtsShim/CtsShim.apk \
+ frameworks/base/packages/CtsShim
revert manifest:
$ pushd frameworks/base && git checkout -- packages/CtsShim/build/shim_priv/AndroidManifest.xml && popd
diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
index 21cf755..971afdc 100644
--- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml
+++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml
@@ -53,7 +53,7 @@
<string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string>
<string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string>
<string name="query_error" msgid="5999895349602476581">"目前無法載入內容"</string>
- <string name="root_recent" msgid="4470053704320518133">"近期用過"</string>
+ <string name="root_recent" msgid="4470053704320518133">"最近"</string>
<string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string>
<string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string>
<string name="root_type_shortcut" msgid="3318760609471618093">"捷徑"</string>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java
index 24ec0e0..8067141 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java
@@ -528,11 +528,11 @@
// Types for logInvalidScopedAccessRequest
public static final String SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS =
- "scoped_directory_access_invalid_args";
+ "docsui_scoped_directory_access_invalid_args";
public static final String SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY =
- "scoped_directory_access_invalid_dir";
+ "docsui_scoped_directory_access_invalid_dir";
public static final String SCOPED_DIRECTORY_ACCESS_ERROR =
- "scoped_directory_access_error";
+ "docsui_scoped_directory_access_error";
@StringDef(value = {
SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS,
diff --git a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java
index b0e5e4e..6588ee1 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java
@@ -20,6 +20,7 @@
import static android.os.Environment.STANDARD_DIRECTORIES;
import static android.os.storage.StorageVolume.EXTRA_DIRECTORY_NAME;
import static android.os.storage.StorageVolume.EXTRA_STORAGE_VOLUME;
+
import static com.android.documentsui.LocalPreferences.getScopedAccessPermissionStatus;
import static com.android.documentsui.LocalPreferences.PERMISSION_ASK;
import static com.android.documentsui.LocalPreferences.PERMISSION_ASK_AGAIN;
@@ -201,14 +202,23 @@
final List<VolumeInfo> volumes = sm.getVolumes();
if (DEBUG) Log.d(TAG, "Number of volumes: " + volumes.size());
File internalRoot = null;
+ boolean found = true;
for (VolumeInfo volume : volumes) {
if (isRightVolume(volume, root, userId)) {
+ found = true;
internalRoot = volume.getInternalPathForUser(userId);
// Must convert path before calling getDocIdForFileCreateNewDir()
if (DEBUG) Log.d(TAG, "Converting " + root + " to " + internalRoot);
file = isRoot ? internalRoot : new File(internalRoot, directory);
+ volumeUuid = storageVolume.getUuid();
volumeLabel = sm.getBestVolumeDescription(volume);
- volumeUuid = volume.getFsUuid();
+ if (TextUtils.isEmpty(volumeLabel)) {
+ volumeLabel = storageVolume.getDescription(activity);
+ }
+ if (TextUtils.isEmpty(volumeLabel)) {
+ volumeLabel = activity.getString(android.R.string.unknownName);
+ Log.w(TAG, "No volume description for " + volume + "; using " + volumeLabel);
+ }
break;
}
}
@@ -229,7 +239,7 @@
return true;
}
- if (volumeLabel == null) {
+ if (!found) {
Log.e(TAG, "Could not get volume for " + file);
logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR);
return false;
@@ -277,15 +287,16 @@
private static boolean isRightVolume(VolumeInfo volume, String root, int userId) {
final File userPath = volume.getPathForUser(userId);
final String path = userPath == null ? null : volume.getPathForUser(userId).getPath();
- final boolean isVisible = volume.isVisibleForWrite(userId);
+ final boolean isMounted = volume.isMountedReadable();
if (DEBUG)
- Log.d(TAG, "Volume: " + volume + " userId: " + userId + " root: " + root
- + " volumePath: " + volume.getPath().getPath()
- + " pathForUser: " + path
- + " internalPathForUser: " + volume.getInternalPath()
- + " isVisible: " + isVisible);
+ Log.d(TAG, "Volume: " + volume
+ + "\n\tuserId: " + userId
+ + "\n\tuserPath: " + userPath
+ + "\n\troot: " + root
+ + "\n\tpath: " + path
+ + "\n\tisMounted: " + isMounted);
- return volume.isVisibleForWrite(userId) && root.equals(path);
+ return isMounted && root.equals(path);
}
private static Uri getGrantedUriPermission(Context context, ContentProviderClient provider,
@@ -455,7 +466,7 @@
message = TextUtils.expandTemplate(
getText(mIsPrimary ? R.string.open_external_dialog_request_primary_volume
: R.string.open_external_dialog_request),
- mAppLabel, directory, mVolumeLabel);
+ mAppLabel, directory, mVolumeLabel);
}
final TextView messageField = (TextView) view.findViewById(R.id.message);
messageField.setText(message);
diff --git a/packages/DocumentsUI/tests/Android.mk b/packages/DocumentsUI/tests/Android.mk
index 3983f78..c004315 100644
--- a/packages/DocumentsUI/tests/Android.mk
+++ b/packages/DocumentsUI/tests/Android.mk
@@ -8,7 +8,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := android-support-v4 android.test.runner
-LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ub-uiautomator
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ub-uiautomator android-support-test
LOCAL_PACKAGE_NAME := DocumentsUITests
LOCAL_INSTRUMENTATION_FOR := DocumentsUI
diff --git a/packages/DocumentsUI/tests/AndroidManifest.xml b/packages/DocumentsUI/tests/AndroidManifest.xml
index b986285..0b76766 100644
--- a/packages/DocumentsUI/tests/AndroidManifest.xml
+++ b/packages/DocumentsUI/tests/AndroidManifest.xml
@@ -19,7 +19,7 @@
</provider>
</application>
- <instrumentation android:name="android.test.InstrumentationTestRunner"
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.documentsui"
android:label="Tests for DocumentsUI" />
diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml
index 7259bd3..9bc2456 100644
--- a/packages/Keyguard/res/values-fr-rCA/strings.xml
+++ b/packages/Keyguard/res/values-fr-rCA/strings.xml
@@ -110,20 +110,20 @@
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string>
<string name="accessibility_ime_switch_button" msgid="2829803408288433429">"Changer de méthode d\'entrée"</string>
<string name="airplane_mode" msgid="3122107900897202805">"Mode Avion"</string>
- <string name="kg_prompt_reason_restart_pattern" msgid="5519822969283306009">"Le motif est exigé après le redémarrage de l\'appareil"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="5519822969283306009">"Le schéma est exigé après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_pin" msgid="4411398237158448198">"Le NIP est exigé après le redémarrage de l\'appareil"</string>
<string name="kg_prompt_reason_restart_password" msgid="6504585392626524695">"Le mot de passe est exigé après le redémarrage de l\'appareil"</string>
- <string name="kg_prompt_reason_timeout_pattern" msgid="3717506169674397620">"Le motif est exigé pour plus de sécurité"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="3717506169674397620">"Le schéma est exigé pour plus de sécurité"</string>
<string name="kg_prompt_reason_timeout_pin" msgid="6951483704195396341">"Le NIP est exigé pour plus de sécurité"</string>
<string name="kg_prompt_reason_timeout_password" msgid="7306667546971345027">"Le mot de passe est exigé pour plus de sécurité"</string>
- <string name="kg_prompt_reason_switch_profiles_pattern" msgid="8476293962695171574">"Le motif est exigé lorsque vous changez de profil"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="8476293962695171574">"Le schéma est exigé lorsque vous changez de profil"</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="2343607138520460043">"Le NIP est exigé lorsque vous changez de profil"</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="1295960907951965927">"Le mot de passe est exigé lorsque vous changez de profil"</string>
<string name="kg_prompt_reason_device_admin" msgid="5838877342219587193">"L\'administrateur de l\'appareil l\'a verrouillé"</string>
<string name="kg_prompt_reason_user_request" msgid="500999297306031595">"L\'appareil a été verrouillé manuellement"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="2697444392228541853">
- <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le motif.</item>
- <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le motif.</item>
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="2118758475374354849">
<item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le NIP.</item>
diff --git a/packages/Keyguard/res/values-pa-rIN/strings.xml b/packages/Keyguard/res/values-pa-rIN/strings.xml
index 5f0b6d8..8cf86a0 100644
--- a/packages/Keyguard/res/values-pa-rIN/strings.xml
+++ b/packages/Keyguard/res/values-pa-rIN/strings.xml
@@ -25,7 +25,7 @@
<string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"SIM PUK ਅਤੇ ਨਵਾਂ PIN ਕੋਡ ਟਾਈਪ ਕਰੋ"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM PUK ਕੋਡ"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"ਨਵਾਂ SIM PIN ਕੋਡ"</string>
- <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ਪਾਸਵਰਡ ਟਾਈਪ ਕਰਨ ਲਈ ਛੋਹਵੋ"</font></string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ਪਾਸਵਰਡ ਟਾਈਪ ਕਰਨ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ਅਨਲੌਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਟਾਈਪ ਕਰੋ"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ਅਨਲੌਕ ਕਰਨ ਲਈ PIN ਟਾਈਪ ਕਰੋ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ਗ਼ਲਤ PIN ਕੋਡ।"</string>
diff --git a/packages/PrintRecommendationService/res/values/strings.xml b/packages/PrintRecommendationService/res/values/strings.xml
index 348fcac..b6c45b7 100644
--- a/packages/PrintRecommendationService/res/values/strings.xml
+++ b/packages/PrintRecommendationService/res/values/strings.xml
@@ -26,6 +26,6 @@
<string name="plugin_vendor_samsung">Samsung</string>
<string name="plugin_vendor_epson">Epson</string>
<string name="plugin_vendor_konica_minolta">Konica Minolta</string>
- <string name="plugin_vendor_fuji">Fuji</string>
+ <string name="plugin_vendor_fuji_xerox">Fuji Xerox</string>
<string name="plugin_vendor_morpia">Mopria</string>
</resources>
diff --git a/packages/PrintRecommendationService/res/xml/vendorconfigs.xml b/packages/PrintRecommendationService/res/xml/vendorconfigs.xml
index 52889ce..703cf6f 100644
--- a/packages/PrintRecommendationService/res/xml/vendorconfigs.xml
+++ b/packages/PrintRecommendationService/res/xml/vendorconfigs.xml
@@ -60,7 +60,7 @@
</vendor>
<vendor>
- <name>@string/plugin_vendor_fuji</name>
+ <name>@string/plugin_vendor_fuji_xerox</name>
<package>jp.co.fujixerox.prt.PrintUtil.PCL</package>
<mdns-names>
<mdns-name>FUJI XEROX</mdns-name>
diff --git a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/MDnsUtils.java b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/MDnsUtils.java
index 7a2d0d8..b0da08b 100755
--- a/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/MDnsUtils.java
+++ b/packages/PrintRecommendationService/src/com/android/printservice/recommendation/plugin/xerox/MDnsUtils.java
@@ -39,8 +39,10 @@
String usbMfg = getString(attributes.get(ATTRIBUTE__USB_MFG));
String usbMdl = getString(attributes.get(ATTRIBUTE__USB_MDL));
String mfg = getString(attributes.get(ATTRIBUTE__MFG));
- return containsVendor(product, vendorValues) || containsVendor(ty, vendorValues) || containsVendor(usbMfg, vendorValues) || containsVendor(mfg, vendorValues) && !(containsString(ty, EXCLUDE_FUJI) || containsString(product, EXCLUDE_FUJI) || containsString(usbMdl, EXCLUDE_FUJI));
-
+ return (containsVendor(product, vendorValues) || containsVendor(ty, vendorValues) ||
+ containsVendor(usbMfg, vendorValues) || containsVendor(mfg, vendorValues)) &&
+ !(containsString(ty, EXCLUDE_FUJI) || containsString(product, EXCLUDE_FUJI) ||
+ containsString(usbMdl, EXCLUDE_FUJI));
}
public static String getVendor(NsdServiceInfo networkDevice) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index be3df54..c318275 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -614,6 +614,9 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
+
+ mMediaSizeComparator.onConfigurationChanged(newConfig);
+
if (mPrintPreviewController != null) {
mPrintPreviewController.onOrientationChanged();
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/util/MediaSizeUtils.java b/packages/PrintSpooler/src/com/android/printspooler/util/MediaSizeUtils.java
index 912ee1d..7289301 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/util/MediaSizeUtils.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/util/MediaSizeUtils.java
@@ -16,13 +16,16 @@
package com.android.printspooler.util;
+import android.annotation.NonNull;
import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
import android.print.PrintAttributes.MediaSize;
-import android.util.ArrayMap;
import com.android.printspooler.R;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -30,7 +33,10 @@
*/
public final class MediaSizeUtils {
- private static Map<MediaSize, String> sMediaSizeToStandardMap;
+ private static Map<MediaSize, Integer> sMediaSizeToStandardMap;
+
+ /** The media size standard for all media sizes no standard is defined for */
+ private static int sMediaSizeStandardIso;
private MediaSizeUtils() {
/* do nothing - hide constructor */
@@ -47,22 +53,32 @@
return MediaSize.getStandardMediaSizeById(mediaSizeId);
}
- private static String getStandardForMediaSize(Context context, MediaSize mediaSize) {
+ /**
+ * Get the standard the {@link MediaSize} belongs to.
+ *
+ * @param context The context of the caller
+ * @param mediaSize The {@link MediaSize} to be resolved
+ *
+ * @return The standard the {@link MediaSize} belongs to
+ */
+ private static int getStandardForMediaSize(Context context, MediaSize mediaSize) {
if (sMediaSizeToStandardMap == null) {
- sMediaSizeToStandardMap = new ArrayMap<MediaSize, String>();
+ sMediaSizeStandardIso = Integer.parseInt(context.getString(
+ R.string.mediasize_standard_iso));
+
+ sMediaSizeToStandardMap = new HashMap<>();
String[] mediaSizeToStandardMapValues = context.getResources()
.getStringArray(R.array.mediasize_to_standard_map);
final int mediaSizeToStandardCount = mediaSizeToStandardMapValues.length;
for (int i = 0; i < mediaSizeToStandardCount; i += 2) {
String mediaSizeId = mediaSizeToStandardMapValues[i];
MediaSize key = MediaSize.getStandardMediaSizeById(mediaSizeId);
- String value = mediaSizeToStandardMapValues[i + 1];
+ int value = Integer.parseInt(mediaSizeToStandardMapValues[i + 1]);
sMediaSizeToStandardMap.put(key, value);
}
}
- String standard = sMediaSizeToStandardMap.get(mediaSize);
- return (standard != null) ? standard : context.getString(
- R.string.mediasize_standard_iso);
+ Integer standard = sMediaSizeToStandardMap.get(mediaSize);
+ return (standard != null) ? standard : sMediaSizeStandardIso;
}
/**
@@ -73,32 +89,76 @@
public static final class MediaSizeComparator implements Comparator<MediaSize> {
private final Context mContext;
+ /** Current configuration */
+ private Configuration mCurrentConfig;
+
+ /** The standard to use for the current locale */
+ private int mCurrentStandard;
+
+ /** Mapping from media size to label */
+ private final @NonNull Map<MediaSize, String> mMediaSizeToLabel;
+
public MediaSizeComparator(Context context) {
mContext = context;
+ mMediaSizeToLabel = new HashMap<>();
+ mCurrentStandard = Integer.parseInt(mContext.getString(R.string.mediasize_standard));
+ }
+
+ /**
+ * Handle a configuration change by reloading all resources.
+ *
+ * @param newConfig The new configuration that will be applied.
+ */
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ if (mCurrentConfig == null ||
+ (newConfig.diff(mCurrentConfig) & ActivityInfo.CONFIG_LOCALE) != 0) {
+ mCurrentStandard = Integer
+ .parseInt(mContext.getString(R.string.mediasize_standard));
+ mMediaSizeToLabel.clear();
+
+ mCurrentConfig = newConfig;
+ }
+ }
+
+ /**
+ * Get the label for a {@link MediaSize}.
+ *
+ * @param context The context the label should be loaded for
+ * @param mediaSize The {@link MediaSize} to resolve
+ *
+ * @return The label for the media size
+ */
+ public @NonNull String getLabel(@NonNull Context context, @NonNull MediaSize mediaSize) {
+ String label = mMediaSizeToLabel.get(mediaSize);
+
+ if (label == null) {
+ label = mediaSize.getLabel(context.getPackageManager());
+ mMediaSizeToLabel.put(mediaSize, label);
+ }
+
+ return label;
}
@Override
public int compare(MediaSize lhs, MediaSize rhs) {
- String currentStandard = mContext.getString(R.string.mediasize_standard);
- String lhsStandard = getStandardForMediaSize(mContext, lhs);
- String rhsStandard = getStandardForMediaSize(mContext, rhs);
+ int lhsStandard = getStandardForMediaSize(mContext, lhs);
+ int rhsStandard = getStandardForMediaSize(mContext, rhs);
// The current standard always wins.
- if (lhsStandard.equals(currentStandard)) {
- if (!rhsStandard.equals(currentStandard)) {
+ if (lhsStandard == mCurrentStandard) {
+ if (rhsStandard != mCurrentStandard) {
return -1;
}
- } else if (rhsStandard.equals(currentStandard)) {
+ } else if (rhsStandard == mCurrentStandard) {
return 1;
}
- if (!lhsStandard.equals(rhsStandard)) {
+ if (lhsStandard != rhsStandard) {
// Different standards - use the standard ordering.
- return lhsStandard.compareTo(rhsStandard);
+ return Integer.valueOf(lhsStandard).compareTo(rhsStandard);
} else {
// Same standard - sort alphabetically by label.
- return lhs.getLabel(mContext.getPackageManager()).
- compareTo(rhs.getLabel(mContext.getPackageManager()));
+ return getLabel(mContext, lhs).compareTo(getLabel(mContext, rhs));
}
}
}
diff --git a/packages/SettingsLib/res/values-pa-rIN/arrays.xml b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
index fd7eb67..42cc9f2 100644
--- a/packages/SettingsLib/res/values-pa-rIN/arrays.xml
+++ b/packages/SettingsLib/res/values-pa-rIN/arrays.xml
@@ -22,7 +22,7 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="wifi_status">
<item msgid="1922181315419294640"></item>
- <item msgid="8934131797783724664">"ਸਕੈਨ ਕਰ ਰਿਹਾ ਹੈ..."</item>
+ <item msgid="8934131797783724664">"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</item>
<item msgid="8513729475867537913">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</item>
<item msgid="515055375277271756">"ਪ੍ਰਮਾਣਿਤ ਕਰ ਰਿਹਾ ਹੈ…"</item>
<item msgid="1943354004029184381">"IP ਪਤਾ ਪ੍ਰਾਪਤ ਕਰ ਰਿਹਾ ਹੈ..."</item>
@@ -36,7 +36,7 @@
</string-array>
<string-array name="wifi_status_with_ssid">
<item msgid="7714855332363650812"></item>
- <item msgid="8878186979715711006">"ਸਕੈਨ ਕਰ ਰਿਹਾ ਹੈ..."</item>
+ <item msgid="8878186979715711006">"ਸਕੈਨ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</item>
<item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</item>
<item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਨਾਲ ਪ੍ਰਮਾਣਿਤ ਕਰ ਰਿਹਾ ਹੈ…"</item>
<item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ਤੋਂ IP ਪਤਾ ਪ੍ਰਾਪਤ ਕਰ ਰਿਹਾ ਹੈ…"</item>
diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml
index bfa36c3..75a69a5 100644
--- a/packages/SettingsLib/res/values-ta-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml
@@ -92,7 +92,7 @@
<string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"டெதெரிங்"</string>
<string name="tether_settings_title_all" msgid="8356136101061143841">"டெதெரிங் & போர்டபிள் ஹாட்ஸ்பாட்"</string>
<string name="managed_user_title" msgid="8109605045406748842">"எல்லா பணிப் பயன்பாடுகளும்"</string>
- <string name="user_guest" msgid="8475274842845401871">"அழைக்கப்பட்டவர்"</string>
+ <string name="user_guest" msgid="8475274842845401871">"கெஸ்ட்"</string>
<string name="unknown" msgid="1592123443519355854">"அறியப்படாத"</string>
<string name="running_process_item_user_label" msgid="3129887865552025943">"பயனர்: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
<string name="launch_defaults_some" msgid="313159469856372621">"சில இயல்புநிலைகள் அமைக்கப்பட்டன"</string>
@@ -282,7 +282,7 @@
<string name="select_webview_provider_toast_text" msgid="5466970498308266359">"இனி இந்தத் தேர்வைப் பயன்படுத்த முடியாது. மீண்டும் முயலவும்."</string>
<string name="convert_to_file_encryption" msgid="3060156730651061223">"கோப்பு முறைமையாக்கத்திற்கு மாற்று"</string>
<string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"மாற்று…"</string>
- <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ஏற்கனவே கோப்பு முறைமையாக்கப்பட்டது"</string>
+ <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ஏற்கனவே கோப்பு என்க்ரிப்ட் செய்யப்பட்டது"</string>
<string name="title_convert_fbe" msgid="1263622876196444453">"கோப்பு சார்ந்த முறைமையாக்கத்திற்கு மாற்றுதல்"</string>
<string name="convert_to_fbe_warning" msgid="6139067817148865527">"தரவுப் பகிர்வை, கோப்பு சார்ந்த முறைமையாக்கத்திற்கு மாற்றவும்.\n !!எச்சரிக்கை!! இது எல்லா தரவையும் அழிக்கும்.\n இது ஆல்பா நிலை அம்சமாக இருப்பதால் சரியாகச் செயல்படாமல் போகக்கூடும்.\n தொடர, \'அழித்து, மாற்று…\' என்பதை அழுத்தவும்."</string>
<string name="button_convert_fbe" msgid="5152671181309826405">"அழித்து மாற்று…"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 08dbb01..2cd6813 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -242,7 +242,7 @@
<string name="transition_animation_scale_title" msgid="387527540523595875">"Scale ng transition animation"</string>
<string name="animator_duration_scale_title" msgid="3406722410819934083">"Scale ng tagal ng animator"</string>
<string name="overlay_display_devices_title" msgid="5364176287998398539">"I-simulate, ika-2 display"</string>
- <string name="debug_applications_category" msgid="4206913653849771549">"Apps"</string>
+ <string name="debug_applications_category" msgid="4206913653849771549">"Mga App"</string>
<string name="immediately_destroy_activities" msgid="1579659389568133959">"Huwag magtago ng mga aktibidad"</string>
<string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"Sirain ang bawat aktibidad sa sandaling iwan ito ng user"</string>
<string name="app_process_limit_title" msgid="4280600650253107163">"Limitasyon ng proseso sa background"</string>
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
index 6d6a4b5..7392453 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java
@@ -46,6 +46,8 @@
import android.util.Log;
import android.util.SparseArray;
+import com.android.internal.util.ArrayUtils;
+
import java.io.File;
import java.text.Collator;
import java.text.Normalizer;
@@ -123,8 +125,8 @@
mPm = mContext.getPackageManager();
mIpm = AppGlobals.getPackageManager();
mUm = (UserManager) app.getSystemService(Context.USER_SERVICE);
- for (UserHandle user : mUm.getUserProfiles()) {
- mEntriesMap.put(user.getIdentifier(), new HashMap<String, AppEntry>());
+ for (int userId : mUm.getProfileIdsWithDisabled(UserHandle.myUserId())) {
+ mEntriesMap.put(userId, new HashMap<String, AppEntry>());
}
mThread = new HandlerThread("ApplicationsState.Loader",
Process.THREAD_PRIORITY_BACKGROUND);
@@ -426,7 +428,8 @@
}
private void addUser(int userId) {
- if (mUm.getUserProfiles().contains(new UserHandle(userId))) {
+ final int profileIds[] = mUm.getProfileIdsWithDisabled(UserHandle.myUserId());
+ if (ArrayUtils.contains(profileIds, userId)) {
synchronized (mEntriesMap) {
mEntriesMap.put(userId, new HashMap<String, AppEntry>());
if (mResumed) {
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index bf75046..ce916cb 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -20,14 +20,17 @@
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.widget.DrawerLayout;
+import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
import android.view.Gravity;
@@ -56,6 +59,9 @@
private static List<DashboardCategory> sDashboardCategories;
private static HashMap<Pair<String, String>, Tile> sTileCache;
+ // Serves as a temporary list of tiles to ignore until we heard back from the PM that they
+ // are disabled.
+ private static ArraySet<ComponentName> sTileBlacklist = new ArraySet<>();
private static InterestingConfigChanges sConfigTracker;
private final PackageReceiver mPackageReceiver = new PackageReceiver();
@@ -270,6 +276,24 @@
finish();
}
+ public void setTileEnabled(ComponentName component, boolean enabled) {
+ PackageManager pm = getPackageManager();
+ int state = pm.getComponentEnabledSetting(component);
+ boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+ if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
+ if (enabled) {
+ sTileBlacklist.remove(component);
+ } else {
+ sTileBlacklist.add(component);
+ }
+ pm.setComponentEnabledSetting(component, enabled
+ ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ new CategoriesUpdater().execute();
+ }
+ }
+
public interface CategoryListener {
void onCategoriesChanged();
}
@@ -285,6 +309,15 @@
@Override
protected void onPostExecute(List<DashboardCategory> dashboardCategories) {
+ for (int i = 0; i < dashboardCategories.size(); i++) {
+ DashboardCategory category = dashboardCategories.get(i);
+ for (int j = 0; j < category.tiles.size(); j++) {
+ Tile tile = category.tiles.get(j);
+ if (sTileBlacklist.contains(tile.intent.getComponent())) {
+ category.tiles.remove(j--);
+ }
+ }
+ }
sDashboardCategories = dashboardCategories;
onCategoriesChanged();
}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 9c0aa35..2efefb3 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -90,7 +90,7 @@
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
- <uses-permission android:name="android.permission.MANAGE_USERS" />
+ <uses-permission android:name="android.permission.CREATE_USERS" />
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
<uses-permission android:name="android.permission.BLUETOOTH_STACK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
diff --git a/packages/SystemUI/res/layout-sw410dp/status_bar_alarm_group.xml b/packages/SystemUI/res/layout-sw410dp/status_bar_alarm_group.xml
new file mode 100644
index 0000000..ba5c0aa
--- /dev/null
+++ b/packages/SystemUI/res/layout-sw410dp/status_bar_alarm_group.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open 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"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/date_time_alarm_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginStart="16dp"
+ android:gravity="start"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/date_time_group"
+ android:layout_width="wrap_content"
+ android:layout_height="19dp"
+ android:orientation="horizontal"
+ android:focusable="true" >
+
+ <include layout="@layout/split_clock_view"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:id="@+id/clock" />
+
+ <com.android.systemui.statusbar.policy.DateView
+ android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="6dp"
+ android:drawableStart="@drawable/header_dot"
+ android:drawablePadding="6dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
+ android:textSize="@dimen/qs_time_collapsed_size"
+ android:gravity="top"
+ systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" />
+
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@+id/alarm_status_collapsed"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_access_alarms_small"
+ android:paddingStart="6dp"
+ android:gravity="center"
+ android:visibility="gone" />
+ </LinearLayout>
+
+ <com.android.systemui.statusbar.AlphaOptimizedButton
+ android:id="@+id/alarm_status"
+ android:layout_width="wrap_content"
+ android:layout_height="20dp"
+ android:paddingTop="3dp"
+ android:drawablePadding="8dp"
+ android:drawableStart="@drawable/ic_access_alarms_small"
+ android:textColor="#64ffffff"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
+ android:gravity="top"
+ android:background="?android:attr/selectableItemBackground"
+ android:visibility="gone" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 5d62940..f65a667 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -106,64 +106,11 @@
android:gravity="center_vertical"
android:focusable="true" />
- <LinearLayout
+ <include
android:id="@+id/date_time_alarm_group"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ layout="@layout/status_bar_alarm_group"
android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
- android:layout_marginTop="8dp"
- android:layout_marginStart="16dp"
- android:gravity="start"
- android:orientation="vertical">
- <LinearLayout
- android:id="@+id/date_time_group"
- android:layout_width="wrap_content"
- android:layout_height="19dp"
- android:orientation="horizontal"
- android:focusable="true" >
-
- <include layout="@layout/split_clock_view"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:id="@+id/clock" />
-
- <com.android.systemui.statusbar.policy.DateView
- android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="6dp"
- android:drawableStart="@drawable/header_dot"
- android:drawablePadding="6dp"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
- android:textSize="@dimen/qs_time_collapsed_size"
- android:gravity="top"
- systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" />
-
- <com.android.systemui.statusbar.AlphaOptimizedImageView
- android:id="@+id/alarm_status_collapsed"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:src="@drawable/ic_access_alarms_small"
- android:paddingStart="6dp"
- android:gravity="center"
- android:visibility="gone" />
- </LinearLayout>
-
- <com.android.systemui.statusbar.AlphaOptimizedButton
- android:id="@+id/alarm_status"
- android:layout_width="wrap_content"
- android:layout_height="20dp"
- android:paddingTop="3dp"
- android:drawablePadding="8dp"
- android:drawableStart="@drawable/ic_access_alarms_small"
- android:textColor="#64ffffff"
- android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
- android:gravity="top"
- android:background="?android:attr/selectableItemBackground"
- android:visibility="gone" />
- </LinearLayout>
+ android:layout_alignParentTop="true" />
<com.android.systemui.qs.QuickQSPanel
android:id="@+id/quick_qs_panel"
@@ -177,7 +124,7 @@
android:clipToPadding="false"
android:importantForAccessibility="yes"
android:focusable="true"
- android:accessibilityTraversalAfter="@id/date_time_group"
+ android:accessibilityTraversalAfter="@+id/date_time_group"
android:accessibilityTraversalBefore="@id/expand_indicator" />
<com.android.systemui.statusbar.AlphaOptimizedImageView
diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml
index 2db97a6..0c8cc9b 100644
--- a/packages/SystemUI/res/layout/remote_input.xml
+++ b/packages/SystemUI/res/layout/remote_input.xml
@@ -43,7 +43,7 @@
android:ellipsize="start"
android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
android:textIsSelectable="true"
- android:imeOptions="actionSend|flagNoExtractUi" />
+ android:imeOptions="actionNone|flagNoExtractUi" />
<FrameLayout
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar_alarm_group.xml b/packages/SystemUI/res/layout/status_bar_alarm_group.xml
new file mode 100644
index 0000000..f94b727
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_alarm_group.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The Android Open 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"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/date_time_alarm_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginStart="16dp"
+ android:gravity="start"
+ android:orientation="vertical">
+ <LinearLayout
+ android:id="@+id/date_time_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:focusable="true" >
+
+ <include layout="@layout/split_clock_view"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:id="@+id/clock" />
+
+ <com.android.systemui.statusbar.AlphaOptimizedImageView
+ android:id="@+id/alarm_status_collapsed"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_access_alarms_small"
+ android:paddingStart="6dp"
+ android:gravity="center"
+ android:visibility="gone" />
+ </LinearLayout>
+
+ <com.android.systemui.statusbar.policy.DateView
+ android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:layout_marginTop="-4dp"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
+ android:textSize="@dimen/qs_time_collapsed_size"
+ android:gravity="top"
+ systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" />
+
+ <com.android.systemui.statusbar.AlphaOptimizedButton
+ android:id="@+id/alarm_status"
+ android:layout_width="wrap_content"
+ android:layout_height="20dp"
+ android:paddingTop="3dp"
+ android:drawablePadding="8dp"
+ android:drawableStart="@drawable/ic_access_alarms_small"
+ android:textColor="#64ffffff"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
+ android:gravity="top"
+ android:background="?android:attr/selectableItemBackground"
+ android:visibility="gone" />
+
+</LinearLayout>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 6a57c13..cd08f34 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -580,7 +580,7 @@
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"Reducir datos está activada"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"Reducir datos está desactivada"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"Activado"</string>
- <string name="switch_bar_off" msgid="8803270596930432874">"Desactivar"</string>
+ <string name="switch_bar_off" msgid="8803270596930432874">"Desactivado"</string>
<string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string>
<string name="start" msgid="6873794757232879664">"Iniciar"</string>
<string name="center" msgid="4327473927066010960">"Centro"</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index fa4800e..46fed8b 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -246,8 +246,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Бардык эскертмелерди тазалоо."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
- <item quantity="other">Ичинде дагы <xliff:g id="NUMBER_1">%s</xliff:g> эскертме бар.</item>
- <item quantity="one">Ичинде дагы <xliff:g id="NUMBER_0">%s</xliff:g> эскертме бар.</item>
+ <item quantity="other">Дагы <xliff:g id="NUMBER_1">%s</xliff:g> эскертме бар.</item>
+ <item quantity="one">Дагы <xliff:g id="NUMBER_0">%s</xliff:g> эскертме бар.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Эскертме жөндөөлөрү"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> жөндөөлөрү"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 78132bd..72f04bb 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -246,8 +246,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle meldingen wissen."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
- <item quantity="other">Nog <xliff:g id="NUMBER_1">%s</xliff:g> meldingen in groep.</item>
- <item quantity="one">Nog <xliff:g id="NUMBER_0">%s</xliff:g> melding in groep.</item>
+ <item quantity="other">Nog <xliff:g id="NUMBER_1">%s</xliff:g> meldingen in deze groep.</item>
+ <item quantity="one">Nog <xliff:g id="NUMBER_0">%s</xliff:g> melding in deze groep.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Instellingen voor meldingen"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g>-instellingen"</string>
diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml
index c8083a2..d9cb04f 100644
--- a/packages/SystemUI/res/values-pa-rIN/strings.xml
+++ b/packages/SystemUI/res/values-pa-rIN/strings.xml
@@ -339,7 +339,7 @@
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਉੱਪਰ ਸਲਾਈਡ ਕਰੋ।"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
<string name="zen_priority_introduction" msgid="3070506961866919502">"ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਦੁਆਰਾ ਨਿਰਦਿਸ਼ਟ ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਇਵੈਂਟਸ, ਅਤੇ ਕਾਲਰਸ ਤੋਂ ਇਲਾਵਾ, ਧੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਤੋਂ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।"</string>
- <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਅਨੁਕੂਲਿਤ ਕਰੋ"</string>
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ ਕਰੋ"</string>
<string name="zen_silence_introduction_voice" msgid="2284540992298200729">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਗੇ।"</string>
<string name="zen_silence_introduction" msgid="3137882381093271568">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀਆਂ ਧੁਨੀਆਂ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ।"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
@@ -384,7 +384,7 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ਕੀ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣੀ ਜਗ੍ਹਾ ਸਥਾਪਤ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n\nਕੋਈ ਵੀ ਵਰਤੋਂਕਾਰ ਹੋਰ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
- <string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਉਪਭੋਗਤਾ ਹਟਾਉਣਾ ਹੈ?"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਵਰਤੋਂਕਾਰ ਹਟਾਉਣਾ ਹੈ?"</string>
<string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡੈਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
<string name="user_remove_user_remove" msgid="7479275741742178297">"ਹਟਾਓ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
diff --git a/packages/SystemUI/res/values-sw410dp/config.xml b/packages/SystemUI/res/values-sw410dp/config.xml
index 049a535..b04b28c 100644
--- a/packages/SystemUI/res/values-sw410dp/config.xml
+++ b/packages/SystemUI/res/values-sw410dp/config.xml
@@ -22,5 +22,5 @@
<resources>
<integer name="quick_settings_num_rows">2</integer>
- <bool name="quick_settings_show_date">true</bool>
+ <bool name="quick_settings_show_full_alarm">true</bool>
</resources>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 180ed4f..d7ba719 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -365,7 +365,7 @@
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"சுயவிவரத்தைக் காட்டு"</string>
<string name="user_add_user" msgid="5110251524486079492">"பயனரைச் சேர்"</string>
<string name="user_new_user_name" msgid="426540612051178753">"புதியவர்"</string>
- <string name="guest_nickname" msgid="8059989128963789678">"அழைக்கப்பட்டவர்"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"கெஸ்ட்"</string>
<string name="guest_new_guest" msgid="600537543078847803">"அழைக்கப்பட்டவரைச் சேர்"</string>
<string name="guest_exit_guest" msgid="7187359342030096885">"அழைக்கப்பட்டவரை அகற்று"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"அழைக்கப்பட்டவரை அகற்றவா?"</string>
@@ -375,7 +375,7 @@
<string name="guest_wipe_session_message" msgid="8476238178270112811">"உங்கள் அமர்வைத் தொடர விருப்பமா?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"மீண்டும் தொடங்கு"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"தொடரவும்"</string>
- <string name="guest_notification_title" msgid="1585278533840603063">"அழைக்கப்பட்டவர்"</string>
+ <string name="guest_notification_title" msgid="1585278533840603063">"கெஸ்ட்"</string>
<string name="guest_notification_text" msgid="335747957734796689">"பயன்பாடுகளையும் தரவையும் நீக்க, விருந்தினர் பயனரை அகற்றவும்"</string>
<string name="guest_notification_remove_action" msgid="8820670703892101990">"அழைக்கப்பட்டவரை அகற்றவா?"</string>
<string name="user_logout_notification_title" msgid="1453960926437240727">"பயனரை வெளியேற்று"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index c30375b..84e2a29 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -322,7 +322,7 @@
<string name="recents_empty_message" msgid="808480104164008572">"Hozircha hech narsa yo‘q"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Hammasi o‘chirildi"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Ilova haqida ma’lumot"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"o‘zgarmas ekran"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ekranni mahkamlash"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"qidirish"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"“<xliff:g id="APP">%s</xliff:g>” ilovasini ishga tushirib bo‘lmadi."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Xavfsiz rejimda <xliff:g id="APP">%s</xliff:g> ilovasi o‘chirib qo‘yildi."</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index e98309e..02b1b50 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -262,7 +262,7 @@
<!-- Nav bar button default ordering/layout -->
<string name="config_navBarLayout" translatable="false">space,back;home;recent,menu_ime</string>
- <bool name="quick_settings_show_date">false</bool>
+ <bool name="quick_settings_show_full_alarm">false</bool>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
index cf96457..71bd798 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java
@@ -109,18 +109,18 @@
if (mListening) {
if (mPosition != position) {
// Clear out the last pages from listening.
- mPages.get(mPosition).setListening(false);
+ setPageListening(mPosition, false);
if (mOffPage) {
- mPages.get(mPosition + 1).setListening(false);
+ setPageListening(mPosition + 1, false);
}
// Set the new pages to listening
- mPages.get(position).setListening(true);
+ setPageListening(position, true);
if (offPage) {
- mPages.get(position + 1).setListening(true);
+ setPageListening(position + 1, true);
}
} else if (mOffPage != offPage) {
// Whether we are showing position + 1 has changed.
- mPages.get(mPosition + 1).setListening(offPage);
+ setPageListening(mPosition + 1, offPage);
}
}
// Save the current state.
@@ -128,6 +128,11 @@
mOffPage = offPage;
}
+ private void setPageListening(int position, boolean listening) {
+ if (position >= mPages.size()) return;
+ mPages.get(position).setListening(listening);
+ }
+
@Override
public boolean hasOverlappingRendering() {
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index f92c51f..2dcb5f4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -20,6 +20,7 @@
import android.view.View.OnAttachStateChangeListener;
import android.view.View.OnLayoutChangeListener;
import android.widget.TextView;
+
import com.android.systemui.qs.PagedTileLayout.PageListener;
import com.android.systemui.qs.QSPanel.QSTileLayout;
import com.android.systemui.qs.QSTile.Host.Callback;
@@ -65,6 +66,7 @@
private boolean mFullRows;
private int mNumQuickTiles;
private float mLastPosition;
+ private QSTileHost mHost;
public QSAnimator(QSContainer container, QuickQSPanel quickPanel, QSPanel panel) {
mQsContainer = container;
@@ -94,6 +96,7 @@
}
public void setHost(QSTileHost qsh) {
+ mHost = qsh;
qsh.addCallback(this);
updateAnimators();
}
@@ -106,6 +109,9 @@
@Override
public void onViewDetachedFromWindow(View v) {
+ if (mHost != null) {
+ mHost.removeCallback(this);
+ }
TunerService.get(mQsContainer.getContext()).removeTunable(this);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java
index 8d6e17e..d5fb8f2 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java
@@ -178,6 +178,7 @@
private void updateQsState() {
boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling || mHeaderAnimating;
mQSPanel.setExpanded(mQsExpanded);
+ mQSDetail.setExpanded(mQsExpanded);
mHeader.setVisibility((mQsExpanded || !mKeyguardShowing || mHeaderAnimating)
? View.VISIBLE
: View.INVISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
index 0cf7e479..a40e5b7 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java
@@ -31,6 +31,7 @@
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
+
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
@@ -64,6 +65,9 @@
private boolean mFullyExpanded;
private View mQsDetailHeaderBack;
private BaseStatusBarHeader mHeader;
+ private boolean mTriggeredExpand;
+ private int mOpenX;
+ private int mOpenY;
public QSDetail(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -112,6 +116,7 @@
public void setQsPanel(QSPanel panel, BaseStatusBarHeader header) {
mQsPanel = panel;
mHeader = header;
+ mHeader.setCallback(mQsPanelCallback);
mQsPanel.setCallback(mQsPanelCallback);
}
@@ -126,6 +131,12 @@
mFullyExpanded = fullyExpanded;
}
+ public void setExpanded(boolean qsExpanded) {
+ if (!qsExpanded) {
+ mTriggeredExpand = false;
+ }
+ }
+
private void updateDetailText() {
mDetailDoneButton.setText(R.string.quick_settings_done);
mDetailSettingsButton.setText(R.string.quick_settings_more_settings);
@@ -161,6 +172,22 @@
}
});
}
+ if (!mFullyExpanded) {
+ mTriggeredExpand = true;
+ mHost.animateToggleQSExpansion();
+ } else {
+ mTriggeredExpand = false;
+ }
+ mOpenX = x;
+ mOpenY = y;
+ } else {
+ // Ensure we collapse into the same point we opened from.
+ x = mOpenX;
+ y = mOpenY;
+ if (mTriggeredExpand) {
+ mHost.animateToggleQSExpansion();
+ mTriggeredExpand = false;
+ }
}
boolean visibleDiff = (mDetailAdapter != null) != (adapter != null);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 51efbf0..932b4f5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -127,7 +127,7 @@
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_NEGATIVE) {
final Intent settingsIntent = new Intent(ACTION_VPN_SETTINGS);
- mContext.startActivityAsUser(settingsIntent, UserHandle.CURRENT);
+ mHost.startActivityDismissingKeyguard(settingsIntent);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 6945176..2c874e5 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -23,6 +23,7 @@
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
@@ -56,7 +57,7 @@
private int mPanelPaddingBottom;
private int mBrightnessPaddingTop;
- private boolean mExpanded;
+ protected boolean mExpanded;
protected boolean mListening;
private Callback mCallback;
@@ -70,7 +71,6 @@
private QSCustomizer mCustomizePanel;
private Record mDetailRecord;
- private boolean mTriggeredExpand;
public QSPanel(Context context) {
this(context, null);
@@ -221,7 +221,6 @@
}
MetricsLogger.visibility(mContext, MetricsEvent.QS_PANEL, mExpanded);
if (!mExpanded) {
- mTriggeredExpand = false;
closeDetail();
} else {
logTiles();
@@ -279,6 +278,7 @@
public void setTiles(Collection<QSTile<?>> tiles, boolean collapsedView) {
for (TileRecord record : mRecords) {
mTileLayout.removeTile(record);
+ record.tile.removeCallback(record.callback);
}
mRecords.clear();
for (QSTile<?> tile : tiles) {
@@ -294,6 +294,10 @@
return new QSTileView(mContext, tile.createTileView(mContext), collapsedView);
}
+ protected boolean shouldShowDetail() {
+ return mExpanded;
+ }
+
protected void addTile(final QSTile<?> tile, boolean collapsedView) {
final TileRecord r = new TileRecord();
r.tile = tile;
@@ -306,7 +310,11 @@
@Override
public void onShowDetail(boolean show) {
- QSPanel.this.showDetail(show, r);
+ // Both the collapsed and full QS panels get this callback, this check determines
+ // which one should handle showing the detail.
+ if (shouldShowDetail()) {
+ QSPanel.this.showDetail(show, r);
+ }
}
@Override
@@ -330,6 +338,7 @@
}
};
r.tile.addCallback(callback);
+ r.callback = callback;
final View.OnClickListener click = new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -390,17 +399,6 @@
}
protected void handleShowDetail(Record r, boolean show) {
- if (show) {
- if (!mExpanded) {
- mTriggeredExpand = true;
- mHost.animateToggleQSExpansion();
- } else {
- mTriggeredExpand = false;
- }
- } else if (mTriggeredExpand) {
- mHost.animateToggleQSExpansion();
- mTriggeredExpand = false;
- }
if (r instanceof TileRecord) {
handleShowDetailTile((TileRecord) r, show);
} else {
@@ -520,6 +518,7 @@
public QSTile<?> tile;
public QSTileBaseView tileView;
public boolean scanState;
+ public QSTile.Callback callback;
}
public interface Callback {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
index 8d9f23f..974de08 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java
@@ -161,6 +161,10 @@
mHandler.obtainMessage(H.ADD_CALLBACK, callback).sendToTarget();
}
+ public void removeCallback(Callback callback) {
+ mHandler.obtainMessage(H.REMOVE_CALLBACK, callback).sendToTarget();
+ }
+
public void removeCallbacks() {
mHandler.sendEmptyMessage(H.REMOVE_CALLBACKS);
}
@@ -224,6 +228,10 @@
handleRefreshState(null);
}
+ private void handleRemoveCallback(Callback callback) {
+ mCallbacks.remove(callback);
+ }
+
private void handleRemoveCallbacks() {
mCallbacks.clear();
}
@@ -334,7 +342,8 @@
private static final int DESTROY = 10;
private static final int CLEAR_STATE = 11;
private static final int REMOVE_CALLBACKS = 12;
- private static final int SET_LISTENING = 13;
+ private static final int REMOVE_CALLBACK = 13;
+ private static final int SET_LISTENING = 14;
private H(Looper looper) {
super(looper);
@@ -350,6 +359,9 @@
} else if (msg.what == REMOVE_CALLBACKS) {
name = "handleRemoveCallbacks";
handleRemoveCallbacks();
+ } else if (msg.what == REMOVE_CALLBACK) {
+ name = "handleRemoveCallback";
+ handleRemoveCallback((QSTile.Callback) msg.obj);
} else if (msg.what == CLICK) {
name = "handleClick";
if (mState.disabledByPolicy) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index b28d0f2..c984abe 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -77,6 +77,11 @@
}
@Override
+ protected boolean shouldShowDetail() {
+ return !mExpanded;
+ }
+
+ @Override
protected void drawTile(TileRecord r, State state) {
if (state instanceof SignalState) {
State copy = r.tile.newTileState();
@@ -90,11 +95,6 @@
}
@Override
- protected void showDetail(boolean show, Record r) {
- // Do nothing, will be handled by the QSPanel.
- }
-
- @Override
protected QSTileBaseView createTileView(QSTile<?> tile, boolean collapsedView) {
return new QSTileBaseView(mContext, tile.createTileView(mContext), collapsedView);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
index 4bf85c7..8a0079d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -42,6 +42,7 @@
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.phone.QSTileHost;
+import com.android.systemui.statusbar.policy.KeyguardMonitor.Callback;
import java.util.ArrayList;
import java.util.List;
@@ -141,6 +142,7 @@
mNotifQsContainer.setCustomizerShowing(true);
announceForAccessibility(mContext.getString(
R.string.accessibility_desc_quick_settings_edit));
+ mHost.getKeyguardMonitor().addCallback(mKeyguardCallback);
}
}
@@ -156,6 +158,7 @@
mNotifQsContainer.setCustomizerShowing(false);
announceForAccessibility(mContext.getString(
R.string.accessibility_desc_quick_settings));
+ mHost.getKeyguardMonitor().removeCallback(mKeyguardCallback);
}
}
@@ -201,6 +204,15 @@
mTileAdapter.saveSpecs(mHost);
}
+ private final Callback mKeyguardCallback = new Callback() {
+ @Override
+ public void onKeyguardChanged() {
+ if (mHost.getKeyguardMonitor().isShowing()) {
+ hide(0, 0);
+ }
+ }
+ };
+
private final AnimatorListener mExpandAnimationListener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
index 8ec6a2f..777ed6a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java
@@ -28,6 +28,8 @@
import android.os.Handler;
import android.os.Looper;
import android.service.quicksettings.TileService;
+import android.widget.Button;
+
import com.android.systemui.R;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTile.DrawableIcon;
@@ -110,6 +112,8 @@
}
TileInfo info = new TileInfo();
info.state = state;
+ info.state.minimalAccessibilityClassName = info.state.expandedAccessibilityClassName =
+ Button.class.getName();
info.spec = spec;
info.appLabel = appLabel;
info.isSystem = isSystem;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index 16b1158..87d6307 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -134,9 +134,14 @@
}
if (DEBUG) Log.d(TAG, "Binding service " + mIntent + " " + mUser);
mBindTryCount++;
- mIsBound = mContext.bindServiceAsUser(mIntent, this,
- Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
- mUser);
+ try {
+ mIsBound = mContext.bindServiceAsUser(mIntent, this,
+ Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
+ mUser);
+ } catch (SecurityException e) {
+ Log.e(TAG, "Failed to bind to service", e);
+ mIsBound = false;
+ }
} else {
if (DEBUG) Log.d(TAG, "Unbinding service " + mIntent + " " + mUser);
// Give it another chance next time it needs to be bound, out of kindness.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index 82a5622..ce9bbf4 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -21,13 +21,20 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.service.quicksettings.IQSTileService;
+import android.service.quicksettings.TileService;
import android.support.annotation.VisibleForTesting;
import android.util.Log;
+
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
+
+import java.util.List;
+
import libcore.util.Objects;
/**
@@ -222,15 +229,29 @@
if (!Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
return;
}
- if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
- return;
- }
+
Uri data = intent.getData();
String pkgName = data.getEncodedSchemeSpecificPart();
final ComponentName component = mStateManager.getComponent();
if (!Objects.equal(pkgName, component.getPackageName())) {
return;
}
+
+ // If the package is being updated, verify the component still exists.
+ if (intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ Intent queryIntent = new Intent(TileService.ACTION_QS_TILE);
+ queryIntent.setPackage(pkgName);
+ PackageManager pm = context.getPackageManager();
+ List<ResolveInfo> services = pm.queryIntentServicesAsUser(
+ queryIntent, 0, ActivityManager.getCurrentUser());
+ for (ResolveInfo info : services) {
+ if (Objects.equal(info.serviceInfo.packageName, component.getPackageName())
+ && Objects.equal(info.serviceInfo.name, component.getClassName())) {
+ return;
+ }
+ }
+ }
+
mServices.getHost().removeTile(component);
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java
index 72a589f..e757560 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java
@@ -56,6 +56,7 @@
private ImageView mBadgeView;
private Task mTask;
private boolean mDismissState;
+ private boolean mTouchExplorationEnabled;
private int mCornerRadius;
private ViewFocusAnimator mViewFocusAnimator;
@@ -90,7 +91,8 @@
R.dimen.recents_task_view_rounded_corners_radius);
mRecentsRowFocusAnimationHolder = new RecentsRowFocusAnimationHolder(this, mInfoFieldView);
SystemServicesProxy ssp = Recents.getSystemServices();
- if (!ssp.isTouchExplorationEnabled()) {
+ mTouchExplorationEnabled = ssp.isTouchExplorationEnabled();
+ if (!mTouchExplorationEnabled) {
mDismissIconView.setVisibility(VISIBLE);
} else {
mDismissIconView.setVisibility(GONE);
@@ -237,10 +239,15 @@
private void setDismissState(boolean dismissState) {
if (mDismissState != dismissState) {
mDismissState = dismissState;
- if (dismissState) {
- mDismissAnimationsHolder.startEnterAnimation();
- } else {
- mDismissAnimationsHolder.startExitAnimation();
+ // Check for touch exploration to ensure dismiss icon/text do not
+ // get animated. This should be removed based on decision from
+ // b/29208918
+ if (!mTouchExplorationEnabled) {
+ if (dismissState) {
+ mDismissAnimationsHolder.startEnterAnimation();
+ } else {
+ mDismissAnimationsHolder.startExitAnimation();
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index 41869dd..e503c56 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -209,7 +209,9 @@
EventBus.getDefault().send(new LaunchTaskSucceededEvent(taskIndexFromFront));
} else {
// Dismiss the task if we fail to launch it
- taskView.dismissTask();
+ if (taskView != null) {
+ taskView.dismissTask();
+ }
// Keep track of failed launches
EventBus.getDefault().send(new LaunchTaskFailedEvent());
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 7b372ec..691e599 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -31,6 +31,7 @@
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.RippleDrawable;
import android.os.CountDownTimer;
import android.support.v4.graphics.ColorUtils;
import android.util.AttributeSet;
@@ -460,6 +461,7 @@
mDismissButton.setContentDescription(t.dismissDescription);
mDismissButton.setOnClickListener(this);
mDismissButton.setClickable(false);
+ ((RippleDrawable) mDismissButton.getBackground()).setForceSoftware(true);
// When freeform workspaces are enabled, then update the move-task button depending on the
// current task
@@ -477,6 +479,7 @@
}
mMoveTaskButton.setOnClickListener(this);
mMoveTaskButton.setClickable(false);
+ ((RippleDrawable) mMoveTaskButton.getBackground()).setForceSoftware(true);
}
if (Recents.getDebugFlags().isFastToggleRecentsEnabled()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java
new file mode 100644
index 0000000..ff2febf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationMessagingTemplateViewWrapper.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.notification;
+
+import com.android.internal.widget.MessagingLinearLayout;
+import com.android.systemui.statusbar.ExpandableNotificationRow;
+import com.android.systemui.statusbar.TransformableView;
+
+import android.content.Context;
+import android.service.notification.StatusBarNotification;
+import android.view.View;
+
+/**
+ * Wraps a notification containing a messaging template
+ */
+public class NotificationMessagingTemplateViewWrapper extends NotificationTemplateViewWrapper {
+
+ private View mContractedMessage;
+
+ protected NotificationMessagingTemplateViewWrapper(Context ctx, View view,
+ ExpandableNotificationRow row) {
+ super(ctx, view, row);
+ }
+
+ private void resolveViews() {
+ mContractedMessage = null;
+
+ View container = mView.findViewById(com.android.internal.R.id.notification_messaging);
+ if (container instanceof MessagingLinearLayout
+ && ((MessagingLinearLayout) container).getChildCount() > 0) {
+ MessagingLinearLayout messagingContainer = (MessagingLinearLayout) container;
+
+ // Only consider the first child - transforming to a position other than the first
+ // looks bad because we have to move across other messages that are fading in.
+ View child = messagingContainer.getChildAt(0);
+ if (child.getId() == messagingContainer.getContractedChildId()) {
+ mContractedMessage = child;
+ }
+ }
+ }
+
+ @Override
+ public void notifyContentUpdated(StatusBarNotification notification) {
+ // Reinspect the notification. Before the super call, because the super call also updates
+ // the transformation types and we need to have our values set by then.
+ resolveViews();
+ super.notifyContentUpdated(notification);
+ }
+
+ @Override
+ protected void updateTransformedTypes() {
+ // This also clears the existing types
+ super.updateTransformedTypes();
+ if (mContractedMessage != null) {
+ mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TEXT,
+ mContractedMessage);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
index 22519e6..16348dfe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java
@@ -50,6 +50,8 @@
return new NotificationBigTextTemplateViewWrapper(ctx, v, row);
} else if ("media".equals(v.getTag()) || "bigMediaNarrow".equals(v.getTag())) {
return new NotificationMediaTemplateViewWrapper(ctx, v, row);
+ } else if ("messaging".equals(v.getTag())) {
+ return new NotificationMessagingTemplateViewWrapper(ctx, v, row);
}
return new NotificationTemplateViewWrapper(ctx, v, row);
} else if (v instanceof NotificationHeaderView) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
index 6d0fbb15..58fbd4c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java
@@ -80,14 +80,16 @@
new NightModeController.Listener() {
@Override
public void onNightModeChanged() {
- mHost.addTile("night");
- Prefs.putBoolean(mContext, Key.QS_NIGHT_ADDED, true);
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mHost.getNightModeController().removeListener(mNightModeListener);
- }
- });
+ if (mHost.getNightModeController().isEnabled()) {
+ mHost.addTile("night");
+ Prefs.putBoolean(mContext, Key.QS_NIGHT_ADDED, true);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mHost.getNightModeController().removeListener(mNightModeListener);
+ }
+ });
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java
index 6e1c862..79eef43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BaseStatusBarHeader.java
@@ -20,6 +20,7 @@
import android.util.AttributeSet;
import android.widget.RelativeLayout;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.qs.QSPanel.Callback;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
import com.android.systemui.statusbar.policy.NextAlarmController;
@@ -44,4 +45,5 @@
public abstract void setBatteryController(BatteryController batteryController);
public abstract void setNextAlarmController(NextAlarmController nextAlarmController);
public abstract void setUserInfoController(UserInfoController userInfoController);
+ public abstract void setCallback(Callback qsPanelCallback);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index 8bb1f24..e091d6dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -38,6 +38,7 @@
import com.android.systemui.R;
import com.android.systemui.qs.QSAnimator;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.qs.QSPanel.Callback;
import com.android.systemui.qs.QuickQSPanel;
import com.android.systemui.qs.TouchAnimator;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -93,6 +94,7 @@
protected TouchAnimator mSettingsAlpha;
private float mExpansionAmount;
private QSTileHost mHost;
+ private boolean mShowFullAlarm;
public QuickStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -109,8 +111,7 @@
mDateTimeGroup = (ViewGroup) findViewById(R.id.date_time_group);
mDateTimeGroup.setPivotX(0);
mDateTimeGroup.setPivotY(0);
- boolean showDate = getResources().getBoolean(R.bool.quick_settings_show_date);
- findViewById(R.id.date).setVisibility(showDate ? View.VISIBLE : View.GONE);
+ mShowFullAlarm = getResources().getBoolean(R.bool.quick_settings_show_full_alarm);
mExpandIndicator = (ExpandableIndicator) findViewById(R.id.expand_indicator);
@@ -165,14 +166,16 @@
updateDateTimePosition();
mSecondHalfAnimator = new TouchAnimator.Builder()
- .addFloat(mAlarmStatus, "alpha", 0, 1)
+ .addFloat(mShowFullAlarm ? mAlarmStatus : findViewById(R.id.date), "alpha", 0, 1)
.addFloat(mEmergencyOnly, "alpha", 0, 1)
.setStartDelay(.5f)
.build();
- mFirstHalfAnimator = new TouchAnimator.Builder()
- .addFloat(mAlarmStatusCollapsed, "alpha", 1, 0)
- .setEndDelay(.5f)
- .build();
+ if (mShowFullAlarm) {
+ mFirstHalfAnimator = new TouchAnimator.Builder()
+ .addFloat(mAlarmStatusCollapsed, "alpha", 1, 0)
+ .setEndDelay(.5f)
+ .build();
+ }
mDateSizeAnimator = new TouchAnimator.Builder()
.addFloat(mDateTimeGroup, "scaleX", 1, mDateScaleFactor)
.addFloat(mDateTimeGroup, "scaleY", 1, mDateScaleFactor)
@@ -220,6 +223,7 @@
@Override
public void setExpanded(boolean expanded) {
mExpanded = expanded;
+ mHeaderQsPanel.setExpanded(expanded);
updateEverything();
}
@@ -244,7 +248,9 @@
public void setExpansion(float headerExpansionFraction) {
mExpansionAmount = headerExpansionFraction;
mSecondHalfAnimator.setPosition(headerExpansionFraction);
- mFirstHalfAnimator.setPosition(headerExpansionFraction);
+ if (mShowFullAlarm) {
+ mFirstHalfAnimator.setPosition(headerExpansionFraction);
+ }
mDateSizeAnimator.setPosition(headerExpansionFraction);
mAlarmTranslation.setPosition(headerExpansionFraction);
mSettingsAlpha.setPosition(headerExpansionFraction);
@@ -263,7 +269,7 @@
}
private void updateAlarmVisibilities() {
- mAlarmStatus.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
+ mAlarmStatus.setVisibility(mAlarmShowing && mShowFullAlarm ? View.VISIBLE : View.INVISIBLE);
mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
}
@@ -389,6 +395,11 @@
}
@Override
+ public void setCallback(Callback qsPanelCallback) {
+ mHeaderQsPanel.setCallback(qsPanelCallback);
+ }
+
+ @Override
public void setEmergencyCallsOnly(boolean show) {
boolean changed = show != mShowEmergencyCallsOnly;
if (changed) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index a051973..72eafd8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -44,6 +44,7 @@
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.qs.QSPanel;
+import com.android.systemui.qs.QSPanel.Callback;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTile.DetailAdapter;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -511,6 +512,10 @@
}
@Override
+ public void setCallback(Callback qsPanelCallback) {
+ }
+
+ @Override
public void onClick(View v) {
if (v == mSettingsButton) {
if (mSettingsButton.isTunerClick()) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index b58538d..7c391fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -53,6 +53,7 @@
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.OverScroller;
+import android.widget.ScrollView;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
@@ -872,7 +873,8 @@
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
ExpandableNotificationRow parent = row.getNotificationParent();
if (parent != null && parent.areChildrenExpanded()
- && (mGearExposedView == parent
+ && (parent.areGutsExposed()
+ || mGearExposedView == parent
|| (parent.getNotificationChildren().size() == 1
&& parent.isClearable()))) {
// In this case the group is expanded and showing the gear for the
@@ -960,6 +962,7 @@
public boolean canChildBeExpanded(View v) {
return v instanceof ExpandableNotificationRow
&& ((ExpandableNotificationRow) v).isExpandable()
+ && !((ExpandableNotificationRow) v).areGutsExposed()
&& (mIsExpanded || !((ExpandableNotificationRow) v).isPinned());
}
@@ -2096,7 +2099,9 @@
final ExpandableView firstChild = getFirstChildNotGone();
int firstChildMinHeight = firstChild != null
? firstChild.getIntrinsicHeight()
- : mCollapsedSize;
+ : mEmptyShadeView != null
+ ? mEmptyShadeView.getMinHeight()
+ : mCollapsedSize;
if (mOwnScrollY > 0) {
firstChildMinHeight = Math.max(firstChildMinHeight - mOwnScrollY, mCollapsedSize);
}
@@ -3600,6 +3605,8 @@
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN);
}
}
+ // Talkback only listenes to scroll events of certain classes, let's make us a scrollview
+ info.setClassName(ScrollView.class.getName());
}
/** @hide */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index 5d26988..c8c7d3d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -171,6 +171,12 @@
}
public static boolean canChildBeDismissed(View v) {
+ if (v instanceof ExpandableNotificationRow) {
+ ExpandableNotificationRow row = (ExpandableNotificationRow) v;
+ if (row.areGutsExposed()) {
+ return false;
+ }
+ }
final View veto = v.findViewById(R.id.veto);
return (veto != null && veto.getVisibility() != View.GONE);
}
diff --git a/preloaded-classes b/preloaded-classes
index 32b692a..fe2fba5 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -12,7 +12,6 @@
[Landroid.animation.Keyframe;
[Landroid.animation.PropertyValuesHolder;
[Landroid.app.LoaderManagerImpl;
-[Landroid.app.Notification$Action;
[Landroid.content.ContentProviderResult;
[Landroid.content.ContentValues;
[Landroid.content.Intent;
@@ -57,6 +56,7 @@
[Landroid.hardware.soundtrigger.SoundTrigger$ConfidenceLevel;
[Landroid.hardware.soundtrigger.SoundTrigger$Keyphrase;
[Landroid.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra;
+[Landroid.icu.impl.CacheValue$Strength;
[Landroid.icu.impl.ICUResourceBundle$OpenType;
[Landroid.icu.impl.StandardPlural;
[Landroid.icu.impl.Trie2$ValueWidth;
@@ -82,16 +82,13 @@
[Landroid.icu.util.ULocale$Category;
[Landroid.icu.util.ULocale;
[Landroid.media.AudioGain;
-[Landroid.media.MediaCodecInfo$CodecCapabilities;
-[Landroid.media.MediaCodecInfo$CodecProfileLevel;
-[Landroid.media.MediaCodecInfo$Feature;
-[Landroid.media.MediaCodecInfo;
[Landroid.net.Network;
[Landroid.net.NetworkInfo$DetailedState;
[Landroid.net.NetworkInfo$State;
[Landroid.net.Uri;
[Landroid.net.wifi.SupplicantState;
[Landroid.os.AsyncTask$Status;
+[Landroid.os.Bundle;
[Landroid.os.MessageQueue$IdleHandler;
[Landroid.os.Parcel;
[Landroid.os.ParcelFileDescriptor;
@@ -129,13 +126,13 @@
[Landroid.view.Choreographer$CallbackQueue;
[Landroid.view.Display$ColorTransform;
[Landroid.view.Display$Mode;
+[Landroid.view.Display;
[Landroid.view.HandlerActionQueue$HandlerAction;
[Landroid.view.MenuItem;
[Landroid.view.View;
[Landroid.widget.Editor$TextRenderNode;
[Landroid.widget.Editor$TextViewPositionListener;
[Landroid.widget.ImageView$ScaleType;
-[Landroid.widget.SpellChecker$SpellParser;
[Landroid.widget.TextView$BufferType;
[Landroid.widget.TextView$ChangeWatcher;
[Lcom.android.dex.TableOfContents$Section;
@@ -155,7 +152,6 @@
[Ljava.io.File;
[Ljava.io.FileDescriptor;
[Ljava.io.IOException;
-[Ljava.io.ObjectInputStream$HandleTable$HandleList;
[Ljava.io.ObjectStreamField;
[Ljava.lang.Byte;
[Ljava.lang.CharSequence;
@@ -178,6 +174,7 @@
[Ljava.lang.Throwable;
[Ljava.lang.Void;
[Ljava.lang.annotation.Annotation;
+[Ljava.lang.ref.SoftReference;
[Ljava.lang.ref.WeakReference;
[Ljava.lang.reflect.AccessibleObject;
[Ljava.lang.reflect.Constructor;
@@ -189,10 +186,10 @@
[Ljava.math.BigInteger;
[Ljava.math.RoundingMode;
[Ljava.net.InetAddress;
+[Ljava.net.InterfaceAddress;
+[Ljava.net.NetworkInterface;
[Ljava.net.Proxy$Type;
-[Ljava.nio.ByteBuffer;
[Ljava.security.CryptoPrimitive;
-[Ljava.security.Principal;
[Ljava.security.Provider;
[Ljava.security.cert.Certificate;
[Ljava.security.cert.X509Certificate;
@@ -209,7 +206,6 @@
[Ljava.util.Locale$Category;
[Ljava.util.Locale;
[Ljava.util.Map$Entry;
-[Ljava.util.TimerTask;
[Ljava.util.WeakHashMap$Entry;
[Ljava.util.concurrent.ConcurrentHashMap$Node;
[Ljava.util.concurrent.ConcurrentHashMap$Segment;
@@ -340,7 +336,6 @@
android.app.ActivityThread$2
android.app.ActivityThread$3
android.app.ActivityThread$ActivityClientRecord
-android.app.ActivityThread$ActivityConfigChangeData
android.app.ActivityThread$AppBindData
android.app.ActivityThread$ApplicationThread
android.app.ActivityThread$BindServiceData
@@ -356,7 +351,6 @@
android.app.ActivityThread$ProviderKey
android.app.ActivityThread$ProviderRefCount
android.app.ActivityThread$ReceiverData
-android.app.ActivityThread$ResultData
android.app.ActivityThread$ServiceArgsData
android.app.ActivityThread$StopInfo
android.app.ActivityTransitionState
@@ -366,6 +360,7 @@
android.app.AppOpsManager
android.app.Application
android.app.Application$ActivityLifecycleCallbacks
+android.app.ApplicationErrorReport
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
@@ -405,8 +400,6 @@
android.app.INotificationManager$Stub$Proxy
android.app.IServiceConnection
android.app.IServiceConnection$Stub
-android.app.ITransientNotification
-android.app.ITransientNotification$Stub
android.app.IUiAutomationConnection
android.app.IUiAutomationConnection$Stub
android.app.IUiModeManager
@@ -416,6 +409,7 @@
android.app.IntentReceiverLeaked
android.app.IntentService
android.app.IntentService$ServiceHandler
+android.app.JobSchedulerImpl
android.app.KeyguardManager
android.app.ListActivity
android.app.LoadedApk
@@ -434,7 +428,6 @@
android.app.Notification
android.app.Notification$1
android.app.Notification$Action
-android.app.Notification$Action$1
android.app.Notification$BigTextStyle
android.app.Notification$Builder
android.app.Notification$BuilderRemoteViews
@@ -444,6 +437,7 @@
android.app.PendingIntent
android.app.PendingIntent$1
android.app.PendingIntent$CanceledException
+android.app.ProgressDialog
android.app.QueuedWork
android.app.ReceiverRestrictedContext
android.app.ResourcesManager
@@ -559,7 +553,12 @@
android.app.backup.FileBackupHelperBase
android.app.backup.FullBackup
android.app.backup.FullBackupDataOutput
+android.app.job.IJobScheduler
+android.app.job.IJobScheduler$Stub
+android.app.job.JobInfo
+android.app.job.JobInfo$Builder
android.app.job.JobScheduler
+android.app.job.JobService
android.app.trust.ITrustManager
android.app.trust.ITrustManager$Stub
android.app.trust.ITrustManager$Stub$Proxy
@@ -578,18 +577,13 @@
android.bluetooth.IBluetoothManager$Stub$Proxy
android.bluetooth.IBluetoothManagerCallback
android.bluetooth.IBluetoothManagerCallback$Stub
-android.content.AbstractThreadedSyncAdapter
-android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
-android.content.AbstractThreadedSyncAdapter$SyncThread
android.content.ActivityNotFoundException
android.content.BroadcastReceiver
android.content.BroadcastReceiver$PendingResult
android.content.BroadcastReceiver$PendingResult$1
android.content.ClipData
-android.content.ClipData$1
android.content.ClipData$Item
android.content.ClipDescription
-android.content.ClipDescription$1
android.content.ClipboardManager
android.content.ComponentCallbacks
android.content.ComponentCallbacks2
@@ -600,6 +594,7 @@
android.content.ContentProviderClient
android.content.ContentProviderNative
android.content.ContentProviderOperation
+android.content.ContentProviderOperation$Builder
android.content.ContentProviderProxy
android.content.ContentProviderResult
android.content.ContentResolver
@@ -627,7 +622,6 @@
android.content.ISyncAdapter$Stub
android.content.ISyncContext
android.content.ISyncContext$Stub
-android.content.ISyncContext$Stub$Proxy
android.content.Intent
android.content.Intent$1
android.content.IntentFilter
@@ -641,9 +635,6 @@
android.content.SharedPreferences
android.content.SharedPreferences$Editor
android.content.SharedPreferences$OnSharedPreferenceChangeListener
-android.content.SyncContext
-android.content.SyncRequest
-android.content.SyncRequest$1
android.content.SyncResult
android.content.SyncResult$1
android.content.SyncStats
@@ -821,6 +812,7 @@
android.graphics.CanvasProperty
android.graphics.Color
android.graphics.ColorFilter
+android.graphics.ColorMatrix
android.graphics.ColorMatrixColorFilter
android.graphics.ComposePathEffect
android.graphics.ComposeShader
@@ -900,7 +892,6 @@
android.graphics.drawable.Animatable2
android.graphics.drawable.AnimatedStateListDrawable
android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState
-android.graphics.drawable.AnimatedStateListDrawable$Transition
android.graphics.drawable.AnimatedVectorDrawable
android.graphics.drawable.AnimatedVectorDrawable$1
android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState
@@ -947,8 +938,6 @@
android.graphics.drawable.RippleForeground$3
android.graphics.drawable.RippleForeground$4
android.graphics.drawable.RippleForeground$LogDecelerateInterpolator
-android.graphics.drawable.RotateDrawable
-android.graphics.drawable.RotateDrawable$RotateState
android.graphics.drawable.ScaleDrawable
android.graphics.drawable.ScaleDrawable$ScaleState
android.graphics.drawable.ShapeDrawable
@@ -956,7 +945,6 @@
android.graphics.drawable.StateListDrawable
android.graphics.drawable.StateListDrawable$StateListState
android.graphics.drawable.TransitionDrawable
-android.graphics.drawable.TransitionDrawable$TransitionState
android.graphics.drawable.VectorDrawable
android.graphics.drawable.VectorDrawable$VFullPath
android.graphics.drawable.VectorDrawable$VFullPath$1
@@ -1068,13 +1056,16 @@
android.hardware.soundtrigger.SoundTriggerModule
android.hardware.usb.IUsbManager
android.hardware.usb.IUsbManager$Stub
-android.hardware.usb.IUsbManager$Stub$Proxy
android.hardware.usb.UsbDevice
android.hardware.usb.UsbDeviceConnection
android.hardware.usb.UsbManager
android.hardware.usb.UsbRequest
android.icu.impl.BMPSet
android.icu.impl.CacheBase
+android.icu.impl.CacheValue
+android.icu.impl.CacheValue$NullValue
+android.icu.impl.CacheValue$SoftValue
+android.icu.impl.CacheValue$Strength
android.icu.impl.CalendarData
android.icu.impl.CalendarUtil
android.icu.impl.CharTrie
@@ -1165,7 +1156,6 @@
android.icu.impl.RuleCharacterIterator
android.icu.impl.SimpleCache
android.icu.impl.SoftCache
-android.icu.impl.SoftCache$SettableSoftReference
android.icu.impl.StandardPlural
android.icu.impl.StringPrepDataReader
android.icu.impl.Trie
@@ -1246,6 +1236,12 @@
android.icu.lang.UScript$ScriptUsage
android.icu.math.BigDecimal
android.icu.math.MathContext
+android.icu.text.BreakIterator
+android.icu.text.BreakIterator$BreakIteratorCache
+android.icu.text.BreakIterator$BreakIteratorServiceShim
+android.icu.text.BreakIteratorFactory
+android.icu.text.BreakIteratorFactory$BFService
+android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
android.icu.text.Collator
android.icu.text.Collator$ServiceShim
android.icu.text.CollatorServiceShim
@@ -1276,10 +1272,13 @@
android.icu.text.DecimalFormat
android.icu.text.DecimalFormat$Unit
android.icu.text.DecimalFormatSymbols
+android.icu.text.DecimalFormatSymbols$1
+android.icu.text.DecimalFormatSymbols$CacheData
android.icu.text.DigitList
android.icu.text.DisplayContext
android.icu.text.DisplayContext$Type
android.icu.text.IDNA
+android.icu.text.LanguageBreakEngine
android.icu.text.MessageFormat
android.icu.text.MessageFormat$AppendableWrapper
android.icu.text.MessageFormat$Field
@@ -1321,8 +1320,13 @@
android.icu.text.PluralRules$RuleList
android.icu.text.PluralRules$SampleType
android.icu.text.PluralRules$SimpleTokenizer
+android.icu.text.RBBIDataWrapper
+android.icu.text.RBBIDataWrapper$IsAcceptable
+android.icu.text.RBBIDataWrapper$RBBIDataHeader
+android.icu.text.RBBIDataWrapper$TrieFoldingFunc
android.icu.text.Replaceable
android.icu.text.ReplaceableString
+android.icu.text.RuleBasedBreakIterator
android.icu.text.RuleBasedCollator
android.icu.text.SimpleDateFormat
android.icu.text.SimpleDateFormat$PatternItem
@@ -1333,6 +1337,7 @@
android.icu.text.UFormat
android.icu.text.UForwardCharacterIterator
android.icu.text.UTF16
+android.icu.text.UnhandledBreakEngine
android.icu.text.UnicodeFilter
android.icu.text.UnicodeMatcher
android.icu.text.UnicodeSet
@@ -1373,21 +1378,9 @@
android.icu.util.UResourceTypeMismatchException
android.icu.util.VersionInfo
android.location.CountryDetector
-android.location.GnssMeasurementCallbackTransport
-android.location.GnssMeasurementCallbackTransport$ListenerTransport
-android.location.GnssNavigationMessageCallbackTransport
-android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
-android.location.IGnssMeasurementsListener
-android.location.IGnssMeasurementsListener$Stub
-android.location.IGnssNavigationMessageListener
-android.location.IGnssNavigationMessageListener$Stub
android.location.ILocationManager
android.location.ILocationManager$Stub
-android.location.ILocationManager$Stub$Proxy
-android.location.LocalListenerHelper
android.location.Location
-android.location.Location$1
-android.location.Location$2
android.location.LocationManager
android.media.AmrInputStream
android.media.AudioAttributes
@@ -1439,12 +1432,6 @@
android.media.JetPlayer
android.media.MediaCodec
android.media.MediaCodecInfo
-android.media.MediaCodecInfo$AudioCapabilities
-android.media.MediaCodecInfo$CodecCapabilities
-android.media.MediaCodecInfo$CodecProfileLevel
-android.media.MediaCodecInfo$EncoderCapabilities
-android.media.MediaCodecInfo$Feature
-android.media.MediaCodecInfo$VideoCapabilities
android.media.MediaCodecList
android.media.MediaCrypto
android.media.MediaDrm
@@ -1458,25 +1445,30 @@
android.media.MediaPlayer$OnErrorListener
android.media.MediaPlayer$OnPreparedListener
android.media.MediaPlayer$OnSeekCompleteListener
+android.media.MediaPlayer$OnVideoSizeChangedListener
android.media.MediaRecorder
android.media.MediaRouter
+android.media.MediaRouter$Callback
+android.media.MediaRouter$RouteCategory
+android.media.MediaRouter$RouteInfo
android.media.MediaScanner
android.media.MediaSync
android.media.PlaybackParams
android.media.PlaybackParams$1
+android.media.PlayerBase
+android.media.PlayerBase$1
android.media.RemoteDisplay
android.media.ResampleInputStream
android.media.SubtitleController$Listener
android.media.ToneGenerator
-android.media.Utils
-android.media.Utils$1
-android.media.Utils$2
-android.media.audiofx.AudioEffect
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
android.media.midi.MidiManager
android.media.projection.MediaProjectionManager
+android.media.session.MediaController
+android.media.session.MediaController$TransportControls
+android.media.session.MediaSession$Token
android.media.session.MediaSessionManager
android.media.soundtrigger.SoundTriggerManager
android.media.tv.TvInputManager
@@ -1499,7 +1491,6 @@
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
-android.net.INetworkPolicyManager
android.net.IpPrefix
android.net.IpPrefix$1
android.net.LinkAddress
@@ -1660,6 +1651,9 @@
android.os.IUserManager$Stub$Proxy
android.os.IVibratorService
android.os.IVibratorService$Stub
+android.os.IVibratorService$Stub$Proxy
+android.os.LocaleList
+android.os.LocaleList$1
android.os.Looper
android.os.MemoryFile
android.os.Message
@@ -1675,7 +1669,6 @@
android.os.ParcelFileDescriptor$1
android.os.ParcelFileDescriptor$AutoCloseInputStream
android.os.ParcelFileDescriptor$AutoCloseOutputStream
-android.os.ParcelUuid
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
@@ -1738,12 +1731,10 @@
android.os.storage.IMountService
android.os.storage.IMountService$Stub
android.os.storage.IMountService$Stub$Proxy
-android.os.storage.IObbActionListener
-android.os.storage.IObbActionListener$Stub
android.os.storage.StorageManager
-android.os.storage.StorageManager$ObbActionListener
android.os.storage.StorageVolume
android.os.storage.StorageVolume$1
+android.preference.Preference$OnPreferenceChangeListener
android.preference.PreferenceActivity
android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
android.preference.PreferenceManager
@@ -1767,9 +1758,13 @@
android.provider.ContactsContract$DataUsageStatColumns
android.provider.ContactsContract$RawContactsColumns
android.provider.ContactsContract$StatusColumns
+android.provider.MediaStore$Images$ImageColumns
+android.provider.MediaStore$Images$Media
android.provider.MediaStore$MediaColumns
+android.provider.Settings$GenerationTracker
android.provider.Settings$Global
android.provider.Settings$NameValueCache
+android.provider.Settings$NameValueCache$-java_lang_String_getStringForUser_android_content_ContentResolver_cr_java_lang_String_name_int_userHandle_LambdaImpl0
android.provider.Settings$NameValueTable
android.provider.Settings$Secure
android.provider.Settings$SettingNotFoundException
@@ -1789,7 +1784,6 @@
android.provider.Settings$System$Validator
android.renderscript.RenderScriptCacheDir
android.security.FrameworkNetworkSecurityPolicy
-android.security.KeyChain
android.security.NetworkSecurityPolicy
android.security.keystore.AndroidKeyStoreBCWorkaroundProvider
android.security.keystore.AndroidKeyStoreProvider
@@ -1813,6 +1807,7 @@
android.security.net.config.RootTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
+android.security.net.config.TrustAnchor
android.security.net.config.TrustedCertificateStoreAdapter
android.security.net.config.UserCertificateSource
android.service.persistentdata.PersistentDataBlockManager
@@ -1837,6 +1832,10 @@
android.system.UnixSocketAddress
android.telecom.TelecomManager
android.telephony.CarrierConfigManager
+android.telephony.PhoneNumberUtils
+android.telephony.PhoneStateListener
+android.telephony.PhoneStateListener$1
+android.telephony.PhoneStateListener$IPhoneStateListenerStub
android.telephony.Rlog
android.telephony.SubscriptionManager
android.telephony.TelephonyManager
@@ -1901,6 +1900,7 @@
android.text.TextWatcher
android.text.format.DateFormat
android.text.format.DateUtils
+android.text.format.Formatter
android.text.format.Time
android.text.format.Time$TimeCalculator
android.text.method.AllCapsTransformationMethod
@@ -1922,7 +1922,6 @@
android.text.method.TransformationMethod
android.text.method.TransformationMethod2
android.text.style.AlignmentSpan
-android.text.style.BackgroundColorSpan
android.text.style.CharacterStyle
android.text.style.ClickableSpan
android.text.style.DynamicDrawableSpan
@@ -1988,8 +1987,7 @@
android.util.EventLog$Event
android.util.FloatProperty
android.util.IntProperty
-android.util.LocaleList
-android.util.LocaleList$1
+android.util.JsonReader
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
@@ -2002,6 +2000,8 @@
android.util.MapCollections$ArrayIterator
android.util.MapCollections$KeySet
android.util.MathUtils
+android.util.MemoryIntArray
+android.util.MemoryIntArray$1
android.util.MutableInt
android.util.MutableLong
android.util.Pair
@@ -2016,7 +2016,6 @@
android.util.Rational
android.util.Singleton
android.util.Size
-android.util.SizeF
android.util.Slog
android.util.SparseArray
android.util.SparseBooleanArray
@@ -2033,7 +2032,6 @@
android.view.AbsSavedState$2
android.view.ActionMode
android.view.ActionMode$Callback
-android.view.ActionMode$Callback2
android.view.ActionProvider
android.view.ActionProvider$SubUiVisibilityListener
android.view.Choreographer
@@ -2050,6 +2048,8 @@
android.view.Display
android.view.Display$ColorTransform
android.view.Display$ColorTransform$1
+android.view.Display$HdrCapabilities
+android.view.Display$HdrCapabilities$1
android.view.Display$Mode
android.view.Display$Mode$1
android.view.DisplayAdjustments
@@ -2057,7 +2057,6 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
-android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
android.view.FocusFinder$1
@@ -2125,7 +2124,6 @@
android.view.LayoutInflater$Filter
android.view.Menu
android.view.MenuInflater
-android.view.MenuInflater$MenuState
android.view.MenuItem
android.view.MenuItem$OnActionExpandListener
android.view.MenuItem$OnMenuItemClickListener
@@ -2177,7 +2175,6 @@
android.view.View$AttachInfo$Callbacks
android.view.View$BaseSavedState
android.view.View$BaseSavedState$1
-android.view.View$CheckForLongPress
android.view.View$CheckForTap
android.view.View$ForegroundInfo
android.view.View$ListenerInfo
@@ -2284,7 +2281,6 @@
android.view.accessibility.AccessibilityRecord
android.view.accessibility.CaptioningManager
android.view.accessibility.CaptioningManager$1
-android.view.accessibility.CaptioningManager$CaptionStyle
android.view.accessibility.CaptioningManager$CaptioningChangeListener
android.view.accessibility.CaptioningManager$MyContentObserver
android.view.accessibility.IAccessibilityManager
@@ -2300,7 +2296,7 @@
android.view.animation.Animation$2
android.view.animation.Animation$3
android.view.animation.Animation$AnimationListener
-android.view.animation.Animation$Description
+android.view.animation.Animation$NoImagePreloadHolder
android.view.animation.AnimationSet
android.view.animation.AnimationUtils
android.view.animation.BaseInterpolator
@@ -2314,8 +2310,6 @@
android.view.animation.TranslateAnimation
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.ComposingText
-android.view.inputmethod.CursorAnchorInfo
-android.view.inputmethod.CursorAnchorInfo$1
android.view.inputmethod.CursorAnchorInfo$Builder
android.view.inputmethod.EditorInfo
android.view.inputmethod.EditorInfo$1
@@ -2330,34 +2324,28 @@
android.view.inputmethod.InputMethodManager$H
android.view.inputmethod.InputMethodManager$ImeInputEventSender
android.view.inputmethod.InputMethodManager$PendingEvent
-android.view.textservice.SpellCheckerSession$SpellCheckerSessionListener
android.view.textservice.SpellCheckerSubtype
android.view.textservice.SpellCheckerSubtype$1
android.view.textservice.TextServicesManager
android.webkit.IWebViewUpdateService
android.webkit.IWebViewUpdateService$Stub
+android.webkit.IWebViewUpdateService$Stub$Proxy
android.webkit.MimeTypeMap
-android.webkit.URLUtil
android.webkit.WebSettings
android.webkit.WebView
-android.webkit.WebViewClient
android.webkit.WebViewFactory
android.webkit.WebViewFactory$MissingWebViewPackageException
+android.webkit.WebViewProviderResponse
+android.webkit.WebViewProviderResponse$1
android.widget.AbsListView
-android.widget.AbsListView$3
android.widget.AbsListView$AdapterDataSetObserver
-android.widget.AbsListView$CheckForTap
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$OnScrollListener
-android.widget.AbsListView$PerformClick
android.widget.AbsListView$RecycleBin
android.widget.AbsListView$SavedState
android.widget.AbsListView$SavedState$1
-android.widget.AbsListView$SelectionBoundsAdjuster
-android.widget.AbsListView$WindowRunnnable
android.widget.AbsSeekBar
android.widget.AbsSpinner
-android.widget.AbsSpinner$RecycleBin
android.widget.AbsoluteLayout
android.widget.ActionMenuPresenter
android.widget.ActionMenuPresenter$1
@@ -2422,7 +2410,6 @@
android.widget.ListAdapter
android.widget.ListPopupWindow
android.widget.ListPopupWindow$ListSelectorHider
-android.widget.ListPopupWindow$PopupDataSetObserver
android.widget.ListPopupWindow$PopupScrollListener
android.widget.ListPopupWindow$PopupTouchInterceptor
android.widget.ListPopupWindow$ResizePopupRunnable
@@ -2436,6 +2423,8 @@
android.widget.PopupWindow$1
android.widget.PopupWindow$2
android.widget.PopupWindow$OnDismissListener
+android.widget.PopupWindow$PopupDecorView
+android.widget.PopupWindow$PopupDecorView$1
android.widget.ProgressBar
android.widget.ProgressBar$1
android.widget.ProgressBar$SavedState
@@ -2453,13 +2442,12 @@
android.widget.RemoteViews$Action
android.widget.RemoteViews$ActionException
android.widget.RemoteViews$BitmapCache
-android.widget.RemoteViews$LayoutParamAction
android.widget.RemoteViews$MemoryUsageCounter
android.widget.RemoteViews$MutablePair
android.widget.RemoteViews$OnClickHandler
android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViews$RuntimeAction
-android.widget.RemoteViews$SetDrawableParameters
+android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
android.widget.RtlSpacingHelper
android.widget.ScrollBarDrawable
@@ -2469,15 +2457,10 @@
android.widget.SectionIndexer
android.widget.SeekBar
android.widget.Space
-android.widget.SpellChecker
-android.widget.SpellChecker$SpellParser
android.widget.Spinner
-android.widget.Spinner$SpinnerPopup
android.widget.SpinnerAdapter
android.widget.Switch
-android.widget.Switch$1
android.widget.TextView
-android.widget.TextView$3
android.widget.TextView$BufferType
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
@@ -2487,16 +2470,12 @@
android.widget.TextView$SavedState$1
android.widget.ThemedSpinnerAdapter
android.widget.Toast
-android.widget.Toast$TN
-android.widget.Toast$TN$1
-android.widget.Toast$TN$2
android.widget.Toolbar
android.widget.Toolbar$1
android.widget.Toolbar$2
android.widget.Toolbar$ExpandedActionViewMenuPresenter
android.widget.Toolbar$LayoutParams
android.widget.WrapperListAdapter
-com.android.dex.Annotation
com.android.dex.ClassData
com.android.dex.ClassData$Method
com.android.dex.ClassDef
@@ -2512,9 +2491,6 @@
com.android.dex.Dex$TypeIndexToDescriptorTable
com.android.dex.DexException
com.android.dex.DexFormat
-com.android.dex.EncodedValue
-com.android.dex.EncodedValueCodec
-com.android.dex.EncodedValueReader
com.android.dex.FieldId
com.android.dex.Leb128
com.android.dex.MethodId
@@ -2522,16 +2498,18 @@
com.android.dex.TableOfContents
com.android.dex.TableOfContents$Section
com.android.dex.TypeList
-com.android.dex.util.ByteArrayByteInput
com.android.dex.util.ByteInput
com.android.dex.util.ByteOutput
com.android.dex.util.ExceptionWithContext
com.android.dex.util.FileUtils
com.android.i18n.phonenumbers.NumberParseException
+com.android.i18n.phonenumbers.PhoneNumberUtil
com.android.internal.R$styleable
com.android.internal.app.AlertController
com.android.internal.app.AlertController$1
com.android.internal.app.AlertController$ButtonHandler
+com.android.internal.app.IAppOpsCallback
+com.android.internal.app.IAppOpsCallback$Stub
com.android.internal.app.IAppOpsService
com.android.internal.app.IAppOpsService$Stub
com.android.internal.app.IAppOpsService$Stub$Proxy
@@ -2558,6 +2536,7 @@
com.android.internal.os.InstallerConnection$InstallerException
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
+com.android.internal.os.PathClassLoaderFactory
com.android.internal.os.RuntimeInit
com.android.internal.os.RuntimeInit$1
com.android.internal.os.RuntimeInit$Arguments
@@ -2581,6 +2560,8 @@
com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
com.android.internal.policy.PhoneWindow$RotationWatcher
com.android.internal.policy.PhoneWindow$RotationWatcher$1
+com.android.internal.telephony.IPhoneStateListener
+com.android.internal.telephony.IPhoneStateListener$Stub
com.android.internal.telephony.ISub
com.android.internal.telephony.ISub$Stub
com.android.internal.telephony.ISub$Stub$Proxy
@@ -2594,17 +2575,12 @@
com.android.internal.textservice.ITextServicesManager
com.android.internal.textservice.ITextServicesManager$Stub
com.android.internal.textservice.ITextServicesManager$Stub$Proxy
-com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.TransitionConstants
com.android.internal.util.ArrayUtils
com.android.internal.util.FastPrintWriter
com.android.internal.util.FastPrintWriter$DummyWriter
com.android.internal.util.FastXmlSerializer
com.android.internal.util.GrowingArrayUtils
com.android.internal.util.LineBreakBufferedWriter
-com.android.internal.util.MessageUtils
-com.android.internal.util.NotificationColorUtil
-com.android.internal.util.NotificationColorUtil$ColorUtilsFromCompat
com.android.internal.util.Preconditions
com.android.internal.util.VirtualRefBasePtr
com.android.internal.util.XmlUtils
@@ -2878,6 +2854,7 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.PinEntryException
+com.android.org.conscrypt.PinListEntry
com.android.org.conscrypt.PinManagerException
com.android.org.conscrypt.Platform
com.android.org.conscrypt.SSLClientSessionCache
@@ -2910,7 +2887,6 @@
dalvik.system.CloseGuard$DefaultReporter
dalvik.system.CloseGuard$Reporter
dalvik.system.DalvikLogHandler
-dalvik.system.DexClassLoader
dalvik.system.DexFile
dalvik.system.DexFile$DFEnum
dalvik.system.DexPathList
@@ -2956,6 +2932,7 @@
java.io.FileOutputStream
java.io.FileReader
java.io.FileSystem
+java.io.FileWriter
java.io.FilenameFilter
java.io.FilterInputStream
java.io.FilterOutputStream
@@ -2968,11 +2945,6 @@
java.io.InvalidObjectException
java.io.ObjectInput
java.io.ObjectInputStream
-java.io.ObjectInputStream$BlockDataInputStream
-java.io.ObjectInputStream$HandleTable
-java.io.ObjectInputStream$HandleTable$HandleList
-java.io.ObjectInputStream$PeekInputStream
-java.io.ObjectInputStream$ValidationList
java.io.ObjectOutput
java.io.ObjectOutputStream
java.io.ObjectStreamClass
@@ -2990,7 +2962,6 @@
java.io.SequenceInputStream
java.io.Serializable
java.io.SerializablePermission
-java.io.StreamCorruptedException
java.io.StringReader
java.io.StringWriter
java.io.UTFDataFormatException
@@ -2999,6 +2970,7 @@
java.io.Writer
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
+java.lang.AndroidHardcodedSystemProperties
java.lang.Appendable
java.lang.ArrayIndexOutOfBoundsException
java.lang.ArrayStoreException
@@ -3011,6 +2983,10 @@
java.lang.CaseMapper
java.lang.CaseMapper$1
java.lang.CharSequence
+java.lang.CharSequence$-java_util_stream_IntStream_chars__LambdaImpl0
+java.lang.CharSequence$-java_util_stream_IntStream_codePoints__LambdaImpl0
+java.lang.CharSequence$1CharIterator
+java.lang.CharSequence$1CodePointIterator
java.lang.Character
java.lang.Character$CharacterCache
java.lang.Character$Subset
@@ -3037,7 +3013,6 @@
java.lang.EnumConstantNotPresentException
java.lang.Error
java.lang.Exception
-java.lang.ExceptionInInitializerError
java.lang.Float
java.lang.FloatingDecimal
java.lang.FloatingDecimal$1
@@ -3081,6 +3056,7 @@
java.lang.RuntimeException
java.lang.RuntimePermission
java.lang.SecurityException
+java.lang.SecurityManager
java.lang.Short
java.lang.Short$ShortCache
java.lang.Shutdown
@@ -3168,6 +3144,7 @@
java.net.CookieHandler
java.net.DatagramPacket
java.net.DatagramSocketImpl
+java.net.DefaultInterface
java.net.HttpURLConnection
java.net.IDN
java.net.Inet4Address
@@ -3179,6 +3156,7 @@
java.net.InetAddressImpl
java.net.InetSocketAddress
java.net.InetSocketAddress$InetSocketAddressHolder
+java.net.InterfaceAddress
java.net.JarURLConnection
java.net.MalformedURLException
java.net.NetworkInterface
@@ -3293,6 +3271,7 @@
java.security.KeyFactory
java.security.KeyFactorySpi
java.security.KeyManagementException
+java.security.KeyPair
java.security.KeyStore
java.security.KeyStore$1
java.security.KeyStoreException
@@ -3377,8 +3356,10 @@
java.security.spec.KeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
+java.sql.Timestamp
java.text.AttributedCharacterIterator$Attribute
java.text.CalendarBuilder
+java.text.CharacterIterator
java.text.Collator
java.text.DateFormat
java.text.DateFormat$Field
@@ -3398,6 +3379,7 @@
java.text.ParsePosition
java.text.RuleBasedCollator
java.text.SimpleDateFormat
+java.text.StringCharacterIterator
java.text.spi.DateFormatProvider
java.text.spi.DateFormatSymbolsProvider
java.text.spi.DecimalFormatSymbolsProvider
@@ -3506,7 +3488,6 @@
java.util.HashMap$EntrySet
java.util.HashMap$HashIterator
java.util.HashMap$HashMapEntry
-java.util.HashMap$Holder
java.util.HashMap$KeyIterator
java.util.HashMap$KeySet
java.util.HashMap$ValueIterator
@@ -3516,9 +3497,6 @@
java.util.Hashtable$EntrySet
java.util.Hashtable$Enumerator
java.util.Hashtable$HashtableEntry
-java.util.Hashtable$Holder
-java.util.Hashtable$KeySet
-java.util.Hashtable$ValueCollection
java.util.IdentityHashMap
java.util.IdentityHashMap$IdentityHashMapIterator
java.util.IdentityHashMap$KeySet
@@ -3549,6 +3527,8 @@
java.util.NavigableSet
java.util.NoSuchElementException
java.util.Objects
+java.util.PrimitiveIterator
+java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
java.util.PriorityQueue$Itr
java.util.Properties
@@ -3559,6 +3539,7 @@
java.util.RandomAccess
java.util.RandomAccessSubList
java.util.RegularEnumSet
+java.util.RegularEnumSet$EnumSetIterator
java.util.ResourceBundle
java.util.ResourceBundle$1
java.util.ResourceBundle$BundleReference
@@ -3591,13 +3572,10 @@
java.util.Stack
java.util.StringTokenizer
java.util.SubList
-java.util.TaskQueue
java.util.TimSort
java.util.TimeZone
java.util.Timer
-java.util.Timer$1
java.util.TimerTask
-java.util.TimerThread
java.util.TreeMap
java.util.TreeMap$EntryIterator
java.util.TreeMap$EntrySet
@@ -3611,17 +3589,14 @@
java.util.UUID
java.util.UUID$Holder
java.util.Vector
-java.util.Vector$1
java.util.Vector$Itr
java.util.WeakHashMap
java.util.WeakHashMap$Entry
java.util.WeakHashMap$EntrySet
java.util.WeakHashMap$HashIterator
-java.util.WeakHashMap$Holder
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$Values
-java.util.XMLUtils
java.util.concurrent.AbstractExecutorService
java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
@@ -3629,6 +3604,8 @@
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentHashMap$BaseIterator
java.util.concurrent.ConcurrentHashMap$CollectionView
+java.util.concurrent.ConcurrentHashMap$EntryIterator
+java.util.concurrent.ConcurrentHashMap$EntrySetView
java.util.concurrent.ConcurrentHashMap$ForwardingNode
java.util.concurrent.ConcurrentHashMap$KeyIterator
java.util.concurrent.ConcurrentHashMap$KeySetView
@@ -3743,10 +3720,12 @@
java.util.logging.LogManager$LoggerWeakRef
java.util.logging.LogManager$RootLogger
java.util.logging.LogManager$SystemLoggerContext
+java.util.logging.LogRecord
java.util.logging.Logger
java.util.logging.LoggingPermission
java.util.logging.LoggingProxyImpl
java.util.prefs.AbstractPreferences
+java.util.prefs.FileSystemPreferences
java.util.prefs.Preferences
java.util.regex.MatchResult
java.util.regex.Matcher
@@ -3754,6 +3733,7 @@
java.util.regex.PatternSyntaxException
java.util.spi.LocaleServiceProvider
java.util.stream.BaseStream
+java.util.stream.IntStream
java.util.stream.Stream
java.util.stream.StreamSupport
java.util.zip.Adler32
@@ -3825,6 +3805,7 @@
javax.net.ssl.SSLSessionContext
javax.net.ssl.SSLSocket
javax.net.ssl.SSLSocketFactory
+javax.net.ssl.SSLSocketFactory$1
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.TrustManagerFactory$1
@@ -3838,9 +3819,6 @@
javax.security.cert.Certificate
javax.security.cert.CertificateException
javax.security.cert.X509Certificate
-javax.xml.parsers.ParserConfigurationException
-javax.xml.transform.TransformerConfigurationException
-javax.xml.transform.TransformerException
libcore.icu.DateIntervalFormat
libcore.icu.DateUtilsBridge
libcore.icu.ICU
@@ -3876,7 +3854,6 @@
libcore.net.event.NetworkEventDispatcher
libcore.net.event.NetworkEventListener
libcore.reflect.AnnotatedElements
-libcore.reflect.AnnotationAccess
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
@@ -3911,7 +3888,6 @@
org.apache.http.HeaderIterator
org.apache.http.HttpEntity
org.apache.http.HttpEntityEnclosingRequest
-org.apache.http.HttpException
org.apache.http.HttpHost
org.apache.http.HttpMessage
org.apache.http.HttpRequest
@@ -3924,14 +3900,14 @@
org.apache.http.client.ResponseHandler
org.apache.http.client.methods.AbortableHttpRequest
org.apache.http.client.methods.HttpEntityEnclosingRequestBase
-org.apache.http.client.methods.HttpGet
org.apache.http.client.methods.HttpPost
org.apache.http.client.methods.HttpRequestBase
org.apache.http.client.methods.HttpUriRequest
+org.apache.http.client.utils.URLEncodedUtils
org.apache.http.conn.ClientConnectionManager
org.apache.http.conn.ConnectTimeoutException
org.apache.http.entity.AbstractHttpEntity
-org.apache.http.entity.ByteArrayEntity
+org.apache.http.entity.BasicHttpEntity
org.apache.http.impl.cookie.DateParseException
org.apache.http.impl.cookie.DateUtils
org.apache.http.message.AbstractHttpMessage
@@ -4002,17 +3978,16 @@
sun.net.NetProperties$1
sun.net.spi.DefaultProxySelector
sun.net.spi.DefaultProxySelector$1
-sun.net.spi.DefaultProxySelector$2
sun.net.spi.DefaultProxySelector$NonProxyInfo
sun.net.spi.nameservice.NameService
sun.net.util.IPAddressUtil
sun.net.www.ParseUtil
sun.net.www.protocol.file.Handler
sun.net.www.protocol.jar.Handler
+sun.nio.ch.AbstractPollArrayWrapper
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
sun.nio.ch.FileDispatcher
@@ -4028,21 +4003,15 @@
sun.nio.ch.NativeThread
sun.nio.ch.NativeThreadSet
sun.nio.ch.Net
+sun.nio.ch.PollArrayWrapper
sun.nio.ch.SelChImpl
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
sun.nio.ch.SocketChannelImpl
-sun.nio.ch.Util
-sun.nio.ch.Util$1
-sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
sun.nio.cs.StreamDecoder
sun.nio.cs.StreamEncoder
-sun.nio.cs.ThreadLocalCoders
-sun.nio.cs.ThreadLocalCoders$1
-sun.nio.cs.ThreadLocalCoders$2
-sun.nio.cs.ThreadLocalCoders$Cache
sun.reflect.annotation.AnnotationType
sun.security.action.GetBooleanAction
sun.security.action.GetPropertyAction
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java
index 3d1370a..3333aa8 100644
--- a/rs/java/android/renderscript/RenderScript.java
+++ b/rs/java/android/renderscript/RenderScript.java
@@ -752,20 +752,12 @@
rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
}
- native void rsnScriptReduce(long con, long id, int slot, long ain,
+ native void rsnScriptReduce(long con, long id, int slot, long[] ains,
long aout, int[] limits);
- synchronized void nScriptReduce(long id, int slot, long ain, long aout,
+ synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
int[] limits) {
validate();
- rsnScriptReduce(mContext, id, slot, ain, aout, limits);
- }
-
- native void rsnScriptReduceNew(long con, long id, int slot, long[] ains,
- long aout, int[] limits);
- synchronized void nScriptReduceNew(long id, int slot, long ains[], long aout,
- int[] limits) {
- validate();
- rsnScriptReduceNew(mContext, id, slot, ains, aout, limits);
+ rsnScriptReduce(mContext, id, slot, ains, aout, limits);
}
native void rsnScriptInvokeV(long con, long id, int slot, byte[] params);
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
index fc3280b..13d5fcd 100644
--- a/rs/java/android/renderscript/Script.java
+++ b/rs/java/android/renderscript/Script.java
@@ -286,35 +286,6 @@
}
/**
- * Only intended for use by generated reflected code. (Simple reduction)
- *
- * @hide
- */
- protected void reduce(int slot, Allocation ain, Allocation aout, LaunchOptions sc) {
- mRS.validate();
- mRS.validateObject(ain);
- mRS.validateObject(aout);
-
- if (ain == null || aout == null) {
- throw new RSIllegalArgumentException(
- "Both ain and aout are required to be non-null.");
- }
-
- long in_id = ain.getID(mRS);
- long out_id = aout.getID(mRS);
-
- int[] limits = null;
- if (sc != null) {
- limits = new int[2];
-
- limits[0] = sc.xstart;
- limits[1] = sc.xend;
- }
-
- mRS.nScriptReduce(getID(mRS), slot, in_id, out_id, limits);
- }
-
- /**
* Only intended for use by generated reflected code. (General reduction)
*
*/
@@ -350,7 +321,7 @@
limits[5] = sc.zend;
}
- mRS.nScriptReduceNew(getID(mRS), slot, in_ids, out_id, limits);
+ mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
}
long[] mInIdsBuffer;
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index e0f5934..aa2a607 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -2094,67 +2094,10 @@
static void
nScriptReduce(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
- jlong ain, jlong aout, jintArray limits)
+ jlongArray ains, jlong aout, jintArray limits)
{
if (kLogApi) {
- ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ain(%" PRId64 ") aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ain, aout);
- }
-
- RsScriptCall sc, *sca = nullptr;
- uint32_t sc_size = 0;
-
- jint limit_len = 0;
- jint *limit_ptr = nullptr;
-
- // If the caller passed limits, reflect them in the RsScriptCall.
- if (limits != nullptr) {
- limit_len = _env->GetArrayLength(limits);
- limit_ptr = _env->GetIntArrayElements(limits, nullptr);
- if (limit_ptr == nullptr) {
- ALOGE("Failed to get Java array elements");
- return;
- }
-
- // We expect to be passed an array [x1, x2] which specifies
- // the sub-range for a 1-dimensional reduction.
- assert(limit_len == 2);
- UNUSED(limit_len); // As the assert might not be compiled.
-
- sc.xStart = limit_ptr[0];
- sc.xEnd = limit_ptr[1];
- sc.yStart = 0;
- sc.yEnd = 0;
- sc.zStart = 0;
- sc.zEnd = 0;
- sc.strategy = RS_FOR_EACH_STRATEGY_DONT_CARE;
- sc.arrayStart = 0;
- sc.arrayEnd = 0;
- sc.array2Start = 0;
- sc.array2End = 0;
- sc.array3Start = 0;
- sc.array3End = 0;
- sc.array4Start = 0;
- sc.array4End = 0;
-
- sca = ≻
- sc_size = sizeof(sc);
- }
-
- rsScriptReduce((RsContext)con, (RsScript)script, slot,
- (RsAllocation)ain, (RsAllocation)aout,
- sca, sc_size);
-
- if (limits != nullptr) {
- _env->ReleaseIntArrayElements(limits, limit_ptr, JNI_ABORT);
- }
-}
-
-static void
-nScriptReduceNew(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot,
- jlongArray ains, jlong aout, jintArray limits)
-{
- if (kLogApi) {
- ALOGD("nScriptReduceNew, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
+ ALOGD("nScriptReduce, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout);
}
if (ains == nullptr) {
@@ -2233,9 +2176,9 @@
sc_size = sizeof(sc);
}
- rsScriptReduceNew((RsContext)con, (RsScript)script, slot,
- in_allocs, in_len, (RsAllocation)aout,
- sca, sc_size);
+ rsScriptReduce((RsContext)con, (RsScript)script, slot,
+ in_allocs, in_len, (RsAllocation)aout,
+ sca, sc_size);
_env->ReleaseLongArrayElements(ains, in_ptr, JNI_ABORT);
@@ -2951,8 +2894,7 @@
{"rsnScriptInvokeV", "(JJI[B)V", (void*)nScriptInvokeV },
{"rsnScriptForEach", "(JJI[JJ[B[I)V", (void*)nScriptForEach },
-{"rsnScriptReduce", "(JJIJJ[I)V", (void*)nScriptReduce },
-{"rsnScriptReduceNew", "(JJI[JJ[I)V", (void*)nScriptReduceNew },
+{"rsnScriptReduce", "(JJI[JJ[I)V", (void*)nScriptReduce },
{"rsnScriptSetVarI", "(JJII)V", (void*)nScriptSetVarI },
{"rsnScriptGetVarI", "(JJI)I", (void*)nScriptGetVarI },
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index acc2ec3..334b228 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -9849,7 +9849,11 @@
synchronized(this) {
if (mActiveRestoreSession != null) {
- Slog.d(TAG, "Restore session requested but one already active");
+ Slog.i(TAG, "Restore session requested but one already active");
+ return null;
+ }
+ if (mBackupRunning) {
+ Slog.i(TAG, "Restore session requested but currently running backups");
return null;
}
mActiveRestoreSession = new ActiveRestoreSession(packageName, transport);
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 3eadb5c..9154b8e 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -222,7 +222,7 @@
} catch (RemoteException e) {
Slog.e(TAG,"Unable to call onBrEdrDown", e);
} finally {
- mBluetoothLock.readLock().lock();
+ mBluetoothLock.readLock().unlock();
}
} else if (st == BluetoothAdapter.STATE_ON){
// disable without persisting the setting
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 5118b3f..acf8009 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -433,15 +433,26 @@
// Array of <Network,ReadOnlyLocalLogs> tracking network validation and results
private static final int MAX_VALIDATION_LOGS = 10;
- private final ArrayDeque<Pair<Network,ReadOnlyLocalLog>> mValidationLogs =
- new ArrayDeque<Pair<Network,ReadOnlyLocalLog>>(MAX_VALIDATION_LOGS);
+ private static class ValidationLog {
+ final Network mNetwork;
+ final String mNetworkExtraInfo;
+ final ReadOnlyLocalLog mLog;
- private void addValidationLogs(ReadOnlyLocalLog log, Network network) {
+ ValidationLog(Network network, String networkExtraInfo, ReadOnlyLocalLog log) {
+ mNetwork = network;
+ mNetworkExtraInfo = networkExtraInfo;
+ mLog = log;
+ }
+ }
+ private final ArrayDeque<ValidationLog> mValidationLogs =
+ new ArrayDeque<ValidationLog>(MAX_VALIDATION_LOGS);
+
+ private void addValidationLogs(ReadOnlyLocalLog log, Network network, String networkExtraInfo) {
synchronized(mValidationLogs) {
while (mValidationLogs.size() >= MAX_VALIDATION_LOGS) {
mValidationLogs.removeLast();
}
- mValidationLogs.addFirst(new Pair(network, log));
+ mValidationLogs.addFirst(new ValidationLog(network, networkExtraInfo, log));
}
}
@@ -1950,10 +1961,10 @@
pw.println();
synchronized (mValidationLogs) {
pw.println("mValidationLogs (most recent first):");
- for (Pair<Network,ReadOnlyLocalLog> p : mValidationLogs) {
- pw.println(p.first);
+ for (ValidationLog p : mValidationLogs) {
+ pw.println(p.mNetwork + " - " + p.mNetworkExtraInfo);
pw.increaseIndent();
- p.second.dump(fd, pw, args);
+ p.mLog.dump(fd, pw, args);
pw.decreaseIndent();
}
}
@@ -3377,7 +3388,6 @@
* was no always-on VPN to start. {@code false} otherwise.
*/
private boolean startAlwaysOnVpn(int userId) {
- final String alwaysOnPackage;
synchronized (mVpns) {
Vpn vpn = mVpns.get(userId);
if (vpn == null) {
@@ -3386,27 +3396,8 @@
Slog.wtf(TAG, "User " + userId + " has no Vpn configuration");
return false;
}
- alwaysOnPackage = vpn.getAlwaysOnPackage();
- // Skip if there is no service to start.
- if (alwaysOnPackage == null) {
- return true;
- }
- // Skip if the service is already established. This isn't bulletproof: it's not bound
- // until after establish(), so if it's mid-setup onStartCommand will be sent twice,
- // which may restart the connection.
- if (vpn.getNetworkInfo().isConnected()) {
- return true;
- }
- }
- // Start the VPN service declared in the app's manifest.
- Intent serviceIntent = new Intent(VpnConfig.SERVICE_INTERFACE);
- serviceIntent.setPackage(alwaysOnPackage);
- try {
- return mContext.startServiceAsUser(serviceIntent, UserHandle.of(userId)) != null;
- } catch (RuntimeException e) {
- Slog.w(TAG, "VpnService " + serviceIntent + " failed to start", e);
- return false;
+ return vpn.startAlwaysOnVpn();
}
}
@@ -3438,17 +3429,7 @@
return false;
}
- // Save the configuration
- final long token = Binder.clearCallingIdentity();
- try {
- final ContentResolver cr = mContext.getContentResolver();
- Settings.Secure.putStringForUser(cr, Settings.Secure.ALWAYS_ON_VPN_APP,
- packageName, userId);
- Settings.Secure.putIntForUser(cr, Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
- (lockdown ? 1 : 0), userId);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
+ vpn.saveAlwaysOnPackage();
}
return true;
}
@@ -4253,7 +4234,8 @@
synchronized (this) {
nai.networkMonitor.systemReady = mSystemReady;
}
- addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network);
+ addValidationLogs(nai.networkMonitor.getValidationLogs(), nai.network,
+ networkInfo.getExtraInfo());
if (DBG) log("registerNetworkAgent " + nai);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_AGENT, nai));
return nai.network.netId;
@@ -5202,6 +5184,15 @@
}
if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) {
+ // Remove always-on package
+ synchronized (mVpns) {
+ final String alwaysOnPackage = getAlwaysOnVpnPackage(userId);
+ if (alwaysOnPackage != null) {
+ setAlwaysOnVpnPackage(userId, null, false);
+ setVpnPackageAuthorization(alwaysOnPackage, userId, false);
+ }
+ }
+
// Turn VPN off
VpnConfig vpnConfig = getVpnConfig(userId);
if (vpnConfig != null) {
@@ -5212,7 +5203,7 @@
// in the future without user intervention.
setVpnPackageAuthorization(vpnConfig.user, userId, false);
- prepareVpn(vpnConfig.user, VpnConfig.LEGACY_VPN, userId);
+ prepareVpn(null, VpnConfig.LEGACY_VPN, userId);
}
}
}
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index e0b4960..36ec2eb 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1431,6 +1431,13 @@
for (UpdateRecord record : records) {
if (isCurrentProfile(UserHandle.getUserId(record.mReceiver.mUid))) {
LocationRequest locationRequest = record.mRequest;
+
+ // Don't assign battery blame for update records whose
+ // client has no permission to receive location data.
+ if (!providerRequest.locationRequests.contains(locationRequest)) {
+ continue;
+ }
+
if (locationRequest.getInterval() <= thresholdInterval) {
if (record.mReceiver.mWorkSource != null
&& record.mReceiver.mWorkSource.size() > 0
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index c89b6ea..9c75a00 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -3031,7 +3031,8 @@
if (forWrite) {
match = vol.isVisibleForWrite(userId);
} else {
- match = vol.isVisibleForRead(userId) || includeInvisible;
+ match = vol.isVisibleForRead(userId)
+ || (includeInvisible && vol.getPath() != null);
}
if (!match) continue;
diff --git a/services/core/java/com/android/server/NetworkScoreService.java b/services/core/java/com/android/server/NetworkScoreService.java
index 3745e0b..83d6344 100644
--- a/services/core/java/com/android/server/NetworkScoreService.java
+++ b/services/core/java/com/android/server/NetworkScoreService.java
@@ -17,10 +17,12 @@
package com.android.server;
import android.Manifest.permission;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.net.INetworkScoreCache;
@@ -67,6 +69,20 @@
private NetworkScorerPackageMonitor mPackageMonitor;
private ScoringServiceConnection mServiceConnection;
+ private BroadcastReceiver mUserIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+ if (DBG) Log.d(TAG, "Received " + action + " for userId " + userId);
+ if (userId == UserHandle.USER_NULL) return;
+
+ if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
+ onUserUnlocked(userId);
+ }
+ }
+ };
+
/**
* Clears scores when the active scorer package is no longer valid and
* manages the service connection.
@@ -138,6 +154,11 @@
public NetworkScoreService(Context context) {
mContext = context;
mScoreCaches = new HashMap<>();
+ IntentFilter filter = new IntentFilter(Intent.ACTION_USER_UNLOCKED);
+ // TODO: Need to update when we support per-user scorers. http://b/23422763
+ mContext.registerReceiverAsUser(
+ mUserIntentReceiver, UserHandle.SYSTEM, filter, null /* broadcastPermission*/,
+ null /* scheduler */);
}
/** Called when the system is ready to run third-party code but before it actually does so. */
@@ -164,6 +185,11 @@
bindToScoringServiceIfNeeded();
}
+ private void onUserUnlocked(int userId) {
+ registerPackageMonitorIfNeeded();
+ bindToScoringServiceIfNeeded();
+ }
+
private void registerPackageMonitorIfNeeded() {
if (DBG) Log.d(TAG, "registerPackageMonitorIfNeeded");
NetworkScorerAppData scorer = NetworkScorerAppManager.getActiveScorer(mContext);
@@ -216,6 +242,8 @@
// Make sure the connection is connected (idempotent)
mServiceConnection.connect(mContext);
+ } else { // otherwise make sure it isn't bound.
+ unbindFromScoringServiceIfNeeded();
}
}
diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java
index 2085f32..680547a 100644
--- a/services/core/java/com/android/server/PersistentDataBlockService.java
+++ b/services/core/java/com/android/server/PersistentDataBlockService.java
@@ -125,10 +125,20 @@
SystemProperties.set(OEM_UNLOCK_PROP, enabled ? "1" : "0");
}
- private void enforceOemUnlockPermission() {
+ private void enforceOemUnlockReadPermission() {
+ if (mContext.checkCallingOrSelfPermission(Manifest.permission.READ_OEM_UNLOCK_STATE)
+ == PackageManager.PERMISSION_DENIED
+ && mContext.checkCallingOrSelfPermission(Manifest.permission.OEM_UNLOCK_STATE)
+ == PackageManager.PERMISSION_DENIED) {
+ throw new SecurityException("Can't access OEM unlock state. Requires "
+ + "READ_OEM_UNLOCK_STATE or OEM_UNLOCK_STATE permission.");
+ }
+ }
+
+ private void enforceOemUnlockWritePermission() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.OEM_UNLOCK_STATE,
- "Can't access OEM unlock state");
+ "Can't modify OEM unlock state");
}
private void enforceUid(int callingUid) {
@@ -425,7 +435,7 @@
@Override
public void wipe() {
- enforceOemUnlockPermission();
+ enforceOemUnlockWritePermission();
synchronized (mLock) {
int ret = nativeWipe(mDataBlockFile);
@@ -442,7 +452,7 @@
if (ActivityManager.isUserAMonkey()) {
return;
}
- enforceOemUnlockPermission();
+ enforceOemUnlockWritePermission();
enforceIsAdmin();
synchronized (mLock) {
@@ -453,13 +463,13 @@
@Override
public boolean getOemUnlockEnabled() {
- enforceOemUnlockPermission();
+ enforceOemUnlockReadPermission();
return doGetOemUnlockEnabled();
}
@Override
public int getFlashLockState() {
- enforceOemUnlockPermission();
+ enforceOemUnlockReadPermission();
String locked = SystemProperties.get(FLASH_LOCK_PROP);
switch (locked) {
case FLASH_LOCK_LOCKED:
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index a9a53a2..4084542 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -432,6 +432,7 @@
final HashMap<String, Integer> knownAuth = getAuthenticatorTypeAndUIDForUser(
mAuthenticatorCache, accounts.userId);
+ boolean userUnlocked = isLocalUnlockedUser(accounts.userId);
synchronized (accounts.cacheLock) {
final SQLiteDatabase db = accounts.openHelper.getWritableDatabase();
@@ -530,7 +531,18 @@
if (obsoleteAuthType.contains(accountType)) {
Slog.w(TAG, "deleting account " + accountName + " because type "
+ accountType + "'s registered authenticator no longer exist.");
- db.delete(TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null);
+ db.beginTransaction();
+ try {
+ db.delete(TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null);
+ // Also delete from CE table if user is unlocked; if user is currently
+ // locked the account will be removed later by syncDeCeAccountsLocked
+ if (userUnlocked) {
+ db.delete(CE_TABLE_ACCOUNTS, ACCOUNTS_ID + "=" + accountId, null);
+ }
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
accountDeleted = true;
logRecord(db, DebugDbHelper.ACTION_AUTHENTICATOR_REMOVE, TABLE_ACCOUNTS,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7ed8123..897aa20 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -41,7 +41,6 @@
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
-import com.android.internal.util.ProgressReporter;
import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.DeviceIdleController;
@@ -98,7 +97,6 @@
import android.app.IUidObserver;
import android.app.IUserSwitchObserver;
import android.app.Instrumentation;
-import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -259,18 +257,17 @@
import static android.app.ActivityManager.DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT;
import static android.app.ActivityManager.RESIZE_MODE_PRESERVE_WINDOW;
import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
-import static android.app.ActivityManager.StackId.FIRST_STATIC_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-import static android.app.ActivityManager.StackId.LAST_STATIC_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.GET_PROVIDERS;
import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
@@ -570,6 +567,9 @@
// so that dispatch of foreground broadcasts gets precedence.
final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2];
+ BroadcastStats mLastBroadcastStats;
+ BroadcastStats mCurBroadcastStats;
+
BroadcastQueue broadcastQueueForIntent(Intent intent) {
final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST,
@@ -5375,17 +5375,18 @@
userId = mUserController.handleIncomingUser(pid, uid, userId, false,
ALLOW_FULL_ONLY, "clearApplicationUserData", null);
- final DevicePolicyManagerInternal dpmi = LocalServices
- .getService(DevicePolicyManagerInternal.class);
- if (dpmi != null && dpmi.hasDeviceOwnerOrProfileOwner(packageName, userId)) {
- throw new SecurityException("Cannot clear data for a device owner or a profile owner");
- }
long callingId = Binder.clearCallingIdentity();
try {
IPackageManager pm = AppGlobals.getPackageManager();
int pkgUid = -1;
synchronized(this) {
+ if (getPackageManagerInternalLocked().canPackageBeWiped(
+ userId, packageName)) {
+ throw new SecurityException(
+ "Cannot clear data for a device owner or a profile owner");
+ }
+
try {
pkgUid = pm.getPackageUid(packageName, MATCH_UNINSTALLED_PACKAGES, userId);
} catch (RemoteException e) {
@@ -6036,7 +6037,7 @@
if (appId < 0 && packageName != null) {
try {
appId = UserHandle.getAppId(AppGlobals.getPackageManager()
- .getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, userId));
+ .getPackageUid(packageName, MATCH_DEBUG_TRIAGED_MISSING, 0));
} catch (RemoteException e) {
}
}
@@ -7821,7 +7822,7 @@
return ActivityManager.APP_START_MODE_NORMAL;
}
- private ProviderInfo getProviderInfoLocked(String authority, int userHandle) {
+ private ProviderInfo getProviderInfoLocked(String authority, int userHandle, int pmFlags) {
ProviderInfo pi = null;
ContentProviderRecord cpr = mProviderMap.getProviderByName(authority, userHandle);
if (cpr != null) {
@@ -7829,7 +7830,8 @@
} else {
try {
pi = AppGlobals.getPackageManager().resolveContentProvider(
- authority, PackageManager.GET_URI_PERMISSION_PATTERNS, userHandle);
+ authority, PackageManager.GET_URI_PERMISSION_PATTERNS | pmFlags,
+ userHandle);
} catch (RemoteException ex) {
}
}
@@ -7952,7 +7954,8 @@
}
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission check: " +
grantUri.uri.toSafeString());
@@ -8079,7 +8082,8 @@
"Granting " + targetPkg + "/" + targetUid + " permission to " + grantUri);
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for grant: " + grantUri.toSafeString());
return;
@@ -8294,7 +8298,8 @@
final IPackageManager pm = AppGlobals.getPackageManager();
final String authority = grantUri.uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, grantUri.sourceUserId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission revoke: "
+ grantUri.toSafeString());
@@ -8391,7 +8396,8 @@
}
final String authority = uri.getAuthority();
- final ProviderInfo pi = getProviderInfoLocked(authority, userId);
+ final ProviderInfo pi = getProviderInfoLocked(authority, userId,
+ MATCH_DEBUG_TRIAGED_MISSING);
if (pi == null) {
Slog.w(TAG, "No content provider found for permission revoke: "
+ uri.toSafeString());
@@ -8625,8 +8631,11 @@
final long createdTime = readLongAttribute(in, ATTR_CREATED_TIME, now);
// Sanity check that provider still belongs to source package
+ // Both direct boot aware and unaware packages are fine as we
+ // will do filtering at query time to avoid multiple parsing.
final ProviderInfo pi = getProviderInfoLocked(
- uri.getAuthority(), sourceUserId);
+ uri.getAuthority(), sourceUserId, MATCH_DIRECT_BOOT_AWARE
+ | MATCH_DIRECT_BOOT_UNAWARE);
if (pi != null && sourcePkg.equals(pi.packageName)) {
int targetUid = -1;
try {
@@ -8805,8 +8814,30 @@
if (perms == null) {
Slog.w(TAG, "No permission grants found for " + packageName);
} else {
+ final int userId = UserHandle.getUserId(callingUid);
+ Set<String> existingAuthorities = null;
+
for (UriPermission perm : perms.values()) {
if (packageName.equals(perm.targetPkg) && perm.persistedModeFlags != 0) {
+ // Is this provider available in the current boot state? If the user
+ // is not running and unlocked we check if the provider package exists.
+ if (!mUserController.isUserRunningLocked(userId,
+ ActivityManager.FLAG_AND_UNLOCKED)) {
+ String authority = perm.uri.uri.getAuthority();
+ if (existingAuthorities == null
+ || !existingAuthorities.contains(authority)) {
+ ProviderInfo providerInfo = getProviderInfoLocked(authority,
+ userId, MATCH_DEBUG_TRIAGED_MISSING);
+ if (providerInfo != null) {
+ if (existingAuthorities == null) {
+ existingAuthorities = new ArraySet<>();
+ }
+ existingAuthorities.add(authority);
+ } else {
+ continue;
+ }
+ }
+ }
result.add(perm.buildPersistedPublicApiObject());
}
}
@@ -13771,6 +13802,8 @@
boolean dumpAll = false;
boolean dumpClient = false;
+ boolean dumpCheckin = false;
+ boolean dumpCheckinFormat = false;
String dumpPackage = null;
int opti = 0;
@@ -13793,6 +13826,10 @@
return;
}
dumpClient = true;
+ } else if ("--checkin".equals(opt)) {
+ dumpCheckin = dumpCheckinFormat = true;
+ } else if ("-C".equals(opt)) {
+ dumpCheckinFormat = true;
} else if ("-h".equals(opt)) {
ActivityManagerShellCommand.dumpHelp(pw, true);
return;
@@ -13831,6 +13868,27 @@
synchronized (this) {
dumpBroadcastsLocked(fd, pw, args, opti, true, dumpPackage);
}
+ } else if ("broadcast-stats".equals(cmd)) {
+ String[] newArgs;
+ String name;
+ if (opti >= args.length) {
+ name = null;
+ newArgs = EMPTY_STRING_ARRAY;
+ } else {
+ dumpPackage = args[opti];
+ opti++;
+ newArgs = new String[args.length - opti];
+ if (args.length > 2) System.arraycopy(args, opti, newArgs, 0,
+ args.length - opti);
+ }
+ synchronized (this) {
+ if (dumpCheckinFormat) {
+ dumpBroadcastStatsCheckinLocked(fd, pw, args, opti, dumpCheckin,
+ dumpPackage);
+ } else {
+ dumpBroadcastStatsLocked(fd, pw, args, opti, true, dumpPackage);
+ }
+ }
} else if ("intents".equals(cmd) || "i".equals(cmd)) {
String[] newArgs;
String name;
@@ -13961,7 +14019,9 @@
}
// No piece of data specified, dump everything.
- if (dumpClient) {
+ if (dumpCheckinFormat) {
+ dumpBroadcastStatsCheckinLocked(fd, pw, args, opti, dumpCheckin, dumpPackage);
+ } else if (dumpClient) {
ActiveServices.ServiceDumper sdumper;
synchronized (this) {
dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
@@ -13974,6 +14034,13 @@
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
+ if (dumpAll || dumpPackage != null) {
+ dumpBroadcastStatsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ }
dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage);
pw.println();
if (dumpAll) {
@@ -14025,6 +14092,13 @@
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
+ if (dumpAll || dumpPackage != null) {
+ dumpBroadcastStatsLocked(fd, pw, args, opti, dumpAll, dumpPackage);
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ }
dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage);
pw.println();
if (dumpAll) {
@@ -14975,6 +15049,58 @@
}
}
+ void dumpBroadcastStatsLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean dumpAll, String dumpPackage) {
+ if (mCurBroadcastStats == null) {
+ return;
+ }
+
+ pw.println("ACTIVITY MANAGER BROADCAST STATS STATE (dumpsys activity broadcast-stats)");
+ final long now = SystemClock.elapsedRealtime();
+ if (mLastBroadcastStats != null) {
+ pw.print(" Last stats (from ");
+ TimeUtils.formatDuration(mLastBroadcastStats.mStartRealtime, now, pw);
+ pw.print(" to ");
+ TimeUtils.formatDuration(mLastBroadcastStats.mEndRealtime, now, pw);
+ pw.print(", ");
+ TimeUtils.formatDuration(mLastBroadcastStats.mEndUptime
+ - mLastBroadcastStats.mStartUptime, pw);
+ pw.println(" uptime):");
+ if (!mLastBroadcastStats.dumpStats(pw, " ", dumpPackage)) {
+ pw.println(" (nothing)");
+ }
+ pw.println();
+ }
+ pw.print(" Current stats (from ");
+ TimeUtils.formatDuration(mCurBroadcastStats.mStartRealtime, now, pw);
+ pw.print(" to now, ");
+ TimeUtils.formatDuration(SystemClock.uptimeMillis()
+ - mCurBroadcastStats.mStartUptime, pw);
+ pw.println(" uptime):");
+ if (!mCurBroadcastStats.dumpStats(pw, " ", dumpPackage)) {
+ pw.println(" (nothing)");
+ }
+ }
+
+ void dumpBroadcastStatsCheckinLocked(FileDescriptor fd, PrintWriter pw, String[] args,
+ int opti, boolean fullCheckin, String dumpPackage) {
+ if (mCurBroadcastStats == null) {
+ return;
+ }
+
+ if (mLastBroadcastStats != null) {
+ mLastBroadcastStats.dumpCheckinStats(pw, dumpPackage);
+ if (fullCheckin) {
+ mLastBroadcastStats = null;
+ return;
+ }
+ }
+ mCurBroadcastStats.dumpCheckinStats(pw, dumpPackage);
+ if (fullCheckin) {
+ mCurBroadcastStats = null;
+ }
+ }
+
void dumpProvidersLocked(FileDescriptor fd, PrintWriter pw, String[] args,
int opti, boolean dumpAll, String dumpPackage) {
boolean needSep;
@@ -17948,11 +18074,34 @@
queue.enqueueOrderedBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
}
+ } else {
+ // There was nobody interested in the broadcast, but we still want to record
+ // that it happened.
+ if (intent.getComponent() == null && intent.getPackage() == null
+ && (intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) {
+ // This was an implicit broadcast... let's record it for posterity.
+ addBroadcastStatLocked(intent.getAction(), callerPackage, 0, 0, 0);
+ }
}
return ActivityManager.BROADCAST_SUCCESS;
}
+ final void addBroadcastStatLocked(String action, String srcPackage, int receiveCount,
+ int skipCount, long dispatchTime) {
+ final long now = SystemClock.elapsedRealtime();
+ if (mCurBroadcastStats == null ||
+ (mCurBroadcastStats.mStartRealtime +(24*60*60*1000) < now)) {
+ mLastBroadcastStats = mCurBroadcastStats;
+ if (mLastBroadcastStats != null) {
+ mLastBroadcastStats.mEndRealtime = SystemClock.elapsedRealtime();
+ mLastBroadcastStats.mEndUptime = SystemClock.uptimeMillis();
+ }
+ mCurBroadcastStats = new BroadcastStats();
+ }
+ mCurBroadcastStats.addBroadcast(action, srcPackage, receiveCount, skipCount, dispatchTime);
+ }
+
final Intent verifyBroadcastLocked(Intent intent) {
// Refuse possible leaked file descriptors
if (intent != null && intent.hasFileDescriptors() == true) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 9be6b43..adf6d36 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -197,6 +197,7 @@
pw.println(" a[ctivities]: activity stack state");
pw.println(" r[recents]: recent activities state");
pw.println(" b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state");
+ pw.println(" broadcast-stats [PACKAGE_NAME]: aggregated broadcast statistics");
pw.println(" i[ntents] [PACKAGE_NAME]: pending intent state");
pw.println(" p[rocesses] [PACKAGE_NAME]: process state");
pw.println(" o[om]: out of memory management");
@@ -216,12 +217,14 @@
pw.println(" -a: include all available server state.");
pw.println(" -c: include client state.");
pw.println(" -p: limit output to given package.");
+ pw.println(" --checkin: output checkin format, resetting data.");
+ pw.println(" --C: output checkin format, not resetting data.");
} else {
pw.println("Activity manager (activity) commands:");
pw.println(" help");
pw.println(" Print this help text.");
pw.println(" force-stop [--user <USER_ID> | all | current] <PACKAGE>");
- pw.println(" Complete stop the given application package.");
+ pw.println(" Completely stop the given application package.");
pw.println(" kill [--user <USER_ID> | all | current] <PACKAGE>");
pw.println(" Kill all processes associated with the given application.");
pw.println(" kill-all");
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 4439a24..df85cfa 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2581,11 +2581,14 @@
}
private void insertTaskAtTop(TaskRecord task, ActivityRecord newActivity) {
+ boolean isLastTaskOverHome = false;
// If the moving task is over home stack, transfer its return type to next task
if (task.isOverHomeStack()) {
final TaskRecord nextTask = getNextTask(task);
if (nextTask != null) {
nextTask.setTaskToReturnTo(task.getTaskToReturnTo());
+ } else {
+ isLastTaskOverHome = true;
}
}
@@ -2595,7 +2598,10 @@
ActivityStack lastStack = mStackSupervisor.getLastStack();
final boolean fromHome = lastStack.isHomeStack();
if (!isHomeStack() && (fromHome || topTask() != task)) {
- int returnToType = APPLICATION_ACTIVITY_TYPE;
+ // If it's a last task over home - we default to keep its return to type not to
+ // make underlying task focused when this one will be finished.
+ int returnToType = isLastTaskOverHome
+ ? task.getTaskToReturnTo() : APPLICATION_ACTIVITY_TYPE;
if (fromHome && StackId.allowTopTaskToReturnHome(mStackId)) {
returnToType = lastStack.topTask() == null
? HOME_ACTIVITY_TYPE : lastStack.topTask().taskType;
@@ -3764,7 +3770,8 @@
r.finishLaunchTickingLocked();
}
- private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
+ private void removeActivityFromHistoryLocked(
+ ActivityRecord r, TaskRecord oldTop, String reason) {
mStackSupervisor.removeChildActivityContainers(r);
finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
r.makeFinishingLocked();
@@ -3783,10 +3790,11 @@
validateAppTokensLocked();
}
final TaskRecord task = r.task;
+ final TaskRecord topTask = oldTop != null ? oldTop : topTask();
if (task != null && task.removeActivity(r)) {
if (DEBUG_STACK) Slog.i(TAG_STACK,
"removeActivityFromHistoryLocked: last activity removed from " + this);
- if (mStackSupervisor.isFocusedStack(this) && task == topTask() &&
+ if (mStackSupervisor.isFocusedStack(this) && task == topTask &&
task.isOverHomeStack()) {
mStackSupervisor.moveHomeStackTaskToTop(task.getTaskToReturnTo(), reason);
}
@@ -3922,6 +3930,12 @@
boolean removedFromHistory = false;
+ // If the activity is finishing, it's no longer considered in topRunningActivityLocked,
+ // and cleanUpActivityLocked() may change focus to another activity (or task).
+ // Get the current top task now, as removeActivityFromHistoryLocked() below need this
+ // to decide whether to return to home stack after removal.
+ final TaskRecord topTask = topTask();
+
cleanUpActivityLocked(r, false, false);
final boolean hadApp = r.app != null;
@@ -3956,7 +3970,8 @@
// up.
//Slog.w(TAG, "Exception thrown during finish", e);
if (r.finishing) {
- removeActivityFromHistoryLocked(r, reason + " exceptionInScheduleDestroy");
+ removeActivityFromHistoryLocked(
+ r, topTask, reason + " exceptionInScheduleDestroy");
removedFromHistory = true;
skipDestroy = true;
}
@@ -3987,7 +4002,7 @@
} else {
// remove this record from the history.
if (r.finishing) {
- removeActivityFromHistoryLocked(r, reason + " hadNoApp");
+ removeActivityFromHistoryLocked(r, topTask, reason + " hadNoApp");
removedFromHistory = true;
} else {
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (no app)");
@@ -4018,7 +4033,7 @@
if (isInStackLocked(r) != null) {
if (r.state == ActivityState.DESTROYING) {
cleanUpActivityLocked(r, true, false);
- removeActivityFromHistoryLocked(r, reason);
+ removeActivityFromHistoryLocked(r, null, reason);
}
}
mStackSupervisor.resumeFocusedStackTopActivityLocked();
@@ -4176,7 +4191,7 @@
}
cleanUpActivityLocked(r, true, true);
if (remove) {
- removeActivityFromHistoryLocked(r, "appDied");
+ removeActivityFromHistoryLocked(r, null, "appDied");
}
}
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 0e4c9a4..52c002d 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1097,21 +1097,7 @@
// Don't debug things in the system process
if (!aInfo.processName.equals("system")) {
if ((startFlags & ActivityManager.START_FLAG_DEBUG) != 0) {
- final ProcessRecord app = mService.getProcessRecordLocked(
- aInfo.processName, aInfo.applicationInfo.uid, true);
- // If the process already started, we can't wait for debugger and shouldn't
- // modify the debug settings.
- // For non-persistent debug, normally we set the debug app here, and restores
- // to the original at attachApplication time. However, if the app process
- // already exists, we won't get another attachApplication, and the debug setting
- // never gets restored. Furthermore, if we get two such calls back-to-back,
- // both mOrigDebugApp and mDebugApp will become the same app, and it won't be
- // cleared even if we get attachApplication after the app process is killed.
- if (app == null || app.thread == null) {
- mService.setDebugApp(aInfo.processName, true, false);
- } else {
- Slog.w(TAG, "Ignoring waitForDebugger because process already exists");
- }
+ mService.setDebugApp(aInfo.processName, true, false);
}
if ((startFlags & ActivityManager.START_FLAG_NATIVE_DEBUGGING) != 0) {
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 61b1317..522e42b 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -166,8 +166,9 @@
private Intent mNewTaskIntent;
private ActivityStack mSourceStack;
private ActivityStack mTargetStack;
- // TODO: Is the mMoveHome flag really needed?
- private boolean mMovedHome;
+ // Indicates that we moved other task and are going to put something on top soon, so
+ // we don't want to show it redundantly or accidentally change what's shown below.
+ private boolean mMovedOtherTask;
private boolean mMovedToFront;
private boolean mNoAnimation;
private boolean mKeepCurTransition;
@@ -204,7 +205,7 @@
mSourceStack = null;
mTargetStack = null;
- mMovedHome = false;
+ mMovedOtherTask = false;
mMovedToFront = false;
mNoAnimation = false;
mKeepCurTransition = false;
@@ -1013,7 +1014,6 @@
resumeTargetStackIfNeeded();
return START_RETURN_INTENT_TO_CALLER;
}
-
setTaskFromIntentActivity(mReusedActivity);
if (!mAddingToTask && mReuseTask == null) {
@@ -1082,7 +1082,7 @@
Slog.e(TAG, "Attempted Lock Task Mode violation mStartActivity=" + mStartActivity);
return START_RETURN_LOCK_TASK_MODE_VIOLATION;
}
- if (!mMovedHome) {
+ if (!mMovedOtherTask) {
updateTaskReturnToType(mStartActivity.task, mLaunchFlags, topStack);
}
} else if (mSourceRecord != null) {
@@ -1443,7 +1443,7 @@
if (mLaunchTaskBehind && mSourceRecord != null) {
intentActivity.setTaskToAffiliateWith(mSourceRecord.task);
}
- mMovedHome = true;
+ mMovedOtherTask = true;
// If the launch flags carry both NEW_TASK and CLEAR_TASK, the task's activities
// will be cleared soon by ActivityStarter in setTaskFromIntentActivity().
@@ -1521,6 +1521,10 @@
mReuseTask = intentActivity.task;
mReuseTask.performClearTaskLocked();
mReuseTask.setIntent(mStartActivity);
+ // When we clear the task - focus will be adjusted, which will bring another task
+ // to top before we launch the activity we need. This will temporary swap their
+ // mTaskToReturnTo values and we don't want to overwrite them accidentally.
+ mMovedOtherTask = true;
} else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
|| mLaunchSingleInstance || mLaunchSingleTask) {
ActivityRecord top = intentActivity.task.performClearTaskLocked(mStartActivity,
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 8ffc6f3..88645c1 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -898,6 +898,12 @@
// ... and on to the next...
addBroadcastToHistoryLocked(r);
+ if (r.intent.getComponent() == null && r.intent.getPackage() == null
+ && (r.intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY) == 0) {
+ // This was an implicit broadcast... let's record it for posterity.
+ mService.addBroadcastStatLocked(r.intent.getAction(), r.callerPackage,
+ r.manifestCount, r.manifestSkipCount, r.finishTime-r.dispatchTime);
+ }
mOrderedBroadcasts.remove(0);
r = null;
looped = true;
@@ -1083,6 +1089,11 @@
skip = true;
}
}
+ if (!skip) {
+ r.manifestCount++;
+ } else {
+ r.manifestSkipCount++;
+ }
if (r.curApp != null && r.curApp.crashing) {
// If the target process is crashing, just skip it.
Slog.w(TAG, "Skipping deliver ordered [" + mQueueName + "] " + r
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index e99cbf9..3437ae6 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -72,6 +72,8 @@
IBinder receiver; // who is currently running, null if none.
int state;
int anrCount; // has this broadcast record hit any ANRs?
+ int manifestCount; // number of manifest receivers dispatched.
+ int manifestSkipCount; // number of manifest receivers skipped.
BroadcastQueue queue; // the outbound queue handling this broadcast
static final int IDLE = 0;
diff --git a/services/core/java/com/android/server/am/BroadcastStats.java b/services/core/java/com/android/server/am/BroadcastStats.java
new file mode 100644
index 0000000..fdbaada
--- /dev/null
+++ b/services/core/java/com/android/server/am/BroadcastStats.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2016 The Android Open 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.am;
+
+import android.os.SystemClock;
+import android.util.ArrayMap;
+import android.util.TimeUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+public final class BroadcastStats {
+ final long mStartRealtime;
+ final long mStartUptime;
+ long mEndRealtime;
+ long mEndUptime;
+ final ArrayMap<String, ActionEntry> mActions = new ArrayMap<>();
+
+ static final Comparator<ActionEntry> ACTIONS_COMPARATOR = new Comparator<ActionEntry>() {
+ @Override public int compare(ActionEntry o1, ActionEntry o2) {
+ if (o1.mTotalDispatchTime < o2.mTotalDispatchTime) {
+ return -1;
+ }
+ if (o1.mTotalDispatchTime > o2.mTotalDispatchTime) {
+ return 1;
+ }
+ return 0;
+ }
+ };
+
+ static final class ActionEntry {
+ final String mAction;
+ final ArrayMap<String, PackageEntry> mPackages = new ArrayMap<>();
+ int mReceiveCount;
+ int mSkipCount;
+ long mTotalDispatchTime;
+ long mMaxDispatchTime;
+
+ ActionEntry(String action) {
+ mAction = action;
+ }
+ }
+
+ static final class PackageEntry {
+ int mSendCount;
+ }
+
+ public BroadcastStats() {
+ mStartRealtime = SystemClock.elapsedRealtime();
+ mStartUptime = SystemClock.uptimeMillis();
+ }
+
+ public void addBroadcast(String action, String srcPackage, int receiveCount,
+ int skipCount, long dispatchTime) {
+ ActionEntry ae = mActions.get(action);
+ if (ae == null) {
+ ae = new ActionEntry(action);
+ mActions.put(action, ae);
+ }
+ ae.mReceiveCount += receiveCount;
+ ae.mSkipCount += skipCount;
+ ae.mTotalDispatchTime += dispatchTime;
+ if (ae.mMaxDispatchTime < dispatchTime) {
+ ae.mMaxDispatchTime = dispatchTime;
+ }
+ PackageEntry pe = ae.mPackages.get(srcPackage);
+ if (pe == null) {
+ pe = new PackageEntry();
+ ae.mPackages.put(srcPackage, pe);
+ }
+ pe.mSendCount++;
+ }
+
+ public boolean dumpStats(PrintWriter pw, String prefix, String dumpPackage) {
+ boolean printedSomething = false;
+ ArrayList<ActionEntry> actions = new ArrayList<>(mActions.size());
+ for (int i=mActions.size()-1; i>=0; i--) {
+ actions.add(mActions.valueAt(i));
+ }
+ Collections.sort(actions, ACTIONS_COMPARATOR);
+ for (int i=actions.size()-1; i>=0; i--) {
+ ActionEntry ae = actions.get(i);
+ if (dumpPackage != null && !ae.mPackages.containsKey(dumpPackage)) {
+ continue;
+ }
+ printedSomething = true;
+ pw.print(prefix);
+ pw.print(ae.mAction);
+ pw.println(":");
+ pw.print(prefix);
+ pw.print(" Number received: ");
+ pw.print(ae.mReceiveCount);
+ pw.print(", skipped: ");
+ pw.println(ae.mSkipCount);
+ pw.print(prefix);
+ pw.print(" Total dispatch time: ");
+ TimeUtils.formatDuration(ae.mTotalDispatchTime, pw);
+ pw.print(", max: ");
+ TimeUtils.formatDuration(ae.mMaxDispatchTime, pw);
+ pw.println();
+ for (int j=ae.mPackages.size()-1; j>=0; j--) {
+ pw.print(prefix);
+ pw.print(" Package ");
+ pw.print(ae.mPackages.keyAt(j));
+ pw.print(": ");
+ PackageEntry pe = ae.mPackages.valueAt(j);
+ pw.print(pe.mSendCount);
+ pw.println(" times");
+ }
+ }
+ return printedSomething;
+ }
+
+ public void dumpCheckinStats(PrintWriter pw, String dumpPackage) {
+ pw.print("broadcast-stats,1,");
+ pw.print(mStartRealtime);
+ pw.print(",");
+ pw.print(mEndRealtime == 0 ? SystemClock.elapsedRealtime() : mEndRealtime);
+ pw.print(",");
+ pw.println((mEndUptime == 0 ? SystemClock.uptimeMillis() : mEndUptime) - mStartUptime);
+ for (int i=mActions.size()-1; i>=0; i--) {
+ ActionEntry ae = mActions.valueAt(i);
+ if (dumpPackage != null && !ae.mPackages.containsKey(dumpPackage)) {
+ continue;
+ }
+ pw.print("a,");
+ pw.print(mActions.keyAt(i));
+ pw.print(",");
+ pw.print(ae.mReceiveCount);
+ pw.print(",");
+ pw.print(ae.mSkipCount);
+ pw.print(",");
+ pw.print(ae.mTotalDispatchTime);
+ pw.print(",");
+ pw.print(ae.mMaxDispatchTime);
+ pw.println();
+ for (int j=ae.mPackages.size()-1; j>=0; j--) {
+ pw.print("p,");
+ pw.print(ae.mPackages.keyAt(j));
+ PackageEntry pe = ae.mPackages.valueAt(j);
+ pw.print(",");
+ pw.print(pe.mSendCount);
+ pw.println();
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java
index c1ff4dd..2467a90 100644
--- a/services/core/java/com/android/server/am/PendingIntentRecord.java
+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java
@@ -32,6 +32,7 @@
import android.os.TransactionTooLargeException;
import android.os.UserHandle;
import android.util.Slog;
+import android.util.TimeUtils;
import com.android.server.am.ActivityStackSupervisor.ActivityContainer;
@@ -397,7 +398,12 @@
pw.print(prefix); pw.print("sent="); pw.print(sent);
pw.print(" canceled="); pw.println(canceled);
}
- pw.print(prefix); pw.println("whitelistDuration="); pw.println(whitelistDuration);
+ if (whitelistDuration != 0) {
+ pw.print(prefix);
+ pw.print("whitelistDuration=");
+ TimeUtils.formatDuration(whitelistDuration, pw);
+ pw.println();
+ }
}
public String toString() {
@@ -412,7 +418,9 @@
sb.append(' ');
sb.append(key.typeName());
if (whitelistDuration > 0) {
- sb.append( " (whitelistDuration: ").append(whitelistDuration).append("ms)");
+ sb.append( " (whitelist: ");
+ TimeUtils.formatDuration(whitelistDuration, sb);
+ sb.append(")");
}
sb.append('}');
return stringName = sb.toString();
diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java
index cea76f2..ab5d4b6 100644
--- a/services/core/java/com/android/server/am/RecentTasks.java
+++ b/services/core/java/com/android/server/am/RecentTasks.java
@@ -621,6 +621,9 @@
for (int i = 0; i < recentsCount; i++) {
final TaskRecord tr = get(i);
if (task != tr) {
+ if (task.stack != tr.stack) {
+ continue;
+ }
if (task.userId != tr.userId) {
continue;
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 8932e4b..c84aaac 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -1537,6 +1537,11 @@
? Configuration.ORIENTATION_PORTRAIT
: Configuration.ORIENTATION_LANDSCAPE;
+ // Always set fontScale to be euqal to global. Can't set to 0, as that makes the override
+ // config not equal to EMPTY. Also can't set to 1, as Configuration.updateFrom will use
+ // the override scale as long as it's non-zero, and we'll always use 1.
+ config.fontScale = serviceConfig.fontScale;
+
// For calculating screen layout, we need to use the non-decor inset screen area for the
// calculation for compatibility reasons, i.e. screen area without system bars that could
// never go away in Honeycomb.
@@ -1564,6 +1569,7 @@
extracted.smallestScreenWidthDp = config.smallestScreenWidthDp;
extracted.orientation = config.orientation;
extracted.screenLayout = config.screenLayout;
+ extracted.fontScale = config.fontScale;
return extracted;
}
@@ -1597,6 +1603,9 @@
newScreenLayout = (newScreenLayout & ~SCREENLAYOUT_SIZE_MASK)
| (overrideScreenLayout & SCREENLAYOUT_SIZE_MASK);
mOverrideConfig.screenLayout = newScreenLayout;
+ // we never override the fontScale, however we need to copy over the global value
+ // so that the default 1.0 doesn't get applied as an override.
+ mOverrideConfig.fontScale = globalConfig.fontScale;
}
static Rect validateBounds(Rect bounds) {
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index f6232fe..4380af3 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -70,6 +70,7 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
@@ -83,6 +84,7 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.ArrayUtils;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
@@ -233,6 +235,11 @@
// storage is already unlocked.
if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
getUserManagerInternal().setUserState(userId, uss.state);
+
+ int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
+ MetricsLogger.histogram(mService.mContext, "framework_locked_boot_completed",
+ uptimeSeconds);
+
Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
@@ -389,6 +396,8 @@
}
Slog.d(TAG, "Sending BOOT_COMPLETE user #" + userId);
+ int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
+ MetricsLogger.histogram(mService.mContext, "framework_boot_completed", uptimeSeconds);
final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 1bdb48a..ebacc71 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -30,6 +30,7 @@
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -53,6 +54,7 @@
import android.net.NetworkMisc;
import android.net.RouteInfo;
import android.net.UidRange;
+import android.net.Uri;
import android.os.Binder;
import android.os.FileUtils;
import android.os.IBinder;
@@ -60,12 +62,14 @@
import android.os.Looper;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
+import android.os.PatternMatcher;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemService;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.security.Credentials;
import android.security.KeyStore;
import android.text.TextUtils;
@@ -163,6 +167,45 @@
// Handle of user initiating VPN.
private final int mUserHandle;
+ // Listen to package remove and change event in this user
+ private final BroadcastReceiver mPackageIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final Uri data = intent.getData();
+ final String packageName = data == null ? null : data.getSchemeSpecificPart();
+ if (packageName == null) {
+ return;
+ }
+
+ synchronized (Vpn.this) {
+ // Avoid race that always-on package has been unset
+ if (!packageName.equals(getAlwaysOnPackage())) {
+ return;
+ }
+
+ final String action = intent.getAction();
+ Log.i(TAG, "Received broadcast " + action + " for always-on package " + packageName
+ + " in user " + mUserHandle);
+
+ switch(action) {
+ case Intent.ACTION_PACKAGE_REPLACED:
+ // Start vpn after app upgrade
+ startAlwaysOnVpn();
+ break;
+ case Intent.ACTION_PACKAGE_REMOVED:
+ final boolean isPackageRemoved = !intent.getBooleanExtra(
+ Intent.EXTRA_REPLACING, false);
+ if (isPackageRemoved) {
+ setAndSaveAlwaysOnPackage(null, false);
+ }
+ break;
+ }
+ }
+ }
+ };
+
+ private boolean mIsPackageIntentReceiverRegistered = false;
+
public Vpn(Looper looper, Context context, INetworkManagementService netService,
int userHandle) {
mContext = context;
@@ -233,10 +276,37 @@
mAlwaysOn = (packageName != null);
mLockdown = (mAlwaysOn && lockdown);
+ maybeRegisterPackageChangeReceiverLocked(packageName);
setVpnForcedLocked(mLockdown);
return true;
}
+ private void unregisterPackageChangeReceiverLocked() {
+ // register previous intent filter
+ if (mIsPackageIntentReceiverRegistered) {
+ mContext.unregisterReceiver(mPackageIntentReceiver);
+ mIsPackageIntentReceiverRegistered = false;
+ }
+ }
+
+ private void maybeRegisterPackageChangeReceiverLocked(String packageName) {
+ // Unregister IntentFilter listening for previous always-on package change
+ unregisterPackageChangeReceiverLocked();
+
+ if (packageName != null) {
+ mIsPackageIntentReceiverRegistered = true;
+
+ IntentFilter intentFilter = new IntentFilter();
+ // Protected intent can only be sent by system. No permission required in register.
+ intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ intentFilter.addDataScheme("package");
+ intentFilter.addDataSchemeSpecificPart(packageName, PatternMatcher.PATTERN_LITERAL);
+ mContext.registerReceiverAsUser(
+ mPackageIntentReceiver, UserHandle.of(mUserHandle), intentFilter, null, null);
+ }
+ }
+
/**
* @return the package name of the VPN controller responsible for always-on VPN,
* or {@code null} if none is set or always-on VPN is controlled through
@@ -249,6 +319,69 @@
}
/**
+ * Save the always-on package and lockdown config into Settings.Secure
+ */
+ public synchronized void saveAlwaysOnPackage() {
+ final long token = Binder.clearCallingIdentity();
+ try {
+ final ContentResolver cr = mContext.getContentResolver();
+ Settings.Secure.putStringForUser(cr, Settings.Secure.ALWAYS_ON_VPN_APP,
+ getAlwaysOnPackage(), mUserHandle);
+ Settings.Secure.putIntForUser(cr, Settings.Secure.ALWAYS_ON_VPN_LOCKDOWN,
+ (mLockdown ? 1 : 0), mUserHandle);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ /**
+ * Set and save always-on package and lockdown config
+ * @see Vpn#setAlwaysOnPackage(String, boolean)
+ * @see Vpn#saveAlwaysOnPackage()
+ *
+ * @return result of Vpn#setAndSaveAlwaysOnPackage(String, boolean)
+ */
+ private synchronized boolean setAndSaveAlwaysOnPackage(String packageName, boolean lockdown) {
+ if (setAlwaysOnPackage(packageName, lockdown)) {
+ saveAlwaysOnPackage();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * @return {@code true} if the service was started, the service was already connected, or there
+ * was no always-on VPN to start. {@code false} otherwise.
+ */
+ public boolean startAlwaysOnVpn() {
+ final String alwaysOnPackage;
+ synchronized (this) {
+ alwaysOnPackage = getAlwaysOnPackage();
+ // Skip if there is no service to start.
+ if (alwaysOnPackage == null) {
+ return true;
+ }
+ // Skip if the service is already established. This isn't bulletproof: it's not bound
+ // until after establish(), so if it's mid-setup onStartCommand will be sent twice,
+ // which may restart the connection.
+ if (getNetworkInfo().isConnected()) {
+ return true;
+ }
+ }
+
+ // Start the VPN service declared in the app's manifest.
+ Intent serviceIntent = new Intent(VpnConfig.SERVICE_INTERFACE);
+ serviceIntent.setPackage(alwaysOnPackage);
+ try {
+ return mContext.startServiceAsUser(serviceIntent, UserHandle.of(mUserHandle)) != null;
+ } catch (RuntimeException e) {
+ Log.e(TAG, "VpnService " + serviceIntent + " failed to start", e);
+ return false;
+ }
+ }
+
+ /**
* Prepare for a VPN application. This method is designed to solve
* race conditions. It first compares the current prepared package
* with {@code oldPackage}. If they are the same, the prepared
@@ -270,11 +403,12 @@
*
* - oldPackage non-null, newPackage null: App calling VpnService#prepare().
* - oldPackage null, newPackage non-null: ConfirmDialog calling prepareVpn().
- * - oldPackage non-null, newPackage=LEGACY_VPN: Used internally to disconnect
+ * - oldPackage null, newPackage=LEGACY_VPN: Used internally to disconnect
* and revoke any current app VPN and re-prepare legacy vpn.
*
- * TODO: Rename the variables - or split this method into two - and end this
- * confusion.
+ * TODO: Rename the variables - or split this method into two - and end this confusion.
+ * TODO: b/29032008 Migrate code from prepare(oldPackage=non-null, newPackage=LEGACY_VPN)
+ * to prepare(oldPackage=null, newPackage=LEGACY_VPN)
*
* @param oldPackage The package name of the old VPN application
* @param newPackage The package name of the new VPN application
@@ -284,10 +418,7 @@
public synchronized boolean prepare(String oldPackage, String newPackage) {
if (oldPackage != null) {
// Stop an existing always-on VPN from being dethroned by other apps.
- // TODO: Replace TextUtils.equals by isCurrentPreparedPackage when ConnectivityService
- // can unset always-on after always-on package is uninstalled. Make sure when package
- // is reinstalled, the consent dialog is not shown.
- if (mAlwaysOn && !TextUtils.equals(mPackage, oldPackage)) {
+ if (mAlwaysOn && !isCurrentPreparedPackage(oldPackage)) {
return false;
}
@@ -318,9 +449,7 @@
enforceControlPermission();
// Stop an existing always-on VPN from being dethroned by other apps.
- // TODO: Replace TextUtils.equals by isCurrentPreparedPackage when ConnectivityService
- // can unset always-on after always-on package is uninstalled
- if (mAlwaysOn && !TextUtils.equals(mPackage, newPackage)) {
+ if (mAlwaysOn && !isCurrentPreparedPackage(newPackage)) {
return false;
}
@@ -862,6 +991,7 @@
setVpnForcedLocked(false);
mAlwaysOn = false;
+ unregisterPackageChangeReceiverLocked();
// Quit any active connections
agentDisconnect();
}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 142426d..cc556c7 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -96,7 +96,7 @@
private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30*1000;
private static final int MAX_FAILED_ATTEMPTS = 5;
- private static final long CANCEL_TIMEOUT_LIMIT = 300; // max wait for onCancel() from HAL,in ms
+ private static final long CANCEL_TIMEOUT_LIMIT = 3000; // max wait for onCancel() from HAL,in ms
private final String mKeyguardPackage;
private int mCurrentUserId = UserHandle.USER_CURRENT;
private final FingerprintUtils mFingerprintUtils = FingerprintUtils.getInstance();
diff --git a/services/core/java/com/android/server/notification/ScheduleCalendar.java b/services/core/java/com/android/server/notification/ScheduleCalendar.java
index 9267d82..22ca702 100644
--- a/services/core/java/com/android/server/notification/ScheduleCalendar.java
+++ b/services/core/java/com/android/server/notification/ScheduleCalendar.java
@@ -58,11 +58,7 @@
final long nextEnd = getNextTime(now, mSchedule.endHour, mSchedule.endMinute);
long nextScheduleTime = Math.min(nextStart, nextEnd);
- if (mSchedule.exitAtAlarm && mSchedule.nextAlarm > now) {
- return Math.min(nextScheduleTime, mSchedule.nextAlarm);
- } else {
- return nextScheduleTime;
- }
+ return nextScheduleTime;
}
private long getNextTime(long now, int hr, int min) {
@@ -124,4 +120,4 @@
mCalendar.add(Calendar.DATE, days);
return mCalendar.getTimeInMillis();
}
-}
\ No newline at end of file
+}
diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
index e3dcf14..8197544 100644
--- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
+++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java
@@ -43,8 +43,8 @@
* Built-in zen condition provider for daily scheduled time-based conditions.
*/
public class ScheduleConditionProvider extends SystemConditionProviderService {
- private static final String TAG = "ConditionProviders.SCP";
- private static final boolean DEBUG = true || Log.isLoggable("ConditionProviders", Log.DEBUG);
+ static final String TAG = "ConditionProviders.SCP";
+ static final boolean DEBUG = true || Log.isLoggable("ConditionProviders", Log.DEBUG);
public static final ComponentName COMPONENT =
new ComponentName("android", ScheduleConditionProvider.class.getName());
@@ -154,6 +154,9 @@
cal.maybeSetNextAlarm(now, nextUserAlarmTime);
} else {
notifyCondition(conditionId, Condition.STATE_FALSE, "!meetsSchedule");
+ if (nextUserAlarmTime == 0) {
+ cal.maybeSetNextAlarm(now, nextUserAlarmTime);
+ }
}
if (cal != null) {
final long nextChangeTime = cal.getNextChangeTime(now);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3999d18..f2fde0f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -102,11 +102,11 @@
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.app.ResourcesManager;
-import android.app.admin.DevicePolicyManagerInternal;
import android.app.admin.IDevicePolicyManager;
import android.app.admin.SecurityLog;
import android.app.backup.IBackupManager;
@@ -504,8 +504,9 @@
public static final int REASON_NON_SYSTEM_LIBRARY = 5;
public static final int REASON_SHARED_APK = 6;
public static final int REASON_FORCED_DEXOPT = 7;
+ public static final int REASON_CORE_APP = 8;
- public static final int REASON_LAST = REASON_FORCED_DEXOPT;
+ public static final int REASON_LAST = REASON_CORE_APP;
/** Special library name that skips shared libraries check during compilation. */
private static final String SKIP_SHARED_LIBRARY_CHECK = "&";
@@ -621,6 +622,8 @@
@GuardedBy("mPackages")
final ArraySet<String> mFrozenPackages = new ArraySet<>();
+ final ProtectedPackages mProtectedPackages = new ProtectedPackages();
+
boolean mRestoredSettings;
// System configuration read by SystemConfig.
@@ -2741,6 +2744,41 @@
// can downgrade to reader
mSettings.writeLPr();
+ // Perform dexopt on all apps that mark themselves as coreApps. We do this pretty
+ // early on (before the package manager declares itself as early) because other
+ // components in the system server might ask for package contexts for these apps.
+ //
+ // Note that "onlyCore" in this context means the system is encrypted or encrypting
+ // (i.e, that the data partition is unavailable).
+ if ((isFirstBoot() || isUpgrade() || VMRuntime.didPruneDalvikCache()) && !onlyCore) {
+ long start = System.nanoTime();
+ List<PackageParser.Package> coreApps = new ArrayList<>();
+ for (PackageParser.Package pkg : mPackages.values()) {
+ if (pkg.coreApp) {
+ coreApps.add(pkg);
+ }
+ }
+
+ int[] stats = performDexOpt(coreApps, false,
+ getCompilerFilterForReason(REASON_CORE_APP));
+
+ final int elapsedTimeSeconds =
+ (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start);
+ MetricsLogger.histogram(mContext, "opt_coreapps_time_s", elapsedTimeSeconds);
+
+ if (DEBUG_DEXOPT) {
+ Slog.i(TAG, "Dex-opt core apps took : " + elapsedTimeSeconds + " seconds (" +
+ stats[0] + ", " + stats[1] + ", " + stats[2] + ")");
+ }
+
+
+ // TODO: Should we log these stats to tron too ?
+ // MetricsLogger.histogram(mContext, "opt_coreapps_num_dexopted", stats[0]);
+ // MetricsLogger.histogram(mContext, "opt_coreapps_num_skipped", stats[1]);
+ // MetricsLogger.histogram(mContext, "opt_coreapps_num_failed", stats[2]);
+ // MetricsLogger.histogram(mContext, "opt_coreapps_num_total", coreApps.size());
+ }
+
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
SystemClock.uptimeMillis());
@@ -7229,12 +7267,34 @@
pkgs = PackageManagerServiceUtils.getPackagesForDexopt(mPackages.values(), this);
}
+ final long startTime = System.nanoTime();
+ final int[] stats = performDexOpt(pkgs, mIsPreNUpgrade /* showDialog */,
+ getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT));
+
+ final int elapsedTimeSeconds =
+ (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
+
+ MetricsLogger.histogram(mContext, "opt_dialog_num_dexopted", stats[0]);
+ MetricsLogger.histogram(mContext, "opt_dialog_num_skipped", stats[1]);
+ MetricsLogger.histogram(mContext, "opt_dialog_num_failed", stats[2]);
+ MetricsLogger.histogram(mContext, "opt_dialog_num_total", getOptimizablePackages().size());
+ MetricsLogger.histogram(mContext, "opt_dialog_time_s", elapsedTimeSeconds);
+ }
+
+ /**
+ * Performs dexopt on the set of packages in {@code packages} and returns an int array
+ * containing statistics about the invocation. The array consists of three elements,
+ * which are (in order) {@code numberOfPackagesOptimized}, {@code numberOfPackagesSkipped}
+ * and {@code numberOfPackagesFailed}.
+ */
+ private int[] performDexOpt(List<PackageParser.Package> pkgs, boolean showDialog,
+ String compilerFilter) {
+
int numberOfPackagesVisited = 0;
int numberOfPackagesOptimized = 0;
int numberOfPackagesSkipped = 0;
int numberOfPackagesFailed = 0;
final int numberOfPackagesToDexopt = pkgs.size();
- final long startTime = System.nanoTime();
for (PackageParser.Package pkg : pkgs) {
numberOfPackagesVisited++;
@@ -7252,7 +7312,7 @@
numberOfPackagesToDexopt + ": " + pkg.packageName);
}
- if (mIsPreNUpgrade) {
+ if (showDialog) {
try {
ActivityManagerNative.getDefault().showBootMessage(
mContext.getResources().getString(R.string.android_upgrading_apk,
@@ -7268,7 +7328,7 @@
// trade-off worth doing to save boot time work.
int dexOptStatus = performDexOptTraced(pkg.packageName,
false /* checkProfiles */,
- getCompilerFilterForReason(causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT),
+ compilerFilter,
false /* force */);
switch (dexOptStatus) {
case PackageDexOptimizer.DEX_OPT_PERFORMED:
@@ -7286,13 +7346,8 @@
}
}
- final int elapsedTimeSeconds =
- (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
- MetricsLogger.histogram(mContext, "opt_dialog_num_dexopted", numberOfPackagesOptimized);
- MetricsLogger.histogram(mContext, "opt_dialog_num_skipped", numberOfPackagesSkipped);
- MetricsLogger.histogram(mContext, "opt_dialog_num_failed", numberOfPackagesFailed);
- MetricsLogger.histogram(mContext, "opt_dialog_num_total", getOptimizablePackages().size());
- MetricsLogger.histogram(mContext, "opt_dialog_time_s", elapsedTimeSeconds);
+ return new int[] { numberOfPackagesOptimized, numberOfPackagesSkipped,
+ numberOfPackagesFailed };
}
@Override
@@ -7467,9 +7522,11 @@
throw new IllegalArgumentException("Unknown package: " + packageName);
}
}
- /* Only the shell or the app user should be able to dump profiles. */
+ /* Only the shell, root, or the app user should be able to dump profiles. */
int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SHELL_UID && callingUid != pkg.applicationInfo.uid) {
+ if (callingUid != Process.SHELL_UID &&
+ callingUid != Process.ROOT_UID &&
+ callingUid != pkg.applicationInfo.uid) {
throw new SecurityException("dumpProfiles");
}
@@ -7477,16 +7534,7 @@
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dump profiles");
final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid);
try {
- final File codeFile = new File(pkg.applicationInfo.getCodePath());
- List<String> allCodePaths = Collections.EMPTY_LIST;
- if (codeFile != null && codeFile.exists()) {
- try {
- final PackageLite codePkg = PackageParser.parsePackageLite(codeFile, 0);
- allCodePaths = codePkg.getAllCodePaths();
- } catch (PackageParserException e) {
- // Well, we tried.
- }
- }
+ List<String> allCodePaths = pkg.getAllCodePathsExcludingResourceOnly();
String gid = Integer.toString(sharedGid);
String codePaths = TextUtils.join(";", allCodePaths);
mInstaller.dumpProfiles(gid, packageName, codePaths);
@@ -7618,15 +7666,17 @@
return;
}
destroyAppProfilesLeafLIF(pkg);
- destroyAppReferenceProfileLeafLIF(pkg, userId);
+ destroyAppReferenceProfileLeafLIF(pkg, userId, true /* removeBaseMarker */);
final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
destroyAppProfilesLeafLIF(pkg.childPackages.get(i));
- destroyAppReferenceProfileLeafLIF(pkg.childPackages.get(i), userId);
+ destroyAppReferenceProfileLeafLIF(pkg.childPackages.get(i), userId,
+ true /* removeBaseMarker */);
}
}
- private void destroyAppReferenceProfileLeafLIF(PackageParser.Package pkg, int userId) {
+ private void destroyAppReferenceProfileLeafLIF(PackageParser.Package pkg, int userId,
+ boolean removeBaseMarker) {
if (pkg.isForwardLocked()) {
return;
}
@@ -7643,11 +7693,13 @@
final String useMarker = path.replace('/', '@');
for (int realUserId : resolveUserIds(userId)) {
File profileDir = Environment.getDataProfilesDeForeignDexDirectory(realUserId);
- File foreignUseMark = new File(profileDir, useMarker);
- if (foreignUseMark.exists()) {
- if (!foreignUseMark.delete()) {
- Slog.w(TAG, "Unable to delete foreign user mark for package: "
- + pkg.packageName);
+ if (removeBaseMarker) {
+ File foreignUseMark = new File(profileDir, useMarker);
+ if (foreignUseMark.exists()) {
+ if (!foreignUseMark.delete()) {
+ Slog.w(TAG, "Unable to delete foreign user mark for package: "
+ + pkg.packageName);
+ }
}
}
@@ -7685,7 +7737,10 @@
return;
}
clearAppProfilesLeafLIF(pkg);
- destroyAppReferenceProfileLeafLIF(pkg, userId);
+ // We don't remove the base foreign use marker when clearing profiles because
+ // we will rename it when the app is updated. Unlike the actual profile contents,
+ // the foreign use marker is good across installs.
+ destroyAppReferenceProfileLeafLIF(pkg, userId, false /* removeBaseMarker */);
final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0;
for (int i = 0; i < childCount; i++) {
clearAppProfilesLeafLIF(pkg.childPackages.get(i));
@@ -8559,6 +8614,14 @@
synchronized (mPackages) {
// We don't expect installation to fail beyond this point
+ if (pkgSetting.pkg != null) {
+ // Note that |user| might be null during the initial boot scan. If a codePath
+ // for an app has changed during a boot scan, it's due to an app update that's
+ // part of the system partition and marker changes must be applied to all users.
+ maybeRenameForeignDexMarkers(pkgSetting.pkg, pkg,
+ (user != null) ? user : UserHandle.ALL);
+ }
+
// Add the new setting to mSettings
mSettings.insertPackageSettingLPw(pkgSetting, pkg);
// Add the new setting to mPackages
@@ -8918,6 +8981,74 @@
return pkg;
}
+ private void maybeRenameForeignDexMarkers(PackageParser.Package existing,
+ PackageParser.Package update, UserHandle user) {
+ if (existing.applicationInfo == null || update.applicationInfo == null) {
+ // This isn't due to an app installation.
+ return;
+ }
+
+ final File oldCodePath = new File(existing.applicationInfo.getCodePath());
+ final File newCodePath = new File(update.applicationInfo.getCodePath());
+
+ // The codePath hasn't changed, so there's nothing for us to do.
+ if (Objects.equals(oldCodePath, newCodePath)) {
+ return;
+ }
+
+ File canonicalNewCodePath;
+ try {
+ canonicalNewCodePath = new File(PackageManagerServiceUtils.realpath(newCodePath));
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed to get canonical path.", e);
+ return;
+ }
+
+ // This is a bit of a hack. The oldCodePath doesn't exist at this point (because
+ // we've already renamed / deleted it) so we cannot call realpath on it. Here we assume
+ // that the last component of the path (i.e, the name) doesn't need canonicalization
+ // (i.e, that it isn't ".", ".." or a symbolic link). This is a valid assumption for now
+ // but may change in the future. Hopefully this function won't exist at that point.
+ final File canonicalOldCodePath = new File(canonicalNewCodePath.getParentFile(),
+ oldCodePath.getName());
+
+ // Calculate the prefixes of the markers. These are just the paths with "/" replaced
+ // with "@".
+ String oldMarkerPrefix = canonicalOldCodePath.getAbsolutePath().replace('/', '@');
+ if (!oldMarkerPrefix.endsWith("@")) {
+ oldMarkerPrefix += "@";
+ }
+ String newMarkerPrefix = canonicalNewCodePath.getAbsolutePath().replace('/', '@');
+ if (!newMarkerPrefix.endsWith("@")) {
+ newMarkerPrefix += "@";
+ }
+
+ List<String> updatedPaths = update.getAllCodePathsExcludingResourceOnly();
+ List<String> markerSuffixes = new ArrayList<String>(updatedPaths.size());
+ for (String updatedPath : updatedPaths) {
+ String updatedPathName = new File(updatedPath).getName();
+ markerSuffixes.add(updatedPathName.replace('/', '@'));
+ }
+
+ for (int userId : resolveUserIds(user.getIdentifier())) {
+ File profileDir = Environment.getDataProfilesDeForeignDexDirectory(userId);
+
+ for (String markerSuffix : markerSuffixes) {
+ File oldForeignUseMark = new File(profileDir, oldMarkerPrefix + markerSuffix);
+ File newForeignUseMark = new File(profileDir, newMarkerPrefix + markerSuffix);
+ if (oldForeignUseMark.exists()) {
+ try {
+ Os.rename(oldForeignUseMark.getAbsolutePath(),
+ newForeignUseMark.getAbsolutePath());
+ } catch (ErrnoException e) {
+ Slog.w(TAG, "Failed to rename foreign use marker", e);
+ oldForeignUseMark.delete();
+ }
+ }
+ }
+ }
+ }
+
/**
* Derive the ABI of a non-system package located at {@code scanFile}. This information
* is derived purely on the basis of the contents of {@code scanFile} and
@@ -16209,8 +16340,9 @@
for (int curUser : users) {
long timeout = SystemClock.uptimeMillis() + 5000;
synchronized (conn) {
- long now = SystemClock.uptimeMillis();
- while (conn.mContainerService == null && now < timeout) {
+ long now;
+ while (conn.mContainerService == null &&
+ (now = SystemClock.uptimeMillis()) < timeout) {
try {
conn.wait(timeout - now);
} catch (InterruptedException e) {
@@ -16249,6 +16381,8 @@
try (PackageFreezer freezer = freezePackage(packageName, "clearApplicationProfileData")) {
synchronized (mInstallLock) {
clearAppProfilesLIF(pkg, UserHandle.USER_ALL);
+ destroyAppReferenceProfileLeafLIF(pkg, UserHandle.USER_ALL,
+ true /* removeBaseMarker */);
}
}
}
@@ -16262,9 +16396,7 @@
enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */, "clear application data");
- final DevicePolicyManagerInternal dpmi = LocalServices
- .getService(DevicePolicyManagerInternal.class);
- if (dpmi != null && dpmi.hasDeviceOwnerOrProfileOwner(packageName, userId)) {
+ if (mProtectedPackages.canPackageBeWiped(userId, packageName)) {
throw new SecurityException("Cannot clear data for a device owner or a profile owner");
}
// Queue up an async operation since the package deletion may take a little while.
@@ -17591,10 +17723,8 @@
+ Binder.getCallingPid()
+ ", uid=" + uid + ", package uid=" + pkgSetting.appId);
}
- // Don't allow changing profile and device owners. Calling into DPMS, so no locking.
- final DevicePolicyManagerInternal dpmi = LocalServices
- .getService(DevicePolicyManagerInternal.class);
- if (dpmi != null && dpmi.hasDeviceOwnerOrProfileOwner(packageName, userId)) {
+ // Don't allow changing profile and device owners.
+ if (mProtectedPackages.canPackageStateBeChanged(userId, packageName)) {
throw new SecurityException("Cannot disable a device owner or a profile owner");
}
}
@@ -20691,6 +20821,20 @@
int userId) {
return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId);
}
+
+ @Override
+ public void setDeviceAndProfileOwnerPackages(
+ int deviceOwnerUserId, String deviceOwnerPackage,
+ SparseArray<String> profileOwnerPackages) {
+ mProtectedPackages.setDeviceAndProfileOwnerPackages(
+ deviceOwnerUserId, deviceOwnerPackage, profileOwnerPackages);
+ }
+
+ @Override
+ public boolean canPackageBeWiped(int userId, String packageName) {
+ return mProtectedPackages.canPackageBeWiped(userId,
+ packageName);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
index a7512db..8a3f48e 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
@@ -27,7 +27,7 @@
// Names for compilation reasons.
static final String REASON_STRINGS[] = {
"first-boot", "boot", "install", "bg-dexopt", "ab-ota", "nsys-library", "shared-apk",
- "forced-dexopt"
+ "forced-dexopt", "core-app"
};
// Static block to ensure the strings array is of the right length.
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index 05f5b8f..07dc404 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1448,6 +1448,9 @@
pw.println(" -s: short summary");
pw.println(" -d: only list dangerous permissions");
pw.println(" -u: list only the permissions users will see");
+ pw.println(" dump-profiles TARGET-PACKAGE");
+ pw.println(" Dumps method/class profile files to");
+ pw.println(" /data/misc/profman/TARGET-PACKAGE.txt");
pw.println(" resolve-activity [--brief] [--components] [--user USER_ID] INTENT");
pw.println(" Prints the activity that resolves to the given Intent.");
pw.println(" query-activities [--brief] [--components] [--user USER_ID] INTENT");
diff --git a/services/core/java/com/android/server/pm/ProtectedPackages.java b/services/core/java/com/android/server/pm/ProtectedPackages.java
new file mode 100644
index 0000000..7bdea18
--- /dev/null
+++ b/services/core/java/com/android/server/pm/ProtectedPackages.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import android.annotation.UserIdInt;
+import android.os.UserHandle;
+import android.util.SparseArray;
+
+/**
+ * Manages package names that need special protection.
+ *
+ * TODO: This class should persist the information by itself, and also keeps track of device admin
+ * packages for all users. Then PMS.isPackageDeviceAdmin() should use it instead of talking
+ * to DPMS.
+ */
+public class ProtectedPackages {
+ @UserIdInt
+ private int mDeviceOwnerUserId;
+
+ private String mDeviceOwnerPackage;
+
+ private SparseArray<String> mProfileOwnerPackages;
+
+ private final Object mLock = new Object();
+
+ /**
+ * Sets the device/profile owner information.
+ */
+ public void setDeviceAndProfileOwnerPackages(
+ int deviceOwnerUserId, String deviceOwnerPackage,
+ SparseArray<String> profileOwnerPackages) {
+ synchronized (mLock) {
+ mDeviceOwnerUserId = deviceOwnerUserId;
+ mDeviceOwnerPackage =
+ (deviceOwnerUserId == UserHandle.USER_NULL) ? null : deviceOwnerPackage;
+ mProfileOwnerPackages = (profileOwnerPackages == null) ? null
+ : profileOwnerPackages.clone();
+ }
+ }
+
+ private boolean hasDeviceOwnerOrProfileOwner(int userId, String packageName) {
+ if (packageName == null) {
+ return false;
+ }
+ synchronized (mLock) {
+ if (mDeviceOwnerPackage != null) {
+ if ((mDeviceOwnerUserId == userId)
+ && (packageName.equals(mDeviceOwnerPackage))) {
+ return true;
+ }
+ }
+ if (mProfileOwnerPackages != null) {
+ if (packageName.equals(mProfileOwnerPackages.get(userId))) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Whether a package or the components in a package's enabled state can be changed
+ * by other callers than itself.
+ */
+ public boolean canPackageStateBeChanged(@UserIdInt int userId, String packageName) {
+ return hasDeviceOwnerOrProfileOwner(userId, packageName);
+ }
+
+ /**
+ * Whether a package's data be cleared.
+ */
+ public boolean canPackageBeWiped(@UserIdInt int userId, String packageName) {
+ return hasDeviceOwnerOrProfileOwner(userId, packageName);
+ }
+}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index b916790..dd34ebcf 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -30,6 +30,7 @@
import android.app.IActivityManager;
import android.app.IStopUserCallback;
import android.app.KeyguardManager;
+import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -167,6 +168,12 @@
private static final String RESTRICTIONS_FILE_PREFIX = "res_";
private static final String XML_SUFFIX = ".xml";
+ private static final int ALLOWED_FLAGS_FOR_CREATE_USERS_PERMISSION =
+ UserInfo.FLAG_MANAGED_PROFILE
+ | UserInfo.FLAG_EPHEMERAL
+ | UserInfo.FLAG_RESTRICTED
+ | UserInfo.FLAG_GUEST;
+
private static final int MIN_USER_ID = 10;
// We need to keep process uid within Integer.MAX_VALUE.
private static final int MAX_USER_ID = Integer.MAX_VALUE / UserHandle.PER_USER_RANGE;
@@ -322,6 +329,27 @@
private final LockPatternUtils mLockPatternUtils;
+ private final String ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK =
+ "com.android.server.pm.DISABLE_QUIET_MODE_AFTER_UNLOCK";
+
+ private final BroadcastReceiver mDisableQuietModeCallback = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK.equals(intent.getAction())) {
+ final IntentSender target = intent.getParcelableExtra(Intent.EXTRA_INTENT);
+ final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_ID, 0);
+ setQuietModeEnabled(userHandle, false);
+ if (target != null) {
+ try {
+ mContext.startIntentSender(target, null, 0, 0, 0);
+ } catch (IntentSender.SendIntentException e) {
+ /* ignore */
+ }
+ }
+ }
+ }
+ };
+
/**
* Whether all users should be created ephemeral.
*/
@@ -414,6 +442,9 @@
// user restriction was not a default guest restriction.
setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, currentGuestUser.id);
}
+ mContext.registerReceiver(mDisableQuietModeCallback,
+ new IntentFilter(ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK),
+ null, mHandler);
}
@Override
@@ -465,7 +496,7 @@
@Override
public @NonNull List<UserInfo> getUsers(boolean excludeDying) {
- checkManageUsersPermission("query users");
+ checkManageOrCreateUsersPermission("query users");
synchronized (mUsersLock) {
ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUsers.size());
final int userSize = mUsers.size();
@@ -703,6 +734,7 @@
@Override
public boolean trySetQuietModeDisabled(int userHandle, IntentSender target) {
+ checkManageUsersPermission("silence profile");
if (StorageManager.isUserKeyUnlocked(userHandle)
|| !mLockPatternUtils.isSecure(userHandle)) {
// if the user is already unlocked, no need to show a profile challenge
@@ -723,9 +755,24 @@
if (unlockIntent == null) {
return false;
}
+ final Intent callBackIntent = new Intent(
+ ACTION_DISABLE_QUIET_MODE_AFTER_UNLOCK);
if (target != null) {
- unlockIntent.putExtra(Intent.EXTRA_INTENT, target);
+ callBackIntent.putExtra(Intent.EXTRA_INTENT, target);
}
+ callBackIntent.putExtra(Intent.EXTRA_USER_ID, userHandle);
+ callBackIntent.setPackage(mContext.getPackageName());
+ callBackIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext,
+ 0,
+ callBackIntent,
+ PendingIntent.FLAG_CANCEL_CURRENT |
+ PendingIntent.FLAG_ONE_SHOT |
+ PendingIntent.FLAG_IMMUTABLE);
+ // After unlocking the challenge, it will disable quiet mode and run the original
+ // intentSender
+ unlockIntent.putExtra(Intent.EXTRA_INTENT, pendingIntent.getIntentSender());
unlockIntent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
mContext.startActivity(unlockIntent);
} finally {
@@ -1407,6 +1454,41 @@
}
/**
+ * Enforces that only the system UID or root's UID or apps that have the
+ * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} or
+ * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS}
+ * can make certain calls to the UserManager.
+ *
+ * @param message used as message if SecurityException is thrown
+ * @throws SecurityException if the caller is not system or root
+ * @see #hasManageOrCreateUsersPermission()
+ */
+ private static final void checkManageOrCreateUsersPermission(String message) {
+ if (!hasManageOrCreateUsersPermission()) {
+ throw new SecurityException(
+ "You either need MANAGE_USERS or CREATE_USERS permission to: " + message);
+ }
+ }
+
+ /**
+ * Similar to {@link #checkManageOrCreateUsersPermission(String)} but when the caller is tries
+ * to create user/profiles other than what is allowed for
+ * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS} permission, then it will only
+ * allow callers with {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} permission.
+ */
+ private static final void checkManageOrCreateUsersPermission(int creationFlags) {
+ if ((creationFlags & ~ALLOWED_FLAGS_FOR_CREATE_USERS_PERMISSION) == 0) {
+ if (!hasManageOrCreateUsersPermission()) {
+ throw new SecurityException("You either need MANAGE_USERS or CREATE_USERS "
+ + "permission to create an user with flags: " + creationFlags);
+ }
+ } else if (!hasManageUsersPermission()) {
+ throw new SecurityException("You need MANAGE_USERS permission to create an user "
+ + " with flags: " + creationFlags);
+ }
+ }
+
+ /**
* @return whether the calling UID is system UID or root's UID or the calling app has the
* {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS}.
*/
@@ -1420,6 +1502,23 @@
}
/**
+ * @return whether the calling UID is system UID or root's UID or the calling app has the
+ * {@link android.Manifest.permission#MANAGE_USERS MANAGE_USERS} or
+ * {@link android.Manifest.permission#CREATE_USERS CREATE_USERS}.
+ */
+ private static final boolean hasManageOrCreateUsersPermission() {
+ final int callingUid = Binder.getCallingUid();
+ return UserHandle.isSameApp(callingUid, Process.SYSTEM_UID)
+ || callingUid == Process.ROOT_UID
+ || ActivityManager.checkComponentPermission(
+ android.Manifest.permission.MANAGE_USERS,
+ callingUid, -1, true) == PackageManager.PERMISSION_GRANTED
+ || ActivityManager.checkComponentPermission(
+ android.Manifest.permission.CREATE_USERS,
+ callingUid, -1, true) == PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
* Enforces that only the system UID or root's UID (on any user) can make certain calls to the
* UserManager.
*
@@ -2005,13 +2104,13 @@
@Override
public UserInfo createProfileForUser(String name, int flags, int userId) {
- checkManageUsersPermission("Only the system can create users");
+ checkManageOrCreateUsersPermission(flags);
return createUserInternal(name, flags, userId);
}
@Override
public UserInfo createUser(String name, int flags) {
- checkManageUsersPermission("Only the system can create users");
+ checkManageOrCreateUsersPermission(flags);
return createUserInternal(name, flags, UserHandle.USER_NULL);
}
@@ -2255,7 +2354,7 @@
*/
@Override
public boolean removeUser(int userHandle) {
- checkManageUsersPermission("Only the system can remove users");
+ checkManageOrCreateUsersPermission("Only the system can remove users");
if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(
UserManager.DISALLOW_REMOVE_USER, false)) {
Log.w(LOG_TAG, "Cannot remove user. DISALLOW_REMOVE_USER is enabled.");
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 66bb24d..568f94c 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2589,9 +2589,7 @@
final PhoneWindow win = new PhoneWindow(context);
win.setIsStartingWindow(true);
- final WindowManager.LayoutParams params = win.getAttributes();
- final Resources r = context.getResources();
- CharSequence label = r.getText(labelRes);
+ CharSequence label = context.getResources().getText(labelRes, null);
// Only change the accessibility title if the label is localized
if (label != null) {
win.setTitle(label, true);
@@ -2631,6 +2629,7 @@
win.setLayout(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT);
+ final WindowManager.LayoutParams params = win.getAttributes();
params.token = appToken;
params.packageName = packageName;
params.windowAnimations = win.getWindowStyle().getResourceId(
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 3700c71..b4c4bd8 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -46,11 +46,12 @@
import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.service.vr.VrListenerService;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
-
import com.android.internal.R;
+import com.android.server.LocalServices;
import com.android.server.SystemConfig;
import com.android.server.SystemService;
import com.android.server.utils.ManagedApplicationService.PendingEvent;
@@ -67,6 +68,7 @@
import java.util.Collection;
import java.util.Date;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
/**
@@ -197,29 +199,44 @@
private final class NotificationAccessManager {
private final SparseArray<ArraySet<String>> mAllowedPackages = new SparseArray<>();
+ private final ArrayMap<String, Integer> mNotificationAccessPackageToUserId =
+ new ArrayMap<>();
public void update(Collection<String> packageNames) {
int currentUserId = ActivityManager.getCurrentUser();
- UserHandle currentUserHandle = new UserHandle(currentUserId);
-
ArraySet<String> allowed = mAllowedPackages.get(currentUserId);
if (allowed == null) {
allowed = new ArraySet<>();
}
+ // Make sure we revoke notification access for listeners in other users
+ final int listenerCount = mNotificationAccessPackageToUserId.size();
+ for (int i = listenerCount - 1; i >= 0; i--) {
+ final int grantUserId = mNotificationAccessPackageToUserId.valueAt(i);
+ if (grantUserId != currentUserId) {
+ String packageName = mNotificationAccessPackageToUserId.keyAt(i);
+ revokeNotificationListenerAccess(packageName, grantUserId);
+ revokeNotificationPolicyAccess(packageName);
+ revokeCoarseLocationPermissionIfNeeded(packageName, grantUserId);
+ mNotificationAccessPackageToUserId.removeAt(i);
+ }
+ }
+
for (String pkg : allowed) {
if (!packageNames.contains(pkg)) {
- revokeNotificationListenerAccess(pkg);
+ revokeNotificationListenerAccess(pkg, currentUserId);
revokeNotificationPolicyAccess(pkg);
- revokeCoarseLocationAccess(pkg, currentUserHandle);
+ revokeCoarseLocationPermissionIfNeeded(pkg, currentUserId);
+ mNotificationAccessPackageToUserId.remove(pkg);
}
}
for (String pkg : packageNames) {
if (!allowed.contains(pkg)) {
grantNotificationPolicyAccess(pkg);
- grantNotificationListenerAccess(pkg, currentUserHandle);
- grantCoarseLocationAccess(pkg, currentUserHandle);
+ grantNotificationListenerAccess(pkg, currentUserId);
+ grantCoarseLocationPermissionIfNeeded(pkg, currentUserId);
+ mNotificationAccessPackageToUserId.put(pkg, currentUserId);
}
}
@@ -229,7 +246,6 @@
}
}
-
/**
* Called when a user, package, or setting changes that could affect whether or not the
* currently bound VrListenerService is changed.
@@ -535,17 +551,33 @@
}
}
- private void updateOverlayStateLocked(ComponentName exemptedComponent) {
+ private void updateOverlayStateLocked(String exemptedPackage, int newUserId, int oldUserId) {
+ AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
+
+ // If user changed drop restrictions for the old user.
+ if (oldUserId != newUserId) {
+ appOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ false, mOverlayToken, null, oldUserId);
+ }
+
+ // Apply the restrictions for the current user based on vr state
+ String[] exemptions = (exemptedPackage == null) ? new String[0] :
+ new String[] { exemptedPackage };
+
+ appOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
+ mVrModeEnabled, mOverlayToken, exemptions, newUserId);
+ }
+
+ private void updateDependentAppOpsLocked(String newVrServicePackage, int newUserId,
+ String oldVrServicePackage, int oldUserId) {
+ // If VR state changed and we also have a VR service change.
+ if (Objects.equals(newVrServicePackage, oldVrServicePackage)) {
+ return;
+ }
final long identity = Binder.clearCallingIdentity();
try {
- AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
- if (appOpsManager != null) {
- String[] exemptions = (exemptedComponent == null) ? new String[0] :
- new String[] { exemptedComponent.getPackageName() };
-
- appOpsManager.setUserRestriction(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
- mVrModeEnabled, mOverlayToken, exemptions);
- }
+ // Set overlay exception state based on VR enabled and current service
+ updateOverlayStateLocked(newVrServicePackage, newUserId, oldUserId);
} finally {
Binder.restoreCallingIdentity(identity);
}
@@ -578,8 +610,12 @@
return validUserComponent; // Disabled -> Disabled transition does nothing.
}
+ String oldVrServicePackage = mCurrentVrService != null
+ ? mCurrentVrService.getComponent().getPackageName() : null;
+ final int oldUserId = mCurrentVrModeUser;
+
// Always send mode change events.
- changeVrModeLocked(enabled, (enabled && validUserComponent) ? component : null);
+ changeVrModeLocked(enabled);
if (!enabled || !validUserComponent) {
// Unbind whatever is running
@@ -606,12 +642,25 @@
}
}
- if (calling != null && !Objects.equals(calling, mCurrentVrModeComponent)) {
+ if (calling != null && !Objects.equals(calling, mCurrentVrModeComponent)) {
mCurrentVrModeComponent = calling;
+ sendUpdatedCaller = true;
+ }
+
+ if (mCurrentVrModeUser != userId) {
mCurrentVrModeUser = userId;
sendUpdatedCaller = true;
}
+ String newVrServicePackage = mCurrentVrService != null
+ ? mCurrentVrService.getComponent().getPackageName() : null;
+ final int newUserId = mCurrentVrModeUser;
+
+ // Update AppOps settings that change state when entering/exiting VR mode, or changing
+ // the current VrListenerService.
+ updateDependentAppOpsLocked(newVrServicePackage, newUserId,
+ oldVrServicePackage, oldUserId);
+
if (mCurrentVrService != null && sendUpdatedCaller) {
final ComponentName c = mCurrentVrModeComponent;
mCurrentVrService.sendEvent(new PendingEvent() {
@@ -645,18 +694,6 @@
return true;
}
- private void grantCoarseLocationAccess(String pkg, UserHandle userId) {
- PackageManager pm = mContext.getPackageManager();
- pm.grantRuntimePermission(pkg, android.Manifest.permission.ACCESS_COARSE_LOCATION,
- userId);
- }
-
- private void revokeCoarseLocationAccess(String pkg, UserHandle userId) {
- PackageManager pm = mContext.getPackageManager();
- pm.revokeRuntimePermission(pkg,
- android.Manifest.permission.ACCESS_COARSE_LOCATION, userId);
- }
-
private void grantNotificationPolicyAccess(String pkg) {
NotificationManager nm = mContext.getSystemService(NotificationManager.class);
nm.setNotificationPolicyAccessGranted(pkg, true);
@@ -670,14 +707,14 @@
nm.setNotificationPolicyAccessGranted(pkg, false);
}
- private void grantNotificationListenerAccess(String pkg, UserHandle userId) {
+ private void grantNotificationListenerAccess(String pkg, int userId) {
PackageManager pm = mContext.getPackageManager();
ArraySet<ComponentName> possibleServices = EnabledComponentsObserver.loadComponentNames(pm,
- userId.getIdentifier(), NotificationListenerService.SERVICE_INTERFACE,
+ userId, NotificationListenerService.SERVICE_INTERFACE,
android.Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE);
ContentResolver resolver = mContext.getContentResolver();
- ArraySet<String> current = getCurrentNotifListeners(resolver);
+ ArraySet<String> current = getNotificationListeners(resolver, userId);
for (ComponentName c : possibleServices) {
String flatName = c.flattenToString();
@@ -689,14 +726,16 @@
if (current.size() > 0) {
String flatSettings = formatSettings(current);
- Settings.Secure.putString(resolver, Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- flatSettings);
+ Settings.Secure.putStringForUser(resolver,
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+ flatSettings, userId);
}
}
- private void revokeNotificationListenerAccess(String pkg) {
+ private void revokeNotificationListenerAccess(String pkg, int userId) {
ContentResolver resolver = mContext.getContentResolver();
- ArraySet<String> current = getCurrentNotifListeners(resolver);
+
+ ArraySet<String> current = getNotificationListeners(resolver, userId);
ArrayList<String> toRemove = new ArrayList<>();
@@ -710,14 +749,37 @@
current.removeAll(toRemove);
String flatSettings = formatSettings(current);
- Settings.Secure.putString(resolver, Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
- flatSettings);
-
+ Settings.Secure.putStringForUser(resolver,
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,
+ flatSettings, userId);
}
- private ArraySet<String> getCurrentNotifListeners(ContentResolver resolver) {
- String flat = Settings.Secure.getString(resolver,
- Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
+ private void grantCoarseLocationPermissionIfNeeded(String pkg, int userId) {
+ // Don't clobber the user if permission set in current state explicitly
+ if (!isPermissionUserUpdated(Manifest.permission.ACCESS_COARSE_LOCATION, pkg, userId)) {
+ mContext.getPackageManager().grantRuntimePermission(pkg,
+ Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId));
+ }
+ }
+
+ private void revokeCoarseLocationPermissionIfNeeded(String pkg, int userId) {
+ // Don't clobber the user if permission set in current state explicitly
+ if (!isPermissionUserUpdated(Manifest.permission.ACCESS_COARSE_LOCATION, pkg, userId)) {
+ mContext.getPackageManager().revokeRuntimePermission(pkg,
+ Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId));
+ }
+ }
+
+ private boolean isPermissionUserUpdated(String permission, String pkg, int userId) {
+ final int flags = mContext.getPackageManager().getPermissionFlags(
+ permission, pkg, new UserHandle(userId));
+ return (flags & (PackageManager.FLAG_PERMISSION_USER_SET
+ | PackageManager.FLAG_PERMISSION_USER_FIXED)) != 0;
+ }
+
+ private ArraySet<String> getNotificationListeners(ContentResolver resolver, int userId) {
+ String flat = Settings.Secure.getStringForUser(resolver,
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, userId);
ArraySet<String> current = new ArraySet<>();
if (flat != null) {
@@ -763,9 +825,8 @@
* Note: Must be called while holding {@code mLock}.
*
* @param enabled new state of the VR mode.
- * @param exemptedComponent a component to exempt from AppOps restrictions for overlays.
*/
- private void changeVrModeLocked(boolean enabled, ComponentName exemptedComponent) {
+ private void changeVrModeLocked(boolean enabled) {
if (mVrModeEnabled != enabled) {
mVrModeEnabled = enabled;
@@ -773,7 +834,6 @@
Slog.i(TAG, "VR mode " + ((mVrModeEnabled) ? "enabled" : "disabled"));
setVrModeNative(mVrModeEnabled);
- updateOverlayStateLocked(exemptedComponent);
onVrModeChangedLocked();
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 3f4c1d5..a882607 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5346,7 +5346,13 @@
// If this isn't coming from the system then don't allow disabling the lockscreen
// to bypass security.
if (Binder.getCallingUid() != Process.SYSTEM_UID && isKeyguardSecure()) {
- Log.d(TAG_WM, "current mode is SecurityMode, ignore hide keyguard");
+ Log.d(TAG_WM, "current mode is SecurityMode, ignore disableKeyguard");
+ return;
+ }
+
+ // If this isn't coming from the current user, ignore it.
+ if (Binder.getCallingUserHandle().getIdentifier() != mCurrentUserId) {
+ Log.d(TAG_WM, "non-current user, ignore disableKeyguard");
return;
}
@@ -5661,6 +5667,11 @@
mAppTransition.setCurrentUser(newUserId);
mPolicy.setCurrentUserLw(newUserId);
+ // If keyguard was disabled, re-enable it
+ // TODO: Keep track of keyguardEnabled state per user and use here...
+ // e.g. enabled = mKeyguardDisableHandler.getEnabledStateForUser(newUserId);
+ mPolicy.enableKeyguard(true);
+
// Hide windows that should not be seen by the new user.
final int numDisplays = mDisplayContents.size();
for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
@@ -10022,6 +10033,7 @@
}
}
+ @Override
public void createWallpaperInputConsumer(InputChannel inputChannel) {
synchronized (mWindowMap) {
mWallpaperInputConsumer = new InputConsumerImpl(this, "wallpaper input", inputChannel);
@@ -10030,6 +10042,7 @@
}
}
+ @Override
public void removeWallpaperInputConsumer() {
synchronized (mWindowMap) {
if (mWallpaperInputConsumer != null) {
@@ -11125,6 +11138,7 @@
}
}
+ @Override
public void registerShortcutKey(long shortcutCode, IShortcutService shortcutKeyReceiver)
throws RemoteException {
if (!checkCallingPermission(Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS,
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 3b4c3cf..36d9697 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -230,6 +230,14 @@
boolean mForceScaleUntilResize;
+ // WindowState.mHScale and WindowState.mVScale contain the
+ // scale according to client specified layout parameters (e.g.
+ // one layout size, with another surface size, creates such scaling).
+ // Here we track an additional scaling factor used to follow stack
+ // scaling (as in the case of the Pinned stack animation).
+ float mExtraHScale = (float) 1.0;
+ float mExtraVScale = (float) 1.0;
+
private final Rect mTmpSize = new Rect();
WindowStateAnimator(final WindowState win) {
@@ -816,22 +824,11 @@
mTmpSize.bottom = mTmpSize.top + 1;
}
- final int displayId = w.getDisplayId();
- float scale = 1.0f;
- // Magnification is supported only for the default display.
- if (mService.mAccessibilityController != null && displayId == DEFAULT_DISPLAY) {
- final MagnificationSpec spec =
- mService.mAccessibilityController.getMagnificationSpecForWindowLocked(w);
- if (spec != null && !spec.isNop()) {
- scale = spec.scale;
- }
- }
-
// Adjust for surface insets.
- mTmpSize.left -= scale * attrs.surfaceInsets.left;
- mTmpSize.top -= scale * attrs.surfaceInsets.top;
- mTmpSize.right += scale * attrs.surfaceInsets.right;
- mTmpSize.bottom += scale * attrs.surfaceInsets.bottom;
+ mTmpSize.left -= attrs.surfaceInsets.left;
+ mTmpSize.top -= attrs.surfaceInsets.top;
+ mTmpSize.right += attrs.surfaceInsets.right;
+ mTmpSize.bottom += attrs.surfaceInsets.bottom;
}
boolean hasSurface() {
@@ -1292,9 +1289,13 @@
void updateSurfaceWindowCrop(Rect clipRect, Rect finalClipRect, boolean recoveringMemory) {
if (DEBUG_WINDOW_CROP) Slog.d(TAG, "updateSurfaceWindowCrop: win=" + mWin
+ " clipRect=" + clipRect + " finalClipRect=" + finalClipRect);
- if (!clipRect.equals(mLastClipRect)) {
- mLastClipRect.set(clipRect);
- mSurfaceController.setCropInTransaction(clipRect, recoveringMemory);
+ if (clipRect != null) {
+ if (!clipRect.equals(mLastClipRect)) {
+ mLastClipRect.set(clipRect);
+ mSurfaceController.setCropInTransaction(clipRect, recoveringMemory);
+ }
+ } else {
+ mSurfaceController.clearCropInTransaction(recoveringMemory);
}
if (!finalClipRect.equals(mLastFinalClipRect)) {
mLastFinalClipRect.set(finalClipRect);
@@ -1306,7 +1307,6 @@
}
private int resolveStackClip() {
-
// App animation overrides window animation stack clip mode.
if (mAppAnimator != null && mAppAnimator.animation != null) {
return mAppAnimator.getStackClip();
@@ -1397,8 +1397,8 @@
mTmpSize.set(w.mShownPosition.x, w.mShownPosition.y, 0, 0);
calculateSurfaceBounds(w, w.getAttrs());
- float extraHScale = (float) 1.0;
- float extraVScale = (float) 1.0;
+ mExtraHScale = (float) 1.0;
+ mExtraVScale = (float) 1.0;
// Once relayout has been called at least once, we need to make sure
// we only resize the client surface during calls to relayout. For
@@ -1412,6 +1412,9 @@
// aren't observing known issues here outside of PiP resizing. (Typically
// the other windows that use -1 are PopupWindows which aren't likely
// to be rendering while we resize).
+
+ boolean wasForceScaled = mForceScaleUntilResize;
+
if (!w.inPinnedWorkspace() || (!w.mRelayoutCalled || w.mInRelayout)) {
mSurfaceResized = mSurfaceController.setSizeInTransaction(
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
@@ -1420,34 +1423,39 @@
}
mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized;
-
calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect);
+
+ float surfaceWidth = mSurfaceController.getWidth();
+ float surfaceHeight = mSurfaceController.getHeight();
+
if ((task != null && task.mStack.getForceScaleToCrop()) || mForceScaleUntilResize) {
int hInsets = w.getAttrs().surfaceInsets.left + w.getAttrs().surfaceInsets.right;
int vInsets = w.getAttrs().surfaceInsets.top + w.getAttrs().surfaceInsets.bottom;
- float surfaceWidth = mSurfaceController.getWidth();
- float surfaceHeight = mSurfaceController.getHeight();
+ if (!mForceScaleUntilResize) {
+ mSurfaceController.forceScaleableInTransaction(true);
+ }
// We want to calculate the scaling based on the content area, not based on
// the entire surface, so that we scale in sync with windows that don't have insets.
- extraHScale = (mTmpClipRect.width() - hInsets) / (float)(surfaceWidth - hInsets);
- extraVScale = (mTmpClipRect.height() - vInsets) / (float)(surfaceHeight - vInsets);
+ mExtraHScale = (mTmpClipRect.width() - hInsets) / (float)(surfaceWidth - hInsets);
+ mExtraVScale = (mTmpClipRect.height() - vInsets) / (float)(surfaceHeight - vInsets);
// In the case of ForceScaleToCrop we scale entire tasks together,
// and so we need to scale our offsets relative to the task bounds
// or parent and child windows would fall out of alignment.
- int posX = (int) (mTmpSize.left - w.mAttrs.x * (1 - extraHScale));
- int posY = (int) (mTmpSize.top - w.mAttrs.y * (1 - extraVScale));
+ int posX = (int) (mTmpSize.left - w.mAttrs.x * (1 - mExtraHScale));
+ int posY = (int) (mTmpSize.top - w.mAttrs.y * (1 - mExtraVScale));
// Imagine we are scaling down. As we scale the buffer down, we decrease the
// distance between the surface top left, and the start of the surface contents
// (previously it was surfaceInsets.left pixels in screen space but now it
- // will be surfaceInsets.left*extraHScale). This means in order to keep the
+ // will be surfaceInsets.left*mExtraHScale). This means in order to keep the
// non inset content at the same position, we have to shift the whole window
// forward. Likewise for scaling up, we've increased this distance, and we need
// to shift by a negative number to compensate.
- posX += w.getAttrs().surfaceInsets.left * (1 - extraHScale);
- posY += w.getAttrs().surfaceInsets.top * (1 - extraVScale);
+ posX += w.getAttrs().surfaceInsets.left * (1 - mExtraHScale);
+ posY += w.getAttrs().surfaceInsets.top * (1 - mExtraVScale);
- mSurfaceController.setPositionInTransaction(posX, posY, recoveringMemory);
+ mSurfaceController.setPositionInTransaction((float)Math.floor(posX),
+ (float)Math.floor(posY), recoveringMemory);
// Since we are scaled to fit in our previously desired crop, we can now
// expose the whole window in buffer space, and not risk extending
@@ -1459,7 +1467,7 @@
// We need to ensure for each surface, that we disable transformation matrix
// scaling in the same transaction which we resize the surface in.
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
- // then take over the scaling until the new buffer arrives, and things
+ // then take over the scaling until the new buffer arrives, and things
// will be seamless.
mForceScaleUntilResize = true;
} else {
@@ -1467,12 +1475,30 @@
recoveringMemory);
}
- updateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect, recoveringMemory);
+ // If we are ending the scaling mode. We switch to SCALING_MODE_FREEZE
+ // to prevent further updates until buffer latch. Normally position
+ // would continue to apply immediately. But we need a different position
+ // before and after resize (since we have scaled the shadows, as discussed
+ // above).
+ if (wasForceScaled && !mForceScaleUntilResize) {
+ mSurfaceController.setPositionAppliesWithResizeInTransaction(true);
+ mSurfaceController.forceScaleableInTransaction(false);
+ }
- mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * extraHScale,
- mDtDx * w.mVScale * extraVScale,
- mDsDy * w.mHScale * extraHScale,
- mDtDy * w.mVScale * extraVScale, recoveringMemory);
+ Rect clipRect = mTmpClipRect;
+ if (w.inPinnedWorkspace()) {
+ clipRect = null;
+ task.mStack.getDimBounds(mTmpFinalClipRect);
+ mTmpFinalClipRect.inset(-w.mAttrs.surfaceInsets.left, -w.mAttrs.surfaceInsets.top,
+ -w.mAttrs.surfaceInsets.right, -w.mAttrs.surfaceInsets.bottom);
+ }
+
+ updateSurfaceWindowCrop(clipRect, mTmpFinalClipRect, recoveringMemory);
+
+ mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale,
+ mDtDx * w.mVScale * mExtraVScale,
+ mDsDy * w.mHScale * mExtraHScale,
+ mDtDy * w.mVScale * mExtraVScale, recoveringMemory);
if (mSurfaceResized) {
mReportSurfaceResized = true;
@@ -1558,8 +1584,10 @@
boolean prepared =
mSurfaceController.prepareToShowInTransaction(mShownAlpha, mAnimLayer,
- mDsDx * w.mHScale, mDtDx * w.mVScale,
- mDsDy * w.mHScale, mDtDy * w.mVScale,
+ mDsDx * w.mHScale * mExtraHScale,
+ mDtDx * w.mVScale * mExtraVScale,
+ mDsDy * w.mHScale * mExtraHScale,
+ mDtDy * w.mVScale * mExtraVScale,
recoveringMemory);
if (prepared && mLastHidden && mDrawState == HAS_DRAWN) {
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index 9646a49..fd0bb99 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -26,6 +26,7 @@
import static android.view.Surface.SCALING_MODE_FREEZE;
import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW;
+import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
@@ -78,7 +79,15 @@
title = name;
- if (DEBUG_SURFACE_TRACE) {
+ // For opaque child windows placed under parent windows,
+ // we use a special SurfaceControl which mirrors commands
+ // to a black-out layer placed one Z-layer below the surface.
+ // This prevents holes to whatever app/wallpaper is underneath.
+ if (animator.mWin.isChildWindow() &&
+ animator.mWin.mSubLayer < 0) {
+ mSurfaceControl = new SurfaceControlWithBackground(s,
+ name, w, h, format, flags);
+ } else if (DEBUG_SURFACE_TRACE) {
mSurfaceControl = new SurfaceTrace(
s, name, w, h, format, flags);
} else {
@@ -194,6 +203,20 @@
}
}
+ void clearCropInTransaction(boolean recoveringMemory) {
+ if (SHOW_TRANSACTIONS) logSurface(
+ "CLEAR CROP", null);
+ try {
+ Rect clipRect = new Rect(0, 0, -1, -1);
+ mSurfaceControl.setWindowCrop(clipRect);
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Error setting clearing crop of " + this, e);
+ if (!recoveringMemory) {
+ mAnimator.reclaimSomeSurfaceMemory("crop", true);
+ }
+ }
+ }
+
void setFinalCropInTransaction(Rect clipRect) {
if (SHOW_TRANSACTIONS) logSurface(
"FINAL CROP " + clipRect.toShortString(), null);
@@ -236,6 +259,10 @@
}
}
+ void setPositionAppliesWithResizeInTransaction(boolean recoveringMemory) {
+ mSurfaceControl.setPositionAppliesWithResize();
+ }
+
void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy,
boolean recoveringMemory) {
try {
@@ -554,6 +581,13 @@
}
@Override
+ public void setPositionAppliesWithResize() {
+ if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setPositionAppliesWithResize(): OLD: "
+ + this + ". Called by" + Debug.getCallers(9));
+ super.setPositionAppliesWithResize();
+ }
+
+ @Override
public void setSize(int w, int h) {
if (w != mSize.x || h != mSize.y) {
if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setSize(" + w + "," + h + "): OLD:"
@@ -719,4 +753,125 @@
+ " (" + mDsdx + "," + mDtdx + "," + mDsdy + "," + mDtdy + ")";
}
}
+
+ private static class SurfaceControlWithBackground extends SurfaceControl {
+ private SurfaceControl mBackgroundControl;
+ private boolean mOpaque = true;
+ private boolean mVisible = false;
+
+ public SurfaceControlWithBackground(SurfaceSession s,
+ String name, int w, int h, int format, int flags)
+ throws OutOfResourcesException {
+ super(s, name, w, h, format, flags);
+ mBackgroundControl = new SurfaceControl(s, name, w, h,
+ PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM);
+ mOpaque = (flags & SurfaceControl.OPAQUE) != 0;
+ }
+
+ @Override
+ public void setAlpha(float alpha) {
+ super.setAlpha(alpha);
+ mBackgroundControl.setAlpha(alpha);
+ }
+
+ @Override
+ public void setLayer(int zorder) {
+ super.setLayer(zorder);
+ mBackgroundControl.setLayer(zorder - 1);
+ }
+
+ @Override
+ public void setPosition(float x, float y) {
+ super.setPosition(x, y);
+ mBackgroundControl.setPosition(x, y);
+ }
+
+ @Override
+ public void setSize(int w, int h) {
+ super.setSize(w, h);
+ mBackgroundControl.setSize(w, h);
+ }
+
+ @Override
+ public void setWindowCrop(Rect crop) {
+ super.setWindowCrop(crop);
+ mBackgroundControl.setWindowCrop(crop);
+ }
+
+ @Override
+ public void setFinalCrop(Rect crop) {
+ super.setFinalCrop(crop);
+ mBackgroundControl.setFinalCrop(crop);
+ }
+
+ @Override
+ public void setLayerStack(int layerStack) {
+ super.setLayerStack(layerStack);
+ mBackgroundControl.setLayerStack(layerStack);
+ }
+
+ @Override
+ public void setOpaque(boolean isOpaque) {
+ super.setOpaque(isOpaque);
+ mOpaque = isOpaque;
+ updateBackgroundVisibility();
+ }
+
+ @Override
+ public void setSecure(boolean isSecure) {
+ super.setSecure(isSecure);
+ }
+
+ @Override
+ public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
+ super.setMatrix(dsdx, dtdx, dsdy, dtdy);
+ mBackgroundControl.setMatrix(dsdx, dtdx, dsdy, dtdy);
+ }
+
+ @Override
+ public void hide() {
+ mVisible = false;
+ super.hide();
+ updateBackgroundVisibility();
+ }
+
+ @Override
+ public void show() {
+ mVisible = true;
+ super.show();
+ updateBackgroundVisibility();
+ }
+
+ @Override
+ public void destroy() {
+ super.destroy();
+ mBackgroundControl.destroy();
+ }
+
+ @Override
+ public void release() {
+ super.release();
+ mBackgroundControl.release();
+ }
+
+ @Override
+ public void setTransparentRegionHint(Region region) {
+ super.setTransparentRegionHint(region);
+ mBackgroundControl.setTransparentRegionHint(region);
+ }
+
+ @Override
+ public void deferTransactionUntil(IBinder handle, long frame) {
+ super.deferTransactionUntil(handle, frame);
+ mBackgroundControl.deferTransactionUntil(handle, frame);
+ }
+
+ private void updateBackgroundVisibility() {
+ if (mOpaque && mVisible) {
+ mBackgroundControl.show();
+ } else {
+ mBackgroundControl.hide();
+ }
+ }
+ }
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 9a7e64b3..4692a57 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1338,7 +1338,8 @@
}
Owners newOwners() {
- return new Owners(mContext, getUserManager(), getUserManagerInternal());
+ return new Owners(getUserManager(), getUserManagerInternal(),
+ getPackageManagerInternal());
}
UserManager getUserManager() {
@@ -8134,26 +8135,6 @@
}
@Override
- public boolean hasDeviceOwnerOrProfileOwner(String packageName, int userId) {
- if (!mHasFeature || packageName == null) {
- return false;
- }
- if (userId < 0) {
- throw new UnsupportedOperationException("userId should be >= 0");
- }
- synchronized (DevicePolicyManagerService.this) {
- if (packageName.equals(mOwners.getProfileOwnerPackage(userId))) {
- return true;
- }
- if (userId == mOwners.getDeviceOwnerUserId()
- && packageName.equals(mOwners.getDeviceOwnerPackageName())) {
- return true;
- }
- }
- return false;
- }
-
- @Override
public Intent createPackageSuspendedDialogIntent(String packageName, int userId) {
Intent intent = new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
intent.putExtra(Intent.EXTRA_USER_ID, userId);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
index b316cbd..cb39ebd 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/Owners.java
@@ -19,6 +19,7 @@
import android.app.admin.SystemUpdatePolicy;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
import android.os.Environment;
import android.os.UserHandle;
@@ -28,6 +29,7 @@
import android.util.AtomicFile;
import android.util.Log;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.Xml;
import com.android.internal.util.FastXmlSerializer;
@@ -86,6 +88,7 @@
private final UserManager mUserManager;
private final UserManagerInternal mUserManagerInternal;
+ private final PackageManagerInternal mPackageManagerInternal;
// Internal state for the device owner package.
private OwnerInfo mDeviceOwner;
@@ -98,10 +101,12 @@
// Local system update policy controllable by device owner.
private SystemUpdatePolicy mSystemUpdatePolicy;
- public Owners(Context context, UserManager userManager,
- UserManagerInternal userManagerInternal) {
+ public Owners(UserManager userManager,
+ UserManagerInternal userManagerInternal,
+ PackageManagerInternal packageManagerInternal) {
mUserManager = userManager;
mUserManagerInternal = userManagerInternal;
+ mPackageManagerInternal = packageManagerInternal;
}
/**
@@ -145,6 +150,17 @@
Slog.w(TAG, String.format("User %d has both DO and PO, which is not supported",
getDeviceOwnerUserId()));
}
+ pushToPackageManager();
+ }
+
+ private void pushToPackageManager() {
+ final SparseArray<String> po = new SparseArray<>();
+ for (int i = mProfileOwners.size() - 1; i >= 0; i--) {
+ po.put(mProfileOwners.keyAt(i), mProfileOwners.valueAt(i).packageName);
+ }
+ mPackageManagerInternal.setDeviceAndProfileOwnerPackages(
+ mDeviceOwnerUserId, (mDeviceOwner != null ? mDeviceOwner.packageName : null),
+ po);
}
String getDeviceOwnerPackageName() {
@@ -190,6 +206,7 @@
mDeviceOwnerUserId = userId;
mUserManagerInternal.setDeviceManaged(true);
+ pushToPackageManager();
}
void clearDeviceOwner() {
@@ -197,6 +214,7 @@
mDeviceOwnerUserId = UserHandle.USER_NULL;
mUserManagerInternal.setDeviceManaged(false);
+ pushToPackageManager();
}
void setProfileOwner(ComponentName admin, String ownerName, int userId) {
@@ -205,11 +223,13 @@
/* userRestrictionsMigrated =*/ true, /* remoteBugreportUri =*/ null,
/* remoteBugreportHash =*/ null));
mUserManagerInternal.setUserManaged(userId, true);
+ pushToPackageManager();
}
void removeProfileOwner(int userId) {
mProfileOwners.remove(userId);
mUserManagerInternal.setUserManaged(userId, false);
+ pushToPackageManager();
}
ComponentName getProfileOwnerComponent(int userId) {
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
index 744443f..6cb4a82 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java
@@ -28,10 +28,8 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
-import android.os.storage.StorageManager;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
-import android.util.Log;
import android.util.Pair;
import android.view.IWindowManager;
@@ -57,7 +55,7 @@
private final File mProfileOwnerBase;
public OwnersTestable(DpmMockContext context) {
- super(context, context.userManager, context.userManagerInternal);
+ super(context.userManager, context.userManagerInternal, context.packageManagerInternal);
mLegacyFile = new File(context.dataDir, LEGACY_FILE);
mDeviceOwnerFile = new File(context.dataDir, DEVICE_OWNER_FILE);
mProfileOwnerBase = new File(context.dataDir, PROFILE_OWNER_FILE_BASE);