diff options
590 files changed, 10238 insertions, 5737 deletions
diff --git a/api/current.txt b/api/current.txt index 4f117ee00ae9..aec89e3f6f28 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4214,12 +4214,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); @@ -6140,7 +6134,6 @@ package android.app { } public class WallpaperManager { - method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; @@ -26034,8 +26027,8 @@ package android.net { method public boolean protect(java.net.Socket); method public boolean protect(java.net.DatagramSocket); method public boolean setUnderlyingNetworks(android.net.Network[]); - field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService"; + field public static final java.lang.String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; } public class VpnService.Builder { @@ -38884,7 +38877,7 @@ package android.telecom { public static final class Call.RttCall { method public int getRttAudioMode(); - method public java.lang.String read() throws java.io.IOException; + method public java.lang.String read(); method public java.lang.String readImmediately() throws java.io.IOException; method public void setRttMode(int); method public void write(java.lang.String) throws java.io.IOException; @@ -39601,6 +39594,7 @@ package android.telephony { field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string"; field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool"; field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; @@ -45234,15 +45228,11 @@ package android.view { public class Surface implements android.os.Parcelable { ctor public Surface(android.graphics.SurfaceTexture); method public int describeContents(); - method public boolean isAutoRefreshEnabled(); - method public boolean isSharedBufferModeEnabled(); method public boolean isValid(); method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException; method public android.graphics.Canvas lockHardwareCanvas(); method public void readFromParcel(android.os.Parcel); method public void release(); - method public void setAutoRefreshEnabled(boolean); - method public void setSharedBufferModeEnabled(boolean); method public deprecated void unlockCanvas(android.graphics.Canvas); method public void unlockCanvasAndPost(android.graphics.Canvas); method public void writeToParcel(android.os.Parcel, int); @@ -47209,6 +47199,7 @@ package android.view.accessibility { method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int); method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(); method public void interrupt(); + method public static boolean isAccessibilityButtonSupported(); method public boolean isEnabled(); method public boolean isTouchExplorationEnabled(); method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer); @@ -49073,7 +49064,6 @@ package android.webkit { method public void goBack(); method public void goBackOrForward(int); method public void goForward(); - method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void invokeZoomPicker(); method public boolean isPrivateBrowsingEnabled(); method public void loadData(java.lang.String, java.lang.String, java.lang.String); @@ -49121,7 +49111,7 @@ package android.webkit { method public void setWebViewClient(android.webkit.WebViewClient); method public deprecated boolean shouldDelayChildPressedState(); method public deprecated boolean showFindDialog(java.lang.String, boolean); - method public static void shutdownSafeBrowsing(); + method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void stopLoading(); method public void zoomBy(float); method public boolean zoomIn(); diff --git a/api/system-current.txt b/api/system-current.txt index a57fbf66d531..4e8f843a5308 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -201,6 +201,7 @@ package android { field public static final java.lang.String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS"; field public static final java.lang.String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS"; field public static final java.lang.String READ_VOICEMAIL = "com.android.voicemail.permission.READ_VOICEMAIL"; + field public static final java.lang.String READ_WALLPAPER_INTERNAL = "android.permission.READ_WALLPAPER_INTERNAL"; field public static final java.lang.String READ_WIFI_CREDENTIAL = "android.permission.READ_WIFI_CREDENTIAL"; field public static final java.lang.String REAL_GET_TASKS = "android.permission.REAL_GET_TASKS"; field public static final java.lang.String REBOOT = "android.permission.REBOOT"; @@ -4377,12 +4378,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); @@ -6349,7 +6344,6 @@ package android.app { } public class WallpaperManager { - method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; @@ -28331,8 +28325,8 @@ package android.net { method public boolean protect(java.net.Socket); method public boolean protect(java.net.DatagramSocket); method public boolean setUnderlyingNetworks(android.net.Network[]); - field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService"; + field public static final java.lang.String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; } public class VpnService.Builder { @@ -38561,7 +38555,6 @@ package android.provider { public final class TimeZoneRulesDataContract { field public static final java.lang.String AUTHORITY = "com.android.timezone"; - field public static final java.lang.String READER_PERMISSION = "android.permission.UPDATE_TIME_ZONE_RULES"; } public static final class TimeZoneRulesDataContract.Operation { @@ -42129,7 +42122,7 @@ package android.telecom { public static final class Call.RttCall { method public int getRttAudioMode(); - method public java.lang.String read() throws java.io.IOException; + method public java.lang.String read(); method public java.lang.String readImmediately() throws java.io.IOException; method public void setRttMode(int); method public void write(java.lang.String) throws java.io.IOException; @@ -43040,6 +43033,7 @@ package android.telephony { field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string"; field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool"; field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; @@ -48819,15 +48813,11 @@ package android.view { public class Surface implements android.os.Parcelable { ctor public Surface(android.graphics.SurfaceTexture); method public int describeContents(); - method public boolean isAutoRefreshEnabled(); - method public boolean isSharedBufferModeEnabled(); method public boolean isValid(); method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException; method public android.graphics.Canvas lockHardwareCanvas(); method public void readFromParcel(android.os.Parcel); method public void release(); - method public void setAutoRefreshEnabled(boolean); - method public void setSharedBufferModeEnabled(boolean); method public deprecated void unlockCanvas(android.graphics.Canvas); method public void unlockCanvasAndPost(android.graphics.Canvas); method public void writeToParcel(android.os.Parcel, int); @@ -52757,7 +52747,6 @@ package android.webkit { method public void goBack(); method public void goBackOrForward(int); method public void goForward(); - method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void invokeZoomPicker(); method public boolean isPrivateBrowsingEnabled(); method public void loadData(java.lang.String, java.lang.String, java.lang.String); @@ -52805,7 +52794,7 @@ package android.webkit { method public void setWebViewClient(android.webkit.WebViewClient); method public deprecated boolean shouldDelayChildPressedState(); method public deprecated boolean showFindDialog(java.lang.String, boolean); - method public static void shutdownSafeBrowsing(); + method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void stopLoading(); method public void zoomBy(float); method public boolean zoomIn(); @@ -53002,7 +52991,6 @@ package android.webkit { method public abstract android.net.Uri[] parseFileChooserResult(int, android.content.Intent); method public abstract void setSafeBrowsingWhitelist(java.util.List<java.lang.String>, android.webkit.ValueCallback<java.lang.Boolean>); method public abstract void setWebContentsDebuggingEnabled(boolean); - method public abstract void shutdownSafeBrowsing(); } public class WebViewFragment extends android.app.Fragment { diff --git a/api/test-current.txt b/api/test-current.txt index 56308b0f9ff0..6ac579036339 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4227,12 +4227,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); @@ -6161,7 +6155,6 @@ package android.app { } public class WallpaperManager { - method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener); method public void addOnColorsChangedListener(android.app.WallpaperManager.OnColorsChangedListener, android.os.Handler); method public void clear() throws java.io.IOException; method public void clear(int) throws java.io.IOException; @@ -26178,8 +26171,8 @@ package android.net { method public boolean protect(java.net.Socket); method public boolean protect(java.net.DatagramSocket); method public boolean setUnderlyingNetworks(android.net.Network[]); - field public static final java.lang.String METADATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; field public static final java.lang.String SERVICE_INTERFACE = "android.net.VpnService"; + field public static final java.lang.String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; } public class VpnService.Builder { @@ -39127,7 +39120,7 @@ package android.telecom { public static final class Call.RttCall { method public int getRttAudioMode(); - method public java.lang.String read() throws java.io.IOException; + method public java.lang.String read(); method public java.lang.String readImmediately() throws java.io.IOException; method public void setRttMode(int); method public void write(java.lang.String) throws java.io.IOException; @@ -39860,6 +39853,7 @@ package android.telephony { field public static final java.lang.String KEY_DEFAULT_VM_NUMBER_STRING = "default_vm_number_string"; field public static final java.lang.String KEY_DIAL_STRING_REPLACE_STRING_ARRAY = "dial_string_replace_string_array"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool"; field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; @@ -45672,15 +45666,11 @@ package android.view { public class Surface implements android.os.Parcelable { ctor public Surface(android.graphics.SurfaceTexture); method public int describeContents(); - method public boolean isAutoRefreshEnabled(); - method public boolean isSharedBufferModeEnabled(); method public boolean isValid(); method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException; method public android.graphics.Canvas lockHardwareCanvas(); method public void readFromParcel(android.os.Parcel); method public void release(); - method public void setAutoRefreshEnabled(boolean); - method public void setSharedBufferModeEnabled(boolean); method public deprecated void unlockCanvas(android.graphics.Canvas); method public void unlockCanvasAndPost(android.graphics.Canvas); method public void writeToParcel(android.os.Parcel, int); @@ -47661,6 +47651,7 @@ package android.view.accessibility { method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int); method public java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(); method public void interrupt(); + method public static boolean isAccessibilityButtonSupported(); method public boolean isEnabled(); method public boolean isTouchExplorationEnabled(); method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer); @@ -49528,7 +49519,6 @@ package android.webkit { method public void goBack(); method public void goBackOrForward(int); method public void goForward(); - method public static void initSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void invokeZoomPicker(); method public boolean isPrivateBrowsingEnabled(); method public void loadData(java.lang.String, java.lang.String, java.lang.String); @@ -49576,7 +49566,7 @@ package android.webkit { method public void setWebViewClient(android.webkit.WebViewClient); method public deprecated boolean shouldDelayChildPressedState(); method public deprecated boolean showFindDialog(java.lang.String, boolean); - method public static void shutdownSafeBrowsing(); + method public static void startSafeBrowsing(android.content.Context, android.webkit.ValueCallback<java.lang.Boolean>); method public void stopLoading(); method public void zoomBy(float); method public boolean zoomIn(); diff --git a/config/copyright-header b/config/copyright-header new file mode 100644 index 000000000000..93071cd7e2ef --- /dev/null +++ b/config/copyright-header @@ -0,0 +1,15 @@ +# +# Copyright (C) 2017 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. +# diff --git a/config/generate-preloaded-classes.sh b/config/generate-preloaded-classes.sh new file mode 100755 index 000000000000..e36e148c7476 --- /dev/null +++ b/config/generate-preloaded-classes.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# +# Copyright (C) 2017 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. +if [ "$#" -lt 2 ]; then + echo "Usage $0 <input classes file> <blacklist file> [extra classes files]" + exit 1 +fi + +# Write file headers first +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cat "$DIR/copyright-header" +echo "# Preloaded-classes filter file for phones. +# +# Classes in this file will be allocated into the boot image, and forcibly initialized in +# the zygote during initialization. This is a trade-off, using virtual address space to share +# common heap between apps. +# +# This file has been derived for mainline phone (and tablet) usage. +#" + +input=$1 +blacklist=$2 +shift 2 +extra_classes_files=("$@") + +# Disable locale to enable lexicographical sorting +LC_ALL=C sort "$input" "${extra_classes_files[@]}" | uniq | grep -f "$blacklist" -v -F -x diff --git a/config/preloaded-classes b/config/preloaded-classes index b6be0ee80877..1c842c79359a 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -# -# # Preloaded-classes filter file for phones. # # Classes in this file will be allocated into the boot image, and forcibly initialized in @@ -1454,6 +1452,7 @@ android.icu.impl.UResource$Sink android.icu.impl.UResource$Table android.icu.impl.UResource$Value android.icu.impl.Utility +android.icu.impl.coll.CollationRoot android.icu.impl.locale.AsciiUtil android.icu.impl.locale.BaseLocale android.icu.impl.locale.BaseLocale$Cache @@ -2276,7 +2275,6 @@ android.util.Base64 android.util.Base64$Coder android.util.Base64$Decoder android.util.Base64$Encoder -android.util.TimingsTraceLog android.util.ContainerHelpers android.util.DisplayMetrics android.util.EventLog @@ -2328,6 +2326,7 @@ android.util.SparseLongArray android.util.StateSet android.util.SuperNotCalledException android.util.TimeUtils +android.util.TimingsTraceLog android.util.TypedValue android.util.Xml android.util.jar.StrictJarFile diff --git a/config/preloaded-classes-blacklist b/config/preloaded-classes-blacklist new file mode 100644 index 000000000000..48cdce852872 --- /dev/null +++ b/config/preloaded-classes-blacklist @@ -0,0 +1 @@ +placeholder diff --git a/config/preloaded-classes-extra b/config/preloaded-classes-extra new file mode 100644 index 000000000000..1934cbca27ad --- /dev/null +++ b/config/preloaded-classes-extra @@ -0,0 +1 @@ +android.icu.impl.coll.CollationRoot diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index adb3152d4ae7..757795e06cfb 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -16,7 +16,7 @@ package android.app; -import static android.os.Build.VERSION_CODES.O; +import static android.os.Build.VERSION_CODES.O_MR1; import static java.lang.Character.MIN_VALUE; @@ -761,6 +761,11 @@ public class Activity extends ContextThemeWrapper boolean mStartedActivity; private boolean mDestroyed; private boolean mDoReportFullyDrawn = true; + private boolean mRestoredFromBundle; + + /** {@code true} if the activity lifecycle is in a state which supports picture-in-picture. + * This only affects the client-side exception, the actual state check still happens in AMS. */ + private boolean mCanEnterPictureInPicture = false; /** true if the activity is going through a transient pause */ /*package*/ boolean mTemporaryPause = false; /** true if the activity is being destroyed in order to recreate it with a new configuration */ @@ -973,7 +978,7 @@ public class Activity extends ContextThemeWrapper protected void onCreate(@Nullable Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState); - if (getApplicationInfo().targetSdkVersion > O && mActivityInfo.isFixedOrientation()) { + if (getApplicationInfo().targetSdkVersion >= O_MR1 && mActivityInfo.isFixedOrientation()) { final TypedArray ta = obtainStyledAttributes(com.android.internal.R.styleable.Window); final boolean isTranslucentOrFloating = ActivityInfo.isTranslucentOrFloating(ta); ta.recycle(); @@ -1012,6 +1017,7 @@ public class Activity extends ContextThemeWrapper if (mVoiceInteractor != null) { mVoiceInteractor.attachActivity(this); } + mRestoredFromBundle = savedInstanceState != null; mCalled = true; } @@ -1948,7 +1954,7 @@ public class Activity extends ContextThemeWrapper if (mDoReportFullyDrawn) { mDoReportFullyDrawn = false; try { - ActivityManager.getService().reportActivityFullyDrawn(mToken); + ActivityManager.getService().reportActivityFullyDrawn(mToken, mRestoredFromBundle); } catch (RemoteException e) { } } @@ -2089,6 +2095,10 @@ public class Activity extends ContextThemeWrapper if (params == null) { throw new IllegalArgumentException("Expected non-null picture-in-picture params"); } + if (!mCanEnterPictureInPicture) { + throw new IllegalStateException("Activity must be resumed to enter" + + " picture-in-picture"); + } return ActivityManagerNative.getDefault().enterPictureInPictureMode(mToken, params); } catch (RemoteException e) { return false; @@ -6955,25 +6965,29 @@ public class Activity extends ContextThemeWrapper return mParent != null ? mParent.getActivityToken() : mToken; } - final void performCreateCommon() { - mVisibleFromClient = !mWindow.getWindowStyle().getBoolean( - com.android.internal.R.styleable.Window_windowNoDisplay, false); - mFragments.dispatchActivityCreated(); - mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); - } - final void performCreate(Bundle icicle) { - restoreHasCurrentPermissionRequest(icicle); - onCreate(icicle); - mActivityTransitionState.readState(icicle); - performCreateCommon(); + performCreate(icicle, null); } final void performCreate(Bundle icicle, PersistableBundle persistentState) { + mCanEnterPictureInPicture = true; restoreHasCurrentPermissionRequest(icicle); - onCreate(icicle, persistentState); + if (persistentState != null) { + onCreate(icicle, persistentState); + } else { + onCreate(icicle); + } mActivityTransitionState.readState(icicle); - performCreateCommon(); + + mVisibleFromClient = !mWindow.getWindowStyle().getBoolean( + com.android.internal.R.styleable.Window_windowNoDisplay, false); + mFragments.dispatchActivityCreated(); + mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); + } + + final void performNewIntent(Intent intent) { + mCanEnterPictureInPicture = true; + onNewIntent(intent); } final void performStart() { @@ -7124,6 +7138,9 @@ public class Activity extends ContextThemeWrapper mDoReportFullyDrawn = false; mFragments.doLoaderStop(mChangingConfigurations /*retain*/); + // Disallow entering picture-in-picture after the activity has been stopped + mCanEnterPictureInPicture = false; + if (!mStopped) { if (mWindow != null) { mWindow.closeAllPanels(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index d4325448ef14..ff68e2348b4a 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -2907,6 +2907,8 @@ public class ActivityManager { /** * @hide */ + @RequiresPermission(anyOf={Manifest.permission.CLEAR_APP_USER_DATA, + Manifest.permission.ACCESS_INSTANT_APPS}) public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) { try { return getService().clearApplicationUserData(packageName, diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index e5fe2402dae1..c8d983933fc6 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -30,8 +30,6 @@ import android.util.SparseIntArray; import com.android.internal.app.IVoiceInteractor; -import java.io.PrintWriter; -import java.util.ArrayList; import java.util.List; /** @@ -90,11 +88,12 @@ public abstract class ActivityManagerInternal { String processName, String abiOverride, int uid, Runnable crashHandler); /** - * Acquires a sleep token with the specified tag. + * Acquires a sleep token for the specified display with the specified tag. * * @param tag A string identifying the purpose of the token (eg. "Dream"). + * @param displayId The display to apply the sleep token to. */ - public abstract SleepToken acquireSleepToken(@NonNull String tag); + public abstract SleepToken acquireSleepToken(@NonNull String tag, int displayId); /** * Sleep tokens cause the activity manager to put the top activity to sleep. @@ -263,4 +262,10 @@ public abstract class ActivityManagerInternal { * Clears the previously saved activity manager ANR state. */ public abstract void clearSavedANRState(); + + /** + * Set focus on an activity. + * @param token The IApplicationToken for the activity + */ + public abstract void setFocusedActivity(IBinder token); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 43693e1983b7..2e4ce1886fd6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2666,14 +2666,8 @@ public final class ActivityThread { Activity activity = null; try { java.lang.ClassLoader cl = appContext.getClassLoader(); - if (appContext.getApplicationContext() instanceof Application) { - activity = ((Application) appContext.getApplicationContext()) - .instantiateActivity(cl, component.getClassName(), r.intent); - } - if (activity == null) { - activity = mInstrumentation.newActivity( - cl, component.getClassName(), r.intent); - } + activity = mInstrumentation.newActivity( + cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); @@ -3169,8 +3163,7 @@ public final class ActivityThread { data.intent.setExtrasClassLoader(cl); data.intent.prepareToEnterProcess(); data.setExtrasClassLoader(cl); - receiver = instantiate(cl, component, data.intent, app, - Application::instantiateReceiver); + receiver = (BroadcastReceiver)cl.loadClass(component).newInstance(); } catch (Exception e) { if (DEBUG_BROADCAST) Slog.i(TAG, "Finishing failed broadcast to " + data.intent.getComponent()); @@ -3258,13 +3251,12 @@ public final class ActivityThread { } else { try { if (DEBUG_BACKUP) Slog.v(TAG, "Initializing agent class " + classname); - ContextImpl context = ContextImpl.createAppContext(this, packageInfo); java.lang.ClassLoader cl = packageInfo.getClassLoader(); - agent = instantiate(cl, classname, context, - Application::instantiateBackupAgent); + agent = (BackupAgent) cl.loadClass(classname).newInstance(); // set up the agent's context + ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(agent); agent.attach(context); @@ -3324,12 +3316,9 @@ public final class ActivityThread { LoadedApk packageInfo = getPackageInfoNoCheck( data.info.applicationInfo, data.compatInfo); Service service = null; - Application app = null; try { - app = packageInfo.makeApplication(false, mInstrumentation); java.lang.ClassLoader cl = packageInfo.getClassLoader(); - service = instantiate(cl, data.info.name, data.intent, app, - Application::instantiateService); + service = (Service) cl.loadClass(data.info.name).newInstance(); } catch (Exception e) { if (!mInstrumentation.onException(service, e)) { throw new RuntimeException( @@ -3344,6 +3333,7 @@ public final class ActivityThread { ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); + Application app = packageInfo.makeApplication(false, mInstrumentation); service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService()); service.onCreate(); @@ -5682,8 +5672,8 @@ public final class ActivityThread { try { final ClassLoader cl = instrContext.getClassLoader(); - mInstrumentation = instantiate(cl, data.instrumentationName.getClassName(), - instrContext, Application::instantiateInstrumentation); + mInstrumentation = (Instrumentation) + cl.loadClass(data.instrumentationName.getClassName()).newInstance(); } catch (Exception e) { throw new RuntimeException( "Unable to instantiate instrumentation " @@ -6234,8 +6224,8 @@ public final class ActivityThread { try { final java.lang.ClassLoader cl = c.getClassLoader(); - localProvider = instantiate(cl, info.name, context, - Application::instantiateProvider); + localProvider = (ContentProvider)cl. + loadClass(info.name).newInstance(); provider = localProvider.getIContentProvider(); if (provider == null) { Slog.e(TAG, "Failed to instantiate class " + @@ -6434,49 +6424,6 @@ public final class ActivityThread { } } - private <T> T instantiate(ClassLoader cl, String className, Context c, - Instantiator<T> instantiator) - throws ClassNotFoundException, IllegalAccessException, InstantiationException { - Application app = getApp(c); - if (app != null) { - T a = instantiator.instantiate(app, cl, className); - if (a != null) return a; - } - return (T) cl.loadClass(className).newInstance(); - } - - private <T> T instantiate(ClassLoader cl, String className, Intent intent, Context c, - IntentInstantiator<T> instantiator) - throws ClassNotFoundException, IllegalAccessException, InstantiationException { - Application app = getApp(c); - if (app != null) { - T a = instantiator.instantiate(app, cl, className, intent); - if (a != null) return a; - } - return (T) cl.loadClass(className).newInstance(); - } - - private Application getApp(Context c) { - // We need this shortcut to avoid actually calling getApplicationContext() on an Application - // because the Application may not return itself for getApplicationContext() because the - // API doesn't enforce it. - if (c instanceof Application) return (Application) c; - if (c.getApplicationContext() instanceof Application) { - return (Application) c.getApplicationContext(); - } - return null; - } - - private interface Instantiator<T> { - T instantiate(Application app, ClassLoader cl, String className) - throws ClassNotFoundException, IllegalAccessException, InstantiationException; - } - - private interface IntentInstantiator<T> { - T instantiate(Application app, ClassLoader cl, String className, Intent intent) - throws ClassNotFoundException, IllegalAccessException, InstantiationException; - } - private static class EventLoggingReporter implements EventLogger.Reporter { @Override public void report (int code, Object... list) { diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index cc23ec9023b6..156df36a600c 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -16,20 +16,17 @@ package android.app; +import java.util.ArrayList; + import android.annotation.CallSuper; -import android.app.backup.BackupAgent; -import android.content.BroadcastReceiver; import android.content.ComponentCallbacks; import android.content.ComponentCallbacks2; -import android.content.ContentProvider; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; -import java.util.ArrayList; - /** * Base class for maintaining global application state. You can provide your own * implementation by creating a subclass and specifying the fully-qualified name @@ -292,73 +289,4 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } } - - /** - * Allows application to override the creation of activities. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of receivers. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of services. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public Service instantiateService(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of providers. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public ContentProvider instantiateProvider(ClassLoader cl, String className) { - return null; - } - - /** - * Allows application to override the creation of backup agents. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public BackupAgent instantiateBackupAgent(ClassLoader cl, String className) { - return null; - } - - /** - * Allows application to override the creation of instrumentation. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public Instrumentation instantiateInstrumentation(ClassLoader cl, String className) { - return null; - } }
\ No newline at end of file diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index fa9d7ca8ebc5..897e42bc2b22 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -376,7 +376,7 @@ interface IActivityManager { boolean convertFromTranslucent(in IBinder token); boolean convertToTranslucent(in IBinder token, in Bundle options); void notifyActivityDrawn(in IBinder token); - void reportActivityFullyDrawn(in IBinder token); + void reportActivityFullyDrawn(in IBinder token, boolean restoredFromBundle); void restart(); void performIdleMaintenance(); void takePersistableUriPermission(in Uri uri, int modeFlags, int userId); diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 467fc952ffee..e260967f92d0 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -48,6 +48,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.ViewConfiguration; import android.view.Window; + import com.android.internal.content.ReferrerIntent; import java.io.File; @@ -1305,7 +1306,7 @@ public class Instrumentation { * @param intent The new intent being received. */ public void callActivityOnNewIntent(Activity activity, Intent intent) { - activity.onNewIntent(intent); + activity.performNewIntent(intent); } /** diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index a218274481a0..9511f3fd7cef 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -60,7 +60,6 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.style.AbsoluteSizeSpan; -import android.text.style.BackgroundColorSpan; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; @@ -1164,7 +1163,8 @@ public class Notification implements Parcelable * Constant for {@link Builder#setGroupAlertBehavior(int)}, meaning that all children * notification in a group should be silenced (no sound or vibration) even if they are posted * to a {@link NotificationChannel} that has sound and/or vibration. Use this constant to - * mute this notification if this notification is a group child. + * mute this notification if this notification is a group child. This must be applied to all + * children notifications you want to mute. * * <p> For example, you might want to use this constant if you post a number of children * notifications at once (say, after a periodic sync), and only need to notify the user @@ -1179,7 +1179,8 @@ public class Notification implements Parcelable * to mute this notification if this notification is a group summary. * * <p>For example, you might want to use this constant if only the children notifications - * in your group have content and the summary is only used to visually group notifications. + * in your group have content and the summary is only used to visually group notifications + * rather than to alert the user that new information is available. */ public static final int GROUP_ALERT_CHILDREN = 2; @@ -2914,7 +2915,9 @@ public class Notification implements Parcelable * Sets the group alert behavior for this notification. Use this method to mute this * notification if alerts for this notification's group should be handled by a different * notification. This is only applicable for notifications that belong to a - * {@link #setGroup(String) group}. + * {@link #setGroup(String) group}. This must be called on all notifications you want to + * mute. For example, if you want only the summary of your group to make noise, all + * children in the group should have the group alert behavior {@link #GROUP_ALERT_SUMMARY}. * * <p> The default value is {@link #GROUP_ALERT_ALL}.</p> */ @@ -3894,7 +3897,7 @@ public class Notification implements Parcelable boolean showProgress = handleProgressBar(p.hasProgress, contentView, ex); if (p.title != null) { contentView.setViewVisibility(R.id.title, View.VISIBLE); - contentView.setTextViewText(R.id.title, p.title); + contentView.setTextViewText(R.id.title, processTextSpans(p.title)); if (!p.ambient) { setTextViewColorPrimary(contentView, R.id.title); } @@ -3905,7 +3908,7 @@ public class Notification implements Parcelable if (p.text != null) { int textId = showProgress ? com.android.internal.R.id.text_line_1 : com.android.internal.R.id.text; - contentView.setTextViewText(textId, p.text); + contentView.setTextViewText(textId, processTextSpans(p.text)); if (!p.ambient) { setTextViewColorSecondary(contentView, textId); } @@ -3917,11 +3920,22 @@ public class Notification implements Parcelable return contentView; } + private CharSequence processTextSpans(CharSequence text) { + if (hasForegroundColor()) { + return NotificationColorUtil.clearColorSpans(text); + } + return text; + } + private void setTextViewColorPrimary(RemoteViews contentView, int id) { ensureColors(); contentView.setTextColor(id, mPrimaryTextColor); } + private boolean hasForegroundColor() { + return mForegroundColor != COLOR_INVALID; + } + /** * @return the primary text color * @hide @@ -3964,7 +3978,7 @@ public class Notification implements Parcelable || mActionBarColor == COLOR_INVALID || mTextColorsAreForBackground != backgroundColor) { mTextColorsAreForBackground = backgroundColor; - if (mForegroundColor == COLOR_INVALID || !isColorized()) { + if (!hasForegroundColor() || !isColorized()) { mPrimaryTextColor = NotificationColorUtil.resolvePrimaryColor(mContext, backgroundColor); mSecondaryTextColor = NotificationColorUtil.resolveSecondaryColor(mContext, @@ -4215,7 +4229,8 @@ public class Notification implements Parcelable } if (headerText != null) { // TODO: Remove the span entirely to only have the string with propper formating. - contentView.setTextViewText(R.id.header_text, processLegacyText(headerText)); + contentView.setTextViewText(R.id.header_text, processTextSpans( + processLegacyText(headerText))); setTextViewColorSecondary(contentView, R.id.header_text); contentView.setViewVisibility(R.id.header_text, View.VISIBLE); contentView.setViewVisibility(R.id.header_text_divider, View.VISIBLE); @@ -4346,18 +4361,21 @@ public class Notification implements Parcelable if (!p.ambient && validRemoteInput && replyText != null && replyText.length > 0 && !TextUtils.isEmpty(replyText[0])) { big.setViewVisibility(R.id.notification_material_reply_container, View.VISIBLE); - big.setTextViewText(R.id.notification_material_reply_text_1, replyText[0]); + big.setTextViewText(R.id.notification_material_reply_text_1, + processTextSpans(replyText[0])); setTextViewColorSecondary(big, R.id.notification_material_reply_text_1); if (replyText.length > 1 && !TextUtils.isEmpty(replyText[1])) { big.setViewVisibility(R.id.notification_material_reply_text_2, View.VISIBLE); - big.setTextViewText(R.id.notification_material_reply_text_2, replyText[1]); + big.setTextViewText(R.id.notification_material_reply_text_2, + processTextSpans(replyText[1])); setTextViewColorSecondary(big, R.id.notification_material_reply_text_2); if (replyText.length > 2 && !TextUtils.isEmpty(replyText[2])) { big.setViewVisibility( R.id.notification_material_reply_text_3, View.VISIBLE); - big.setTextViewText(R.id.notification_material_reply_text_3, replyText[2]); + big.setTextViewText(R.id.notification_material_reply_text_3, + processTextSpans(replyText[2])); setTextViewColorSecondary(big, R.id.notification_material_reply_text_3); } } @@ -4664,12 +4682,12 @@ public class Notification implements Parcelable CharSequence title = action.title; ColorStateList[] outResultColor = null; if (isLegacy()) { - title = clearColorSpans(title); + title = NotificationColorUtil.clearColorSpans(title); } else { outResultColor = new ColorStateList[1]; title = ensureColorSpanContrast(title, bgColor, outResultColor); } - button.setTextViewText(R.id.action0, title); + button.setTextViewText(R.id.action0, processTextSpans(title)); setTextViewColorPrimary(button, R.id.action0); if (outResultColor != null && outResultColor[0] != null) { // We need to set the text color as well since changing a text to uppercase @@ -4679,7 +4697,8 @@ public class Notification implements Parcelable button.setTextColor(R.id.action0,resolveContrastColor()); } } else { - button.setTextViewText(R.id.action0, processLegacyText(action.title)); + button.setTextViewText(R.id.action0, processTextSpans( + processLegacyText(action.title))); if (isColorized() && !ambient) { setTextViewColorPrimary(button, R.id.action0); } else if (mN.color != COLOR_DEFAULT && mTintActionButtons) { @@ -4691,45 +4710,6 @@ public class Notification implements Parcelable } /** - * Clears all color spans of a text - * @param charSequence the input text - * @return the same text but without color spans - */ - private CharSequence clearColorSpans(CharSequence charSequence) { - if (charSequence instanceof Spanned) { - Spanned ss = (Spanned) charSequence; - Object[] spans = ss.getSpans(0, ss.length(), Object.class); - SpannableStringBuilder builder = new SpannableStringBuilder(ss.toString()); - for (Object span : spans) { - Object resultSpan = span; - if (resultSpan instanceof CharacterStyle) { - resultSpan = ((CharacterStyle) span).getUnderlying(); - } - if (resultSpan instanceof TextAppearanceSpan) { - TextAppearanceSpan originalSpan = (TextAppearanceSpan) resultSpan; - if (originalSpan.getTextColor() != null) { - resultSpan = new TextAppearanceSpan( - originalSpan.getFamily(), - originalSpan.getTextStyle(), - originalSpan.getTextSize(), - null, - originalSpan.getLinkTextColor()); - } - } else if (resultSpan instanceof ForegroundColorSpan - || (resultSpan instanceof BackgroundColorSpan)) { - continue; - } else { - resultSpan = span; - } - builder.setSpan(resultSpan, ss.getSpanStart(span), ss.getSpanEnd(span), - ss.getSpanFlags(span)); - } - return builder; - } - return charSequence; - } - - /** * Ensures contrast on color spans against a background color. also returns the color of the * text if a span was found that spans over the whole text. * @@ -5182,17 +5162,22 @@ public class Notification implements Parcelable if (extras.getBoolean(EXTRA_REDUCED_IMAGES)) { return; } + boolean isLowRam = ActivityManager.isLowRamDeviceStatic(); if (mLargeIcon != null || largeIcon != null) { Resources resources = context.getResources(); Class<? extends Style> style = getNotificationStyle(); - int maxWidth = resources.getDimensionPixelSize(R.dimen.notification_right_icon_size); + int maxWidth = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_right_icon_size_low_ram + : R.dimen.notification_right_icon_size); int maxHeight = maxWidth; if (MediaStyle.class.equals(style) || DecoratedMediaCustomViewStyle.class.equals(style)) { - maxHeight = resources.getDimensionPixelSize( - R.dimen.notification_media_image_max_height); - maxWidth = resources.getDimensionPixelSize( - R.dimen.notification_media_image_max_width); + maxHeight = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_media_image_max_height_low_ram + : R.dimen.notification_media_image_max_height); + maxWidth = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_media_image_max_width_low_ram + : R.dimen.notification_media_image_max_width); } if (mLargeIcon != null) { mLargeIcon.scaleDownIfNecessary(maxWidth, maxHeight); @@ -5201,19 +5186,22 @@ public class Notification implements Parcelable largeIcon = Icon.scaleDownIfNecessary(largeIcon, maxWidth, maxHeight); } } - reduceImageSizesForRemoteView(contentView, context); - reduceImageSizesForRemoteView(headsUpContentView, context); - reduceImageSizesForRemoteView(bigContentView, context); + reduceImageSizesForRemoteView(contentView, context, isLowRam); + reduceImageSizesForRemoteView(headsUpContentView, context, isLowRam); + reduceImageSizesForRemoteView(bigContentView, context, isLowRam); extras.putBoolean(EXTRA_REDUCED_IMAGES, true); } - private void reduceImageSizesForRemoteView(RemoteViews remoteView, Context context) { + private void reduceImageSizesForRemoteView(RemoteViews remoteView, Context context, + boolean isLowRam) { if (remoteView != null) { Resources resources = context.getResources(); - int maxWidth = resources.getDimensionPixelSize( - R.dimen.notification_custom_view_max_image_width); - int maxHeight = resources.getDimensionPixelSize( - R.dimen.notification_custom_view_max_image_height); + int maxWidth = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_custom_view_max_image_width_low_ram + : R.dimen.notification_custom_view_max_image_width); + int maxHeight = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_custom_view_max_image_height_low_ram + : R.dimen.notification_custom_view_max_image_height); remoteView.reduceImageSizes(maxWidth, maxHeight); } } @@ -5629,16 +5617,20 @@ public class Notification implements Parcelable public void reduceImageSizes(Context context) { super.reduceImageSizes(context); Resources resources = context.getResources(); + boolean isLowRam = ActivityManager.isLowRamDeviceStatic(); if (mPicture != null) { - int maxPictureWidth = resources.getDimensionPixelSize( - R.dimen.notification_big_picture_max_height); - int maxPictureHeight = resources.getDimensionPixelSize( - R.dimen.notification_big_picture_max_width); + int maxPictureWidth = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_big_picture_max_height_low_ram + : R.dimen.notification_big_picture_max_height); + int maxPictureHeight = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_big_picture_max_width_low_ram + : R.dimen.notification_big_picture_max_width); mPicture = Icon.scaleDownIfNecessary(mPicture, maxPictureWidth, maxPictureHeight); } if (mBigLargeIcon != null) { - int rightIconSize = resources.getDimensionPixelSize( - R.dimen.notification_right_icon_size); + int rightIconSize = resources.getDimensionPixelSize(isLowRam + ? R.dimen.notification_right_icon_size_low_ram + : R.dimen.notification_right_icon_size); mBigLargeIcon.scaleDownIfNecessary(rightIconSize, rightIconSize); } } @@ -5666,7 +5658,8 @@ public class Notification implements Parcelable RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource()); if (mSummaryTextSet) { - contentView.setTextViewText(R.id.text, mBuilder.processLegacyText(mSummaryText)); + contentView.setTextViewText(R.id.text, mBuilder.processTextSpans( + mBuilder.processLegacyText(mSummaryText))); mBuilder.setTextViewColorSecondary(contentView, R.id.text); contentView.setViewVisibility(R.id.text, View.VISIBLE); } @@ -5848,7 +5841,7 @@ public class Notification implements Parcelable static void applyBigTextContentView(Builder builder, RemoteViews contentView, CharSequence bigTextText) { - contentView.setTextViewText(R.id.big_text, bigTextText); + contentView.setTextViewText(R.id.big_text, builder.processTextSpans(bigTextText)); builder.setTextViewColorSecondary(contentView, R.id.big_text); contentView.setViewVisibility(R.id.big_text, TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE); @@ -6183,7 +6176,8 @@ public class Notification implements Parcelable int rowId = rowIds[i]; contentView.setViewVisibility(rowId, View.VISIBLE); - contentView.setTextViewText(rowId, makeMessageLine(m, mBuilder)); + contentView.setTextViewText(rowId, mBuilder.processTextSpans( + makeMessageLine(m, mBuilder))); mBuilder.setTextViewColorSecondary(contentView, rowId); if (contractedMessage == m) { @@ -6549,7 +6543,8 @@ public class Notification implements Parcelable CharSequence str = mTexts.get(i); if (!TextUtils.isEmpty(str)) { contentView.setViewVisibility(rowIds[i], View.VISIBLE); - contentView.setTextViewText(rowIds[i], mBuilder.processLegacyText(str)); + contentView.setTextViewText(rowIds[i], + mBuilder.processTextSpans(mBuilder.processLegacyText(str))); mBuilder.setTextViewColorSecondary(contentView, rowIds[i]); contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0); handleInboxImageMargin(contentView, rowIds[i], first); @@ -6935,6 +6930,7 @@ public class Notification implements Parcelable customContent = customContent.clone(); remoteViews.removeAllViewsExceptId(R.id.notification_main_column, R.id.progress); remoteViews.addView(R.id.notification_main_column, customContent, 0 /* index */); + remoteViews.setReapplyDisallowed(); } // also update the end margin if there is an image int endMargin = R.dimen.notification_content_margin_end; @@ -7039,8 +7035,10 @@ public class Notification implements Parcelable // Need to clone customContent before adding, because otherwise it can no longer be // parceled independently of remoteViews. customContent = customContent.clone(); + customContent.overrideTextColors(mBuilder.getPrimaryTextColor()); remoteViews.removeAllViews(id); remoteViews.addView(id, customContent); + remoteViews.setReapplyDisallowed(); } return remoteViews; } diff --git a/core/java/android/app/NotificationChannelGroup.java b/core/java/android/app/NotificationChannelGroup.java index 7e8f191acdb9..18ad9cf3d8e3 100644 --- a/core/java/android/app/NotificationChannelGroup.java +++ b/core/java/android/app/NotificationChannelGroup.java @@ -15,24 +15,18 @@ */ package android.app; -import android.annotation.StringRes; import android.annotation.SystemApi; import android.content.Intent; -import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; -import android.service.notification.NotificationListenerService; import android.text.TextUtils; -import android.util.Slog; import org.json.JSONException; import org.json.JSONObject; -import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -115,10 +109,8 @@ public final class NotificationChannelGroup implements Parcelable { return mName; } - /* + /** * Returns the list of channels that belong to this group - * - * @hide */ public List<NotificationChannel> getChannels() { return mChannels; diff --git a/core/java/android/app/SharedElementCallback.java b/core/java/android/app/SharedElementCallback.java index bac84a4fcc9d..af13e695108f 100644 --- a/core/java/android/app/SharedElementCallback.java +++ b/core/java/android/app/SharedElementCallback.java @@ -18,6 +18,7 @@ package android.app; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; @@ -44,6 +45,8 @@ import java.util.Map; public abstract class SharedElementCallback { private Matrix mTempMatrix; private static final String BUNDLE_SNAPSHOT_BITMAP = "sharedElement:snapshot:bitmap"; + private static final String BUNDLE_SNAPSHOT_GRAPHIC_BUFFER = + "sharedElement:snapshot:graphicBuffer"; private static final String BUNDLE_SNAPSHOT_IMAGE_SCALETYPE = "sharedElement:snapshot:imageScaleType"; private static final String BUNDLE_SNAPSHOT_IMAGE_MATRIX = "sharedElement:snapshot:imageMatrix"; @@ -176,7 +179,12 @@ public abstract class SharedElementCallback { Bitmap bitmap = TransitionUtils.createDrawableBitmap(d); if (bitmap != null) { Bundle bundle = new Bundle(); - bundle.putParcelable(BUNDLE_SNAPSHOT_BITMAP, bitmap); + if (bitmap.getConfig() != Bitmap.Config.HARDWARE) { + bundle.putParcelable(BUNDLE_SNAPSHOT_BITMAP, bitmap); + } else { + GraphicBuffer graphicBuffer = bitmap.createGraphicBufferHandle(); + bundle.putParcelable(BUNDLE_SNAPSHOT_GRAPHIC_BUFFER, graphicBuffer); + } bundle.putString(BUNDLE_SNAPSHOT_IMAGE_SCALETYPE, imageView.getScaleType().toString()); if (imageView.getScaleType() == ScaleType.MATRIX) { @@ -218,10 +226,14 @@ public abstract class SharedElementCallback { View view = null; if (snapshot instanceof Bundle) { Bundle bundle = (Bundle) snapshot; - Bitmap bitmap = (Bitmap) bundle.getParcelable(BUNDLE_SNAPSHOT_BITMAP); - if (bitmap == null) { + GraphicBuffer buffer = bundle.getParcelable(BUNDLE_SNAPSHOT_GRAPHIC_BUFFER); + Bitmap bitmap = bundle.getParcelable(BUNDLE_SNAPSHOT_BITMAP); + if (buffer == null && bitmap == null) { return null; } + if (bitmap == null) { + bitmap = Bitmap.createHardwareBitmap(buffer); + } ImageView imageView = new ImageView(context); view = imageView; imageView.setImageBitmap(bitmap); diff --git a/core/java/android/app/WallpaperColors.java b/core/java/android/app/WallpaperColors.java index 2a8130f1bd5e..a2864b9d83af 100644 --- a/core/java/android/app/WallpaperColors.java +++ b/core/java/android/app/WallpaperColors.java @@ -49,7 +49,7 @@ public final class WallpaperColors implements Parcelable { * eg. A launcher may set its text color to black if this flag is specified. * @hide */ - public static final int HINT_SUPPORTS_DARK_TEXT = 0x1; + public static final int HINT_SUPPORTS_DARK_TEXT = 1 << 0; /** * Specifies that dark theme is preferred over the current wallpaper for best presentation. @@ -57,7 +57,13 @@ public final class WallpaperColors implements Parcelable { * eg. A launcher may set its drawer color to black if this flag is specified. * @hide */ - public static final int HINT_SUPPORTS_DARK_THEME = 0x2; + public static final int HINT_SUPPORTS_DARK_THEME = 1 << 1; + + /** + * Specifies that this object was generated by extracting colors from a bitmap. + * @hide + */ + public static final int HINT_FROM_BITMAP = 1 << 2; // Maximum size that a bitmap can have to keep our calculations sane private static final int MAX_BITMAP_SIZE = 112; @@ -180,13 +186,13 @@ public final class WallpaperColors implements Parcelable { } } - int hints = calculateHints(bitmap); + int hints = calculateDarkHints(bitmap); if (shouldRecycle) { bitmap.recycle(); } - return new WallpaperColors(primary, secondary, tertiary, hints); + return new WallpaperColors(primary, secondary, tertiary, HINT_FROM_BITMAP | hints); } /** @@ -348,7 +354,7 @@ public final class WallpaperColors implements Parcelable { * @param source What to read. * @return Whether image supports dark text or not. */ - private static int calculateHints(Bitmap source) { + private static int calculateDarkHints(Bitmap source) { if (source == null) { return 0; } diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 16d02149cc0d..b9e739755921 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -59,6 +59,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; +import android.service.wallpaper.WallpaperService; import android.text.TextUtils; import android.util.Log; import android.util.Pair; @@ -855,16 +856,6 @@ public class WallpaperManager { /** * Registers a listener to get notified when the wallpaper colors change. - * Callback might be called from an arbitrary background thread. - * - * @param listener A listener to register - */ - public void addOnColorsChangedListener(@NonNull OnColorsChangedListener listener) { - addOnColorsChangedListener(listener, null); - } - - /** - * Registers a listener to get notified when the wallpaper colors change * @param listener A listener to register * @param handler Where to call it from. Will be called from the main thread * if null. @@ -907,10 +898,16 @@ public class WallpaperManager { } /** - * Get the primary colors of a wallpaper - * @param which wallpaper type. Must be either {@link #FLAG_SYSTEM} or - * {@link #FLAG_LOCK} - * @return {@link WallpaperColors} or null if colors are unknown. + * Get the primary colors of a wallpaper. + * + * <p>You can expect null if: + * • Colors are still being processed by the system. + * • A live wallpaper doesn't implement {@link WallpaperService.Engine#onComputeColors()}. + * + * @param which Wallpaper type. Must be either {@link #FLAG_SYSTEM} or + * {@link #FLAG_LOCK}. + * @return Current {@link WallpaperColors} or null if colors are unknown. + * @see #addOnColorsChangedListener(OnColorsChangedListener, Handler) */ public @Nullable WallpaperColors getWallpaperColors(int which) { return getWallpaperColors(which, mContext.getUserId()); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d8da8c5bee82..56123a72d00e 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2707,13 +2707,14 @@ public class DevicePolicyManager { } /** - * Flag for {@link #resetPassword}: don't allow other admins to change - * the password again until the user has entered it. + * Flag for {@link #resetPasswordWithToken} and {@link #resetPassword}: don't allow other admins + * to change the password again until the user has entered it. */ public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001; /** - * Flag for {@link #resetPassword}: don't ask for user credentials on device boot. + * Flag for {@link #resetPasswordWithToken} and {@link #resetPassword}: don't ask for user + * credentials on device boot. * If the flag is set, the device can be booted without asking for user password. * The absence of this flag does not change the current boot requirements. This flag * can be set by the device owner only. If the app is not the device owner, the flag @@ -2723,8 +2724,8 @@ public class DevicePolicyManager { public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002; /** - * Force a new device unlock password (the password needed to access the entire device, not for - * individual accounts) on the user. This takes effect immediately. + * Force a new password for device unlock (the password needed to access the entire device) or + * the work profile challenge on the current user. This takes effect immediately. * <p> * <em>For device owner and profile owners targeting SDK level * {@link android.os.Build.VERSION_CODES#O} or above, this API is no longer available and will @@ -2762,7 +2763,6 @@ public class DevicePolicyManager { * @throws SecurityException if the calling application does not own an active administrator * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} * @throws IllegalStateException if the calling user is locked or has a managed profile. - * @throws IllegalArgumentException if the password does not meet system requirements. */ public boolean resetPassword(String password, int flags) { throwIfParentInstance("resetPassword"); @@ -2804,8 +2804,8 @@ public class DevicePolicyManager { * @param token a secure token a least 32-byte long, which must be generated by a * cryptographically strong random number generator. * @return true if the operation is successful, false otherwise. + * @throws SecurityException if admin is not a device or profile owner. * @throws IllegalArgumentException if the supplied token is invalid. - * @throws SecurityException */ public boolean setResetPasswordToken(ComponentName admin, byte[] token) { throwIfParentInstance("setResetPasswordToken"); @@ -2824,6 +2824,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return true if the operation is successful, false otherwise. + * @throws SecurityException if admin is not a device or profile owner. */ public boolean clearResetPasswordToken(ComponentName admin) { throwIfParentInstance("clearResetPasswordToken"); @@ -2842,6 +2843,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @return true if the token is active, false otherwise. + * @throws SecurityException if admin is not a device or profile owner. * @throws IllegalStateException if no token has been set. */ public boolean isResetPasswordTokenActive(ComponentName admin) { @@ -2867,24 +2869,23 @@ public class DevicePolicyManager { * The given password must be sufficient for the current password quality and length constraints * as returned by {@link #getPasswordQuality(ComponentName)} and * {@link #getPasswordMinimumLength(ComponentName)}; if it does not meet these constraints, then - * it will be rejected and false returned. Note that the password may be a stronger quality - * (containing alphanumeric characters when the requested quality is only numeric), in which - * case the currently active quality will be increased to match. + * it will be rejected and false returned. Note that the password may be a stronger quality, for + * example, a password containing alphanumeric characters when the requested quality is only + * numeric. * <p> - * Calling with a null or empty password will clear any existing PIN, pattern or password if the - * current password constraints allow it. + * Calling with a {@code null} or empty password will clear any existing PIN, pattern or + * password if the current password constraints allow it. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. - * @param password The new password for the user. Null or empty clears the password. - * @param token the password reset token previously provisioned by #setResetPasswordToken. + * @param password The new password for the user. {@code null} or empty clears the password. + * @param token the password reset token previously provisioned by + * {@link #setResetPasswordToken}. * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and - * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. + * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. * @return Returns true if the password was applied, or false if it is not acceptable for the * current constraints. - * @throws SecurityException if the calling application does not own an active administrator - * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} + * @throws SecurityException if admin is not a device or profile owner. * @throws IllegalStateException if the provided token is not valid. - * @throws IllegalArgumentException if the password does not meet system requirements. */ public boolean resetPasswordWithToken(@NonNull ComponentName admin, String password, byte[] token, int flags) { @@ -3938,7 +3939,7 @@ public class DevicePolicyManager { * {@link android.Manifest.permission#BIND_VPN_SERVICE};</li> * <li>target {@link android.os.Build.VERSION_CODES#N API 24} or above; and</li> * <li><i>not</i> explicitly opt out of the feature through - * {@link android.net.VpnService#METADATA_SUPPORTS_ALWAYS_ON}.</li> + * {@link android.net.VpnService#SERVICE_META_DATA_SUPPORTS_ALWAYS_ON}.</li> * </ul> * The call will fail if called with the package name of an unsupported VPN app. * diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java index dfd5996c6a00..44c2667f2d85 100644 --- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java +++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java @@ -415,7 +415,8 @@ public final class BluetoothLeAdvertiser { gatt = mBluetoothManager.getBluetoothGatt(); } catch (RemoteException e) { Log.e(TAG, "Failed to get Bluetooth gatt - ", e); - throw new IllegalStateException("Failed to get Bluetooth"); + postStartSetFailure(handler, callback, AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR); + return; } IAdvertisingSetCallback wrapped = wrap(callback, handler); @@ -429,7 +430,8 @@ public final class BluetoothLeAdvertiser { periodicData, duration, maxExtendedAdvertisingEvents, wrapped); } catch (RemoteException e) { Log.e(TAG, "Failed to start advertising set - ", e); - throw new IllegalStateException("Failed to start advertising set"); + postStartSetFailure(handler, callback, AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR); + return; } } @@ -453,8 +455,7 @@ public final class BluetoothLeAdvertiser { gatt.stopAdvertisingSet(wrapped); } catch (RemoteException e) { Log.e(TAG, "Failed to stop advertising - ", e); - throw new IllegalStateException("Failed to stop advertising"); - } + } } /** @@ -648,6 +649,16 @@ public final class BluetoothLeAdvertiser { }; } + private void postStartSetFailure(Handler handler, final AdvertisingSetCallback callback, + final int error) { + handler.post(new Runnable() { + @Override + public void run() { + callback.onAdvertisingSetStarted(null, 0, error); + } + }); + } + private void postStartFailure(final AdvertiseCallback callback, final int error) { mHandler.post(new Runnable() { @Override diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index bd0228e8049d..a9dbdd5268a6 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2225,7 +2225,12 @@ public class Intent implements Parcelable, Cloneable { * Note that the cleared package does <em>not</em> * receive this broadcast. The data contains the name of the package. * <ul> - * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. + * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. If the + * package whose data was cleared is an uninstalled instant app, then the UID + * will be -1. The platform keeps some meta-data associated with instant apps + * after they are uninstalled. + * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name only if the cleared + * data was for an instant app. * </ul> * * <p class="note">This is a protected intent that can only be sent diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 72075a515e02..2aa3d09dd479 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -1508,6 +1508,11 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PARTIALLY_DIRECT_BOOT_AWARE) != 0; } + /** @hide */ + public boolean isEncryptionAware() { + return isDirectBootAware() || isPartiallyDirectBootAware(); + } + /** * @hide */ diff --git a/core/java/android/content/pm/BaseParceledListSlice.java b/core/java/android/content/pm/BaseParceledListSlice.java index aaa5f19c3fca..5877a09b7759 100644 --- a/core/java/android/content/pm/BaseParceledListSlice.java +++ b/core/java/android/content/pm/BaseParceledListSlice.java @@ -102,7 +102,7 @@ abstract class BaseParceledListSlice<T> implements Parcelable { return; } while (i < N && reply.readInt() != 0) { - final T parcelable = reply.readCreator(creator, loader); + final T parcelable = readCreator(creator, reply, loader); verifySameType(listElementClass, parcelable.getClass()); mList.add(parcelable); diff --git a/core/java/android/content/pm/InstantAppRequest.java b/core/java/android/content/pm/InstantAppRequest.java index 27d28287b6ae..38f02256ee6e 100644 --- a/core/java/android/content/pm/InstantAppRequest.java +++ b/core/java/android/content/pm/InstantAppRequest.java @@ -38,14 +38,18 @@ public final class InstantAppRequest { * Optional extra bundle provided by the source application to the installer for additional * verification. */ public final Bundle verificationBundle; + /** Whether resolution occurs because an application is starting */ + public final boolean resolveForStart; public InstantAppRequest(AuxiliaryResolveInfo responseObj, Intent origIntent, - String resolvedType, String callingPackage, int userId, Bundle verificationBundle) { + String resolvedType, String callingPackage, int userId, Bundle verificationBundle, + boolean resolveForStart) { this.responseObj = responseObj; this.origIntent = origIntent; this.resolvedType = resolvedType; this.callingPackage = callingPackage; this.userId = userId; this.verificationBundle = verificationBundle; + this.resolveForStart = resolveForStart; } } diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index cf0edcad7e2b..ba488f6a0518 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -187,8 +187,17 @@ public class PackageInfo implements Parcelable { public static final int REQUESTED_PERMISSION_GRANTED = 1<<1; /** - * Array of all signatures read from the package file. This is only filled - * in if the flag {@link PackageManager#GET_SIGNATURES} was set. + * Array of all signatures read from the package file. This is only filled + * in if the flag {@link PackageManager#GET_SIGNATURES} was set. A package + * must be singed with at least one certificate which is at position zero. + * The package can be signed with additional certificates which appear as + * subsequent entries. + * + * <strong>Note:</strong> Signature ordering is not guaranteed to be + * stable which means that a package signed with certificates A and B is + * equivalent to being signed with certificates B and A. This means that + * in case multiple signatures are reported you cannot assume the one at + * the first position to be the same across updates. */ public Signature[] signatures; diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 99700df2b990..e8bade9b2c94 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -20,7 +20,6 @@ import android.content.ComponentName; import android.content.Intent; import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.pm.PackageManager.ComponentInfoFlags; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.PackageInfoFlags; import android.content.pm.PackageManager.ResolveInfoFlags; import android.os.Bundle; @@ -372,4 +371,11 @@ public abstract class PackageManagerInternal { /** Whether the binder caller can access instant apps. */ public abstract boolean canAccessInstantApps(int callingUid, int userId); + + /** + * Returns {@code true} if a given package has instant application meta-data. + * Otherwise, returns {@code false}. Meta-data is state (eg. cookie, app icon, etc) + * associated with an instant app. It may be kept after the instant app has been uninstalled. + */ + public abstract boolean hasInstantApplicationMetadata(String packageName, int userId); } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 9b9499cd602d..cb9ecf3e2bd8 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -97,6 +97,7 @@ import com.android.internal.util.XmlUtils; import libcore.io.IoUtils; +import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -1120,12 +1121,12 @@ public class PackageParser { final String cacheKey = getCacheKey(packageFile, flags); final File cacheFile = new File(mCacheDir, cacheKey); - // If the cache is not up to date, return null. - if (!isCacheUpToDate(packageFile, cacheFile)) { - return null; - } - try { + // If the cache is not up to date, return null. + if (!isCacheUpToDate(packageFile, cacheFile)) { + return null; + } + final byte[] bytes = IoUtils.readFileAsByteArray(cacheFile.getAbsolutePath()); Package p = fromCacheEntry(bytes); if (mCallback != null) { @@ -1140,7 +1141,7 @@ public class PackageParser { } } return p; - } catch (Exception e) { + } catch (Throwable e) { Slog.w(TAG, "Error reading package cache: ", e); // If something went wrong while reading the cache entry, delete the cache file @@ -1158,26 +1159,30 @@ public class PackageParser { return; } - final String cacheKey = getCacheKey(packageFile, flags); - final File cacheFile = new File(mCacheDir, cacheKey); + try { + final String cacheKey = getCacheKey(packageFile, flags); + final File cacheFile = new File(mCacheDir, cacheKey); - if (cacheFile.exists()) { - if (!cacheFile.delete()) { - Slog.e(TAG, "Unable to delete cache file: " + cacheFile); + if (cacheFile.exists()) { + if (!cacheFile.delete()) { + Slog.e(TAG, "Unable to delete cache file: " + cacheFile); + } } - } - final byte[] cacheEntry = toCacheEntry(parsed); + final byte[] cacheEntry = toCacheEntry(parsed); - if (cacheEntry == null) { - return; - } + if (cacheEntry == null) { + return; + } - try (FileOutputStream fos = new FileOutputStream(cacheFile)) { - fos.write(cacheEntry); - } catch (IOException ioe) { - Slog.w(TAG, "Error writing cache entry.", ioe); - cacheFile.delete(); + try (FileOutputStream fos = new FileOutputStream(cacheFile)) { + fos.write(cacheEntry); + } catch (IOException ioe) { + Slog.w(TAG, "Error writing cache entry.", ioe); + cacheFile.delete(); + } + } catch (Throwable e) { + Slog.w(TAG, "Error saving package cache.", e); } } @@ -2820,14 +2825,14 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); final int version = sa.getInt( com.android.internal.R.styleable.AndroidManifestUsesStaticLibrary_version, -1); - String certSha256 = sa.getNonResourceString(com.android.internal.R.styleable + String certSha256Digest = sa.getNonResourceString(com.android.internal.R.styleable .AndroidManifestUsesStaticLibrary_certDigest); sa.recycle(); // Since an APK providing a static shared lib can only provide the lib - fail if malformed - if (lname == null || version < 0 || certSha256 == null) { + if (lname == null || version < 0 || certSha256Digest == null) { outError[0] = "Bad uses-static-library declaration name: " + lname + " version: " - + version + " certDigest" + certSha256; + + version + " certDigest" + certSha256Digest; mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; XmlUtils.skipCurrentTag(parser); return false; @@ -2844,18 +2849,75 @@ public class PackageParser { lname = lname.intern(); // We allow ":" delimiters in the SHA declaration as this is the format // emitted by the certtool making it easy for developers to copy/paste. - certSha256 = certSha256.replace(":", "").toLowerCase(); + certSha256Digest = certSha256Digest.replace(":", "").toLowerCase(); + + // Fot apps targeting O-MR1 we require explicit enumeration of all certs. + String[] additionalCertSha256Digests = EmptyArray.STRING; + if (pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.O) { + additionalCertSha256Digests = parseAdditionalCertificates(res, parser, outError); + if (additionalCertSha256Digests == null) { + return false; + } + } else { + XmlUtils.skipCurrentTag(parser); + } + + final String[] certSha256Digests = new String[additionalCertSha256Digests.length + 1]; + certSha256Digests[0] = certSha256Digest; + System.arraycopy(additionalCertSha256Digests, 0, certSha256Digests, + 1, additionalCertSha256Digests.length); + pkg.usesStaticLibraries = ArrayUtils.add(pkg.usesStaticLibraries, lname); pkg.usesStaticLibrariesVersions = ArrayUtils.appendInt( pkg.usesStaticLibrariesVersions, version, true); - pkg.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String.class, - pkg.usesStaticLibrariesCertDigests, certSha256, true); - - XmlUtils.skipCurrentTag(parser); + pkg.usesStaticLibrariesCertDigests = ArrayUtils.appendElement(String[].class, + pkg.usesStaticLibrariesCertDigests, certSha256Digests, true); return true; } + private String[] parseAdditionalCertificates(Resources resources, XmlResourceParser parser, + String[] outError) throws XmlPullParserException, IOException { + String[] certSha256Digests = EmptyArray.STRING; + + int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + + final String nodeName = parser.getName(); + if (nodeName.equals("additional-certificate")) { + final TypedArray sa = resources.obtainAttributes(parser, com.android.internal. + R.styleable.AndroidManifestAdditionalCertificate); + String certSha256Digest = sa.getNonResourceString(com.android.internal. + R.styleable.AndroidManifestAdditionalCertificate_certDigest); + sa.recycle(); + + if (TextUtils.isEmpty(certSha256Digest)) { + outError[0] = "Bad additional-certificate declaration with empty" + + " certDigest:" + certSha256Digest; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; + XmlUtils.skipCurrentTag(parser); + sa.recycle(); + return null; + } + + // We allow ":" delimiters in the SHA declaration as this is the format + // emitted by the certtool making it easy for developers to copy/paste. + certSha256Digest = certSha256Digest.replace(":", "").toLowerCase(); + certSha256Digests = ArrayUtils.appendElement(String.class, + certSha256Digests, certSha256Digest); + } else { + XmlUtils.skipCurrentTag(parser); + } + } + + return certSha256Digests; + } + private boolean parseUsesPermission(Package pkg, Resources res, XmlResourceParser parser) throws XmlPullParserException, IOException { TypedArray sa = res.obtainAttributes(parser, @@ -5816,7 +5878,7 @@ public class PackageParser { public ArrayList<String> usesLibraries = null; public ArrayList<String> usesStaticLibraries = null; public int[] usesStaticLibrariesVersions = null; - public String[] usesStaticLibrariesCertDigests = null; + public String[][] usesStaticLibrariesCertDigests = null; public ArrayList<String> usesOptionalLibraries = null; public String[] usesLibraryFiles = null; @@ -6314,8 +6376,10 @@ public class PackageParser { internStringArrayList(usesStaticLibraries); usesStaticLibrariesVersions = new int[libCount]; dest.readIntArray(usesStaticLibrariesVersions); - usesStaticLibrariesCertDigests = new String[libCount]; - dest.readStringArray(usesStaticLibrariesCertDigests); + usesStaticLibrariesCertDigests = new String[libCount][]; + for (int i = 0; i < libCount; i++) { + usesStaticLibrariesCertDigests[i] = dest.createStringArray(); + } } preferredActivityFilters = new ArrayList<>(); @@ -6461,7 +6525,9 @@ public class PackageParser { dest.writeInt(usesStaticLibraries.size()); dest.writeStringList(usesStaticLibraries); dest.writeIntArray(usesStaticLibrariesVersions); - dest.writeStringArray(usesStaticLibrariesCertDigests); + for (String[] usesStaticLibrariesCertDigest : usesStaticLibrariesCertDigests) { + dest.writeStringArray(usesStaticLibrariesCertDigest); + } } dest.writeParcelableList(preferredActivityFilters, flags); diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index c0b82b4dfee3..61b0eb0b51f8 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -36,161 +36,72 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.List; /** - * The ShortcutManager manages an app's <em>shortcuts</em>. Shortcuts provide users - * with quick access to activities other than an app's main activity in the currently-active - * launcher. For example, - * an email app may publish the "compose new email" action, which will directly open the - * compose activity. The {@link ShortcutInfo} class contains information about each of the - * shortcuts themselves. + * The ShortcutManager manages an app's <em>shortcuts</em>. Shortcuts provide users with quick + * access to activities other than an app's main activity in the currently-active launcher, provided + * that the launcher supports app shortcuts. For example, an email app may publish the "compose new + * email" action, which will directly open the compose activity. The {@link ShortcutInfo} class + * contains information about each of the shortcuts themselves. * - * <h3>Static Shortcuts and Dynamic Shortcuts</h3> + * <p>This page discusses the implementation details of the <code>ShortcutManager</code> class. For + * guidance on performing operations on app shortcuts within your app, see the + * <a href="/guide/topics/ui/shortcuts.html">App Shortcuts</a> feature guide. * - * <p> - * There are several different types of shortcuts: + * <h3>Shortcut characteristics</h3> * - * <ul> - * <li><p>Static shortcuts are declared in a resource XML file, which is referenced in the publisher - * app's <code>AndroidManifest.xml</code> file. These shortcuts are visually associated with an - * app's launcher icon. - * <p>Static shortcuts are published when an app is installed, and the details of these shortcuts - * change when an app is upgraded with an updated XML file. Static shortcuts are immutable, and - * their definitions, such as icons and labels, cannot be changed dynamically without upgrading the - * publisher app.</li> + * This section describes in-depth details about each shortcut type's usage and availability. * - * <li>Dynamic shortcuts are published at runtime using this class's APIs. These shortcuts are - * visually associated with an app's launcher icon. Apps can publish, update, and remove dynamic - * shortcuts at runtime. - * </ul> + * <p class="note"><b>Important security note:</b> All shortcut information is stored in + * <a href="/training/articles/direct-boot.html">credential encrypted storage</a>, so your app + * cannot access a user's shortcuts until after they've unlocked the device. * - * <p>Only main activities—activities that handle the {@code MAIN} action and the - * {@code LAUNCHER} category—can have shortcuts. - * If an app has multiple main activities, these activities have different sets - * of shortcuts. + * <h4>Static and dynamic shortcuts</h4> * * <p>Static shortcuts and dynamic shortcuts are shown in a supported launcher when the user - * long-presses on an app's launcher icon. Note that the actual gesture may be different - * depending on the launcher app. - * - * <p>Each launcher icon can have at most {@link #getMaxShortcutCountPerActivity()} number of - * static and dynamic shortcuts combined. - * - * - * <h3>Pinning Shortcuts</h3> - * - * <p>Apps running in the foreground can also <em>pin</em> shortcuts at runtime, subject to user - * permission, using this class's APIs. Each pinned shortcut is a copy of a static shortcut or a - * dynamic shortcut. Although users can pin a shortcut multiple times, the system calls the pinning - * API only once to complete the pinning process. Unlike static and dynamic shortcuts, pinned - * shortcuts appear as separate icons, visually distinct from the app's launcher icon, in the - * launcher. There is no limit to the number of pinned shortcuts that an app can create. - * - * <p>Pinned shortcuts <strong>cannot</strong> be removed by publisher apps. They're removed only - * when the user removes them, when the publisher app is uninstalled, or when the user performs the - * clear data action on the publisher app from the device's <b>Settings</b> app. - * - * <p>However, the publisher app can <em>disable</em> pinned shortcuts so they cannot be started. - * See the following sections for details. - * - * <h3>Updating and Disabling Shortcuts</h3> - * - * <p>When a dynamic shortcut is pinned, even when the publisher removes it as a dynamic shortcut, - * the pinned shortcut will still be visible and launchable. This allows an app to have - * more than {@link #getMaxShortcutCountPerActivity()} number of shortcuts. - * - * <p>For example, suppose {@link #getMaxShortcutCountPerActivity()} is 5: - * <ol> - * <li>A chat app publishes 5 dynamic shortcuts for the 5 most recent - * conversations (c1, c2, ..., c5). - * - * <li>The user pins all 5 of the shortcuts. - * - * <li>Later, the user has started 3 additional conversations (c6, c7, and c8), - * so the publisher app - * re-publishes its dynamic shortcuts. The new dynamic shortcut list is: - * c4, c5, ..., c8. - * The publisher app has to remove c1, c2, and c3 because it can't have more than - * 5 dynamic shortcuts. + * performs a specific gesture. On currently-supported launchers, the gesture is a long-press on the + * app's launcher icon, but the actual gesture may be different on other launcher apps. * - * <li>However, even though c1, c2, and c3 are no longer dynamic shortcuts, the pinned - * shortcuts for these conversations are still available and launchable. + * <p>The {@link LauncherApps} class provides APIs for launcher apps to access shortcuts. * - * <li>At this point, the user can access a total of 8 shortcuts that link to activities in - * the publisher app, including the 3 pinned - * shortcuts, even though an app can have at most 5 dynamic shortcuts. - * - * <li>The app can use {@link #updateShortcuts(List)} to update <em>any</em> of the existing - * 8 shortcuts, when, for example, the chat peers' icons have changed. - * </ol> - * The {@link #addDynamicShortcuts(List)} and {@link #setDynamicShortcuts(List)} methods - * can also be used - * to update existing shortcuts with the same IDs, but they <b>cannot</b> be used - * for updating non-dynamic, pinned shortcuts because these two methods try to convert the given - * lists of shortcuts to dynamic shortcuts. + * <h4>Pinned shortcuts</h4> * + * <p>Because pinned shortcuts appear in the launcher itself, they're always visible. A pinned + * shortcut is removed from the launcher only in the following situations: + * <ul> + * <li>The user removes it. + * <li>The publisher app associated with the shortcut is uninstalled. + * <li>The user performs the clear data action on the publisher app from the device's + * <b>Settings</b> app. + * </ul> * - * <h4>Disabling Static Shortcuts</h4> - * <p>When an app is upgraded and the new version - * no longer uses a static shortcut that appeared in the previous version, this deprecated - * shortcut isn't published as a static shortcut. + * <p>Because the system performs + * <a href="/guide/topics/ui/shortcuts.html#backup-and-restore">backup and restore</a> on pinned + * shortcuts automatically, these shortcuts' IDs should contain either stable, constant strings or + * server-side identifiers, rather than identifiers generated locally that might not make sense on + * other devices. * - * <p>If the deprecated shortcut is pinned, then the pinned shortcut will remain on the launcher, - * but it's disabled automatically. When a pinned shortcut is disabled, this class's APIs cannot - * update it. + * <h3>Shortcut display order</h3> * - * <h4>Disabling Dynamic Shortcuts</h4> - * Sometimes pinned shortcuts become obsolete and may not be usable. For example, a pinned shortcut - * to a group chat becomes unusable when the associated group chat is deleted. In cases like this, - * apps should use {@link #disableShortcuts(List)}, which removes the specified dynamic - * shortcuts and also makes any specified pinned shortcuts un-launchable. - * The {@link #disableShortcuts(List, CharSequence)} method can also be used to disable shortcuts - * and show users a custom error message when they attempt to launch the disabled shortcuts. + * <p>When the launcher displays an app's shortcuts, they should appear in the following order: * + * <ul> + * <li>Static shortcuts (if {@link ShortcutInfo#isDeclaredInManifest()} is {@code true}), + * and then show dynamic shortcuts (if {@link ShortcutInfo#isDynamic()} is {@code true}). + * <li>Within each shortcut type (static and dynamic), sort the shortcuts in order of increasing + * rank according to {@link ShortcutInfo#getRank()}. + * </ul> * - * <h3>Publishing Static Shortcuts</h3> + * <p>Shortcut ranks are non-negative, sequential integers that determine the order in which + * shortcuts appear, assuming that the shortcuts are all in the same category. You can update ranks + * of existing shortcuts when you call {@link #updateShortcuts(List)}, + * {@link #addDynamicShortcuts(List)}, or {@link #setDynamicShortcuts(List)}. * - * <p> - * In order to add static shortcuts to your app, first add - * {@code <meta-data android:name="android.app.shortcuts" />} to your main activity in - * AndroidManifest.xml: - * <pre> - *<manifest xmlns:android="http://schemas.android.com/apk/res/android" - * package="com.example.myapplication"> - * <application ... > - * <activity android:name="Main"> - * <intent-filter> - * <action android:name="android.intent.action.MAIN" /> - * <category android:name="android.intent.category.LAUNCHER" /> - * </intent-filter> - * <strong><meta-data android:name="android.app.shortcuts" - * android:resource="@xml/shortcuts" /></strong> - * </activity> - * </application> - *</manifest> - * </pre> + * <p class="note"><b>Note:</b> Ranks are auto-adjusted so that they're unique for each type of + * shortcut (static or dynamic). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and + * 2, adding another dynamic shortcut with a rank of 1 represents a request to place this shortcut + * at the second position. In response, the third and fourth shortcuts move closer to the bottom of + * the shortcut list, with their ranks changing to 2 and 3, respectively. * - * Then, define your app's static shortcuts in the <code>res/xml/shortcuts.xml</code> - * file: - * <pre> - *<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> - * <shortcut - * android:shortcutId="compose" - * android:enabled="true" - * android:icon="@drawable/compose_icon" - * android:shortcutShortLabel="@string/compose_shortcut_short_label1" - * android:shortcutLongLabel="@string/compose_shortcut_long_label1" - * android:shortcutDisabledMessage="@string/compose_disabled_message1"> - * <intent - * android:action="android.intent.action.VIEW" - * android:targetPackage="com.example.myapplication" - * android:targetClass="com.example.myapplication.ComposeActivity" /> - * <!-- If your shortcut is associated with multiple intents, include them - * here. The last intent in the list is what the user sees when they - * launch this shortcut. --> - * <categories android:name="android.shortcut.conversation" /> - * </shortcut> - * <!-- Specify more shortcuts here. --> - *</shortcuts> - * </pre> + * <h3>Options for static shortcuts</h3> * * The following list includes descriptions for the different attributes within a static shortcut: * <dl> @@ -236,9 +147,10 @@ import java.util.List; * {@code android:action} is mandatory. * See <a href="{@docRoot}guide/topics/ui/settings.html#Intents">Using intents</a> for the * other supported tags. - * You can provide multiple intents for a single shortcut so that the last defined activity is launched - * with the other activities in the <a href="/guide/components/tasks-and-back-stack.html">back stack</a>. - * See {@link android.app.TaskStackBuilder} for details. + * <p>You can provide multiple intents for a single shortcut so that the last defined activity is + * launched with the other activities in the + * <a href="/guide/components/tasks-and-back-stack.html">back stack</a>. See + * {@link android.app.TaskStackBuilder} for details. * <p><b>Note:</b> String resources may not be used within an {@code <intent>} element. * </dd> * <dt>{@code categories}</dt> @@ -247,337 +159,92 @@ import java.util.List; * </dd> * </dl> * - * <h3>Publishing Dynamic Shortcuts</h3> + * <h3>Updating shortcuts</h3> * - * <p> - * Apps can publish dynamic shortcuts with {@link #setDynamicShortcuts(List)} - * or {@link #addDynamicShortcuts(List)}. The {@link #updateShortcuts(List)} method can also be - * used to update existing, mutable shortcuts. - * Use {@link #removeDynamicShortcuts(List)} or {@link #removeAllDynamicShortcuts()} to remove - * dynamic shortcuts. - * - * <p>The following code snippet shows how to create a single dynamic shortcut: - * <pre> - *ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); - * - *ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1") - * .setShortLabel("Web site") - * .setLongLabel("Open the web site") - * .setIcon(Icon.createWithResource(context, R.drawable.icon_website)) - * .setIntent(new Intent(Intent.ACTION_VIEW, - * Uri.parse("https://www.mysite.example.com/"))) - * .build(); - * - *shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut)); - * </pre> - * - * <h3>Publishing Pinned Shortcuts</h3> - * - * <p>Apps can pin an existing shortcut (either static or dynamic) or an entirely new shortcut to a - * supported launcher programatically using {@link #requestPinShortcut(ShortcutInfo, IntentSender)}. - * You pass two arguments into this method: - * - * <ul> - * <li>A {@link ShortcutInfo} object – If the shortcut already exists, this object should - * contain only the shortcut's ID. Otherwise, the new {@link ShortcutInfo} object must contain an - * ID, an intent, and a short label for the new shortcut. - * <li><p>A {@link android.app.PendingIntent} object – This intent represents the callback - * that your app receives if the shortcut is successfully pinned to the device's launcher. - * <p><b>Note:</b> If the user doesn't allow the shortcut to be pinned to the launcher, the - * pinning process fails, and the {@link Intent} object that is passed into this - * {@link android.app.PendingIntent} object isn't executed. - * <div class="note"><p><b>Note:</b> Due to background execution limits introduced in Android - * {@link VERSION_CODES#O}, it's best to use a - * <a href="{@docRoot}guide/components/broadcasts.html#manifest-declared_receivers"> - * manifest-declared receiver</a> to receive a callback. - * <p>Also, to prevent other apps from invoking the receiver, add the attribute assignment - * <code>android:exported="false"</code> to the receiver's manifest entry.</p></div> - * </ul> - * - * The following code snippet shows how to pin a single shortcut that already exists and is enabled: - * - * <pre> - *ShortcutManager mShortcutManager = - * context.getSystemService(ShortcutManager.class); - * - *if (mShortcutManager.isRequestPinShortcutSupported()) { - * - * // This example defines a new shortcut; that is, this shortcut hasn't - * // been published before. - * ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder() - * .setIcon(myIcon) - * .setShortLabel("My awesome shortcut") - * .setIntent(myIntent) - * .build(); - * - * PendingIntent resultPendingIntent = null; - * - * // Create the following Intent and PendingIntent objects only if your app - * // needs to be notified that the user allowed the shortcut to be pinned. - * // Use a boolean value, such as "appNeedsNotifying", to define this behavior. - * if (appNeedsNotifying) { - * // We assume here the app has a manifest-declared receiver "MyReceiver". - * Intent pinnedShortcutCallbackIntent = new Intent(context, MyReceiver.class); - * - * // Configure the intent so that your app's broadcast receiver gets - * // the callback successfully. - * PendingIntent successCallback = PendingIntent.createBroadcast(context, 0, - * pinnedShortcutCallbackIntent); - * - * resultPendingIntent = successCallback.getIntentSender(); - * } - * - * mShortcutManager.requestPinShortcut(pinShortcutInfo, resultPendingIntent); - *} - * </pre> - * - * <p class="note"><strong>Note:</strong> As you add logic in your app to make requests to pin - * shortcuts, keep in mind that not all launchers support pinning of shortcuts. To determine whether - * your app can complete this process on a particular device, check the return value of - * {@link #isRequestPinShortcutSupported()}. Based on this return value, you might decide to hide - * the option in your app that allows users to pin a shortcut. - * - * <p class="note"><strong>Note:</strong> See also the support library APIs - * {@link android.support.v4.content.pm.ShortcutManagerCompat#isRequestPinShortcutSupported( - * Context)} and - * {@link android.support.v4.content.pm.ShortcutManagerCompat#requestPinShortcut( - * Context, ShortcutInfoCompat, IntentSender)}, which works on Android versions lower than - * {@link VERSION_CODES#O} by falling back to the deprecated private intent - * {@code com.android.launcher.action.INSTALL_SHORTCUT}. + * <p>As an example, suppose {@link #getMaxShortcutCountPerActivity()} is 5: + * <ol> + * <li>A chat app publishes 5 dynamic shortcuts for the 5 most recent + * conversations (c1, c2, ..., c5). * - * <h4>Custom Activity for Pinning Shortcuts</h4> + * <li>The user pins all 5 of the shortcuts. * - * <p>You can also create a specialized activity that helps users create shortcuts, complete with - * custom options and a confirmation button. In your app's manifest file, add - * {@link Intent#ACTION_CREATE_SHORTCUT} to the activity's <code><intent-filter></code> - * element, as shown in the following snippet: + * <li>Later, the user has started 3 additional conversations (c6, c7, and c8), + * so the publisher app + * re-publishes its dynamic shortcuts. The new dynamic shortcut list is: + * c4, c5, ..., c8. + * The publisher app has to remove c1, c2, and c3 because it can't have more than + * 5 dynamic shortcuts. * - * <pre> - *<manifest> - * ... - * <application> - * <activity android:name="com.example.MyCustomPromptToPinShortcut" ... > - * <intent-filter - * action android:name="android.intent.action.ACTION_CREATE_SHORTCUT"> - * ... - * </intent-filter> - * </activity> - * ... - * </application> - *</manifest> - * </pre> + * <li>However, even though c1, c2, and c3 are no longer dynamic shortcuts, the pinned + * shortcuts for these conversations are still available and launchable. * - * <p>When you use this specialized activity in your app, the following sequence of steps takes - * place:</p> + * <li>At this point, the user can access a total of 8 shortcuts that link to activities in + * the publisher app, including the 3 pinned shortcuts, even though an app can have at most 5 + * dynamic shortcuts. * - * <ol> - * <li>The user attempts to create a shortcut, triggering the system to start the specialized - * activity.</li> - * <li>The user sets options for the shortcut.</li> - * <li>The user selects the confirmation button, allowing your app to create the shortcut using - * the {@link #createShortcutResultIntent(ShortcutInfo)} method. This method returns an - * {@link Intent}, which your app relays back to the previously-executing activity using - * {@link Activity#setResult(int)}.</li> - * <li>Your app calls {@link Activity#finish()} on the activity used for creating the customized - * shortcut.</li> + * <li>The app can use {@link #updateShortcuts(List)} to update <em>any</em> of the existing + * 8 shortcuts, when, for example, the chat peers' icons have changed. + * <p>The {@link #addDynamicShortcuts(List)} and {@link #setDynamicShortcuts(List)} methods + * can also be used to update existing shortcuts with the same IDs, but they <b>cannot</b> be + * used for updating non-dynamic, pinned shortcuts because these 2 methods try to convert the + * given lists of shortcuts to dynamic shortcuts. * </ol> * - * <h3>Shortcut Intents</h3> + * <h3>Shortcut intents</h3> + * * <p> * Dynamic shortcuts can be published with any set of {@link Intent#addFlags Intent} flags. * Typically, {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} is specified, possibly along with other * flags; otherwise, if the app is already running, the app is simply brought to * the foreground, and the target activity may not appear. * - * <p>The {@link ShortcutInfo.Builder#setIntents(Intent[])} method can be used instead of - * {@link ShortcutInfo.Builder#setIntent(Intent)} with {@link android.app.TaskStackBuilder} - * in order to launch an activity with other activities in the back stack. - * When the user selects a shortcut to load an activity with a back stack, - * then presses the back key, a parent activity from the same app will be shown - * instead of the user being navigated back to the launcher. - * - * <p>Static shortcuts can also have multiple intents to achieve the same effect. - * In order to associate multiple {@link Intent} objects with a shortcut, simply list multiple - * <code><intent></code> elements within a single <code><shortcut></code> element. - * The last intent specifies what the user sees when they launch a shortcut. - * * <p>Static shortcuts <b>cannot</b> have custom intent flags. * The first intent of a static shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK} - * and {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} set. - * This means, when the app is already running, all the existing activities will be - * destroyed when a static shortcut is launched. - * If this behavior is not desirable, you can use a <em>trampoline activity</em>, - * or an invisible activity that starts another activity in {@link Activity#onCreate}, - * then calls {@link Activity#finish()}. - * The first activity should include an attribute setting - * of {@code android:taskAffinity=""} in the app's <code>AndroidManifest.xml</code> - * file, and the intent within the static shortcut should point at this first activity. - * - * - * <h3>Showing New Information in a Shortcut</h3> - * <p> - * In order to avoid confusion, you should not use {@link #updateShortcuts(List)} to update - * a shortcut so that it contains conceptually different information. + * and {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} set. This means, when the app is already running, all + * the existing activities in your app will be destroyed when a static shortcut is launched. + * If this behavior is not desirable, you can use a <em>trampoline activity</em>, or an invisible + * activity that starts another activity in {@link Activity#onCreate}, then calls + * {@link Activity#finish()}: + * <ol> + * <li>In the <code>AndroidManifest.xml</code> file, the trampoline activity should include the + * attribute assignment {@code android:taskAffinity=""}. + * <li>In the shortcuts resource file, the intent within the static shortcut should point at + * the trampoline activity. + * </ol> * - * <p>For example, a phone app may publish the most frequently called contact as a dynamic - * shortcut. Over time, this contact may change. When it does, the app should - * represent the changed contact with a new shortcut that contains a different ID, using either - * {@link #setDynamicShortcuts(List)} or {@link #addDynamicShortcuts(List)}, rather than updating - * the existing shortcut with {@link #updateShortcuts(List)}. - * This is because when the shortcut is pinned, changing - * it to reference a different contact will likely confuse the user. + * <h3>Handling system locale changes</h3> * - * <p>On the other hand, when the - * contact's information has changed, such as the name or picture, the app should - * use {@link #updateShortcuts(List)} so that the pinned shortcut is updated too. + * <p>Apps should update dynamic and pinned shortcuts when the system locale changes using the + * {@link Intent#ACTION_LOCALE_CHANGED} broadcast. When the system locale changes, + * <a href="/guide/topics/ui/shortcuts.html#rate-limit">rate limiting</a> is reset, so even + * background apps can add and update dynamic shortcuts until the rate limit is reached again. * + * <h3>Shortcut limits</h3> * - * <h3>Shortcut Display Order</h3> - * When the launcher displays the shortcuts that are associated with a particular launcher icon, - * the shortcuts should appear in the following order: - * <ul> - * <li>First show static shortcuts - * (if {@link ShortcutInfo#isDeclaredInManifest()} is {@code true}), - * and then show dynamic shortcuts (if {@link ShortcutInfo#isDynamic()} is {@code true}). - * <li>Within each category of shortcuts (static and dynamic), sort the shortcuts in order - * of increasing rank according to {@link ShortcutInfo#getRank()}. - * </ul> - * <p>Shortcut ranks are non-negative, sequential integers - * that determine the order in which shortcuts appear, assuming that the shortcuts are all in - * the same category. - * Ranks of existing shortcuts can be updated with - * {@link #updateShortcuts(List)}. You can also use {@link #addDynamicShortcuts(List)} and - * {@link #setDynamicShortcuts(List)}. + * <p>Only main activities—activities that handle the {@code MAIN} action and the + * {@code LAUNCHER} category—can have shortcuts. If an app has multiple main activities, you + * need to define the set of shortcuts for <em>each</em> activity. * - * <p>Ranks are auto-adjusted so that they're unique for each target activity in each category - * (static or dynamic). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and 2, - * adding another dynamic shortcut with a rank of 1 represents a request to place this shortcut at - * the second position. - * In response, the third and fourth shortcuts move closer to the bottom of the shortcut list, - * with their ranks changing to 2 and 3, respectively. + * <p>Each launcher icon can have at most {@link #getMaxShortcutCountPerActivity()} number of + * static and dynamic shortcuts combined. There is no limit to the number of pinned shortcuts that + * an app can create. * - * <h3>Rate Limiting</h3> + * <p>When a dynamic shortcut is pinned, even when the publisher removes it as a dynamic shortcut, + * the pinned shortcut is still visible and launchable. This allows an app to have more than + * {@link #getMaxShortcutCountPerActivity()} number of shortcuts. * - * <p> - * Calls to {@link #setDynamicShortcuts(List)}, {@link #addDynamicShortcuts(List)}, and - * {@link #updateShortcuts(List)} may be rate-limited when called by <em>background apps</em>, or - * apps with no foreground activity or service. When you attempt to call these methods - * from a background app after exceeding the rate limit, these APIs return {@code false}. + * <h4>Rate limiting</h4> * - * <p>Apps with a foreground activity or service are not rate-limited. + * <p>When <a href="/guide/topics/ui/shortcuts.html#rate-limit">rate limiting</a> is active, + * {@link #isRateLimitingActive()} returns {@code true}. * - * <p>Rate-limiting is reset upon certain events, so that even background apps - * can call these APIs until the rate limit is reached again. - * These events include the following: + * <p>Rate limiting is reset upon certain events, so even background apps can call these APIs until + * the rate limit is reached again. These events include the following: * <ul> * <li>An app comes to the foreground. * <li>The system locale changes. * <li>The user performs the <strong>inline reply</strong> action on a notification. * </ul> - * - * <p>When rate-limiting is active, {@link #isRateLimitingActive()} returns {@code true}. - * - * <h4>Resetting rate-limiting for testing</h4> - * - * <p> - * If your app is rate-limited during development or testing, you can use the - * <strong>Reset ShortcutManager rate-limiting</strong> development option or - * the following {@code adb} command to reset it: - * <pre class="no-pretty-print"> - *$ adb shell cmd shortcut reset-throttling [ --user USER-ID ] - * </pre> - * - * <h3>Handling System Locale Changes</h3> - * - * <p> - * Apps should update dynamic and pinned shortcuts when the system locale changes - * using the {@link Intent#ACTION_LOCALE_CHANGED} broadcast. - * - * <p>When the system locale changes, rate-limiting is reset, so even background apps - * can add and update dynamic shortcuts until the rate limit is reached again. - * - * - * <h3>Backup and Restore</h3> - * - * <p> - * When an app has the {@code android:allowBackup="true"} attribute assignment included - * in its <code>AndroidManifest.xml</code> file, pinned shortcuts are - * backed up automatically and are restored when the user sets up a new device. - * - * <h4>Categories of shortcuts that are backed up</h4> - * - * <ul> - * <li>Pinned shortcuts are backed up. Bitmap icons are not backed up by the system, - * so launcher apps should back them up and restore them so that the user still sees icons - * for pinned shortcuts on the launcher. Apps can always use - * {@link #updateShortcuts(List)} to re-publish icons. - * - * <li>Static shortcuts aren't backed up, but when an app is re-installed on a new - * device, they are re-published from the <code>AndroidManifest.xml</code> file. - * - * <li>Dynamic shortcuts <b>aren't</b> backed up. - * </ul> - * - * <p>Because dynamic shortcuts are not restored, it is recommended that apps check - * currently-published dynamic shortcuts using {@link #getDynamicShortcuts()} - * each time they are launched, and they should re-publish - * dynamic shortcuts when necessary. - * - * <pre> - *public class MainActivity extends Activity { - * public void onCreate(Bundle savedInstanceState) { - * super.onCreate(savedInstanceState); - * ShortcutManager shortcutManager = - * getSystemService(ShortcutManager.class); - * - * if (shortcutManager.getDynamicShortcuts().size() == 0) { - * // Application restored. Need to re-publish dynamic shortcuts. - * if (shortcutManager.getPinnedShortcuts().size() > 0) { - * // Pinned shortcuts have been restored. Use - * // updateShortcuts() to make sure they contain - * // up-to-date information. - * } - * } - * } - * // ... - *} - * </pre> - * - * - * <h4>Backup/restore and shortcut IDs</h4> - * <p> - * Because pinned shortcuts are backed up and restored on new devices, shortcut IDs - * should contain either stable, constant strings or server-side identifiers, - * rather than identifiers generated locally that might not make sense on other devices. - * - * - * <h3>Report Shortcut Usage and Prediction</h3> - * <p> - * Launcher apps may be capable of predicting which shortcuts will most likely be - * used at a given time by examining the shortcut usage history data. - * - * <p>In order to provide launchers with such data, publisher apps should - * report the shortcuts that are used with {@link #reportShortcutUsed(String)} - * when a shortcut is selected, - * <b>or when an action equivalent to a shortcut is taken by the user even if it wasn't started - * with the shortcut</b>. - * - * <p>For example, suppose a navigation app supports "navigate to work" as a shortcut. - * It should then report when the user selects this shortcut <b>and</b> when the user chooses - * to navigate to work within the app itself. - * This helps the launcher app - * learn that the user wants to navigate to work at a certain time every - * weekday, and it can then show this shortcut in a suggestion list at the right time. - * - * <h3>Launcher API</h3> - * - * The {@link LauncherApps} class provides APIs for launcher apps to access shortcuts. - * - * - * <h3>Direct Boot and Shortcuts</h3> - * - * All shortcut information is stored in credential encrypted storage, so no shortcuts can be - * accessed when the user is locked. */ @SystemService(Context.SHORTCUT_SERVICE) public class ShortcutManager { diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 48123fede6f5..744ee8ed0e74 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -840,8 +840,8 @@ public class ConnectivityManager { * In order to support the always-on feature, an app has to * <ul> * <li>target {@link VERSION_CODES#N API 24} or above, and - * <li>not opt out through the {@link VpnService#METADATA_SUPPORTS_ALWAYS_ON} meta-data - * field. + * <li>not opt out through the {@link VpnService#SERVICE_META_DATA_SUPPORTS_ALWAYS_ON} + * meta-data field. * </ul> * * @param userId The identifier of the user for whom the VPN app is installed. diff --git a/core/java/android/net/ITetheringStatsProvider.aidl b/core/java/android/net/ITetheringStatsProvider.aidl index 769086da42b4..da0bf4c47b94 100644 --- a/core/java/android/net/ITetheringStatsProvider.aidl +++ b/core/java/android/net/ITetheringStatsProvider.aidl @@ -19,7 +19,7 @@ package android.net; import android.net.NetworkStats; /** - * Interface that allows NetworkManagementService to query for tethering statistics. + * Interface for NetworkManagementService to query tethering statistics and set data limits. * * TODO: this does not really need to be an interface since Tethering runs in the same process * as NetworkManagementService. Consider refactoring Tethering to use direct access to @@ -29,5 +29,17 @@ import android.net.NetworkStats; * @hide */ interface ITetheringStatsProvider { - NetworkStats getTetherStats(); + // Returns cumulative statistics for all tethering sessions since boot, on all upstreams. + // @code {how} is one of the NetworkStats.STATS_PER_* constants. If {@code how} is + // {@code STATS_PER_IFACE}, the provider should not include any traffic that is already + // counted by kernel interface counters. + NetworkStats getTetherStats(int how); + + // Sets the interface quota for the specified upstream interface. This is defined as the number + // of bytes, starting from zero and counting from now, after which data should stop being + // forwarded to/from the specified upstream. A value of QUOTA_UNLIMITED means there is no limit. + void setInterfaceQuota(String iface, long quotaBytes); + + // Indicates that no data usage limit is set. + const int QUOTA_UNLIMITED = -1; } diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index 6b4f2d5acd00..6e2654e3ce7c 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -20,6 +20,8 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.Pair; +import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; @@ -185,6 +187,20 @@ public final class IpPrefix implements Parcelable { } /** + * @hide + */ + public boolean isIPv6() { + return getAddress() instanceof Inet6Address; + } + + /** + * @hide + */ + public boolean isIPv4() { + return getAddress() instanceof Inet4Address; + } + + /** * Returns a string representation of this {@code IpPrefix}. * * @return a string such as {@code "192.0.2.0/24"} or {@code "2001:db8:1:2::/64"}. diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java index 62de9911bc48..bcfe93882375 100644 --- a/core/java/android/net/LinkAddress.java +++ b/core/java/android/net/LinkAddress.java @@ -76,7 +76,7 @@ public class LinkAddress implements Parcelable { * RFC 6724 section 3.2. * @hide */ - static int scopeForUnicastAddress(InetAddress addr) { + private static int scopeForUnicastAddress(InetAddress addr) { if (addr.isAnyLocalAddress()) { return RT_SCOPE_HOST; } @@ -101,7 +101,7 @@ public class LinkAddress implements Parcelable { * Per RFC 4193 section 8, fc00::/7 identifies these addresses. */ private boolean isIPv6ULA() { - if (address instanceof Inet6Address) { + if (isIPv6()) { byte[] bytes = address.getAddress(); return ((bytes[0] & (byte)0xfe) == (byte)0xfc); } @@ -109,13 +109,29 @@ public class LinkAddress implements Parcelable { } /** + * @return true if the address is IPv6. + * @hide + */ + public boolean isIPv6() { + return address instanceof Inet6Address; + } + + /** + * @return true if the address is IPv4 or is a mapped IPv4 address. + * @hide + */ + public boolean isIPv4() { + return address instanceof Inet4Address; + } + + /** * Utility function for the constructors. */ private void init(InetAddress address, int prefixLength, int flags, int scope) { if (address == null || address.isMulticastAddress() || prefixLength < 0 || - ((address instanceof Inet4Address) && prefixLength > 32) || + (address instanceof Inet4Address && prefixLength > 32) || (prefixLength > 128)) { throw new IllegalArgumentException("Bad LinkAddress params " + address + "/" + prefixLength); @@ -184,6 +200,7 @@ public class LinkAddress implements Parcelable { */ public LinkAddress(String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. + // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". Pair<InetAddress, Integer> ipAndMask = NetworkUtils.parseIpAndMask(address); init(ipAndMask.first, ipAndMask.second, flags, scope); } diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 0b9289345dbe..4bb884405360 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -770,7 +770,6 @@ public final class NetworkCapabilities implements Parcelable { StringJoiner joiner = new StringJoiner(", "); - // TODO: consider only enforcing that capabilities are not removed, allowing addition. // Ignore NOT_METERED being added or removed as it is effectively dynamic. http://b/63326103 // TODO: properly support NOT_METERED as a mutable and requestable capability. final long mask = ~MUTABLE_CAPABILITIES & ~(1 << NET_CAPABILITY_NOT_METERED); diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index be9e80973875..171adc054bbe 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -82,6 +82,11 @@ public class NetworkStats implements Parcelable { /** {@link #roaming} value where roaming data is accounted. */ public static final int ROAMING_YES = 1; + /** Denotes a request for stats at the interface level. */ + public static final int STATS_PER_IFACE = 0; + /** Denotes a request for stats at the interface and UID level. */ + public static final int STATS_PER_UID = 1; + // TODO: move fields to "mVariable" notation /** diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 7fb0c47598c8..185b1818df45 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -152,9 +152,10 @@ public class VpnService extends Service { * </service> * } </pre> * - * <p>This meta-data field defaults to {@code true} if absent. + * <p>This meta-data field defaults to {@code true} if absent. It will only have effect on + * {@link android.os.Build.VERSION_CODES#O_MR1} or higher. */ - public static final String METADATA_SUPPORTS_ALWAYS_ON = + public static final String SERVICE_META_DATA_SUPPORTS_ALWAYS_ON = "android.net.VpnService.SUPPORTS_ALWAYS_ON"; /** diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index b916b4381a5d..05627160cc3a 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -220,6 +220,21 @@ interface INetworkManagementService void unregisterTetheringStatsProvider(ITetheringStatsProvider provider); /** + * Reports that a tethering provider has reached a data limit. + * + * Currently triggers a global alert, which causes NetworkStatsService to poll counters and + * re-evaluate data usage. + * + * This does not take an interface name because: + * 1. The tethering offload stats provider cannot reliably determine the interface on which the + * limit was reached, because the HAL does not provide it. + * 2. Firing an interface-specific alert instead of a global alert isn't really useful since in + * all cases of interest, the system responds to both in the same way - it polls stats, and + * then notifies NetworkPolicyManagerService of the fact. + */ + void tetherLimitReached(ITetheringStatsProvider provider); + + /** ** PPPD **/ @@ -266,7 +281,7 @@ interface INetworkManagementService /** * Return summary of network statistics all tethering interfaces. */ - NetworkStats getNetworkStatsTethering(); + NetworkStats getNetworkStatsTethering(int how); /** * Set quota for an interface. diff --git a/core/java/android/provider/TimeZoneRulesDataContract.java b/core/java/android/provider/TimeZoneRulesDataContract.java index 7a5ae1d7af41..33d25880226e 100644 --- a/core/java/android/provider/TimeZoneRulesDataContract.java +++ b/core/java/android/provider/TimeZoneRulesDataContract.java @@ -41,12 +41,6 @@ public final class TimeZoneRulesDataContract { private static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); /** - * The permission that the reader of the ContentProvider must possess. - */ - public static final String READER_PERMISSION = - android.Manifest.permission.UPDATE_TIME_ZONE_RULES; - - /** * Defines fields exposed through the {@link Operation#CONTENT_URI} for describing a time zone * distro operation. */ diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index c068e6a21db6..2755e8e7bee1 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -18,16 +18,15 @@ package android.service.autofill; import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; -import android.os.RemoteException; -import android.provider.Settings; - -import com.android.internal.os.HandlerCaller; import android.annotation.SdkConstant; -import android.app.Service;import android.content.Intent; +import android.app.Service; +import android.content.Intent; import android.os.CancellationSignal; import android.os.IBinder; import android.os.ICancellationSignal; import android.os.Looper; +import android.os.RemoteException; +import android.provider.Settings; import android.util.Log; import android.view.View; import android.view.ViewStructure; @@ -35,6 +34,7 @@ import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; +import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; /** @@ -280,6 +280,76 @@ import com.android.internal.os.SomeArgs; * calling {@link FillResponse.Builder#setIgnoredIds(AutofillId...)} so the system does not trigger * a new {@link #onFillRequest(FillRequest, CancellationSignal, FillCallback)} when these views are * focused. + * + * <h3>Web security</h3> + * + * <p>When handling autofill requests that represent web pages (typically + * view structures whose root's {@link android.app.assist.AssistStructure.ViewNode#getClassName()} + * is a {@link android.webkit.WebView}), the service should take the following steps to verify if + * the structure can be autofilled with the data associated with the app requesting it: + * + * <ol> + * <li>Use the {@link android.app.assist.AssistStructure.ViewNode#getWebDomain()} to get the + * source of the document. + * <li>Get the canonical domain using the + * <a href="https://publicsuffix.org/>Public Suffix List</a> (see example below). + * <li>Use <a href="https://developers.google.com/digital-asset-links/">Digital Asset Links</a> + * to obtain the package name and certificate fingerprint of the package corresponding to + * the canonical domain. + * <li>Make sure the certificate fingerprint matches the value returned by Package Manager + * (see "Package verification" section above). + * </ol> + * + * <p>Here's an example on how to get the canonical domain using + * <a href="https://github.com/google/guava">Guava</a>: + * + * <pre class="prettyprint"> + * private static String getCanonicalDomain(String domain) { + * InternetDomainName idn = InternetDomainName.from(domain); + * while (!idn.isTopPrivateDomain() && idn != null) { + * idn = idn.parent(); + * } + * return idn == null ? null : idn.toString(); + * } + * </pre> + * + * <p>If the association between the web domain and app package cannot be verified through the steps + * above, the service can still autofill the app, but it should warn the user about the potential + * data leakage first, and askfor the user to confirm. For example, the service could: + * + * <ol> + * <li>Create a dataset that requires + * {@link Dataset.Builder#setAuthentication(android.content.IntentSender) authentication} to + * unlock. + * <li>Include the web domain in the custom presentation for the + * {@link Dataset.Builder#setValue(AutofillId, AutofillValue, android.widget.RemoteViews) + * dataset value}. + * <li>When the user select that dataset, show a disclaimer dialog explaining that the app is + * requesting credentials for a web domain, but the service could not verify if the app owns + * that domain. If the user agrees, then the service can unlock the dataset. + * <li>Similarly, when adding a {@link SaveInfo} object for the request, the service should + * include the above disclaimer in the {@link SaveInfo.Builder#setDescription(CharSequence)}. + * </ol> + * + * <p>This same procedure could also be used when the autofillable data is contained inside an + * {@code IFRAME}, in which case the WebView generates a new autofill context when a node inside + * the {@code IFRAME} is focused, which the root node containing the {@code IFRAME}'s {@code src} + * attribute on {@link android.app.assist.AssistStructure.ViewNode#getWebDomain()}. A typical and + * legitimate use case for this scenario is a financial app that allows the user + * to login on different bank accounts. For example, a financial app {@code my_financial_app} could + * use a WebView that loads contents from {@code banklogin.my_financial_app.com}, which contains an + * {@code IFRAME} node whose {@code src} attribute is {@code login.some_bank.com}. When fulfilling + * that request, the service could add an + * {@link Dataset.Builder#setAuthentication(android.content.IntentSender) authenticated dataset} + * whose presentation displays "Username for some_bank.com" and + * "Password for some_bank.com". Then when the user taps one of these options, the service + * shows the disclaimer dialog explaining that selecting that option would release the + * {@code login.some_bank.com} credentials to the {@code my_financial_app}; if the user agrees, + * then the service returns an unlocked dataset with the {@code some_bank.com} credentials. + * + * <p><b>Note:</b> The autofill service could also whitelist well-known browser apps and skip the + * verifications above, as long as the service can verify the authenticity of the browser app by + * checking its signing certificate. */ public abstract class AutofillService extends Service { private static final String TAG = "AutofillService"; @@ -424,7 +494,7 @@ public abstract class AutofillService extends Service { * {@link SaveCallback#onSuccess()} or {@link SaveCallback#onFailure(CharSequence)}) * to notify the result of the request. * - * <p><b>NOTE: </b>to retrieve the actual value of the field, the service should call + * <p><b>Note:</b> To retrieve the actual value of the field, the service should call * {@link android.app.assist.AssistStructure.ViewNode#getAutofillValue()}; if it calls * {@link android.app.assist.AssistStructure.ViewNode#getText()} or other methods, there is no * guarantee such method will return the most recent value of the field. diff --git a/core/java/android/service/gatekeeper/GateKeeperResponse.java b/core/java/android/service/gatekeeper/GateKeeperResponse.java index 287dc76a9b01..9b529345851b 100644 --- a/core/java/android/service/gatekeeper/GateKeeperResponse.java +++ b/core/java/android/service/gatekeeper/GateKeeperResponse.java @@ -106,6 +106,8 @@ public final class GateKeeperResponse implements Parcelable { if (mPayload != null) { dest.writeInt(mPayload.length); dest.writeByteArray(mPayload); + } else { + dest.writeInt(0); } } } diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index f548d3b77bf3..1c6275fb8dc1 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -195,7 +195,8 @@ public abstract class WallpaperService extends Service { // Needed for throttling onComputeColors. private long mLastColorInvalidation; private final Runnable mNotifyColorsChanged = this::notifyColorsChanged; - private Supplier<Long> mClockFunction = SystemClock::elapsedRealtime; + private final Supplier<Long> mClockFunction; + private final Handler mHandler; DisplayManager mDisplayManager; Display mDisplay; @@ -362,6 +363,26 @@ public abstract class WallpaperService extends Service { } } }; + + /** + * Default constructor + */ + public Engine() { + this(SystemClock::elapsedRealtime, Handler.getMain()); + } + + /** + * Constructor used for test purposes. + * + * @param clockFunction Supplies current times in millis. + * @param handler Used for posting/deferring asynchronous calls. + * @hide + */ + @VisibleForTesting + public Engine(Supplier<Long> clockFunction, Handler handler) { + mClockFunction = clockFunction; + mHandler = handler; + } /** * Provides access to the surface in which this wallpaper is drawn. @@ -563,18 +584,17 @@ public abstract class WallpaperService extends Service { */ public void notifyColorsChanged() { final long now = mClockFunction.get(); - final Handler mainHandler = Handler.getMain(); if (now - mLastColorInvalidation < NOTIFY_COLORS_RATE_LIMIT_MS) { Log.w(TAG, "This call has been deferred. You should only call " + "notifyColorsChanged() once every " + (NOTIFY_COLORS_RATE_LIMIT_MS / 1000f) + " seconds."); - if (!mainHandler.hasCallbacks(mNotifyColorsChanged)) { - mainHandler.postDelayed(mNotifyColorsChanged, NOTIFY_COLORS_RATE_LIMIT_MS); + if (!mHandler.hasCallbacks(mNotifyColorsChanged)) { + mHandler.postDelayed(mNotifyColorsChanged, NOTIFY_COLORS_RATE_LIMIT_MS); } return; } mLastColorInvalidation = now; - mainHandler.removeCallbacks(mNotifyColorsChanged); + mHandler.removeCallbacks(mNotifyColorsChanged); try { final WallpaperColors newColors = onComputeColors(); @@ -662,14 +682,6 @@ public abstract class WallpaperService extends Service { } } - /** - * @hide - */ - @VisibleForTesting - public void setClockFunction(Supplier<Long> clockFunction) { - mClockFunction = clockFunction; - } - void updateSurface(boolean forceRelayout, boolean forceReport, boolean redrawNeeded) { if (mDestroyed) { Log.w(TAG, "Ignoring updateSurface: destroyed"); diff --git a/core/java/android/transition/TransitionUtils.java b/core/java/android/transition/TransitionUtils.java index 49ceb3b5365e..4951237e5cc9 100644 --- a/core/java/android/transition/TransitionUtils.java +++ b/core/java/android/transition/TransitionUtils.java @@ -20,12 +20,14 @@ import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.TypeEvaluator; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.view.DisplayListCanvas; +import android.view.RenderNode; +import android.view.ThreadedRenderer; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -126,8 +128,11 @@ public class TransitionUtils { } int bitmapWidth = (int) (width * scale); int bitmapHeight = (int) (height * scale); - Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + final RenderNode node = RenderNode.create("TransitionUtils", null); + node.setLeftTopRightBottom(0, 0, width, height); + node.setClipToBounds(false); + final DisplayListCanvas canvas = node.start(width, height); + // Do stuff with the canvas Rect existingBounds = drawable.getBounds(); int left = existingBounds.left; int top = existingBounds.top; @@ -136,7 +141,8 @@ public class TransitionUtils { drawable.setBounds(0, 0, bitmapWidth, bitmapHeight); drawable.draw(canvas); drawable.setBounds(left, top, right, bottom); - return bitmap; + node.end(canvas); + return ThreadedRenderer.createHardwareBitmap(node, width, height); } /** @@ -162,10 +168,15 @@ public class TransitionUtils { bitmapHeight *= scale; matrix.postTranslate(-bounds.left, -bounds.top); matrix.postScale(scale, scale); - bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); + + final RenderNode node = RenderNode.create("TransitionUtils", null); + node.setLeftTopRightBottom(0, 0, bitmapWidth, bitmapHeight); + node.setClipToBounds(false); + final DisplayListCanvas canvas = node.start(bitmapWidth, bitmapHeight); canvas.concat(matrix); view.draw(canvas); + node.end(canvas); + bitmap = ThreadedRenderer.createHardwareBitmap(node, bitmapWidth, bitmapHeight); } return bitmap; } diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java index 0fe56f6efa21..e2e9d53e7e9e 100644 --- a/core/java/android/util/PackageUtils.java +++ b/core/java/android/util/PackageUtils.java @@ -18,12 +18,13 @@ package android.util; import android.annotation.NonNull; import android.annotation.Nullable; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.content.pm.Signature; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Arrays; /** * Helper functions applicable to packages. @@ -36,32 +37,67 @@ public final class PackageUtils { } /** - * Computes the SHA256 digest of the signing cert for a package. - * @param packageManager The package manager. - * @param packageName The package for which to generate the digest. - * @param userId The user for which to generate the digest. - * @return The digest or null if the package does not exist for this user. + * Computes the SHA256 digests of a list of signatures. Items in the + * resulting array of hashes correspond to the signatures in the + * input array. + * @param signatures The signatures. + * @return The digest array. */ - public static @Nullable String computePackageCertSha256Digest( - @NonNull PackageManager packageManager, - @NonNull String packageName, int userId) { - final PackageInfo packageInfo; - try { - packageInfo = packageManager.getPackageInfoAsUser(packageName, - PackageManager.GET_SIGNATURES, userId); - } catch (PackageManager.NameNotFoundException e) { - return null; + public static @NonNull String[] computeSignaturesSha256Digests( + @NonNull Signature[] signatures) { + final int signatureCount = signatures.length; + final String[] digests = new String[signatureCount]; + for (int i = 0; i < signatureCount; i++) { + digests[i] = computeSha256Digest(signatures[i].toByteArray()); + } + return digests; + } + /** + * Computes a SHA256 digest of the signatures' SHA256 digests. First, + * individual hashes for each signature is derived in a hexademical + * form, then these strings are sorted based the natural ordering, and + * finally a hash is derived from these strings' bytes. + * @param signatures The signatures. + * @return The digest. + */ + public static @NonNull String computeSignaturesSha256Digest( + @NonNull Signature[] signatures) { + // Shortcut for optimization - most apps singed by a single cert + if (signatures.length == 1) { + return computeSha256Digest(signatures[0].toByteArray()); } - return computeCertSha256Digest(packageInfo.signatures[0]); + + // Make sure these are sorted to handle reversed certificates + final String[] sha256Digests = computeSignaturesSha256Digests(signatures); + return computeSignaturesSha256Digest(sha256Digests); } /** - * Computes the SHA256 digest of a cert. - * @param signature The signature. - * @return The digest or null if an error occurs. + * Computes a SHA256 digest in of the signatures SHA256 digests. First, + * the strings are sorted based the natural ordering, and then a hash is + * derived from these strings' bytes. + * @param sha256Digests Signature SHA256 hashes in hexademical form. + * @return The digest. */ - public static @Nullable String computeCertSha256Digest(@NonNull Signature signature) { - return computeSha256Digest(signature.toByteArray()); + public static @NonNull String computeSignaturesSha256Digest( + @NonNull String[] sha256Digests) { + // Shortcut for optimization - most apps singed by a single cert + if (sha256Digests.length == 1) { + return sha256Digests[0]; + } + + // Make sure these are sorted to handle reversed certificates + Arrays.sort(sha256Digests); + + final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + for (String sha256Digest : sha256Digests) { + try { + bytes.write(sha256Digest.getBytes()); + } catch (IOException e) { + /* ignore - can't happen */ + } + } + return computeSha256Digest(bytes.toByteArray()); } /** diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java index ca3985449d92..50cd7b18e254 100644 --- a/core/java/android/util/Patterns.java +++ b/core/java/android/util/Patterns.java @@ -406,7 +406,7 @@ public class Patterns { * the local part to be at most 64 octets. */ private static final String EMAIL_ADDRESS_LOCAL_PART = - "[" + EMAIL_CHAR + "]" + "(?:[" + EMAIL_CHAR + "\\.]{1,62}[" + EMAIL_CHAR + "])?"; + "[" + EMAIL_CHAR + "]" + "(?:[" + EMAIL_CHAR + "\\.]{0,62}[" + EMAIL_CHAR + "])?"; /** * Regular expression for the domain part of an email address. RFC5321 section 4.5.3.1.2 limits diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 78cdf5d922b4..2c1f73468ca6 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -659,6 +659,8 @@ public class Surface implements Parcelable { * * @see #isSharedBufferModeEnabled() * @see #setAutoRefreshEnabled(boolean) + * + * @hide */ public void setSharedBufferModeEnabled(boolean enabled) { if (mIsSharedBufferModeEnabled != enabled) { @@ -676,6 +678,8 @@ public class Surface implements Parcelable { * @return True if shared buffer mode is enabled on this surface, false otherwise * * @see #setSharedBufferModeEnabled(boolean) + * + * @hide */ public boolean isSharedBufferModeEnabled() { return mIsSharedBufferModeEnabled; @@ -699,6 +703,8 @@ public class Surface implements Parcelable { * * @see #isAutoRefreshEnabled() * @see #setSharedBufferModeEnabled(boolean) + * + * @hide */ public void setAutoRefreshEnabled(boolean enabled) { if (mIsAutoRefreshEnabled != enabled) { @@ -713,6 +719,8 @@ public class Surface implements Parcelable { /** * @return True if auto-refresh is enabled on this surface, false otherwise + * + * @hide */ public boolean isAutoRefreshEnabled() { return mIsAutoRefreshEnabled; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2b4015f9063e..8a9b14e37909 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8078,10 +8078,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, boolean forAutofill, @AutofillFlags int flags) { if (forAutofill) { structure.setAutofillId(getAutofillId()); - if (!isLaidOut()) { - Log.w(VIEW_LOG_TAG, "dispatchProvideAutofillStructure(): not laid out, ignoring"); - return; - } onProvideAutofillStructure(structure, flags); onProvideAutofillVirtualStructure(structure, flags); } else if (!isAssistBlocked()) { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index ecdfa3fc3336..18b7334c7adf 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3400,6 +3400,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (childrenCount <= 0) { return; } + + if (!isLaidOut()) { + Log.v(VIEW_LOG_TAG, "dispatchProvideStructure(): not laid out, ignoring " + + childrenCount + " children of " + getAccessibilityViewId()); + return; + } + structure.setChildCount(childrenCount); ArrayList<View> preorderedList = buildOrderedChildList(); boolean customOrder = preorderedList == null @@ -3476,6 +3483,13 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (structure.getChildCount() != 0) { return; } + + if (!isLaidOut()) { + Log.v(VIEW_LOG_TAG, "dispatchProvideAutofillStructure(): not laid out, ignoring " + + mChildrenCount + " children of " + getAutofillId()); + return; + } + final ChildListForAutoFill children = getChildrenForAutofill(flags); final int childrenCount = children.size(); structure.setChildCount(childrenCount); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 6bf48450fc71..22faeed72a0f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -259,6 +259,9 @@ public final class ViewRootImpl implements ViewParent, // visibility to control drawing. The decor view visibility will get adjusted when the app get // stopped and that's when the app will stop drawing further frames. private boolean mForceDecorViewVisibility = false; + // Used for tracking app visibility updates separately in case we get double change. This will + // make sure that we always call relayout for the corresponding window. + private boolean mAppVisibilityChanged; int mOrigWindowType = -1; /** Whether the window had focus during the most recent traversal. */ @@ -1058,6 +1061,7 @@ public final class ViewRootImpl implements ViewParent, void handleAppVisibility(boolean visible) { if (mAppVisible != visible) { mAppVisible = visible; + mAppVisibilityChanged = true; scheduleTraversals(); if (!mAppVisible) { WindowManagerGlobal.trimForeground(); @@ -1600,7 +1604,11 @@ public final class ViewRootImpl implements ViewParent, final int viewVisibility = getHostVisibility(); final boolean viewVisibilityChanged = !mFirst - && (mViewVisibility != viewVisibility || mNewSurfaceNeeded); + && (mViewVisibility != viewVisibility || mNewSurfaceNeeded + // Also check for possible double visibility update, which will make current + // viewVisibility value equal to mViewVisibility and we may miss it. + || mAppVisibilityChanged); + mAppVisibilityChanged = false; final boolean viewUserVisibilityChanged = !mFirst && ((mViewVisibility == View.VISIBLE) != (viewVisibility == View.VISIBLE)); diff --git a/core/java/android/view/WindowInfo.java b/core/java/android/view/WindowInfo.java index 95a63944b3bc..bb9e391ddcb4 100644 --- a/core/java/android/view/WindowInfo.java +++ b/core/java/android/view/WindowInfo.java @@ -41,6 +41,7 @@ public class WindowInfo implements Parcelable { public int layer; public IBinder token; public IBinder parentToken; + public IBinder activityToken; public boolean focused; public final Rect boundsInScreen = new Rect(); public List<IBinder> childTokens; @@ -66,6 +67,7 @@ public class WindowInfo implements Parcelable { window.layer = other.layer; window.token = other.token; window.parentToken = other.parentToken; + window.activityToken = other.activityToken; window.focused = other.focused; window.boundsInScreen.set(other.boundsInScreen); window.title = other.title; @@ -99,6 +101,7 @@ public class WindowInfo implements Parcelable { parcel.writeInt(layer); parcel.writeStrongBinder(token); parcel.writeStrongBinder(parentToken); + parcel.writeStrongBinder(activityToken); parcel.writeInt(focused ? 1 : 0); boundsInScreen.writeToParcel(parcel, flags); parcel.writeCharSequence(title); @@ -135,6 +138,7 @@ public class WindowInfo implements Parcelable { layer = parcel.readInt(); token = parcel.readStrongBinder(); parentToken = parcel.readStrongBinder(); + activityToken = parcel.readStrongBinder(); focused = (parcel.readInt() == 1); boundsInScreen.readFromParcel(parcel); title = parcel.readCharSequence(); @@ -155,6 +159,7 @@ public class WindowInfo implements Parcelable { layer = 0; token = null; parentToken = null; + activityToken = null; focused = false; boundsInScreen.setEmpty(); if (childTokens != null) { diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 1e50a85833ec..86402a7c6abe 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -16,6 +16,7 @@ package android.view; +import android.Manifest.permission; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; @@ -1424,6 +1425,15 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY = 0x00100000; /** + * If this flag is set on the window, window manager will acquire a sleep token that puts + * all activities to sleep as long as this window is visible. When this flag is set, the + * window needs to occlude all activity windows. + * @hide + */ + @RequiresPermission(permission.DEVICE_POWER) + public static final int PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN = 0x00200000; + + /** * Control flags that are private to the platform. * @hide */ diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 49b7ed8bac0e..c4ffb4c06a26 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -16,6 +16,7 @@ package android.view; +import static android.Manifest.permission; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; @@ -485,11 +486,17 @@ public interface WindowManagerPolicy { /** * Returns true if the window owner can add internal system windows. - * That is, they have {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW}. + * That is, they have {@link permission#INTERNAL_SYSTEM_WINDOW}. */ default boolean canAddInternalSystemWindow() { return false; } + + /** + * Returns true if the window owner has the permission to acquire a sleep token when it's + * visible. That is, they have the permission {@link permission#DEVICE_POWER}. + */ + boolean canAcquireSleepToken(); } /** @@ -774,7 +781,7 @@ public interface WindowManagerPolicy { * @param type The type of window being assigned. * @param canAddInternalSystemWindow If the owner window associated with the type we are * evaluating can add internal system windows. I.e they have - * {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW}. If true, alert window + * {@link permission#INTERNAL_SYSTEM_WINDOW}. If true, alert window * types {@link android.view.WindowManager.LayoutParams#isSystemAlertWindowType(int)} * can be assigned layers greater than the layer for * {@link android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY} Else, their diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index d9128d8014bb..0b9bc5760fa8 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -23,7 +23,6 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; -import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.ComponentName; import android.content.Context; @@ -1113,9 +1112,7 @@ public final class AccessibilityManager { * * @return {@code true} if the accessibility button is supported on this device, * {@code false} otherwise - * @hide */ - @SystemApi public static boolean isAccessibilityButtonSupported() { final Resources res = Resources.getSystem(); return res.getBoolean(com.android.internal.R.bool.config_showNavigationBar); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 650c7d97d357..81ab4078e549 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1628,42 +1628,28 @@ public class WebView extends AbsoluteLayout } /** - * Starts Safe Browsing initialization. This should only be called once. - * + * Starts Safe Browsing initialization. * <p> - * Because the Safe Browsing feature takes time to initialize, WebView may temporarily whitelist - * URLs until the feature is ready. The callback will be invoked with true once initialization - * is complete. - * </p> - * + * URL loads are not guaranteed to be protected by Safe Browsing until after {@code callback} is + * invoked with {@code true}. Safe Browsing is not fully supported on all devices. For those + * devices {@code callback} will receive {@code false}. * <p> - * This does not enable the Safe Browsing feature itself, and should only be used if the feature - * is otherwise enabled. - * </p> - * + * This does not enable the Safe Browsing feature itself, and should only be called if Safe + * Browsing is enabled by the manifest tag or {@link WebSettings#setSafeBrowsingEnabled}. This + * prepares resources used for Safe Browsing. * <p> - * This does not require an Activity Context, and will always use the application Context to do - * its work. - * </p> + * This should be called with the Application Context (and will always use the Application + * context to do its work regardless). * * @param context Application Context. - * @param callback will be called with the value true if initialization is - * successful. The callback will be run on the UI thread. + * @param callback will be called on the UI thread with {@code true} if initialization is + * successful, {@code false} otherwise. */ - public static void initSafeBrowsing(Context context, ValueCallback<Boolean> callback) { + public static void startSafeBrowsing(Context context, ValueCallback<Boolean> callback) { getFactory().getStatics().initSafeBrowsing(context, callback); } /** - * Shuts down Safe Browsing. This should only be called once. This does not disable the feature, - * it only frees resources used by Safe Browsing code. To disable Safe Browsing on an individual - * WebView, see {@link WebSettings#setSafeBrowsingEnabled} - */ - public static void shutdownSafeBrowsing() { - getFactory().getStatics().shutdownSafeBrowsing(); - } - - /** * Sets the list of domains that are exempt from SafeBrowsing checks. The list is * global for all the WebViews. * <p> @@ -1940,13 +1926,14 @@ public class WebView extends AbsoluteLayout * For applications targeted to API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN} or below, * all public methods (including the inherited ones) can be accessed, see the * important security note below for implications. - * <p> Note that injected objects will not - * appear in JavaScript until the page is next (re)loaded. For example: + * <p> Note that injected objects will not appear in JavaScript until the page is next + * (re)loaded. JavaScript should be enabled before injecting the object. For example: * <pre> * class JsObject { * {@literal @}JavascriptInterface * public String toString() { return "injectedObject"; } * } + * webview.getSettings().setJavaScriptEnabled(true); * webView.addJavascriptInterface(new JsObject(), "injectedObject"); * webView.loadData("<!DOCTYPE html><title></title>", "text/html", null); * webView.loadUrl("javascript:alert(injectedObject.toString())");</pre> @@ -2725,6 +2712,18 @@ public class WebView extends AbsoluteLayout * understood by the {@link android.service.autofill.AutofillService} implementations: * * <ol> + * <li>Only the HTML nodes inside a {@code FORM} are generated. + * <li>The source of the HTML is set using {@link ViewStructure#setWebDomain(String)} in the + * node representing the WebView. + * <li>If a web page has multiple {@code FORM}s, only the data for the current form is + * represented—if the user taps a field from another form, then the current autofill + * context is canceled (by calling {@link android.view.autofill.AutofillManager#cancel()} and + * a new context is created for that {@code FORM}. + * <li>Similarly, if the page has {@code IFRAME} nodes, they are not initially represented in + * the view structure until the user taps a field from a {@code FORM} inside the + * {@code IFRAME}, in which case it would be treated the same way as multiple forms described + * above, except that the {@link ViewStructure#setWebDomain(String) web domain} of the + * {@code FORM} contains the {@code src} attribute from the {@code IFRAME} node. * <li>If the Android SDK provides a similar View, then should be set with the * fully-qualified class name of such view. * <li>The W3C autofill field ({@code autocomplete} tag attribute) maps to diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java index 4f6513fe1bc8..4c47abc65a65 100644 --- a/core/java/android/webkit/WebViewFactoryProvider.java +++ b/core/java/android/webkit/WebViewFactoryProvider.java @@ -80,17 +80,11 @@ public interface WebViewFactoryProvider { /** * Implement the API method - * {@link android.webkit.WebView#initSafeBrowsing(Context , ValueCallback<Boolean>)} + * {@link android.webkit.WebView#startSafeBrowsing(Context , ValueCallback<Boolean>)} */ void initSafeBrowsing(Context context, ValueCallback<Boolean> callback); /** - * Implement the API method - * {@link android.webkit.WebView#shutdownSafeBrowsing()} - */ - void shutdownSafeBrowsing(); - - /** * Implement the API method * {@link android.webkit.WebView#setSafeBrowsingWhitelist(List<String>, * ValueCallback<Boolean>)} diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 8094bfc6eeb8..dfb36423ea94 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -524,12 +524,13 @@ public class DatePicker extends FrameLayout { void setAutoFillChangeListener(OnDateChangedListener onDateChangedListener); void updateDate(int year, int month, int dayOfMonth); - void updateDate(long date); int getYear(); int getMonth(); int getDayOfMonth(); - long getDate(); + + void autofill(AutofillValue value); + AutofillValue getAutofillValue(); void setFirstDayOfWeek(int firstDayOfWeek); int getFirstDayOfWeek(); @@ -572,6 +573,7 @@ public class DatePicker extends FrameLayout { // The context protected Context mContext; + // NOTE: when subclasses change this variable, they must call resetAutofilledValue(). protected Calendar mCurrentDate; // The current locale @@ -582,6 +584,11 @@ public class DatePicker extends FrameLayout { protected OnDateChangedListener mAutoFillChangeListener; protected ValidationCallback mValidationCallback; + // The value that was passed to autofill() - it must be stored because it getAutofillValue() + // must return the exact same value that was autofilled, otherwise the widget will not be + // properly highlighted after autofill(). + private long mAutofilledValue; + public AbstractDatePickerDelegate(DatePicker delegator, Context context) { mDelegator = delegator; mContext = context; @@ -612,16 +619,38 @@ public class DatePicker extends FrameLayout { } @Override - public void updateDate(long date) { - Calendar cal = Calendar.getInstance(mCurrentLocale); - cal.setTimeInMillis(date); + public final void autofill(AutofillValue value) { + if (value == null || !value.isDate()) { + Log.w(LOG_TAG, value + " could not be autofilled into " + this); + return; + } + + final long time = value.getDateValue(); + + final Calendar cal = Calendar.getInstance(mCurrentLocale); + cal.setTimeInMillis(time); updateDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); + + // Must set mAutofilledValue *after* calling subclass method to make sure the value + // returned by getAutofillValue() matches it. + mAutofilledValue = time; } @Override - public long getDate() { - return mCurrentDate.getTimeInMillis(); + public final AutofillValue getAutofillValue() { + final long time = mAutofilledValue != 0 + ? mAutofilledValue + : mCurrentDate.getTimeInMillis(); + return AutofillValue.forDate(time); + } + + /** + * This method must be called every time the value of the year, month, and/or day is + * changed by a subclass method. + */ + protected void resetAutofilledValue() { + mAutofilledValue = 0; } protected void onValidationChanged(boolean valid) { @@ -777,12 +806,7 @@ public class DatePicker extends FrameLayout { public void autofill(AutofillValue value) { if (!isEnabled()) return; - if (!value.isDate()) { - Log.w(LOG_TAG, value + " could not be autofilled into " + this); - return; - } - - mDelegate.updateDate(value.getDateValue()); + mDelegate.autofill(value); } @Override @@ -792,6 +816,6 @@ public class DatePicker extends FrameLayout { @Override public AutofillValue getAutofillValue() { - return isEnabled() ? AutofillValue.forDate(mDelegate.getDate()) : null; + return isEnabled() ? mDelegate.getAutofillValue() : null; } } diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index 636519b197e7..60b4757216af 100755 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -368,12 +368,9 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { } @Override - public void init(int year, int monthOfYear, int dayOfMonth, + public void init(int year, int month, int dayOfMonth, DatePicker.OnDateChangedListener callBack) { - mCurrentDate.set(Calendar.YEAR, year); - mCurrentDate.set(Calendar.MONTH, monthOfYear); - mCurrentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - + setDate(year, month, dayOfMonth); onDateChanged(false, false); mOnDateChangedListener = callBack; @@ -381,11 +378,15 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { @Override public void updateDate(int year, int month, int dayOfMonth) { + setDate(year, month, dayOfMonth); + onDateChanged(false, true); + } + + private void setDate(int year, int month, int dayOfMonth) { mCurrentDate.set(Calendar.YEAR, year); mCurrentDate.set(Calendar.MONTH, month); mCurrentDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - - onDateChanged(false, true); + resetAutofilledValue(); } private void onDateChanged(boolean fromUser, boolean callbackToClient) { diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java index 4f9316f881cd..dba74b191b09 100644 --- a/core/java/android/widget/DatePickerSpinnerDelegate.java +++ b/core/java/android/widget/DatePickerSpinnerDelegate.java @@ -504,6 +504,7 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { private void setDate(int year, int month, int dayOfMonth) { mCurrentDate.set(year, month, dayOfMonth); + resetAutofilledValue(); if (mCurrentDate.before(mMinDate)) { mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis()); } else if (mCurrentDate.after(mMaxDate)) { diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index b77aa1c6888a..5adbdbe8ab4f 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -64,6 +64,7 @@ import android.view.ViewStub; import android.widget.AdapterView.OnItemClickListener; import com.android.internal.R; +import com.android.internal.util.NotificationColorUtil; import com.android.internal.util.Preconditions; import libcore.util.Objects; @@ -75,6 +76,7 @@ import java.lang.annotation.Target; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; +import java.util.Stack; import java.util.concurrent.Executor; /** @@ -118,6 +120,7 @@ public class RemoteViews implements Parcelable, Filter { private static final int TEXT_VIEW_DRAWABLE_COLOR_FILTER_ACTION_TAG = 17; private static final int SET_REMOTE_INPUTS_ACTION_TAG = 18; private static final int LAYOUT_PARAM_ACTION_TAG = 19; + private static final int OVERRIDE_TEXT_COLORS_TAG = 20; /** * Application that hosts the remote views. @@ -154,6 +157,12 @@ public class RemoteViews implements Parcelable, Filter { private boolean mIsRoot = true; /** + * Whether reapply is disallowed on this remoteview. This maybe be true if some actions modify + * the layout in a way that isn't recoverable, since views are being removed. + */ + private boolean mReapplyDisallowed; + + /** * Constants to whether or not this RemoteViews is composed of a landscape and portrait * RemoteViews. */ @@ -215,6 +224,37 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Override all text colors in this layout and replace them by the given text color. + * + * @param textColor The color to use. + * + * @hide + */ + public void overrideTextColors(int textColor) { + addAction(new OverrideTextColorsAction(textColor)); + } + + /** + * Set that it is disallowed to reapply another remoteview with the same layout as this view. + * This should be done if an action is destroying the view tree of the base layout. + * + * @hide + */ + public void setReapplyDisallowed() { + mReapplyDisallowed = true; + } + + /** + * @return Whether it is disallowed to reapply another remoteview with the same layout as this + * view. True if this remoteview has actions that destroyed view tree of the base layout. + * + * @hide + */ + public boolean isReapplyDisallowed() { + return mReapplyDisallowed; + } + + /** * Handle with care! */ static class MutablePair<F, S> { @@ -2223,6 +2263,52 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Helper action to override all textViewColors + */ + private class OverrideTextColorsAction extends Action { + + private final int textColor; + + public OverrideTextColorsAction(int textColor) { + this.textColor = textColor; + } + + public OverrideTextColorsAction(Parcel parcel) { + textColor = parcel.readInt(); + } + + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(OVERRIDE_TEXT_COLORS_TAG); + dest.writeInt(textColor); + } + + @Override + public void apply(View root, ViewGroup rootParent, OnClickHandler handler) { + // Let's traverse the viewtree and override all textColors! + Stack<View> viewsToProcess = new Stack<>(); + viewsToProcess.add(root); + while (!viewsToProcess.isEmpty()) { + View v = viewsToProcess.pop(); + if (v instanceof TextView) { + TextView textView = (TextView) v; + textView.setText(NotificationColorUtil.clearColorSpans(textView.getText())); + textView.setTextColor(textColor); + } + if (v instanceof ViewGroup) { + ViewGroup viewGroup = (ViewGroup) v; + for (int i = 0; i < viewGroup.getChildCount(); i++) { + viewsToProcess.push(viewGroup.getChildAt(i)); + } + } + } + } + + public String getActionName() { + return "OverrideTextColorsAction"; + } + } + + /** * Simple class used to keep track of memory usage in a RemoteViews. * */ @@ -2417,6 +2503,9 @@ public class RemoteViews implements Parcelable, Filter { case LAYOUT_PARAM_ACTION_TAG: mActions.add(new LayoutParamAction(parcel)); break; + case OVERRIDE_TEXT_COLORS_TAG: + mActions.add(new OverrideTextColorsAction(parcel)); + break; default: throw new ActionException("Tag " + tag + " not found"); } @@ -2429,6 +2518,7 @@ public class RemoteViews implements Parcelable, Filter { mApplication = mPortrait.mApplication; mLayoutId = mPortrait.getLayoutId(); } + mReapplyDisallowed = parcel.readInt() == 0; // setup the memory usage statistics mMemoryUsageCounter = new MemoryUsageCounter(); @@ -3738,6 +3828,7 @@ public class RemoteViews implements Parcelable, Filter { // Both RemoteViews already share the same package and user mPortrait.writeToParcel(dest, flags | PARCELABLE_ELIDE_DUPLICATES); } + dest.writeInt(mReapplyDisallowed ? 1 : 0); } private static ApplicationInfo getApplicationInfo(String packageName, int userId) { diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index de289bb9a27a..ae6881e4e28c 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -366,8 +366,11 @@ public class TimePicker extends FrameLayout { void setMinute(@IntRange(from = 0, to = 59) int minute); int getMinute(); - void setDate(long date); - long getDate(); + void setDate(@IntRange(from = 0, to = 23) int hour, + @IntRange(from = 0, to = 59) int minute); + + void autofill(AutofillValue value); + AutofillValue getAutofillValue(); void setIs24Hour(boolean is24Hour); boolean is24Hour(); @@ -422,6 +425,11 @@ public class TimePicker extends FrameLayout { protected OnTimeChangedListener mOnTimeChangedListener; protected OnTimeChangedListener mAutoFillChangeListener; + // The value that was passed to autofill() - it must be stored because it getAutofillValue() + // must return the exact same value that was autofilled, otherwise the widget will not be + // properly highlighted after autofill(). + private long mAutofilledValue; + public AbstractTimePickerDelegate(@NonNull TimePicker delegator, @NonNull Context context) { mDelegator = delegator; mContext = context; @@ -439,19 +447,41 @@ public class TimePicker extends FrameLayout { } @Override - public void setDate(long date) { - Calendar cal = Calendar.getInstance(mLocale); - cal.setTimeInMillis(date); - setHour(cal.get(Calendar.HOUR_OF_DAY)); - setMinute(cal.get(Calendar.MINUTE)); + public final void autofill(AutofillValue value) { + if (value == null || !value.isDate()) { + Log.w(LOG_TAG, value + " could not be autofilled into " + this); + return; + } + + final long time = value.getDateValue(); + + final Calendar cal = Calendar.getInstance(mLocale); + cal.setTimeInMillis(time); + setDate(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); + + // Must set mAutofilledValue *after* calling subclass method to make sure the value + // returned by getAutofillValue() matches it. + mAutofilledValue = time; } @Override - public long getDate() { - Calendar cal = Calendar.getInstance(mLocale); + public final AutofillValue getAutofillValue() { + if (mAutofilledValue != 0) { + return AutofillValue.forDate(mAutofilledValue); + } + + final Calendar cal = Calendar.getInstance(mLocale); cal.set(Calendar.HOUR_OF_DAY, getHour()); cal.set(Calendar.MINUTE, getMinute()); - return cal.getTimeInMillis(); + return AutofillValue.forDate(cal.getTimeInMillis()); + } + + /** + * This method must be called every time the value of the hour and/or minute is changed by + * a subclass method. + */ + protected void resetAutofilledValue() { + mAutofilledValue = 0; } protected static class SavedState extends View.BaseSavedState { @@ -532,12 +562,7 @@ public class TimePicker extends FrameLayout { public void autofill(AutofillValue value) { if (!isEnabled()) return; - if (!value.isDate()) { - Log.w(LOG_TAG, value + " could not be autofilled into " + this); - return; - } - - mDelegate.setDate(value.getDateValue()); + mDelegate.autofill(value); } @Override @@ -547,6 +572,6 @@ public class TimePicker extends FrameLayout { @Override public AutofillValue getAutofillValue() { - return isEnabled() ? AutofillValue.forDate(mDelegate.getDate()) : null; + return isEnabled() ? mDelegate.getAutofillValue() : null; } } diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java index 526246b28530..706b0ce225dc 100644 --- a/core/java/android/widget/TimePickerClockDelegate.java +++ b/core/java/android/widget/TimePickerClockDelegate.java @@ -506,19 +506,29 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { mAmPmLayout.setLayoutParams(params); } + @Override + public void setDate(int hour, int minute) { + setHourInternal(hour, FROM_EXTERNAL_API, true, false); + setMinuteInternal(minute, FROM_EXTERNAL_API, false); + + onTimeChanged(); + } + /** * Set the current hour. */ @Override public void setHour(int hour) { - setHourInternal(hour, FROM_EXTERNAL_API, true); + setHourInternal(hour, FROM_EXTERNAL_API, true, true); } - private void setHourInternal(int hour, @ChangeSource int source, boolean announce) { + private void setHourInternal(int hour, @ChangeSource int source, boolean announce, + boolean notify) { if (mCurrentHour == hour) { return; } + resetAutofilledValue(); mCurrentHour = hour; updateHeaderHour(hour, announce); updateHeaderAmPm(); @@ -532,7 +542,9 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { } mDelegator.invalidate(); - onTimeChanged(); + if (notify) { + onTimeChanged(); + } } /** @@ -557,14 +569,15 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { */ @Override public void setMinute(int minute) { - setMinuteInternal(minute, FROM_EXTERNAL_API); + setMinuteInternal(minute, FROM_EXTERNAL_API, true); } - private void setMinuteInternal(int minute, @ChangeSource int source) { + private void setMinuteInternal(int minute, @ChangeSource int source, boolean notify) { if (mCurrentMinute == minute) { return; } + resetAutofilledValue(); mCurrentMinute = minute; updateHeaderMinute(minute, true); @@ -576,7 +589,9 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { } mDelegator.invalidate(); - onTimeChanged(); + if (notify) { + onTimeChanged(); + } } /** @@ -870,7 +885,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { valueChanged = true; } final boolean isTransition = mAllowAutoAdvance && autoAdvance; - setHourInternal(newValue, FROM_RADIAL_PICKER, !isTransition); + setHourInternal(newValue, FROM_RADIAL_PICKER, !isTransition, true); if (isTransition) { setCurrentItemShowing(MINUTE_INDEX, true, false); @@ -882,7 +897,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { if (getMinute() != newValue) { valueChanged = true; } - setMinuteInternal(newValue, FROM_RADIAL_PICKER); + setMinuteInternal(newValue, FROM_RADIAL_PICKER, true); break; } @@ -897,10 +912,10 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { public void onValueChanged(int pickerType, int newValue) { switch (pickerType) { case TextInputTimePickerView.HOURS: - setHourInternal(newValue, FROM_INPUT_PICKER, false); + setHourInternal(newValue, FROM_INPUT_PICKER, false, true); break; case TextInputTimePickerView.MINUTES: - setMinuteInternal(newValue, FROM_INPUT_PICKER); + setMinuteInternal(newValue, FROM_INPUT_PICKER, true); break; case TextInputTimePickerView.AMPM: setAmOrPm(newValue); diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java index 7a7d9a948dcc..cc79b9c85784 100644 --- a/core/java/android/widget/TimePickerSpinnerDelegate.java +++ b/core/java/android/widget/TimePickerSpinnerDelegate.java @@ -284,6 +284,14 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { } @Override + public void setDate(int hour, int minute) { + setCurrentHour(hour, false); + setCurrentMinute(minute, false); + + onTimeChanged(); + } + + @Override public void setHour(int hour) { setCurrentHour(hour, true); } @@ -293,6 +301,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { if (currentHour == getHour()) { return; } + resetAutofilledValue(); if (!is24Hour()) { // convert [0,23] ordinal to wall clock display if (currentHour >= HOURS_IN_HALF_DAY) { @@ -328,11 +337,18 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { @Override public void setMinute(int minute) { + setCurrentMinute(minute, true); + } + + private void setCurrentMinute(int minute, boolean notifyTimeChanged) { if (minute == getMinute()) { return; } + resetAutofilledValue(); mMinuteSpinner.setValue(minute); - onTimeChanged(); + if (notifyTimeChanged) { + onTimeChanged(); + } } @Override diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index ef98a5e9f787..c171fa6b25fd 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -80,7 +80,7 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener if (wallpaperManager == null) { Log.w(TAG, "Can't listen to color changes!"); } else { - wallpaperManager.addOnColorsChangedListener(this); + wallpaperManager.addOnColorsChangedListener(this, null /* handler */); // Initialize all gradients with the current colors Trace.beginSection("ColorExtractor#getWallpaperColors"); diff --git a/core/java/com/android/internal/colorextraction/types/Tonal.java b/core/java/com/android/internal/colorextraction/types/Tonal.java index dbc086c21304..e6ef10b3b7c6 100644 --- a/core/java/com/android/internal/colorextraction/types/Tonal.java +++ b/core/java/com/android/internal/colorextraction/types/Tonal.java @@ -111,18 +111,19 @@ public class Tonal implements ExtractionType { final List<Color> mainColors = inWallpaperColors.getMainColors(); final int mainColorsSize = mainColors.size(); - final boolean supportsDarkText = (inWallpaperColors.getColorHints() & - WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; + final int hints = inWallpaperColors.getColorHints(); + final boolean supportsDarkText = (hints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; + final boolean generatedFromBitmap = (hints & WallpaperColors.HINT_FROM_BITMAP) != 0; if (mainColorsSize == 0) { return false; } - // Tonal is not really a sort, it takes a color from the extracted - // palette and finds a best fit amongst a collection of pre-defined - // palettes. The best fit is tweaked to be closer to the source color - // and replaces the original palette - // Get the most preeminent, non-blacklisted color. + // Decide what's the best color to use. + // We have 2 options: + // • Just pick the primary color + // • Filter out blacklisted colors. This is useful when palette is generated + // automatically from a bitmap. Color bestColor = null; final float[] hsl = new float[3]; for (int i = 0; i < mainColorsSize; i++) { @@ -132,7 +133,7 @@ public class Tonal implements ExtractionType { Color.blue(colorValue), hsl); // Stop when we find a color that meets our criteria - if (!isBlacklisted(hsl)) { + if (!generatedFromBitmap || !isBlacklisted(hsl)) { bestColor = color; break; } @@ -143,6 +144,10 @@ public class Tonal implements ExtractionType { return false; } + // Tonal is not really a sort, it takes a color from the extracted + // palette and finds a best fit amongst a collection of pre-defined + // palettes. The best fit is tweaked to be closer to the source color + // and replaces the original palette. int colorValue = bestColor.toArgb(); ColorUtils.RGBToHSL(Color.red(colorValue), Color.green(colorValue), Color.blue(colorValue), hsl); diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java index d327180c6e9d..d64c9a1d813b 100644 --- a/core/java/com/android/internal/notification/SystemNotificationChannels.java +++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java @@ -132,10 +132,12 @@ public class SystemNotificationChannels { context.getString(R.string.notification_channel_usb), NotificationManager.IMPORTANCE_MIN)); - channelsList.add(new NotificationChannel( + NotificationChannel foregroundChannel = new NotificationChannel( FOREGROUND_SERVICE, context.getString(R.string.notification_channel_foreground_service), - NotificationManager.IMPORTANCE_LOW)); + NotificationManager.IMPORTANCE_LOW); + foregroundChannel.setBlockableSystem(true); + channelsList.add(foregroundChannel); nm.createNotificationChannels(channelsList); } diff --git a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java index c89f546b13a2..e85e29543d23 100644 --- a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java +++ b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java @@ -137,7 +137,7 @@ public class KernelUidCpuFreqTimeReader { sb.append("times=").append("("); TimeUtils.formatDuration(mLastTimeReadMs, sb); sb.append(","); TimeUtils.formatDuration(mNowTimeMs, sb); sb.append(")"); - Slog.wtf(TAG, sb.toString()); + Slog.e(TAG, sb.toString()); return; } curUidTimeMs[i] = totalTimeMs; diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java index 2778d93a5388..933cc7af975a 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -33,6 +33,7 @@ import android.graphics.drawable.Icon; import android.graphics.drawable.VectorDrawable; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.text.style.BackgroundColorSpan; import android.text.style.CharacterStyle; import android.text.style.ForegroundColorSpan; import android.text.style.TextAppearanceSpan; @@ -240,6 +241,45 @@ public class NotificationColorUtil { return span; } + /** + * Clears all color spans of a text + * @param charSequence the input text + * @return the same text but without color spans + */ + public static CharSequence clearColorSpans(CharSequence charSequence) { + if (charSequence instanceof Spanned) { + Spanned ss = (Spanned) charSequence; + Object[] spans = ss.getSpans(0, ss.length(), Object.class); + SpannableStringBuilder builder = new SpannableStringBuilder(ss.toString()); + for (Object span : spans) { + Object resultSpan = span; + if (resultSpan instanceof CharacterStyle) { + resultSpan = ((CharacterStyle) span).getUnderlying(); + } + if (resultSpan instanceof TextAppearanceSpan) { + TextAppearanceSpan originalSpan = (TextAppearanceSpan) resultSpan; + if (originalSpan.getTextColor() != null) { + resultSpan = new TextAppearanceSpan( + originalSpan.getFamily(), + originalSpan.getTextStyle(), + originalSpan.getTextSize(), + null, + originalSpan.getLinkTextColor()); + } + } else if (resultSpan instanceof ForegroundColorSpan + || (resultSpan instanceof BackgroundColorSpan)) { + continue; + } else { + resultSpan = span; + } + builder.setSpan(resultSpan, ss.getSpanStart(span), ss.getSpanEnd(span), + ss.getSpanFlags(span)); + } + return builder; + } + return charSequence; + } + private int processColor(int color) { return Color.argb(Color.alpha(color), 255 - Color.red(color), diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 81018fe4b357..77788921635f 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -141,6 +141,7 @@ public class SystemConfig { final ArrayMap<String, ArraySet<String>> mPrivAppPermissions = new ArrayMap<>(); + final ArrayMap<String, ArraySet<String>> mPrivAppDenyPermissions = new ArrayMap<>(); public static SystemConfig getInstance() { synchronized (SystemConfig.class) { @@ -219,6 +220,10 @@ public class SystemConfig { return mPrivAppPermissions.get(packageName); } + public ArraySet<String> getPrivAppDenyPermissions(String packageName) { + return mPrivAppDenyPermissions.get(packageName); + } + SystemConfig() { // Read configuration from system readPermissions(Environment.buildPath( @@ -660,6 +665,7 @@ public class SystemConfig { if (permissions == null) { permissions = new ArraySet<>(); } + ArraySet<String> denyPermissions = mPrivAppDenyPermissions.get(packageName); int depth = parser.getDepth(); while (XmlUtils.nextElementWithin(parser, depth)) { String name = parser.getName(); @@ -671,8 +677,22 @@ public class SystemConfig { continue; } permissions.add(permName); + } else if ("deny-permission".equals(name)) { + String permName = parser.getAttributeValue(null, "name"); + if (TextUtils.isEmpty(permName)) { + Slog.w(TAG, "name is required for <deny-permission> in " + + parser.getPositionDescription()); + continue; + } + if (denyPermissions == null) { + denyPermissions = new ArraySet<>(); + } + denyPermissions.add(permName); } } mPrivAppPermissions.put(packageName, permissions); + if (denyPermissions != null) { + mPrivAppDenyPermissions.put(packageName, denyPermissions); + } } } diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 94edde1a2798..325f6d4615d7 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -75,6 +75,9 @@ jstring encodedFormatToString(JNIEnv* env, SkEncodedImageFormat format) { case SkEncodedImageFormat::kWEBP: mimeType = "image/webp"; break; + case SkEncodedImageFormat::kHEIF: + mimeType = "image/heif"; + break; case SkEncodedImageFormat::kWBMP: mimeType = "image/vnd.wap.wbmp"; break; diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 6c2b4609ebc7..4d32c0546d93 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -29,6 +29,7 @@ #include <time.h> #include <unistd.h> +#include <atomic> #include <iomanip> #include <string> @@ -44,16 +45,11 @@ #include "jni.h" #include <memtrack/memtrack.h> #include <memunreachable/memunreachable.h> +#include "android_os_Debug.h" namespace android { -static void safeFclose(FILE* fp) { - if (fp) fclose(fp); -} - -using UniqueFile = std::unique_ptr<FILE, decltype(&safeFclose)>; - static inline UniqueFile MakeUniqueFile(const char* path, const char* mode) { return UniqueFile(fopen(path, mode), safeFclose); } @@ -155,6 +151,14 @@ struct stats_t { int swappedOutPss; }; +enum pss_rollup_support { + PSS_ROLLUP_UNTRIED, + PSS_ROLLUP_SUPPORTED, + PSS_ROLLUP_UNSUPPORTED +}; + +static std::atomic<pss_rollup_support> g_pss_rollup_support; + #define BINDER_STATS "/proc/binder/stats" static jlong android_os_Debug_getNativeHeapSize(JNIEnv *env, jobject clazz) @@ -548,6 +552,33 @@ static void android_os_Debug_getDirtyPages(JNIEnv *env, jobject clazz, jobject o android_os_Debug_getDirtyPagesPid(env, clazz, getpid(), object); } +UniqueFile OpenSmapsOrRollup(int pid) +{ + enum pss_rollup_support rollup_support = + g_pss_rollup_support.load(std::memory_order_relaxed); + if (rollup_support != PSS_ROLLUP_UNSUPPORTED) { + std::string smaps_rollup_path = + base::StringPrintf("/proc/%d/smaps_rollup", pid); + UniqueFile fp_rollup = MakeUniqueFile(smaps_rollup_path.c_str(), "re"); + if (fp_rollup == nullptr && errno != ENOENT) { + return fp_rollup; // Actual error, not just old kernel. + } + if (fp_rollup != nullptr) { + if (rollup_support == PSS_ROLLUP_UNTRIED) { + ALOGI("using rollup pss collection"); + g_pss_rollup_support.store(PSS_ROLLUP_SUPPORTED, + std::memory_order_relaxed); + } + return fp_rollup; + } + g_pss_rollup_support.store(PSS_ROLLUP_UNSUPPORTED, + std::memory_order_relaxed); + } + + std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); + return MakeUniqueFile(smaps_path.c_str(), "re"); +} + static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jlongArray outUssSwapPss, jlongArray outMemtrack) { @@ -563,12 +594,11 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, } { - std::string smaps_path = base::StringPrintf("/proc/%d/smaps", pid); - UniqueFile fp = MakeUniqueFile(smaps_path.c_str(), "re"); + UniqueFile fp = OpenSmapsOrRollup(pid); if (fp != nullptr) { while (true) { - if (fgets(line, 1024, fp.get()) == NULL) { + if (fgets(line, sizeof (line), fp.get()) == NULL) { break; } diff --git a/core/jni/android_os_Debug.h b/core/jni/android_os_Debug.h new file mode 100644 index 000000000000..81270ca994bb --- /dev/null +++ b/core/jni/android_os_Debug.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +#ifndef ANDROID_OS_DEBUG_H +#define ANDROID_OS_DEBUG_H + +#include <memory> +#include <stdio.h> + +namespace android { + +inline void safeFclose(FILE* fp) { + if (fp) fclose(fp); +} + +using UniqueFile = std::unique_ptr<FILE, decltype(&safeFclose)>; +UniqueFile OpenSmapsOrRollup(int pid); + +} // namespace android + +#endif // ANDROID_OS_HW_BLOB_H diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 44f15cd637ed..33c8304f2547 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -31,6 +31,7 @@ #include "android_util_Binder.h" #include <nativehelper/JNIHelp.h> +#include "android_os_Debug.h" #include <dirent.h> #include <fcntl.h> @@ -1092,27 +1093,21 @@ static jlong android_os_Process_getElapsedCpuTime(JNIEnv* env, jobject clazz) static jlong android_os_Process_getPss(JNIEnv* env, jobject clazz, jint pid) { - char filename[64]; - - snprintf(filename, sizeof(filename), "/proc/%" PRId32 "/smaps", pid); - - FILE * file = fopen(filename, "r"); - if (!file) { + UniqueFile file = OpenSmapsOrRollup(pid); + if (file == nullptr) { return (jlong) -1; } // Tally up all of the Pss from the various maps char line[256]; jlong pss = 0; - while (fgets(line, sizeof(line), file)) { + while (fgets(line, sizeof(line), file.get())) { jlong v; if (sscanf(line, "Pss: %" SCNd64 " kB", &v) == 1) { pss += v; } } - fclose(file); - // Return the Pss value in bytes, not kilobytes return pss * 1024; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f294b98712c6..86c0b436ae29 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1984,6 +1984,15 @@ android:description="@string/permdesc_setWallpaperHints" android:protectionLevel="normal" /> + <!-- Allow the app to read the system wallpaper image without + holding the READ_EXTERNAL_STORAGE permission. + <p>Not for use by third-party applications. + @hide + @SystemApi + --> + <permission android:name="android.permission.READ_WALLPAPER_INTERNAL" + android:protectionLevel="signature|privileged" /> + <!-- ============================================ --> <!-- Permissions for changing the system clock --> <!-- ============================================ --> diff --git a/core/res/res/layout/autofill_save.xml b/core/res/res/layout/autofill_save.xml index 77fa62a5ecc9..50ff50f19564 100644 --- a/core/res/res/layout/autofill_save.xml +++ b/core/res/res/layout/autofill_save.xml @@ -14,94 +14,91 @@ limitations under the License. --> +<!-- NOTE: outer layout is required to provide proper shadow. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/autofill_save" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:layout_marginTop="32dp" - android:paddingTop="16dp" - android:elevation="32dp" - android:background="?android:attr/colorBackground" android:orientation="vertical"> <LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/autofill_save" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:paddingLeft="16dp" - android:paddingRight="16dp" + android:layout_marginTop="32dp" + android:paddingTop="16dp" + android:elevation="32dp" + android:background="?android:attr/colorBackground" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" - android:orientation="horizontal"> + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:orientation="vertical"> - <TextView - android:id="@+id/autofill_save_title" - android:layout_width="0dp" + <LinearLayout + android:layout_width="fill_parent" android:layout_height="wrap_content" - android:text="@string/autofill_save_title" - android:textSize="16sp" - android:textColor="?android:attr/textColorPrimary" - android:layout_weight="1"> - </TextView> - - <ImageView - android:id="@+id/autofill_save_close" - android:layout_width="wrap_content" + android:orientation="horizontal"> + + <TextView + android:id="@+id/autofill_save_title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="@string/autofill_save_title" + android:textSize="16sp" + android:textColor="?android:attr/textColorPrimary" + android:layout_weight="1"> + </TextView> + + </LinearLayout> + + <com.android.server.autofill.ui.CustomScrollView + android:id="@+id/autofill_save_custom_subtitle" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:src="@android:drawable/ic_close" - android:alpha="0.54" - android:background="?android:attr/selectableItemBackgroundBorderless" - android:contentDescription="@android:string/close_button_text"> - </ImageView> + android:layout_marginTop="4dp" + android:visibility="gone"/> </LinearLayout> - <com.android.server.autofill.ui.CustomScrollView - android:id="@+id/autofill_save_custom_subtitle" - android:layout_width="match_parent" + <com.android.internal.widget.ButtonBarLayout + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="4dp" - android:visibility="gone"/> + android:layout_gravity="end" + android:padding="16dp" + android:clipToPadding="false" + android:layout_weight="1" + android:orientation="horizontal"> - </LinearLayout> + <Space + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_weight="1" + android:visibility="invisible"> + </Space> - <com.android.internal.widget.ButtonBarLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:padding="16dp" - android:clipToPadding="false" - android:layout_weight="1" - android:orientation="horizontal"> - - <Space - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_weight="1" - android:visibility="invisible"> - </Space> + <Button + android:id="@+id/autofill_save_no" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="?android:attr/buttonBarButtonStyle" + android:text="@string/autofill_save_no"> + </Button> - <Button - android:id="@+id/autofill_save_no" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="?android:attr/buttonBarButtonStyle" - android:text="@string/autofill_save_no"> - </Button> + <Button + android:id="@+id/autofill_save_yes" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + style="@style/Widget.Material.Button.Colored" + android:text="@string/autofill_save_yes"> + </Button> - <Button - android:id="@+id/autofill_save_yes" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - style="@style/Widget.Material.Button.Colored" - android:text="@string/autofill_save_yes"> - <requestFocus /> - </Button> + </com.android.internal.widget.ButtonBarLayout> - </com.android.internal.widget.ButtonBarLayout> + </LinearLayout> </LinearLayout> diff --git a/core/res/res/values-sw380dp-land/dimens.xml b/core/res/res/values-mcc310-mnc030/strings.xml index 20eb1be0bb34..a3fea29070f5 100644 --- a/core/res/res/values-sw380dp-land/dimens.xml +++ b/core/res/res/values-mcc310-mnc030/strings.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <!-- -/* //device/apps/common/assets/res/any/dimens.xml +/* //device/apps/common/assets/res/any/strings.xml ** -** Copyright 2012, The Android Open Source Project +** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ ** limitations under the License. */ --> -<resources> - <!-- Top margin for the clock view --> - <dimen name="kg_clock_top_margin">48dp</dimen> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> </resources> diff --git a/core/res/res/values-mcc310-mnc170 b/core/res/res/values-mcc310-mnc170 deleted file mode 120000 index cfced1756742..000000000000 --- a/core/res/res/values-mcc310-mnc170 +++ /dev/null @@ -1 +0,0 @@ -./values-mcc310-mnc150
\ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/values-sw380dp/dimens.xml b/core/res/res/values-mcc310-mnc170/strings.xml index fc0e85d26bae..a3fea29070f5 100644 --- a/packages/SystemUI/res-keyguard/values-sw380dp/dimens.xml +++ b/core/res/res/values-mcc310-mnc170/strings.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <!-- +/* //device/apps/common/assets/res/any/strings.xml ** -** Copyright 2012, The Android Open Source Project +** Copyright 2006, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License") +** 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 ** @@ -16,8 +17,7 @@ ** limitations under the License. */ --> - -<resources> - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">340dp</dimen> -</resources>
\ No newline at end of file +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-sw380dp/dimens.xml b/core/res/res/values-mcc310-mnc280/strings.xml index fc0e85d26bae..a3fea29070f5 100644 --- a/core/res/res/values-sw380dp/dimens.xml +++ b/core/res/res/values-mcc310-mnc280/strings.xml @@ -1,9 +1,10 @@ <?xml version="1.0" encoding="utf-8"?> <!-- +/* //device/apps/common/assets/res/any/strings.xml ** -** Copyright 2012, The Android Open Source Project +** Copyright 2006, The Android Open Source Project ** -** Licensed under the Apache License, Version 2.0 (the "License") +** 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 ** @@ -16,8 +17,7 @@ ** limitations under the License. */ --> - -<resources> - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">340dp</dimen> -</resources>
\ No newline at end of file +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc380 b/core/res/res/values-mcc310-mnc380 deleted file mode 120000 index cfced1756742..000000000000 --- a/core/res/res/values-mcc310-mnc380 +++ /dev/null @@ -1 +0,0 @@ -./values-mcc310-mnc150
\ No newline at end of file diff --git a/core/res/res/values-mcc310-mnc380/strings.xml b/core/res/res/values-mcc310-mnc380/strings.xml new file mode 100644 index 000000000000..a3fea29070f5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc380/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc410/strings.xml b/core/res/res/values-mcc310-mnc410/strings.xml new file mode 100644 index 000000000000..a3fea29070f5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc410/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc560/strings.xml b/core/res/res/values-mcc310-mnc560/strings.xml new file mode 100644 index 000000000000..a3fea29070f5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc560/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-mcc310-mnc950/strings.xml b/core/res/res/values-mcc310-mnc950/strings.xml new file mode 100644 index 000000000000..a3fea29070f5 --- /dev/null +++ b/core/res/res/values-mcc310-mnc950/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-mcc311-mnc180/strings.xml b/core/res/res/values-mcc311-mnc180/strings.xml new file mode 100644 index 000000000000..a3fea29070f5 --- /dev/null +++ b/core/res/res/values-mcc311-mnc180/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="mmcc_imsi_unknown_in_hlr">SIM not provisioned MM#2</string> + <string name="mmcc_illegal_ms">SIM not allowed MM#3</string> +</resources> diff --git a/core/res/res/values-sw600dp/dimens.xml b/core/res/res/values-sw600dp/dimens.xml index 9c45c12ce109..02ed848fc7f1 100644 --- a/core/res/res/values-sw600dp/dimens.xml +++ b/core/res/res/values-sw600dp/dimens.xml @@ -104,9 +104,6 @@ <dimen name="kg_runway_lights_top_margin">-10dp</dimen> <!-- Margin around the various security views --> - <dimen name="keyguard_security_view_margin">12dp</dimen> - - <!-- Margin around the various security views --> <dimen name="keyguard_muliuser_selector_margin">12dp</dimen> <!-- width of ImmersiveModeConfirmation (-1 for match_parent) --> diff --git a/core/res/res/values-sw720dp/dimens.xml b/core/res/res/values-sw720dp/dimens.xml index 2317d1f6909c..ac48ad76d43d 100644 --- a/core/res/res/values-sw720dp/dimens.xml +++ b/core/res/res/values-sw720dp/dimens.xml @@ -111,10 +111,4 @@ <!-- Size of the text under the avator on the multiuser lockscreen. --> <dimen name="keyguard_avatar_name_size">12sp</dimen> - - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">420dp</dimen> - - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_height">420dp</dimen> </resources> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 682815014ade..8aff3b6eb749 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1779,6 +1779,11 @@ the library at build time while it offers apps to share code defined in such libraries. Hence, static libraries are strictly required. + <p>On devices running O MR1 or higher, if the library is singed with multiple + signing certificates you must to specify the SHA-256 hashes of the additional + certificates via adding + {@link #AndroidManifestAdditionalCertificate additional-certificate} tags. + <p>This appears as a child tag of the {@link #AndroidManifestApplication application} tag. --> <declare-styleable name="AndroidManifestUsesStaticLibrary" parent="AndroidManifestApplication"> @@ -1790,6 +1795,17 @@ <attr name="certDigest" format="string" /> </declare-styleable> + <!-- The <code>additional-certificate</code> specifies the SHA-256 digest of a static + shared library's additional signing certificate. You need to use this tag if the + library is singed with more than one certificate. + + <p>This appears as a child tag of the + {@link #AndroidManifestUsesStaticLibrary uses-static-library} tag. --> + <declare-styleable name="AndroidManifestAdditionalCertificate" parent="AndroidManifestUsesStaticLibrary"> + <!-- The SHA-256 digest of the library signing certificate. --> + <attr name="certDigest" /> + </declare-styleable> + <!-- The <code>supports-screens</code> specifies the screen dimensions an application supports. By default a modern application supports all screen sizes and must explicitly disable certain screen sizes here; diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 95aa264639ac..ca4b355664d7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -531,15 +531,18 @@ <!-- Integer parameters of the wifi to cellular handover feature wifi should not stick to bad networks --> <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz">-82</integer> + <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz">-82</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_5GHz">-70</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_5GHz">-57</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz">-85</integer> + <integer translatable="false" name="config_wifi_framework_wifi_score_entry_rssi_threshold_24GHz">-85</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_low_rssi_threshold_24GHz">-73</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_good_rssi_threshold_24GHz">-60</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_bad_link_speed_24">6</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_bad_link_speed_5">12</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_good_link_speed_24">24</integer> <integer translatable="false" name="config_wifi_framework_wifi_score_good_link_speed_5">36</integer> + <string translatable="false" name="config_wifi_random_mac_oui">DA-A1-19</string> <string translatable="false" name="config_wifi_framework_sap_2G_channel_list">1,6,11</string> @@ -626,10 +629,10 @@ <bool name="config_automatic_brightness_available">false</bool> <!-- Fast brightness animation ramp rate in brightness units per second--> - <integer translatable="false" name="config_brightness_ramp_rate_fast">200</integer> + <integer translatable="false" name="config_brightness_ramp_rate_fast">180</integer> <!-- Slow brightness animation ramp rate in brightness units per second--> - <integer translatable="false" name="config_brightness_ramp_rate_slow">40</integer> + <integer translatable="false" name="config_brightness_ramp_rate_slow">60</integer> <!-- Don't name config resources like this. It should look like config_annoyDianne --> <bool name="config_annoy_dianne">true</bool> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 12feba941103..9b1ebc877384 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -438,15 +438,6 @@ <!-- Width of the outline stroke used by the accessibility screen magnification indicator --> <dimen name="accessibility_magnification_indicator_width">4dip</dimen> - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">320dp</dimen> - - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_height">400dp</dimen> - - <!-- Margin around the various security views --> - <dimen name="keyguard_security_view_margin">8dp</dimen> - <!-- Margin around the various security views --> <dimen name="keyguard_muliuser_selector_margin">8dp</dimen> @@ -592,6 +583,21 @@ <!-- The size of the right icon --> <dimen name="notification_right_icon_size">40dp</dimen> + <!-- The maximum height of any image in a remote view. This is applied to all images in custom remoteviews. --> + <dimen name="notification_custom_view_max_image_height_low_ram">208dp</dimen> + <!-- The maximum height of any image in a remote view. This is applied to all images in custom remoteviews. --> + <dimen name="notification_custom_view_max_image_width_low_ram">294dp</dimen> + <!-- The maximum height of a big picture in a notification. The images will be reduced to that height in case they are bigger. --> + <dimen name="notification_big_picture_max_height_low_ram">208dp</dimen> + <!-- The maximum width of a big picture in a notification. The images will be reduced to that width in case they are bigger. --> + <dimen name="notification_big_picture_max_width_low_ram">294dp</dimen> + <!-- The maximum height of a image in a media notification. The images will be reduced to that height in case they are bigger. --> + <dimen name="notification_media_image_max_height_low_ram">100dp</dimen> + <!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.--> + <dimen name="notification_media_image_max_width_low_ram">100dp</dimen> + <!-- The size of the right icon image when on low ram --> + <dimen name="notification_right_icon_size_low_ram">40dp</dimen> + <!-- Max width/height of the autofill data set picker as a fraction of the screen width/height --> <dimen name="autofill_dataset_picker_max_size">90%</dimen> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 8a5625b9d3b3..ce6815f10b30 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -593,17 +593,18 @@ <!-- This is the label for the notification channel settings that controls the behavior of the notification about applications that are running in the background (that is, perhaps confusingly, running foreground services but not the foreground UI on the screen). - [CHAR LIMIT=NONE] --> - <string name="notification_channel_foreground_service">Apps running in background</string> + [CHAR LIMIT=NONE BACKUP_MESSAGE_ID=6665375982962336520] --> + <string name="notification_channel_foreground_service">Apps consuming battery</string> - <!-- Label for foreground service notification when one app is running. [CHAR LIMIT=NONE] --> + <!-- Label for foreground service notification when one app is running. + [CHAR LIMIT=NONE BACKUP_MESSAGE_ID=6826789589341671842] --> <string name="foreground_service_app_in_background"><xliff:g id="app_name">%1$s</xliff:g> is - running in the background</string> + using battery</string> <!-- Label for foreground service notification when multiple apps are running. - [CHAR LIMIT=NONE] --> + [CHAR LIMIT=NONE BACKUP_MESSAGE_ID=7150914856893450380] --> <string name="foreground_service_apps_in_background"><xliff:g id="number">%1$d</xliff:g> apps - are running in the background</string> + are using battery</string> <!-- Content for foreground service notification when one app is running. [CHAR LIMIT=NONE] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 061413c60367..04cfe485df4a 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -357,9 +357,11 @@ <java-symbol type="integer" name="config_wifi_framework_associated_full_scan_max_total_dwell_time" /> <java-symbol type="integer" name="config_wifi_framework_associated_partial_scan_max_num_active_channels" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz" /> + <java-symbol type="integer" name="config_wifi_framework_wifi_score_entry_rssi_threshold_24GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_low_rssi_threshold_24GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_good_rssi_threshold_24GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz" /> + <java-symbol type="integer" name="config_wifi_framework_wifi_score_entry_rssi_threshold_5GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_low_rssi_threshold_5GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_good_rssi_threshold_5GHz" /> <java-symbol type="integer" name="config_wifi_framework_wifi_score_bad_link_speed_24" /> @@ -2900,7 +2902,6 @@ <java-symbol type="id" name="autofill_save_title" /> <java-symbol type="id" name="autofill_save_no" /> <java-symbol type="id" name="autofill_save_yes" /> - <java-symbol type="id" name="autofill_save_close" /> <java-symbol type="string" name="autofill_error_cannot_autofill" /> <java-symbol type="string" name="autofill_picker_no_suggestions" /> <java-symbol type="plurals" name="autofill_picker_some_suggestions" /> @@ -2932,6 +2933,14 @@ <java-symbol type="dimen" name="notification_custom_view_max_image_height"/> <java-symbol type="dimen" name="notification_custom_view_max_image_width"/> + <java-symbol type="dimen" name="notification_big_picture_max_height_low_ram"/> + <java-symbol type="dimen" name="notification_big_picture_max_width_low_ram"/> + <java-symbol type="dimen" name="notification_media_image_max_width_low_ram"/> + <java-symbol type="dimen" name="notification_media_image_max_height_low_ram"/> + <java-symbol type="dimen" name="notification_right_icon_size_low_ram"/> + <java-symbol type="dimen" name="notification_custom_view_max_image_height_low_ram"/> + <java-symbol type="dimen" name="notification_custom_view_max_image_width_low_ram"/> + <!-- Accessibility fingerprint gestures --> <java-symbol type="string" name="capability_title_canCaptureFingerprintGestures" /> <java-symbol type="string" name="capability_desc_canCaptureFingerprintGestures" /> diff --git a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java index 5dd3c2ce6b5d..a9d19b4b295c 100644 --- a/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java +++ b/core/tests/coretests/src/android/content/pm/ParceledListSliceTest.java @@ -2,9 +2,11 @@ package android.content.pm; import android.os.Parcel; import android.os.Parcelable; + import junit.framework.TestCase; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class ParceledListSliceTest extends TestCase { @@ -91,15 +93,10 @@ public class ParceledListSliceTest extends TestCase { } } - public void testStringList() throws Exception { - final int objectCount = 400; - List<String> list = new ArrayList<String>(); - for (long i = 0; i < objectCount; i++) { - list.add(Long.toString(i * (6 - i))); - } - + private void sendParcelStringList(List<String> list) { StringParceledListSlice slice; Parcel parcel = Parcel.obtain(); + try { parcel.writeParcelable(new StringParceledListSlice(list), 0); parcel.setDataPosition(0); @@ -113,6 +110,26 @@ public class ParceledListSliceTest extends TestCase { assertEquals(list, slice.getList()); } + public void testStringList() throws Exception { + final int objectCount = 400; + List<String> list = new ArrayList<String>(); + for (long i = 0; i < objectCount; i++) { + list.add(Long.toString(i * (6 - i))); + } + + sendParcelStringList(list); + } + + public void testLargeStringList() throws Exception { + final int thresholdBytes = 256 * 1024; + final String value = Long.toString(Long.MAX_VALUE); + final int objectCount = 2 * thresholdBytes / value.length(); + final List<String> list = Collections.nCopies(objectCount, value); + + sendParcelStringList(list); + } + + /** * Test that only homogeneous elements may be unparceled. */ diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java index 674b36355ab0..22365bac64a2 100644 --- a/core/tests/coretests/src/android/transition/FadeTransitionTest.java +++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java @@ -16,22 +16,24 @@ package android.transition; +import android.animation.Animator; import android.animation.AnimatorSetActivity; import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.SmallTest; import android.transition.Transition.TransitionListener; -import android.transition.TransitionListenerAdapter; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; import com.android.frameworks.coretests.R; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import static android.support.test.espresso.Espresso.onView; - public class FadeTransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { Activity mActivity; public FadeTransitionTest() { @@ -129,6 +131,43 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato assertEquals(View.INVISIBLE, square1.getVisibility()); } + @SmallTest + public void testSnapshotView() throws Throwable { + final View square1 = mActivity.findViewById(R.id.square1); + + final CountDownLatch disappearCalled = new CountDownLatch(1); + final Fade fadeOut = new Fade(Fade.MODE_OUT) { + @Override + public Animator onDisappear(ViewGroup sceneRoot, View view, + TransitionValues startValues, + TransitionValues endValues) { + assertNotSame(square1, view); + assertTrue(view instanceof ImageView); + ImageView imageView = (ImageView) view; + BitmapDrawable background = (BitmapDrawable) imageView.getDrawable(); + Bitmap bitmap = background.getBitmap(); + assertEquals(Bitmap.Config.HARDWARE, bitmap.getConfig()); + Bitmap copy = bitmap.copy(Bitmap.Config.ARGB_8888, false); + assertEquals(0xFFFF0000, copy.getPixel(1, 1)); + disappearCalled.countDown(); + return super.onDisappear(sceneRoot, view, startValues, endValues); + } + }; + + runTestOnUiThread(new Runnable() { + @Override + public void run() { + ViewGroup container = mActivity.findViewById(R.id.container); + TransitionManager.beginDelayedTransition(container, fadeOut); + container.removeView(square1); + FrameLayout parent = new FrameLayout(mActivity); + parent.addView(square1); + } + }); + + assertTrue(disappearCalled.await(1, TimeUnit.SECONDS)); + } + public TransitionLatch setVisibilityInTransition(final Transition transition, int viewId, final int visibility) throws Throwable { final ViewGroup sceneRoot = (ViewGroup) mActivity.findViewById(R.id.container); diff --git a/core/tests/coretests/src/android/transition/TransitionTest.java b/core/tests/coretests/src/android/transition/TransitionTest.java index 7e72e25b6f45..ab4320c65eb2 100644 --- a/core/tests/coretests/src/android/transition/TransitionTest.java +++ b/core/tests/coretests/src/android/transition/TransitionTest.java @@ -28,6 +28,8 @@ import android.widget.TextView; import com.android.frameworks.coretests.R; +import java.lang.reflect.Field; + public class TransitionTest extends ActivityInstrumentationTestCase2<AnimatorSetActivity> { Activity mActivity; public TransitionTest() { @@ -77,27 +79,47 @@ public class TransitionTest extends ActivityInstrumentationTestCase2<AnimatorSet fade.setEpicenterCallback(epicenterCallback); Fade clone = (Fade) fade.clone(); - assertEquals(fade.mStartDelay, clone.mStartDelay); - assertEquals(fade.mDuration, clone.mDuration); - assertEquals(fade.mInterpolator, clone.mInterpolator); - assertEquals(fade.mPropagation, clone.mPropagation); + assertFieldEquals(fade, clone, "mStartDelay"); + assertFieldEquals(fade, clone, "mDuration"); + assertFieldEquals(fade, clone, "mInterpolator"); + assertFieldEquals(fade, clone, "mPropagation"); assertEquals(fade.getPathMotion(), clone.getPathMotion()); assertEquals(fade.getEpicenterCallback(), clone.getEpicenterCallback()); - assertEquals(fade.mNameOverrides, clone.mNameOverrides); - assertEquals(fade.mMatchOrder, clone.mMatchOrder); + assertFieldEquals(fade, clone, "mNameOverrides"); + assertFieldEquals(fade, clone, "mMatchOrder"); + + assertFieldEquals(fade, clone, "mTargets"); + assertFieldEquals(fade, clone, "mTargetExcludes"); + assertFieldEquals(fade, clone, "mTargetChildExcludes"); + + assertFieldEquals(fade, clone, "mTargetIds"); + assertFieldEquals(fade, clone, "mTargetIdExcludes"); + assertFieldEquals(fade, clone, "mTargetIdChildExcludes"); - assertEquals(fade.mTargets, clone.mTargets); - assertEquals(fade.mTargetExcludes, clone.mTargetExcludes); - assertEquals(fade.mTargetChildExcludes, clone.mTargetChildExcludes); + assertFieldEquals(fade, clone, "mTargetNames"); + assertFieldEquals(fade, clone, "mTargetNameExcludes"); - assertEquals(fade.mTargetIds, clone.mTargetIds); - assertEquals(fade.mTargetIdExcludes, clone.mTargetIdExcludes); - assertEquals(fade.mTargetIdChildExcludes, clone.mTargetIdChildExcludes); + assertFieldEquals(fade, clone, "mTargetTypes"); + assertFieldEquals(fade, clone, "mTargetTypeExcludes"); + } - assertEquals(fade.mTargetNames, clone.mTargetNames); - assertEquals(fade.mTargetNameExcludes, clone.mTargetNameExcludes); + private static void assertFieldEquals(Fade fade1, Fade fade2, String fieldName) + throws NoSuchFieldException, IllegalAccessException { + Field field = findField(Fade.class, fieldName); + field.setAccessible(true); + assertEquals("Field '" + fieldName + "' value mismatch", field.get(fade1), + field.get(fade2)); + } - assertEquals(fade.mTargetTypes, clone.mTargetTypes); - assertEquals(fade.mTargetTypeExcludes, clone.mTargetTypeExcludes); + private static Field findField(Class<?> type, String fieldName) throws NoSuchFieldException { + while (type != null) { + try { + return type.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // try the parent + type = type.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); } } diff --git a/data/etc/framework-sysconfig.xml b/data/etc/framework-sysconfig.xml index 3a81c1309a8b..ae6a7f6d6808 100644 --- a/data/etc/framework-sysconfig.xml +++ b/data/etc/framework-sysconfig.xml @@ -22,6 +22,8 @@ <allow-implicit-broadcast action="android.intent.action.SIM_STATE_CHANGED" /> <allow-implicit-broadcast action="android.intent.action.PACKAGE_CHANGED" /> <allow-implicit-broadcast action="android.intent.action.MEDIA_SCANNER_SCAN_FILE" /> + <allow-implicit-broadcast action="android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION" /> + <allow-implicit-broadcast action="android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION" /> <!-- Whitelist of what components are permitted as backup data transports. The 'service' attribute here is a flattened ComponentName string. --> diff --git a/data/sounds/AudioPackageGo.mk b/data/sounds/AudioPackageGo.mk new file mode 100644 index 000000000000..3756d3056da9 --- /dev/null +++ b/data/sounds/AudioPackageGo.mk @@ -0,0 +1,42 @@ +# Copyright 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := frameworks/base/data/sounds + +# Ring_Classic_02 : Bell Phone +# Ring_Synth_02 : Chimey Phone +# Ring_Digital_02 : Digital Phone +# Ring_Synth_04 : Flutey Phone +# Alarm_Beep_03 : Beep Beep Beep +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/notifications/ogg/Alya.ogg:system/media/audio/notifications/Alya.ogg \ + $(LOCAL_PATH)/notifications/ogg/Argon.ogg:system/media/audio/notifications/Argon.ogg \ + $(LOCAL_PATH)/notifications/Canopus.ogg:system/media/audio/notifications/Canopus.ogg \ + $(LOCAL_PATH)/notifications/Deneb.ogg:system/media/audio/notifications/Deneb.ogg \ + $(LOCAL_PATH)/newwavelabs/Highwire.ogg:system/media/audio/notifications/Highwire.ogg \ + $(LOCAL_PATH)/notifications/ogg/Iridium.ogg:system/media/audio/notifications/Iridium.ogg \ + $(LOCAL_PATH)/notifications/pixiedust.ogg:system/media/audio/notifications/pixiedust.ogg \ + $(LOCAL_PATH)/notifications/ogg/Talitha.ogg:system/media/audio/notifications/Talitha.ogg \ + $(LOCAL_PATH)/Ring_Classic_02.ogg:system/media/audio/ringtones/Ring_Classic_02.ogg \ + $(LOCAL_PATH)/Ring_Synth_02.ogg:system/media/audio/ringtones/Ring_Synth_02.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg \ + $(LOCAL_PATH)/Ring_Digital_02.ogg:system/media/audio/ringtones/Ring_Digital_02.ogg \ + $(LOCAL_PATH)/Ring_Synth_04.ogg:system/media/audio/ringtones/Ring_Synth_04.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \ + $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \ + $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \ + $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \ + $(LOCAL_PATH)/Alarm_Beep_03.ogg:system/media/audio/alarms/Alarm_Beep_03.ogg \ + $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \ + $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \ diff --git a/keystore/java/android/security/KeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java index d023866ca702..d5b34c432e79 100644 --- a/keystore/java/android/security/KeyPairGeneratorSpec.java +++ b/keystore/java/android/security/KeyPairGeneratorSpec.java @@ -260,13 +260,13 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Example: * * <pre class="prettyprint"> - * Calendar start = new Calendar(); - * Calendar end = new Calendar(); - * end.add(1, Calendar.YEAR); + * Calendar start = Calendar.getInstance(); + * Calendar end = Calendar.getInstance(); + * end.add(Calendar.YEAR, 1); * * KeyPairGeneratorSpec spec = * new KeyPairGeneratorSpec.Builder(mContext).setAlias("myKey") - * .setSubject(new X500Principal("CN=myKey")).setSerial(BigInteger.valueOf(1337)) + * .setSubject(new X500Principal("CN=myKey")).setSerialNumber(BigInteger.valueOf(1337)) * .setStartDate(start.getTime()).setEndDate(end.getTime()).build(); * </pre> * diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp index df2b35b39aa8..4e59baa48983 100644 --- a/libs/hwui/BakedOpRenderer.cpp +++ b/libs/hwui/BakedOpRenderer.cpp @@ -208,7 +208,6 @@ void BakedOpRenderer::drawRects(const float* rects, int count, const SkPaint* pa // TODO: Currently assume full FBO damage, due to FrameInfoVisualizer::unionDirty. // Should should scissor/set mHasDrawn safely. mRenderState.scissor().setEnabled(false); - mHasDrawn = true; Glop glop; GlopBuilder(mRenderState, mCaches, &glop) .setRoundRectClipState(nullptr) @@ -217,7 +216,11 @@ void BakedOpRenderer::drawRects(const float* rects, int count, const SkPaint* pa .setTransform(Matrix4::identity(), TransformFlags::None) .setModelViewIdentityEmptyBounds() .build(); - mRenderState.render(glop, mRenderTarget.orthoMatrix); + // Disable blending if this is the first draw to the main framebuffer, in case app has defined + // transparency where it doesn't make sense - as first draw in opaque window. + bool overrideDisableBlending = !mHasDrawn && mOpaque && !mRenderTarget.frameBufferId; + mRenderState.render(glop, mRenderTarget.orthoMatrix, overrideDisableBlending); + mHasDrawn = true; } // clears and re-fills stencil with provided rendertarget space quads, @@ -234,7 +237,7 @@ void BakedOpRenderer::setupStencilQuads(std::vector<Vertex>& quadVertices, .setTransform(Matrix4::identity(), TransformFlags::None) .setModelViewIdentityEmptyBounds() .build(); - mRenderState.render(glop, mRenderTarget.orthoMatrix); + mRenderState.render(glop, mRenderTarget.orthoMatrix, false); mRenderState.stencil().enableTest(incrementThreshold); } @@ -346,7 +349,10 @@ void BakedOpRenderer::prepareRender(const Rect* dirtyBounds, const ClipBase* cli void BakedOpRenderer::renderGlopImpl(const Rect* dirtyBounds, const ClipBase* clip, const Glop& glop) { prepareRender(dirtyBounds, clip); - mRenderState.render(glop, mRenderTarget.orthoMatrix); + // Disable blending if this is the first draw to the main framebuffer, in case app has defined + // transparency where it doesn't make sense - as first draw in opaque window. + bool overrideDisableBlending = !mHasDrawn && mOpaque && !mRenderTarget.frameBufferId; + mRenderState.render(glop, mRenderTarget.orthoMatrix, overrideDisableBlending); if (!mRenderTarget.frameBufferId) mHasDrawn = true; } diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index bc4181075319..8b0346867cbc 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -99,13 +99,22 @@ FontRenderer::FontRenderer(const uint8_t* gammaTable) } auto deviceInfo = DeviceInfo::get(); + auto displayInfo = deviceInfo->displayInfo(); int maxTextureSize = deviceInfo->maxTextureSize(); + // Adjust cache size based on Pixel's desnsity. + constexpr float PIXEL_DENSITY = 2.6; + const float densityRatio = displayInfo.density / PIXEL_DENSITY; + // TODO: Most devices are hardcoded with this configuration, does it need to be dynamic? - mSmallCacheWidth = std::min(1024, maxTextureSize); - mSmallCacheHeight = std::min(1024, maxTextureSize); - mLargeCacheWidth = std::min(2048, maxTextureSize); - mLargeCacheHeight = std::min(1024, maxTextureSize); + mSmallCacheWidth = + OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio); + mSmallCacheHeight = + OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio); + mLargeCacheWidth = + OffscreenBuffer::computeIdealDimension(std::min(2048, maxTextureSize) * densityRatio); + mLargeCacheHeight = + OffscreenBuffer::computeIdealDimension(std::min(1024, maxTextureSize) * densityRatio); if (sLogFontRendererCreate) { INIT_LOGD(" Text cache sizes, in pixels: %i x %i, %i x %i, %i x %i, %i x %i", diff --git a/libs/hwui/OpenGLReadback.cpp b/libs/hwui/OpenGLReadback.cpp index 025503b15975..f9a1cc5296d5 100644 --- a/libs/hwui/OpenGLReadback.cpp +++ b/libs/hwui/OpenGLReadback.cpp @@ -228,7 +228,7 @@ inline CopyResult copyTextureInto(Caches& caches, RenderState& renderState, .build(); Matrix4 ortho; ortho.loadOrtho(destWidth, destHeight); - renderState.render(glop, ortho); + renderState.render(glop, ortho, false); // TODO: We should convert to linear space when the target is RGBA16F glReadPixels(0, 0, bitmap->width(), bitmap->height(), format, diff --git a/libs/hwui/renderstate/Blend.cpp b/libs/hwui/renderstate/Blend.cpp index 8865c6efce8c..b1ca4a248a80 100644 --- a/libs/hwui/renderstate/Blend.cpp +++ b/libs/hwui/renderstate/Blend.cpp @@ -118,7 +118,7 @@ void Blend::getFactors(SkBlendMode mode, ModeOrderSwap modeUsage, GLenum* outSrc } void Blend::setFactors(GLenum srcMode, GLenum dstMode) { - if (srcMode == GL_ZERO && dstMode == GL_ZERO) { + if ((srcMode == GL_ZERO || srcMode == GL_ONE) && dstMode == GL_ZERO) { // disable blending if (mEnabled) { glDisable(GL_BLEND); diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index ededffb0f4bb..5fc5cb275741 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -262,7 +262,8 @@ void RenderState::postDecStrong(VirtualLightRefBase* object) { // Render /////////////////////////////////////////////////////////////////////////////// -void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix) { +void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix, + bool overrideDisableBlending) { const Glop::Mesh& mesh = glop.mesh; const Glop::Mesh::Vertices& vertices = mesh.vertices; const Glop::Mesh::Indices& indices = mesh.indices; @@ -417,7 +418,11 @@ void RenderState::render(const Glop& glop, const Matrix4& orthoMatrix) { // ------------------------------------ // ---------- GL state setup ---------- // ------------------------------------ - blend().setFactors(glop.blend.src, glop.blend.dst); + if (CC_UNLIKELY(overrideDisableBlending)) { + blend().setFactors(GL_ZERO, GL_ZERO); + } else { + blend().setFactors(glop.blend.src, glop.blend.dst); + } GL_CHECKPOINT(MODERATE); diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h index df81e864a0b5..315fa2db6878 100644 --- a/libs/hwui/renderstate/RenderState.h +++ b/libs/hwui/renderstate/RenderState.h @@ -106,7 +106,7 @@ public: // more thinking... void postDecStrong(VirtualLightRefBase* object); - void render(const Glop& glop, const Matrix4& orthoMatrix); + void render(const Glop& glop, const Matrix4& orthoMatrix, bool overrideDisableBlending); Blend& blend() { return *mBlend; } MeshState& meshState() { return *mMeshState; } diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java index 3e75759bdfce..fbe55614db52 100644 --- a/media/java/android/media/Image.java +++ b/media/java/android/media/Image.java @@ -31,7 +31,7 @@ import android.graphics.Rect; * {@link java.nio.ByteBuffer ByteBuffers}. Each buffer is encapsulated in a * {@link Plane} that describes the layout of the pixel data in that plane. Due * to this direct access, and unlike the {@link android.graphics.Bitmap Bitmap} class, - * Images are not directly usable as as UI resources.</p> + * Images are not directly usable as UI resources.</p> * * <p>Since Images are often directly produced or consumed by hardware * components, they are a limited resource shared across the system, and should diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index bf18a7d291a6..f85925d8d867 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -2095,6 +2095,7 @@ public final class MediaCodecInfo { errors |= ERROR_UNRECOGNIZED; } switch (profileLevel.profile) { + case CodecProfileLevel.AVCProfileConstrainedHigh: case CodecProfileLevel.AVCProfileHigh: BR *= 1250; break; case CodecProfileLevel.AVCProfileHigh10: @@ -2107,6 +2108,7 @@ public final class MediaCodecInfo { errors |= ERROR_UNSUPPORTED; supported = false; // fall through - treat as base profile + case CodecProfileLevel.AVCProfileConstrainedBaseline: case CodecProfileLevel.AVCProfileBaseline: case CodecProfileLevel.AVCProfileMain: BR *= 1000; break; diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java index 2f48ffbfdb5c..fc4d15fad5ca 100644 --- a/media/java/android/media/MediaFile.java +++ b/media/java/android/media/MediaFile.java @@ -80,8 +80,9 @@ public class MediaFile { public static final int FILE_TYPE_BMP = 34; public static final int FILE_TYPE_WBMP = 35; public static final int FILE_TYPE_WEBP = 36; + public static final int FILE_TYPE_HEIF = 37; private static final int FIRST_IMAGE_FILE_TYPE = FILE_TYPE_JPEG; - private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_WEBP; + private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_HEIF; // Raw image file types public static final int FILE_TYPE_DNG = 300; @@ -239,6 +240,8 @@ public class MediaFile { addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp", MtpConstants.FORMAT_BMP, true); addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp", MtpConstants.FORMAT_DEFINED, false); addFileType("WEBP", FILE_TYPE_WEBP, "image/webp", MtpConstants.FORMAT_DEFINED, false); + addFileType("HEIC", FILE_TYPE_HEIF, "image/heif", MtpConstants.FORMAT_HEIF, true); + addFileType("HEIF", FILE_TYPE_HEIF, "image/heif", MtpConstants.FORMAT_HEIF, false); addFileType("DNG", FILE_TYPE_DNG, "image/x-adobe-dng", MtpConstants.FORMAT_DNG, true); addFileType("CR2", FILE_TYPE_CR2, "image/x-canon-cr2", MtpConstants.FORMAT_TIFF, false); diff --git a/media/java/android/mtp/MtpConstants.java b/media/java/android/mtp/MtpConstants.java index 7d078d7a97cf..88e287e6264f 100644 --- a/media/java/android/mtp/MtpConstants.java +++ b/media/java/android/mtp/MtpConstants.java @@ -211,6 +211,8 @@ public final class MtpConstants { public static final int FORMAT_JPX = 0x3810; /** Format code for DNG files */ public static final int FORMAT_DNG = 0x3811; + /** Format code for HEIF files {@hide} */ + public static final int FORMAT_HEIF = 0x3812; /** Format code for firmware files */ public static final int FORMAT_UNDEFINED_FIRMWARE = 0xB802; /** Format code for Windows image files */ diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index 698c9c96fe01..9847d705adcf 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -595,6 +595,7 @@ public class MtpDatabase implements AutoCloseable { MtpConstants.FORMAT_XML_DOCUMENT, MtpConstants.FORMAT_FLAC, MtpConstants.FORMAT_DNG, + MtpConstants.FORMAT_HEIF, }; } @@ -705,6 +706,7 @@ public class MtpDatabase implements AutoCloseable { case MtpConstants.FORMAT_PNG: case MtpConstants.FORMAT_BMP: case MtpConstants.FORMAT_DNG: + case MtpConstants.FORMAT_HEIF: return IMAGE_PROPERTIES; default: return FILE_PROPERTIES; diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index cf4458a6fd49..5b874cd82678 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -849,6 +849,7 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, // read EXIF data for thumbnail information switch (info.mFormat) { case MTP_FORMAT_EXIF_JPEG: + case MTP_FORMAT_HEIF: case MTP_FORMAT_JFIF: { ExifData *exifdata = exif_data_new_from_file(path); if (exifdata) { @@ -906,6 +907,7 @@ void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) if (getObjectFilePath(handle, path, length, format) == MTP_RESPONSE_OK) { switch (format) { case MTP_FORMAT_EXIF_JPEG: + case MTP_FORMAT_HEIF: case MTP_FORMAT_JFIF: { ExifData *exifdata = exif_data_new_from_file(path); if (exifdata) { diff --git a/packages/BackupRestoreConfirmation/res/values-ar/strings.xml b/packages/BackupRestoreConfirmation/res/values-ar/strings.xml index b7a56d179b00..4d4d6befce97 100644 --- a/packages/BackupRestoreConfirmation/res/values-ar/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-ar/strings.xml @@ -24,10 +24,10 @@ <string name="restore_confirm_text" msgid="7499866728030461776">"تم طلب استرداد جميع البيانات بالكامل من كمبيوتر سطح مكتب متصل. هل تريد السماح بإجراء ذلك؟\n\nإذا لم تطلب الاسترداد بنفسك، فلا تسمح بمتابعة العملية. يؤدي لك إلى استبدال أية بيانات حاليًا على الجهاز."</string> <string name="allow_restore_button_label" msgid="3081286752277127827">"استرداد بياناتي"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"عدم الاسترداد"</string> - <string name="current_password_text" msgid="8268189555578298067">"الرجاء إدخال كلمة مرور النسخ الاحتياطي أدناه:"</string> - <string name="device_encryption_restore_text" msgid="1570864916855208992">"الرجاء إدخال كلمة مرور تشفير جهازك أدناه."</string> - <string name="device_encryption_backup_text" msgid="5866590762672844664">"الرجاء إدخال كلمة مرور تشفير الجهاز. سيتم استخدام ذلك أيضًا لتشفير أرشيف النسخ الاحتياطي."</string> - <string name="backup_enc_password_text" msgid="4981585714795233099">"الرجاء إدخال كلمة المرور للاستخدام لتشفير بيانات النسخة الاحتياطية بالكامل. إذا تم ترك هذا فارغًا، فسيتم استخدام كلمة مرور النسخ الاحتياطي الحالية:"</string> + <string name="current_password_text" msgid="8268189555578298067">"يُرجى إدخال كلمة مرور النسخ الاحتياطي أدناه:"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"يُرجى إدخال كلمة مرور تشفير جهازك أدناه."</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"يُرجى إدخال كلمة مرور تشفير الجهاز. سيتم استخدام ذلك أيضًا لتشفير أرشيف النسخ الاحتياطي."</string> + <string name="backup_enc_password_text" msgid="4981585714795233099">"يُرجى إدخال كلمة المرور للاستخدام لتشفير بيانات النسخة الاحتياطية بالكامل. إذا تم ترك هذا فارغًا، فسيتم استخدام كلمة مرور النسخ الاحتياطي الحالية:"</string> <string name="backup_enc_password_optional" msgid="1350137345907579306">"إذا كنت ترغب في تشفير بيانات النسخة الاحتياطية بالكامل، فأدخل كلمة المرور أدناه:"</string> <string name="backup_enc_password_required" msgid="7889652203371654149">"نظرًا لكون جهازك مشفرًا، أنت مطالب بتشفير النسخة الاحتياطية. يُرجى إدخال كلمة المرور أدناه:"</string> <string name="restore_enc_password_text" msgid="6140898525580710823">"إذا كانت بيانات الاسترداد مشفرة، فالرجاء إدخال كلمة المرور أدناه:"</string> diff --git a/packages/BackupRestoreConfirmation/res/values-en-rCA/strings.xml b/packages/BackupRestoreConfirmation/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..badad601114e --- /dev/null +++ b/packages/BackupRestoreConfirmation/res/values-en-rCA/strings.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="backup_confirm_title" msgid="827563724209303345">"Full backup"</string> + <string name="restore_confirm_title" msgid="5469365809567486602">"Full restoration"</string> + <string name="backup_confirm_text" msgid="1878021282758896593">"A full backup of all data to a connected desktop computer has been requested. Do you want to allow this to happen?\n\nIf you did not request the backup yourself, do not allow the operation to proceed."</string> + <string name="allow_backup_button_label" msgid="4217228747769644068">"Back up my data"</string> + <string name="deny_backup_button_label" msgid="6009119115581097708">"Do not back up"</string> + <string name="restore_confirm_text" msgid="7499866728030461776">"A full restore of all data from a connected desktop computer has been requested. Do you want to allow this to happen?\n\nIf you did not request the restore yourself, do not allow the operation to proceed. This will replace any data currently on the device!"</string> + <string name="allow_restore_button_label" msgid="3081286752277127827">"Restore my data"</string> + <string name="deny_restore_button_label" msgid="1724367334453104378">"Do not restore"</string> + <string name="current_password_text" msgid="8268189555578298067">"Please enter your current backup password below:"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"Please enter your device encryption password below."</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"Please enter your device encryption password below. This will also be used to encrypt the backup archive."</string> + <string name="backup_enc_password_text" msgid="4981585714795233099">"Please enter a password to use for encrypting the full backup data. If this is left blank, your current backup password will be used:"</string> + <string name="backup_enc_password_optional" msgid="1350137345907579306">"If you wish to encrypt the full backup data, enter a password below:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"Since your device is encrypted, you are required to encrypt your backup. Please enter a password below:"</string> + <string name="restore_enc_password_text" msgid="6140898525580710823">"If the restore data is encrypted, please enter the password below:"</string> + <string name="toast_backup_started" msgid="550354281452756121">"Backup starting..."</string> + <string name="toast_backup_ended" msgid="3818080769548726424">"Backup finished"</string> + <string name="toast_restore_started" msgid="7881679218971277385">"Restoration starting..."</string> + <string name="toast_restore_ended" msgid="1764041639199696132">"Restoration ended"</string> + <string name="toast_timeout" msgid="5276598587087626877">"Operation timed out"</string> +</resources> diff --git a/packages/BackupRestoreConfirmation/res/values-hi/strings.xml b/packages/BackupRestoreConfirmation/res/values-hi/strings.xml index 2578e8fec895..f758fa1c5495 100644 --- a/packages/BackupRestoreConfirmation/res/values-hi/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-hi/strings.xml @@ -35,5 +35,5 @@ <string name="toast_backup_ended" msgid="3818080769548726424">"सुरक्षित करना पूर्ण"</string> <string name="toast_restore_started" msgid="7881679218971277385">"पुनर्स्थापना प्रारंभ हो रही है..."</string> <string name="toast_restore_ended" msgid="1764041639199696132">"पुनर्स्थापना समाप्त"</string> - <string name="toast_timeout" msgid="5276598587087626877">"कार्यवाही समयबाह्य हो गई"</string> + <string name="toast_timeout" msgid="5276598587087626877">"काम नहीं हो सका. टाइम आउट हो गया"</string> </resources> diff --git a/packages/BackupRestoreConfirmation/res/values-mr/strings.xml b/packages/BackupRestoreConfirmation/res/values-mr/strings.xml index 121ad0066e85..f94ec4b1a027 100644 --- a/packages/BackupRestoreConfirmation/res/values-mr/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-mr/strings.xml @@ -25,15 +25,15 @@ <string name="allow_restore_button_label" msgid="3081286752277127827">"माझा डेटा पुनर्संचयित करा"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"पुनर्संचयित करू नका"</string> <string name="current_password_text" msgid="8268189555578298067">"कृपया आपला वर्तमान बॅकअप संकेतशब्द खाली प्रविष्ट करा:"</string> - <string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया आपला डिव्हाइस कूटबद्धीकरण संकेतशब्द खाली प्रविष्ट करा."</string> - <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया आपला डिव्हाइस कूटबद्धीकरण संकेतशब्द खाली प्रविष्ट करा. हा बॅकअप संग्रह कूटबद्ध करण्यासाठी देखील वापरला जाईल."</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"कृपया तुमचे डीव्हाइस एंक्रिप्शन पासवर्ड खाली एंटर करा."</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"कृपया तुमचे डीव्हाइस एंक्रिप्शन पासवर्ड खाली एंटर करा. हा बॅकअप संग्रह एंक्रिप्ट करण्यासाठी देखील वापरला जाईल."</string> <string name="backup_enc_password_text" msgid="4981585714795233099">"कृपया पूर्ण बॅकअप डेटा कूटबद्ध करण्यासाठी वापरण्याकरिता संकेतशब्द प्रविष्ट करा. हे रिक्त सोडल्यास, आपला वर्तमान बॅकअप संकेतशब्द वापरला जाईल:"</string> <string name="backup_enc_password_optional" msgid="1350137345907579306">"आपण पूर्ण बॅकअप डेटा कूटबद्ध करू इच्छित असल्यास, खालील संकेतशब्द प्रविष्ट करा:"</string> - <string name="backup_enc_password_required" msgid="7889652203371654149">"आपले डिव्हाइस कूटबद्ध केले असल्यामुळे, आपल्याला आपला बॅक अप कूटबद्ध करणे आवश्यक आहे. कृपया खाली एक संकेतशब्द प्रविष्ट करा:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"तुमचे डीव्हाइस एंक्रिप्ट केले असल्यामुळे, तुम्हाला तुमचा बॅक अप एंक्रिप्ट करणे आवश्यक आहे. कृपया खाली एक पासवर्ड एंटर करा:"</string> <string name="restore_enc_password_text" msgid="6140898525580710823">"पुनर्संचयित डेटा कूटबद्ध केला असल्यास, कृपया संकेतशब्द खाली प्रविष्ट करा:"</string> <string name="toast_backup_started" msgid="550354281452756121">"बॅकअप सुरू होत आहे..."</string> <string name="toast_backup_ended" msgid="3818080769548726424">"बॅकअप समाप्त झाले"</string> <string name="toast_restore_started" msgid="7881679218971277385">"पुनर्संचयन सुरू होत आहे..."</string> <string name="toast_restore_ended" msgid="1764041639199696132">"पुनर्संचयन समाप्त झाले"</string> - <string name="toast_timeout" msgid="5276598587087626877">"कार्य कालबाह्य झाले"</string> + <string name="toast_timeout" msgid="5276598587087626877">"कार्य टाइमआउट झाले"</string> </resources> diff --git a/packages/BackupRestoreConfirmation/res/values-pa/strings.xml b/packages/BackupRestoreConfirmation/res/values-pa/strings.xml index 12dd5463b8e8..dd3b5800fb69 100644 --- a/packages/BackupRestoreConfirmation/res/values-pa/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-pa/strings.xml @@ -21,15 +21,15 @@ <string name="backup_confirm_text" msgid="1878021282758896593">"ਇੱਕ ਕਨੈਕਟ ਕੀਤੇ ਡੈਸਕਟੌਪ ਕੰਪਿਊਟਰ ਦੇ ਸਾਰੇ ਡੈਟਾ ਦੇ ਇੱਕ ਪੁੂਰੇ ਬੈਕਅਪ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਹੈ। ਕੀ ਤੁਸੀਂ ਅਜਿਹਾ ਹੋਣ ਦੀ ਆਗਿਆ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹੋ?\n\nਜੇਕਰ ਤੁਸੀਂ ਖੁਦ ਬੈਕਅਪ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਸੀ, ਤਾਂ ਓਪਰੇਸ਼ਨ ਜਾਰੀ ਰੱਖਣ ਦੀ ਆਗਿਆ ਨਾ ਦਿਓ।"</string> <string name="allow_backup_button_label" msgid="4217228747769644068">"ਮੇਰਾ ਡੈਟਾ ਬੈਕ ਅਪ ਕਰੋ"</string> <string name="deny_backup_button_label" msgid="6009119115581097708">"ਬੈਕ ਅਪ ਨਾ ਕਰੋ"</string> - <string name="restore_confirm_text" msgid="7499866728030461776">"ਇੱਕ ਕਨੈਕਟ ਕੀਤੇ ਡੈਸਕਟੌਪ ਕੰਪਿਊਟਰ ਦੇ ਸਾਰੇ ਡੈਟਾ ਦੇ ਇੱਕ ਪੁੂਰੇ ਰੀਸਟੋਰ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਹੈ। ਕੀ ਤੁਸੀਂ ਅਜਿਹਾ ਹੋਣ ਦੀ ਆਗਿਆ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹੋ?\n\nਜੇਕਰ ਤੁਸੀਂ ਖੁਦ ਰੀਸਟੋਰ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਸੀ, ਤਾਂ ਓਪਰੇਸ਼ਨ ਜਾਰੀ ਰੱਖਣ ਦੀ ਆਗਿਆ ਨਾ ਦਿਓ। ਇਹ ਡੀਵਾਈਸ ਤੇ ਇਸ ਵੇਲੇ ਮੌਜੂਦ ਕਿਸੇ ਵੀ ਡੈਟਾ ਨੂੰ ਬਦਲ ਦੇਵੇਗਾ!"</string> + <string name="restore_confirm_text" msgid="7499866728030461776">"ਇੱਕ ਕਨੈਕਟ ਕੀਤੇ ਡੈਸਕਟਾਪ ਕੰਪਿਊਟਰ ਦੇ ਸਾਰੇ ਡਾਟਾ ਦੇ ਇੱਕ ਪੁੂਰੇ ਰੀਸਟੋਰ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਗਈ ਹੈ। ਕੀ ਤੁਸੀਂ ਅਜਿਹਾ ਹੋਣ ਦੀ ਆਗਿਆ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹੋ?\n\nਜੇਕਰ ਤੁਸੀਂ ਖੁਦ ਰੀਸਟੋਰ ਦੀ ਬੇਨਤੀ ਨਹੀਂ ਕੀਤੀ ਸੀ, ਤਾਂ ਓਪਰੇਸ਼ਨ ਜਾਰੀ ਰੱਖਣ ਦੀ ਆਗਿਆ ਨਾ ਦਿਓ। ਇਹ ਡੀਵਾਈਸ ਤੇ ਇਸ ਵੇਲੇ ਮੌਜੂਦ ਕਿਸੇ ਵੀ ਡਾਟਾ ਨੂੰ ਬਦਲ ਦੇਵੇਗਾ!"</string> <string name="allow_restore_button_label" msgid="3081286752277127827">"ਮੇਰਾ ਡੈਟਾ ਰੀਸਟੋਰ ਕਰੋ"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"ਰੀਸਟੋਰ ਨਾ ਕਰੋ"</string> <string name="current_password_text" msgid="8268189555578298067">"ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਆਪਣਾ ਮੌਜੂਦਾ ਬੈਕਅਪ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ:"</string> <string name="device_encryption_restore_text" msgid="1570864916855208992">"ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਆਪਣਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।"</string> - <string name="device_encryption_backup_text" msgid="5866590762672844664">"ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਆਪਣਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਇਹ ਬੈਕਅਪ ਆਰਕਾਈਵ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਵੀ ਵਰਤਿਆ ਜਾਏਗਾ।"</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਆਪਣਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਸ਼ਨ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਇਹ ਬੈਕਅੱਪ ਆਰਕਾਈਵ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਵੀ ਵਰਤਿਆ ਜਾਏਗਾ।"</string> <string name="backup_enc_password_text" msgid="4981585714795233099">"ਕਿਰਪਾ ਕਰਕੇ ਪੂਰਾ ਬੈਕਅਪ ਡੈਟਾ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਦੀ ਵਰਤੋਂ ਲਈ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ। ਜੇਕਰ ਇਸਨੂੰ ਖਾਲੀ ਛੱਡਿਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਵਰਤਮਾਨ ਬੈਕਅਪ ਪਾਸਵਰਡ ਵਰਤਿਆ ਜਾਏਗਾ:"</string> <string name="backup_enc_password_optional" msgid="1350137345907579306">"ਜੇਕਰ ਤੁਸੀਂ ਪੂਰਾ ਬੈਕਅਪ ਡੈਟਾ ਇਨਕ੍ਰਿਪਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਹੇਠਾਂ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ:"</string> - <string name="backup_enc_password_required" msgid="7889652203371654149">"ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਟਿਡ ਬੈ, ਇਸਲਈ ਤੁਹਾਡੇ ਤੋਂ ਆਪਣਾ ਬੈਕਅਪ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਦੀ ਮੰਗ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"ਕਿਉਂਕਿ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਇਨਕ੍ਰਿਪਟਿਡ ਹੈ, ਇਸਲਈ ਤੁਹਾਡੇ ਤੋਂ ਆਪਣਾ ਬੈਕਅੱਪ ਇਨਕ੍ਰਿਪਟ ਕਰਨ ਦੀ ਮੰਗ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਇੱਕ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ:"</string> <string name="restore_enc_password_text" msgid="6140898525580710823">"ਜੇਕਰ ਰੀਸਟੋਰ ਡੈਟਾ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਹੇਠਾਂ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ:"</string> <string name="toast_backup_started" msgid="550354281452756121">"ਬੈਕਅਪ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ..."</string> <string name="toast_backup_ended" msgid="3818080769548726424">"ਬੈਕਅਪ ਪੂਰਾ ਹੋਇਆ"</string> diff --git a/packages/CaptivePortalLogin/res/values-en-rCA/strings.xml b/packages/CaptivePortalLogin/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..2e8d1f082d1f --- /dev/null +++ b/packages/CaptivePortalLogin/res/values-en-rCA/strings.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string> + <string name="action_use_network" msgid="6076184727448466030">"Use this network as is"</string> + <string name="action_do_not_use_network" msgid="4577366536956516683">"Do not use this network"</string> + <string name="action_bar_label" msgid="917235635415966620">"Sign in to network"</string> + <string name="action_bar_title" msgid="5645564790486983117">"Sign in to %1$s"</string> + <string name="ssl_error_warning" msgid="6653188881418638872">"The network that you’re trying to join has security issues."</string> + <string name="ssl_error_example" msgid="647898534624078900">"For example, the login page might not belong to the organisation shown."</string> + <string name="ssl_error_continue" msgid="6492718244923937110">"Continue anyway via browser"</string> +</resources> diff --git a/packages/CaptivePortalLogin/res/values-pa/strings.xml b/packages/CaptivePortalLogin/res/values-pa/strings.xml index c1b014c351a1..11bfc777cbaa 100644 --- a/packages/CaptivePortalLogin/res/values-pa/strings.xml +++ b/packages/CaptivePortalLogin/res/values-pa/strings.xml @@ -8,5 +8,5 @@ <string name="action_bar_title" msgid="5645564790486983117">"%1$s \'ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string> <string name="ssl_error_warning" msgid="6653188881418638872">"ਤੁਹਾਡੇ ਦੁਆਰਾ ਸ਼ਾਮਿਲ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੇ ਜਾ ਰਹੇ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ।"</string> <string name="ssl_error_example" msgid="647898534624078900">"ਉਦਾਹਰਣ ਵੱਜੋਂ, ਲੌਗਇਨ ਪੰਨਾ ਦਿਖਾਈ ਗਈ ਸੰਸਥਾ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"</string> - <string name="ssl_error_continue" msgid="6492718244923937110">"ਬ੍ਰਾਉਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string> + <string name="ssl_error_continue" msgid="6492718244923937110">"ਬ੍ਰਾਊਜ਼ਰ ਰਾਹੀਂ ਫਿਰ ਵੀ ਜਾਰੀ ਰੱਖੋ"</string> </resources> diff --git a/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml b/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..a925a30f3fc8 --- /dev/null +++ b/packages/CarrierDefaultApp/res/values-en-rCA/strings.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string> + <string name="android_system_label" msgid="2797790869522345065">"Mobile Operator"</string> + <string name="portal_notification_id" msgid="5155057562457079297">"Mobile data has run out"</string> + <string name="no_data_notification_id" msgid="668400731803969521">"Your mobile data has been deactivated"</string> + <string name="portal_notification_detail" msgid="2295729385924660881">"Tap to visit the %s website"</string> + <string name="no_data_notification_detail" msgid="3112125343857014825">"Please contact your service provider %s"</string> + <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"No mobile data connection"</string> + <string name="no_mobile_data_connection" msgid="544980465184147010">"Add data or roaming plan through %s"</string> + <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Mobile data status"</string> + <string name="action_bar_label" msgid="4290345990334377177">"Sign in to mobile network"</string> + <string name="ssl_error_warning" msgid="3127935140338254180">"The network that you’re trying to join has security issues."</string> + <string name="ssl_error_example" msgid="6188711843183058764">"For example, the login page might not belong to the organisation shown."</string> + <string name="ssl_error_continue" msgid="1138548463994095584">"Continue anyway via browser"</string> +</resources> diff --git a/packages/CarrierDefaultApp/res/values-hi/strings.xml b/packages/CarrierDefaultApp/res/values-hi/strings.xml index b49022b6f481..842bb5dcb87f 100644 --- a/packages/CarrierDefaultApp/res/values-hi/strings.xml +++ b/packages/CarrierDefaultApp/res/values-hi/strings.xml @@ -2,9 +2,9 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string> - <string name="android_system_label" msgid="2797790869522345065">"मोबाइल वाहक"</string> + <string name="android_system_label" msgid="2797790869522345065">"मोबाइल सेवा देने वाली कंपनी"</string> <string name="portal_notification_id" msgid="5155057562457079297">"मोबाइल डेटा खत्म हो गया है"</string> - <string name="no_data_notification_id" msgid="668400731803969521">"आपका मोबाइल डेटा निष्क्रिय कर दिया गया है"</string> + <string name="no_data_notification_id" msgid="668400731803969521">"आपका मोबाइल डेटा बंद कर दिया गया है"</string> <string name="portal_notification_detail" msgid="2295729385924660881">"%s वेबसाइट पर जाने के लिए टैप करें"</string> <string name="no_data_notification_detail" msgid="3112125343857014825">"कृपया अपने सेवा प्रदाता %s से संपर्क करें"</string> <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"कोई भी मोबाइल डेटा कनेक्शन नहीं है"</string> diff --git a/packages/CarrierDefaultApp/res/values-pa/strings.xml b/packages/CarrierDefaultApp/res/values-pa/strings.xml index 37aa2ac9d86d..4f77b5d27214 100644 --- a/packages/CarrierDefaultApp/res/values-pa/strings.xml +++ b/packages/CarrierDefaultApp/res/values-pa/strings.xml @@ -7,7 +7,7 @@ <string name="no_data_notification_id" msgid="668400731803969521">"ਤੁਹਾਡਾ ਮੋਬਾਈਲ ਡੈਟਾ ਅਕਿਰਿਆਸ਼ੀਲ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string> <string name="portal_notification_detail" msgid="2295729385924660881">"%s ਵੈੱਬਸਾਈਟ \'ਤੇ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="no_data_notification_detail" msgid="3112125343857014825">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਸੇਵਾ ਪ੍ਰਦਾਨਕ %s ਨੂੰ ਸੰਪਰਕ ਕਰੋ"</string> - <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"ਕੋਈ ਮੋਬਾਈਲ ਡੈਟਾ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string> + <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"ਕੋਈ ਮੋਬਾਈਲ ਡਾਟਾ ਕਨੈਕਸ਼ਨ ਨਹੀਂ"</string> <string name="no_mobile_data_connection" msgid="544980465184147010">"%s ਰਾਹੀਂ ਡੈਟਾ ਜਾਂ ਰੋਮਿੰਗ ਯੋਜਨਾ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"ਮੋਬਾਈਲ ਡੈਟੇ ਦੀ ਅਵਸਥਾ"</string> <string name="action_bar_label" msgid="4290345990334377177">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ"</string> diff --git a/packages/DefaultContainerService/res/values-en-rCA/strings.xml b/packages/DefaultContainerService/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..216d715996c7 --- /dev/null +++ b/packages/DefaultContainerService/res/values-en-rCA/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="service_name" msgid="4841491635055379553">"Package Access Helper"</string> +</resources> diff --git a/packages/ExternalStorageProvider/res/values-en-rCA/strings.xml b/packages/ExternalStorageProvider/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..beaaf0d8556b --- /dev/null +++ b/packages/ExternalStorageProvider/res/values-en-rCA/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7123375275748530234">"External Storage"</string> + <string name="storage_description" msgid="8541974407321172792">"Local storage"</string> + <string name="root_internal_storage" msgid="827844243068584127">"Internal storage"</string> + <string name="root_documents" msgid="4051252304075469250">"Documents"</string> +</resources> diff --git a/packages/ExternalStorageProvider/res/values-gu/strings.xml b/packages/ExternalStorageProvider/res/values-gu/strings.xml index 3e8a099929ef..3f59dd3889fb 100644 --- a/packages/ExternalStorageProvider/res/values-gu/strings.xml +++ b/packages/ExternalStorageProvider/res/values-gu/strings.xml @@ -18,6 +18,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="7123375275748530234">"બાહ્ય સંગ્રહ"</string> <string name="storage_description" msgid="8541974407321172792">"સ્થાનિક સ્ટોરેજ"</string> - <string name="root_internal_storage" msgid="827844243068584127">"આંતરિક સંગ્રહ"</string> + <string name="root_internal_storage" msgid="827844243068584127">"આંતરિક સ્ટોરેજ"</string> <string name="root_documents" msgid="4051252304075469250">"દસ્તાવેજો"</string> </resources> diff --git a/packages/ExternalStorageProvider/res/values-mk/strings.xml b/packages/ExternalStorageProvider/res/values-mk/strings.xml index 83a22d974c6b..5ebf8a60658f 100644 --- a/packages/ExternalStorageProvider/res/values-mk/strings.xml +++ b/packages/ExternalStorageProvider/res/values-mk/strings.xml @@ -18,6 +18,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="7123375275748530234">"Надворешна меморија"</string> <string name="storage_description" msgid="8541974407321172792">"Локална меморија"</string> - <string name="root_internal_storage" msgid="827844243068584127">"Внатрешна меморија"</string> + <string name="root_internal_storage" msgid="827844243068584127">"Внатрешен капацитет"</string> <string name="root_documents" msgid="4051252304075469250">"Документи"</string> </resources> diff --git a/packages/ExternalStorageProvider/res/values-mr/strings.xml b/packages/ExternalStorageProvider/res/values-mr/strings.xml index 5b81cc5d5ab5..2bf3000a9b52 100644 --- a/packages/ExternalStorageProvider/res/values-mr/strings.xml +++ b/packages/ExternalStorageProvider/res/values-mr/strings.xml @@ -18,6 +18,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="7123375275748530234">"बाह्य संचयन"</string> <string name="storage_description" msgid="8541974407321172792">"स्थानिक संचय"</string> - <string name="root_internal_storage" msgid="827844243068584127">"अंतर्गत संचयन"</string> + <string name="root_internal_storage" msgid="827844243068584127">"अंतर्गत स्टोरेज"</string> <string name="root_documents" msgid="4051252304075469250">"दस्तऐवज"</string> </resources> diff --git a/packages/FusedLocation/res/values-en-rCA/strings.xml b/packages/FusedLocation/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..0d2cccc66dc0 --- /dev/null +++ b/packages/FusedLocation/res/values-en-rCA/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="5379477904423203699">"Fused Location"</string> +</resources> diff --git a/packages/InputDevices/res/raw/keyboard_layout_persian.kcm b/packages/InputDevices/res/raw/keyboard_layout_persian.kcm new file mode 100644 index 000000000000..e7dd6c6d68c8 --- /dev/null +++ b/packages/InputDevices/res/raw/keyboard_layout_persian.kcm @@ -0,0 +1,501 @@ +# Copyright (C) 2017 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. + + + +type FULL + +### Basic QWERTY keys ### + +key A { + label: '\u0634' + base: '\u0634' + shift, capslock: '\u0624' + ctrl, alt, meta: none +} + +key B { + label: '\u0630' + base: '\u0630' + shift, capslock: '\u200C' + ctrl, alt, meta: none +} + +key C { + label: '\u0632' + base: '\u0632' + shift, capslock: '\u0698' + ctrl, alt, meta: none +} + +key D { + label: '\u06CC' + base: '\u06CC' + shift, capslock: '\u064A' + ctrl, alt, meta: none +} + +key E { + label: '\u062B' + base: '\u062B' + shift, capslock: '\u064D' + ctrl, alt, meta: none +} + +key F { + label: '\u0628' + base: '\u0628' + shift, capslock: '\u0625' + ctrl, alt, meta: none +} + +key G { + label: '\u0644' + base: '\u0644' + shift, capslock: '\u0623' + ctrl, alt, meta: none +} + +key H { + label: '\u0627' + base: '\u0627' + shift, capslock: '\u0622' + ctrl, alt, meta: none +} + +key I { + label: '\u0647' + base: '\u0647' + shift, capslock: '\u0651' + ctrl, alt, meta: none +} + +key J { + label: '\u062A' + base: '\u062A' + shift, capslock: '\u0629' + ctrl, alt, meta: none +} + +key K { + label: '\u0646' + base: '\u0646' + shift, capslock: '\u00AB' + ctrl, alt, meta: none +} + +key L { + label: '\u0645' + base: '\u0645' + shift, capslock: '\u00BB' + ctrl, alt, meta: none +} + +key M { + label: '\u067E' + base: '\u067E' + shift, capslock: '\u0621' + ctrl, alt, meta: none +} + +key N { + label: '\u062F' + base: '\u062F' + shift, capslock: '\u0654' + ctrl, alt, meta: none +} + +key O { + label: '\u062E' + base: '\u062E' + shift, capslock: ']' + ctrl, alt, meta: none +} + +key P { + label: '\u062D' + base: '\u062D' + shift, capslock: '[' + ctrl, alt, meta: none +} + +key Q { + label: '\u0636' + base: '\u0636' + shift, capslock: '\u0652' + ctrl, alt, meta: none +} + +key R { + label: '\u0642' + base: '\u0642' + shift, capslock: '\u064B' + ctrl, alt, meta: none +} + +key S { + label: '\u0633' + base: '\u0633' + shift, capslock: '\u0626' + ctrl, alt, meta: none +} + +key T { + label: '\u0641' + base: '\u0641' + shift, capslock: '\u064F' + ctrl, alt, meta: none +} + +key U { + label: '\u0639' + base: '\u0639' + shift, capslock: '\u064E' + ctrl, alt, meta: none +} + +key V { + label: '\u0631' + base: '\u0631' + shift, capslock: '\u0670' + ctrl, alt, meta: none +} + +key W { + label: '\u0635' + base: '\u0635' + shift, capslock: '\u064C' + ctrl, alt, meta: none +} + +key X { + label: '\u0637' + base: '\u0637' + shift, capslock: '\u0653' + ctrl, alt, meta: none +} + +key Y { + label: '\u063A' + base: '\u063A' + shift, capslock: '\u0650' + ctrl, alt, meta: none +} + +key Z { + label: '\u0638' + base: '\u0638' + shift, capslock: '\u0643' + ctrl, alt, meta: none +} + +key 0 { + label, number: '\u06F0' + base: '\u06F0' + shift: '(' + ctrl, alt, meta: none +} + +key 1 { + label, number: '\u06F1' + base: '\u06F1' + shift: '!' + ctrl, alt, meta: none +} + +key 2 { + label, number: '\u06F2' + base: '\u06F2' + shift: '\u066C' + ctrl, alt, meta: none + +} +key 3 { + label, number: '\u06F3' + base: '\u06F3' + shift: '\u066B' + ctrl, alt, meta: none +} + +key 4 { + label, number: '\u06F4' + base: '\u06F4' + shift: '\uFDFC' + ctrl, alt, meta: none +} + +key 5 { + label, number: '\u06F5' + base: '\u06F5' + shift: '\u066A' + ctrl, alt, meta: none +} + +key 6 { + label, number: '\u06F6' + base: '\u06F6' + shift: '\u00D7' + ctrl, alt, meta: none +} + + +key 7 { + label, number: '\u06F7' + base: '\u06F7' + shift: '\u060C' + ctrl, alt, meta: none +} + +key 8 { + label, number: '\u06F8' + base: '\u06F8' + shift: '*' + ctrl, alt, meta: none +} + +key 9 { + label, number: '\u06F9' + base: '\u06F9' + shift: ')' + ctrl, alt, meta: none +} + +key SPACE { + label: ' ' + base: ' ' + ctrl, alt, meta: none +} + +key ENTER { + label: '\n' + base: '\n' + ctrl, alt, meta: none +} + +key TAB { + label: '\t' + base: '\t' + ctrl, alt, meta: none +} + +key COMMA { + label, number: '\u0648' + base: '\u0648' + shift: '<' + ctrl, alt, meta: none +} + +key PERIOD { + label, number: '.' + base: '.' + shift: '>' + ctrl, alt, meta: none +} + +key SLASH { + label, number: '/' + base: '/' + shift: '\u061F' + ctrl, alt, meta: none +} + +key GRAVE { + label, number: '`' + base: '`' + shift: '\u00F7' + ctrl, alt, meta: none +} + + +key MINUS { + label, number: '-' + base: '-' + shift: '_' + ctrl, alt, meta: none +} + +key EQUALS { + label, number: '=' + base: '=' + shift: '+' + ctrl, alt, meta: none +} + +key LEFT_BRACKET { + label, number: '\u062C' + base: '\u062C' + shift: '}' + ctrl, alt, meta: none +} + +key RIGHT_BRACKET { + label, number: '\u0686' + base: '\u0686' + shift: '{' + ctrl, alt, meta: none +} + +key BACKSLASH { + label, number: '\\' + base: '\\' + shift: '|' + ctrl, alt, meta: none +} + +key SEMICOLON { + label, number: '\u06A9' + base: '\u06A9' + shift: ':' + ctrl, alt, meta: none +} + +key APOSTROPHE { + label, number: '\'' + base: '\'' + shift: '\"' + ctrl, alt, meta: none +} + +### Numeric keypad ### + +key NUMPAD_0 { + label, number: '0' + base: fallback INSERT + numlock: '0' + ctrl, alt, meta: none +} + +key NUMPAD_1 { + label, number: '1' + base: fallback MOVE_END + numlock: '1' + ctrl, alt, meta: none +} + +key NUMPAD_2 { + label, number: '2' + base: fallback DPAD_DOWN + numlock: '2' + ctrl, alt, meta: none +} + +key NUMPAD_3 { + label, number: '3' + base: fallback PAGE_DOWN + numlock: '3' + ctrl, alt, meta: none +} + +key NUMPAD_4 { + label, number: '4' + base: fallback DPAD_LEFT + numlock: '4' + ctrl, alt, meta: none +} + +key NUMPAD_5 { + label, number: '5' + base: fallback DPAD_CENTER + numlock: '5' + ctrl, alt, meta: none +} + +key NUMPAD_6 { + label, number: '6' + base: fallback DPAD_RIGHT + numlock: '6' + ctrl, alt, meta: none +} + +key NUMPAD_7 { + label, number: '7' + base: fallback MOVE_HOME + numlock: '7' + ctrl, alt, meta: none +} + +key NUMPAD_8 { + label, number: '8' + base: fallback DPAD_UP + numlock: '8' + ctrl, alt, meta: none +} + +key NUMPAD_9 { + label, number: '9' + base: fallback PAGE_UP + numlock: '9' + ctrl, alt, meta: none +} + +key NUMPAD_LEFT_PAREN { + label, number: '(' + base: '(' + ctrl, alt, meta: none +} + +key NUMPAD_RIGHT_PAREN { + label, number: ')' + base: ')' + ctrl, alt, meta: none +} + +key NUMPAD_DIVIDE { + label, number: '/' + base: '/' + ctrl, alt, meta: none +} + +key NUMPAD_MULTIPLY { + label, number: '*' + base: '*' + ctrl, alt, meta: none +} + +key NUMPAD_SUBTRACT { + label, number: '-' + base: '-' + ctrl, alt, meta: none +} + +key NUMPAD_ADD { + label, number: '+' + base: '+' + ctrl, alt, meta: none +} + +key NUMPAD_DOT { + label, number: '.' + base: fallback FORWARD_DEL + numlock: '.' + ctrl, alt, meta: none +} + +key NUMPAD_COMMA { + label, number: ',' + base: ',' + ctrl, alt, meta: none +} + +key NUMPAD_EQUALS { + label, number: '=' + base: '=' + ctrl, alt, meta: none +} + +key NUMPAD_ENTER { + label: '\n' + base: '\n' fallback ENTER + ctrl, alt, meta: none fallback ENTER +} diff --git a/packages/InputDevices/res/values-bn/strings.xml b/packages/InputDevices/res/values-bn/strings.xml index a0ce313c7f91..e9540b64f894 100644 --- a/packages/InputDevices/res/values-bn/strings.xml +++ b/packages/InputDevices/res/values-bn/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="8016145283189546017">"ইনপুট ডিভাইসগুলি"</string> + <string name="app_label" msgid="8016145283189546017">"ইনপুট ডিভাইস"</string> <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android কীবোর্ড"</string> <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ইংরেজি (UK)"</string> <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ইংরেজি (US)"</string> diff --git a/packages/InputDevices/res/values-en-rCA/strings.xml b/packages/InputDevices/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..01c2979ec107 --- /dev/null +++ b/packages/InputDevices/res/values-en-rCA/strings.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="8016145283189546017">"Input Devices"</string> + <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android keyboard"</string> + <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"English (UK)"</string> + <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"English (US)"</string> + <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"English (US), International style"</string> + <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"English (US), Colemak style"</string> + <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"English (US), Dvorak style"</string> + <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"English (US), Workman style"</string> + <string name="keyboard_layout_german_label" msgid="8451565865467909999">"German"</string> + <string name="keyboard_layout_french_label" msgid="813450119589383723">"French"</string> + <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"French (Canada)"</string> + <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Russian"</string> + <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Russian, Mac style"</string> + <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanish"</string> + <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Swiss French"</string> + <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Swiss German"</string> + <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgian"</string> + <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgarian"</string> + <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italian"</string> + <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danish"</string> + <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Norwegian"</string> + <string name="keyboard_layout_swedish" msgid="732959109088479351">"Swedish"</string> + <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Finnish"</string> + <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Croatian"</string> + <string name="keyboard_layout_czech" msgid="1349256901452975343">"Czech"</string> + <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Estonian"</string> + <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Hungarian"</string> + <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Icelandic"</string> + <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Brazilian"</string> + <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Portuguese"</string> + <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Slovak"</string> + <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Slovenian"</string> + <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkish"</string> + <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainian"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabic"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"Greek"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebrew"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Lithuanian"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanish (Latin)"</string> + <string name="keyboard_layout_latvian" msgid="4405417142306250595">"Latvian"</string> +</resources> diff --git a/packages/InputDevices/res/values-ml/strings.xml b/packages/InputDevices/res/values-ml/strings.xml index 0faa40ee2e39..51866673bdcd 100644 --- a/packages/InputDevices/res/values-ml/strings.xml +++ b/packages/InputDevices/res/values-ml/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="8016145283189546017">"ടൈപ്പുചെയ്യൽ ഉപകരണങ്ങൾ"</string> + <string name="app_label" msgid="8016145283189546017">"ഇൻപുട്ട് ഉപകരണങ്ങൾ"</string> <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android കീബോർഡ്"</string> <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ഇംഗ്ലീഷ് (യുകെ)"</string> <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ഇംഗ്ലീഷ് (യുഎസ്)"</string> diff --git a/packages/InputDevices/res/values-mr/strings.xml b/packages/InputDevices/res/values-mr/strings.xml index 9ffcc70f0ae5..33d01e97ef6e 100644 --- a/packages/InputDevices/res/values-mr/strings.xml +++ b/packages/InputDevices/res/values-mr/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="8016145283189546017">"इनपुट डिव्हाइसेस"</string> + <string name="app_label" msgid="8016145283189546017">"इनपुट डीव्हाइस"</string> <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android कीबोर्ड"</string> <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"इंग्रजी (यूके)"</string> <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"इंग्रजी (यूएस)"</string> diff --git a/packages/InputDevices/res/values/strings.xml b/packages/InputDevices/res/values/strings.xml index 5644c9a9ddfb..1e262260a6c7 100644 --- a/packages/InputDevices/res/values/strings.xml +++ b/packages/InputDevices/res/values/strings.xml @@ -119,4 +119,7 @@ <!-- Latvian keyboard layout label. [CHAR LIMIT=35] --> <string name="keyboard_layout_latvian">Latvian</string> + + <!-- Persian keyboard layout label. [CHAR LIMIT=35] --> + <string name="keyboard_layout_persian">Persian</string> </resources> diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml index a302162a00f1..c55711a4e716 100644 --- a/packages/InputDevices/res/xml/keyboard_layouts.xml +++ b/packages/InputDevices/res/xml/keyboard_layouts.xml @@ -151,4 +151,8 @@ <keyboard-layout android:name="keyboard_layout_latvian" android:label="@string/keyboard_layout_latvian" android:keyboardLayout="@raw/keyboard_layout_latvian_qwerty" /> + + <keyboard-layout android:name="keyboard_layout_persian" + android:label="@string/keyboard_layout_persian" + android:keyboardLayout="@raw/keyboard_layout_persian" /> </keyboard-layouts> diff --git a/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..5f2167e8273a --- /dev/null +++ b/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2015 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> + <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> + <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> + <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> + <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> + <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> +</resources> diff --git a/packages/MtpDocumentsProvider/res/values-hi/strings.xml b/packages/MtpDocumentsProvider/res/values-hi/strings.xml index 1cf1c03780e8..6aceb95d525c 100644 --- a/packages/MtpDocumentsProvider/res/values-hi/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-hi/strings.xml @@ -21,5 +21,5 @@ <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> से फ़ाइलें एक्सेस कर रहा है"</string> <string name="error_busy_device" msgid="3997316850357386589">"दूसरा डिवाइस व्यस्त है. आप उसके उपलब्ध हो जाने तक फ़ाइलें स्थानांतरित नहीं कर सकते हैं."</string> - <string name="error_locked_device" msgid="7557872102188356147">"कोई फ़ाइल नहीं मिली. हो सकता है कि दूसरा डिवाइस लॉक हो. यदि ऐसा है, तो उसे अनलॉक करें और पुन: प्रयास करें."</string> + <string name="error_locked_device" msgid="7557872102188356147">"कोई फ़ाइल नहीं मिली. हो सकता है कि दूसरा डिवाइस लॉक हो. अगर ऐसा है, तो उसे अनलॉक करें और दोबारा कोशिश करें."</string> </resources> diff --git a/packages/MtpDocumentsProvider/res/values-mr/strings.xml b/packages/MtpDocumentsProvider/res/values-mr/strings.xml index 5b856dc4ec19..9b50e93cf11a 100644 --- a/packages/MtpDocumentsProvider/res/values-mr/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-mr/strings.xml @@ -20,6 +20,6 @@ <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोड"</string> <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> मधून फायलींंमध्ये प्रवेश करीत आहे"</string> - <string name="error_busy_device" msgid="3997316850357386589">"अन्य डिव्हाइस व्यस्त आहे. ते उपलब्ध होईपर्यंत आपण फायली हस्तांतरित करू शकत नाही."</string> - <string name="error_locked_device" msgid="7557872102188356147">"कोणत्याही फायली आढळल्या नाहीत. अन्य डिव्हाइस कदाचित बंद असू शकते. तसे असल्यास, ते अनलॉक करा आणि पुन्हा प्रयत्न करा."</string> + <string name="error_busy_device" msgid="3997316850357386589">"दुसरे डीव्हाइस व्यस्त आहे. ते उपलब्ध होईपर्यंत तुम्ही फायली ट्रांसफर करू शकत नाही."</string> + <string name="error_locked_device" msgid="7557872102188356147">"कोणत्याही फायली आढळल्या नाहीत. दुसरे डीव्हाइस कदाचित बंद असू शकते. तसे असल्यास, ते अनलॉक करा आणि पुन्हा प्रयत्न करा."</string> </resources> diff --git a/packages/MtpDocumentsProvider/res/values-pa/strings.xml b/packages/MtpDocumentsProvider/res/values-pa/strings.xml index ab8ba1592ba7..236db6f333ce 100644 --- a/packages/MtpDocumentsProvider/res/values-pa/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-pa/strings.xml @@ -20,6 +20,6 @@ <string name="downloads_app_label" msgid="7120690641874849726">"ਡਾਊਨਲੋਡ"</string> <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ਦੀਆਂ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪਹੁੰਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ਦੂਜੀ ਡੀਵਾਈਸ ਰੁਝੇਵੇਂ ਵਿੱਚ ਹੈ। ਉਸਦੇ ਉਪਲਬਧ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਫ਼ਾਈਲਾਂ ਦਾ ਤਬਾਦਲਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string> - <string name="error_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜੀ ਡੀਵਾਈਸ ਲੌਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਨਲੌਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> + <string name="error_busy_device" msgid="3997316850357386589">"ਦੂਜਾ ਡੀਵਾਈਸ ਰੁਝੇਵੇਂ ਵਿੱਚ ਹੈ। ਉਸਦੇ ਉਪਲਬਧ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਫ਼ਾਈਲਾਂ ਦਾ ਤਬਾਦਲਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string> + <string name="error_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜਾ ਡੀਵਾਈਸ ਲੌਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਨਲੌਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> </resources> diff --git a/packages/PrintSpooler/res/values-en-rCA/strings.xml b/packages/PrintSpooler/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..7fbfeb3b3d3b --- /dev/null +++ b/packages/PrintSpooler/res/values-en-rCA/strings.xml @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4469836075319831821">"Print Spooler"</string> + <string name="more_options_button" msgid="2243228396432556771">"More options"</string> + <string name="label_destination" msgid="9132510997381599275">"Destination"</string> + <string name="label_copies" msgid="3634531042822968308">"Copies"</string> + <string name="label_copies_summary" msgid="3861966063536529540">"Copies:"</string> + <string name="label_paper_size" msgid="908654383827777759">"Paper size"</string> + <string name="label_paper_size_summary" msgid="5668204981332138168">"Paper size:"</string> + <string name="label_color" msgid="1108690305218188969">"Colour"</string> + <string name="label_duplex" msgid="5370037254347072243">"Two-sided"</string> + <string name="label_orientation" msgid="2853142581990496477">"Orientation"</string> + <string name="label_pages" msgid="7768589729282182230">"Pages"</string> + <string name="destination_default_text" msgid="5422708056807065710">"Select a printer"</string> + <string name="template_all_pages" msgid="3322235982020148762">"All <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> + <string name="template_page_range" msgid="428638530038286328">"Range of <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> + <string name="pages_range_example" msgid="8558694453556945172">"e.g. 1–5,8,11–13"</string> + <string name="print_preview" msgid="8010217796057763343">"Print preview"</string> + <string name="install_for_print_preview" msgid="6366303997385509332">"Install PDF viewer for preview"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"Printing app crashed"</string> + <string name="generating_print_job" msgid="3119608742651698916">"Generating print job"</string> + <string name="save_as_pdf" msgid="5718454119847596853">"Save as PDF"</string> + <string name="all_printers" msgid="5018829726861876202">"All printers…"</string> + <string name="print_dialog" msgid="32628687461331979">"Print dialogue"</string> + <string name="current_page_template" msgid="5145005201131935302">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g>/<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string> + <string name="page_description_template" msgid="6831239682256197161">"Page <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> of <xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string> + <string name="summary_template" msgid="8899734908625669193">"Summary, copies <xliff:g id="COPIES">%1$s</xliff:g>, paper size <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> + <string name="expand_handle" msgid="7282974448109280522">"Expand handle"</string> + <string name="collapse_handle" msgid="6886637989442507451">"Collapse handle"</string> + <string name="print_button" msgid="645164566271246268">"Print"</string> + <string name="savetopdf_button" msgid="2976186791686924743">"Save to PDF"</string> + <string name="print_options_expanded" msgid="6944679157471691859">"Print options expanded"</string> + <string name="print_options_collapsed" msgid="7455930445670414332">"Print options collapsed"</string> + <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="all_printers_label" msgid="3178848870161526399">"All printers"</string> + <string name="add_print_service_label" msgid="5356702546188981940">"Add service"</string> + <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"Search box shown"</string> + <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"Search box hidden"</string> + <string name="print_add_printer" msgid="1088656468360653455">"Add printer"</string> + <string name="print_select_printer" msgid="7388760939873368698">"Select printer"</string> + <string name="print_forget_printer" msgid="5035287497291910766">"Forget printer"</string> + <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g> printer found</item> + </plurals> + <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> + <string name="printer_info_desc" msgid="7181988788991581654">"More information about this printer"</string> + <string name="notification_channel_progress" msgid="872788690775721436">"Running print jobs"</string> + <string name="notification_channel_failure" msgid="9042250774797916414">"Failed print jobs"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Could not create file"</string> + <string name="print_services_disabled_toast" msgid="9089060734685174685">"Some print services are disabled"</string> + <string name="print_searching_for_printers" msgid="6550424555079932867">"Searching for printers"</string> + <string name="print_no_print_services" msgid="8561247706423327966">"No print services enabled"</string> + <string name="print_no_printers" msgid="4869403323900054866">"No printers found"</string> + <string name="cannot_add_printer" msgid="7840348733668023106">"Cannot add printers"</string> + <string name="select_to_add_printers" msgid="3800709038689830974">"Select to add printer"</string> + <string name="enable_print_service" msgid="3482815747043533842">"Select to enable"</string> + <string name="enabled_services_title" msgid="7036986099096582296">"Enabled services"</string> + <string name="recommended_services_title" msgid="3799434882937956924">"Recommended services"</string> + <string name="disabled_services_title" msgid="7313253167968363211">"Disabled services"</string> + <string name="all_services_title" msgid="5578662754874906455">"All services"</string> + <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> + <item quantity="other">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> + <item quantity="one">Install to discover <xliff:g id="COUNT_0">%1$s</xliff:g> printer</item> + </plurals> + <string name="printing_notification_title_template" msgid="295903957762447362">"Printing <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="cancelling_notification_title_template" msgid="1821759594704703197">"Cancelling <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="failed_notification_title_template" msgid="2256217208186530973">"Printer error <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="blocked_notification_title_template" msgid="1175435827331588646">"Printer blocked <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="cancel" msgid="4373674107267141885">"Cancel"</string> + <string name="restart" msgid="2472034227037808749">"Restart"</string> + <string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string> + <string name="reason_unknown" msgid="5507940196503246139">"unknown"</string> + <string name="print_service_security_warning_title" msgid="2160752291246775320">"Use <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> + <string name="print_service_security_warning_summary" msgid="1427434625361692006">"Your document may pass through one or more servers on its way to the printer."</string> + <string-array name="color_mode_labels"> + <item msgid="7602948745415174937">"Black & White"</item> + <item msgid="2762241247228983754">"Colour"</item> + </string-array> + <string-array name="duplex_mode_labels"> + <item msgid="3882302912790928315">"None"</item> + <item msgid="7296563835355641719">"Long edge"</item> + <item msgid="79513688117503758">"Short edge"</item> + </string-array> + <string-array name="orientation_labels"> + <item msgid="4061931020926489228">"Portrait"</item> + <item msgid="3199660090246166812">"Landscape"</item> + </string-array> + <string name="print_write_error_message" msgid="5787642615179572543">"Couldn\'t write to file"</string> + <string name="print_error_default_message" msgid="8602678405502922346">"Sorry, that didn\'t work. Try again."</string> + <string name="print_error_retry" msgid="1426421728784259538">"Retry"</string> + <string name="print_error_printer_unavailable" msgid="8985614415253203381">"This printer isn\'t available right now."</string> + <string name="print_cannot_load_page" msgid="6179560924492912009">"Can\'t display preview"</string> + <string name="print_preparing_preview" msgid="3939930735671364712">"Preparing preview…"</string> +</resources> diff --git a/packages/PrintSpooler/res/values-gu/strings.xml b/packages/PrintSpooler/res/values-gu/strings.xml index f5d698d49eb5..7ad8d57bfead 100644 --- a/packages/PrintSpooler/res/values-gu/strings.xml +++ b/packages/PrintSpooler/res/values-gu/strings.xml @@ -26,7 +26,7 @@ <string name="label_color" msgid="1108690305218188969">"રંગ"</string> <string name="label_duplex" msgid="5370037254347072243">"દ્વિભુજ"</string> <string name="label_orientation" msgid="2853142581990496477">"ઓરિએન્ટેશન"</string> - <string name="label_pages" msgid="7768589729282182230">"પૃષ્ઠો"</string> + <string name="label_pages" msgid="7768589729282182230">"પેજ"</string> <string name="destination_default_text" msgid="5422708056807065710">"પ્રિન્ટર પસંદ કરો"</string> <string name="template_all_pages" msgid="3322235982020148762">"તમામ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g> ની શ્રેણી"</string> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index 809431d1483c..bfe558c37679 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -25,7 +25,7 @@ <string name="label_paper_size_summary" msgid="5668204981332138168">"काग़ज़ का आकार:"</string> <string name="label_color" msgid="1108690305218188969">"रंग"</string> <string name="label_duplex" msgid="5370037254347072243">"दो-तरफ़ा"</string> - <string name="label_orientation" msgid="2853142581990496477">"अभिविन्यास"</string> + <string name="label_orientation" msgid="2853142581990496477">"स्क्रीन की दिशा"</string> <string name="label_pages" msgid="7768589729282182230">"पेज"</string> <string name="destination_default_text" msgid="5422708056807065710">"कोई प्रिंटर चुनें"</string> <string name="template_all_pages" msgid="3322235982020148762">"सभी <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-mr/strings.xml b/packages/PrintSpooler/res/values-mr/strings.xml index 8981cd83c649..1ccc721d3eb3 100644 --- a/packages/PrintSpooler/res/values-mr/strings.xml +++ b/packages/PrintSpooler/res/values-mr/strings.xml @@ -25,7 +25,7 @@ <string name="label_paper_size_summary" msgid="5668204981332138168">"कागद आकार:"</string> <string name="label_color" msgid="1108690305218188969">"रंग"</string> <string name="label_duplex" msgid="5370037254347072243">"दोन्ही बाजूंनी"</string> - <string name="label_orientation" msgid="2853142581990496477">"अभिमुखता"</string> + <string name="label_orientation" msgid="2853142581990496477">"ओरिएंटेशन"</string> <string name="label_pages" msgid="7768589729282182230">"पृष्ठे"</string> <string name="destination_default_text" msgid="5422708056807065710">"प्रिंटर निवडा"</string> <string name="template_all_pages" msgid="3322235982020148762">"सर्व <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml index e5a0879736a1..2a20fc8d44b1 100644 --- a/packages/PrintSpooler/res/values-te/strings.xml +++ b/packages/PrintSpooler/res/values-te/strings.xml @@ -25,7 +25,7 @@ <string name="label_paper_size_summary" msgid="5668204981332138168">"కాగితపు పరిమాణం:"</string> <string name="label_color" msgid="1108690305218188969">"రంగు"</string> <string name="label_duplex" msgid="5370037254347072243">"రెండు వైపుల"</string> - <string name="label_orientation" msgid="2853142581990496477">"దృగ్విన్యాసం"</string> + <string name="label_orientation" msgid="2853142581990496477">"ఓరియంటేషన్"</string> <string name="label_pages" msgid="7768589729282182230">"పేజీలు"</string> <string name="destination_default_text" msgid="5422708056807065710">"ప్రింటర్ ఎంచుకోండి"</string> <string name="template_all_pages" msgid="3322235982020148762">"మొత్తం <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> @@ -33,7 +33,7 @@ <string name="pages_range_example" msgid="8558694453556945172">"ఉదా. 1—5,8,11—13"</string> <string name="print_preview" msgid="8010217796057763343">"ముద్రణ పరిదృశ్యం"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"పరిదృశ్యం చేయడానికి PDF వ్యూయర్ను ఇన్స్టాల్ చేయండి"</string> - <string name="printing_app_crashed" msgid="854477616686566398">"ముద్రణ అనువర్తనం క్రాష్ అయ్యింది"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"ముద్రణ యాప్ క్రాష్ అయ్యింది"</string> <string name="generating_print_job" msgid="3119608742651698916">"ముద్రణ జాబ్ను ఉత్పన్నం చేస్తోంది"</string> <string name="save_as_pdf" msgid="5718454119847596853">"PDF వలె సేవ్ చేయి"</string> <string name="all_printers" msgid="5018829726861876202">"అన్ని ప్రింటర్లు…"</string> diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index bc27c301cc8f..d656a5b11a56 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Gebruik stelselkeuse (verstek)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX-HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Aktiveer opsionele kodekke"</item> - <item msgid="3304843301758635896">"Deaktiveer opsionele kodekke"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Gebruik stelselkeuse (verstek)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX-HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Aktiveer opsionele kodekke"</item> - <item msgid="741805482892725657">"Deaktiveer opsionele kodekke"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Gebruik stelselkeuse (verstek)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 866aa0fa31d0..bd4062d9a0dd 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> oor"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tot vol gelaai"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Onbekend"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Laai"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laai tans"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Laai nie"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Ingeprop; kan nie op die oomblik laai nie"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Vol"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Beheer deur administrateur"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Geaktiveer deur administrateur"</string> diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index 79dad14e59c7..26ad9efd459e 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"አማራጭ ኮዴኮችን አንቃ"</item> - <item msgid="3304843301758635896">"አማራጭ ኮዴኮችን አሰናክል"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"አማራጭ ኮዴኮችን አንቃ"</item> - <item msgid="741805482892725657">"አማራጭ ኮዴኮችን አሰናክል"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"የስርዓቱን ምርጫ (ነባሪ) ተጠቀም"</item> <item msgid="8895532488906185219">"44.1 ኪኸ"</item> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 100a5b239e35..b6fe78270339 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ይቀራል"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ሙሉ ለሙሉ እስኪሞላ ድረስ <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ያልታወቀ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ኃይል በመሙላት ላይ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ኃይል በመሙላት ላይ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ባትሪ እየሞላ አይደለም"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ተሰክቷል፣ አሁን ኃይል መሙላት አይቻልም"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ሙሉነው"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"በአስተዳዳሪ ቁጥጥር የተደረገበት"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"በአስተዳዳሪ ነቅቷል"</string> diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml index ea31dbe7ebc0..dbf35c7b0cf1 100644 --- a/packages/SettingsLib/res/values-ar/arrays.xml +++ b/packages/SettingsLib/res/values-ar/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"استخدام اختيار النظام (افتراضي)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"تمكين برامج الترميز الاختيارية"</item> - <item msgid="3304843301758635896">"تعطيل برامج الترميز الاختيارية"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"استخدام اختيار النظام (افتراضي)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"تمكين برامج الترميز الاختيارية"</item> - <item msgid="741805482892725657">"تعطيل برامج الترميز الاختيارية"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"استخدام اختيار النظام (افتراضي)"</item> <item msgid="8895532488906185219">"44.1 كيلو هرتز"</item> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 67d0a918decf..3700d55fb4b1 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - يتبقى <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> حتى يكتمل الشحن"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"غير معروف"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"جارٍ الشحن"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"جارٍ الشحن"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"لا يتم الشحن"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"تم التوصيل، ولكن يتعذّر الشحن الآن"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ممتلئة"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"إعدادات يتحكم فيها المشرف"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"تم تمكين الإعداد بواسطة المشرف"</string> @@ -375,7 +373,7 @@ <string name="charge_length_format" msgid="8978516217024434156">"قبل <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="remaining_length_format" msgid="7886337596669190587">"يتبقى <xliff:g id="ID_1">%1$s</xliff:g>"</string> <string name="screen_zoom_summary_small" msgid="5867245310241621570">"صغير"</string> - <string name="screen_zoom_summary_default" msgid="2247006805614056507">"افتراضي"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"تلقائي"</string> <string name="screen_zoom_summary_large" msgid="4835294730065424084">"كبير"</string> <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"أكبر"</string> <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"أكبر مستوى"</string> diff --git a/packages/SettingsLib/res/values-az/arrays.xml b/packages/SettingsLib/res/values-az/arrays.xml index b25b38252c53..a20a250a8ace 100644 --- a/packages/SettingsLib/res/values-az/arrays.xml +++ b/packages/SettingsLib/res/values-az/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Sistem Seçimini istifadə edin (Defolt)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Şəxsi Kodekləri Aktiv edin"</item> - <item msgid="3304843301758635896">"Şəxsi Kodekləri Deaktiv edin"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Sistem Seçimini istifadə edin (Defolt)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Şəxsi Kodekləri Aktiv edin"</item> - <item msgid="741805482892725657">"Şəxsi Kodekləri Deaktiv edin"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Sistem Seçimini istifadə edin (Defolt)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 1732c87212c5..8eb6d90460f7 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> qalıb"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tam enerji yığana kimi"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Naməlum"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Enerji doldurma"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"enerji yığır"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Doldurulmur"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Cihaz hazırda batareya yığa bilmir"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Tam"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Admin tərəfindən nəzarət olunur"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Admin tərəfindən aktiv edildi"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index 0bfda36a37d6..efdf34a18323 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Koristi izbor sistema (podrazumevano)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Omogući opcionalne kodeke"</item> - <item msgid="3304843301758635896">"Onemogući opcionalne kodeke"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Koristi izbor sistema (podrazumevano)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Omogući opcionalne kodeke"</item> - <item msgid="741805482892725657">"Onemogući opcionalne kodeke"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Koristi izbor sistema (podrazumevano)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 3336164bacfb..1f225907be42 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"Preostalo je <xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do potpunog punjenja"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"puni se"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ne puni se"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Priključeno je, ali punjenje trenutno nije moguće"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puno"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontroliše administrator"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Omogućio je administrator"</string> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index 8ea31e58943e..bf83692bffe1 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Выбар сістэмы (стандартны)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Уключыць дадатковыя кодэкі"</item> - <item msgid="3304843301758635896">"Адключыць дадатковыя кодэкі"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Выбар сістэмы (стандартны)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Уключыць дадатковыя кодэкі"</item> - <item msgid="741805482892725657">"Адключыць дадатковыя кодэкі"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Выбар сістэмы (стандартны)"</item> <item msgid="8895532488906185219">"44,1 кГц"</item> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index b50285f04bc6..80dbab48680a 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -119,7 +119,7 @@ <string name="user_guest" msgid="8475274842845401871">"Госць"</string> <string name="unknown" msgid="1592123443519355854">"Невядома"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Карыстальнiк: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> - <string name="launch_defaults_some" msgid="313159469856372621">"Некат. параметры па змаўч. усталяваныя"</string> + <string name="launch_defaults_some" msgid="313159469856372621">"Усталяваны некаторыя стандартныя налады"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Параметры па змаўчанні не ўсталяваныя"</string> <string name="tts_settings" msgid="8186971894801348327">"Налады Text-to-speech"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Сінтэз маўлення"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – засталося <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> да поўнай зарадкі"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Невядома"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Зарадка"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ідзе зарадка"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не зараджаецца"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Падключана да сеткі сілкавання, зарадзіць зараз немагчыма"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Поўная"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Кантралюецца адміністратарам"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Уключана адміністратарам"</string> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index 3f25978791ec..f118c7699eab 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Използване на сист. избор (стандартно)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"Разширено аудиокодиране (AAC)"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Активиране на кодеците по избор"</item> - <item msgid="3304843301758635896">"Деактивиране на кодеците по избор"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Използване на сист. избор (стандартно)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"Разширено аудиокодиране (AAC)"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Активиране на кодеците по избор"</item> - <item msgid="741805482892725657">"Деактивиране на кодеците по избор"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Използване на сист. избор (стандартно)"</item> <item msgid="8895532488906185219">"44,1 кХц"</item> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index ef3f1f6b6abc..ffe076b82c22 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – оставащо време: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до пълно зареждане"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Неизвестно"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Зарежда се"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"зарежда се"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не се зарежда"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Включена в захранването, в момента не се зарежда"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Пълна"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Контролира се от администратор"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Активирано от администратора"</string> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index 4d5c1f19b726..3bb85a6f68b8 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -24,7 +24,7 @@ <item msgid="1922181315419294640"></item> <item msgid="8934131797783724664">"স্ক্যান করা হচ্ছে…"</item> <item msgid="8513729475867537913">"সংযুক্ত হচ্ছে..."</item> - <item msgid="515055375277271756">"প্রমাণীকরণ হচ্ছে..."</item> + <item msgid="515055375277271756">"যাচাইকরণ হচ্ছে..."</item> <item msgid="1943354004029184381">"IP ঠিকানা প্রাপ্ত করা হচ্ছে..."</item> <item msgid="4221763391123233270">"সংযুক্ত হয়েছে"</item> <item msgid="624838831631122137">"স্থগিত করা হয়েছে"</item> @@ -38,7 +38,7 @@ <item msgid="7714855332363650812"></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="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> <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> তে সংযুক্ত হয়েছে"</item> <item msgid="1330262655415760617">"স্থগিত করা হয়েছে"</item> @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ঐচ্ছিক কোডেক সক্ষম করুন"</item> - <item msgid="3304843301758635896">"ঐচ্ছিক কোডেক অক্ষম করুন"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ঐচ্ছিক কোডেক সক্ষম করুন"</item> - <item msgid="741805482892725657">"ঐচ্ছিক কোডেক অক্ষম করুন"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"সিস্টেমের নির্বাচন ব্যবহার করুন (ডিফল্ট)"</item> <item msgid="8895532488906185219">"৪৪.১ kHz"</item> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 2cf27305b708..39c5e45abb5c 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -27,7 +27,7 @@ <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP কনফিগারেশনের ব্যর্থতা"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"খারাপ নেটওয়ার্কের কারণে সংযুক্ত নয়"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ওয়াই ফাই সংযোগের ব্যর্থতা"</string> - <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"প্রমাণীকরণ সমস্যা"</string> + <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"যাচাইকরণ সমস্যা"</string> <string name="wifi_cant_connect" msgid="5410016875644565884">"সংযোগ স্থাপন করা যাচ্ছে না"</string> <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\'এ যোগ করা যায়নি"</string> <string name="wifi_check_password_try_again" msgid="516958988102584767">"পাসওয়ার্ড দেখে আবার চেষ্টা করুন"</string> @@ -54,7 +54,7 @@ <string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন হচ্ছে..."</string> <string name="bluetooth_connecting" msgid="8555009514614320497">"সংযুক্ত হচ্ছে..."</string> <string name="bluetooth_connected" msgid="6038755206916626419">"সংযুক্ত হয়েছে"</string> - <string name="bluetooth_pairing" msgid="1426882272690346242">"যুক্ত করা হচ্ছে..."</string> + <string name="bluetooth_pairing" msgid="1426882272690346242">"চেনানো হচ্ছে..."</string> <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"সংযুক্ত (কোনো ফোন নেই)"</string> <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"সংযুক্ত (কোনো মিডিয়া নেই)"</string> <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"সংযুক্ত (কোনো বার্তা অ্যাক্সেস নেই)"</string> @@ -94,11 +94,11 @@ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যুক্ত করুন"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যুক্ত করুন"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল করুন"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"যুক্ত করা থাকলে তা সংযুক্ত থাকাকালীন অবস্থায় আপনার পরিচিতিগুলি এবং কলের ইতিহাসকে অ্যাক্সেস করতে অনুমোদিত করে৷"</string> - <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সাথে যুক্ত করা যায়নি।"</string> - <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ভুল পিন বা পাস কী দেওয়ার কারণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে যুক্ত করা যায়নি।"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"চেনানো থাকলে তা সংযুক্ত থাকাকালীন অবস্থায় আপনার পরিচিতিগুলি এবং কলের ইতিহাসকে অ্যাক্সেস করতে অনুমোদিত করে৷"</string> + <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সাথে চেনানো যায়নি।"</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ভুল পিন বা কোড দেওয়ার কারণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে চেনানো যায়নি।"</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সঙ্গে যোগাযোগ করতে পারবেন না।"</string> - <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"যুক্ত করা <xliff:g id="DEVICE_NAME">%1$s</xliff:g> প্রত্যাখ্যান করেছে।"</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"চেনানো <xliff:g id="DEVICE_NAME">%1$s</xliff:g> প্রত্যাখ্যান করেছে।"</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"ওয়াই ফাই বন্ধ৷"</string> <string name="accessibility_no_wifi" msgid="8834610636137374508">"ওয়াই ফাই এর সংযোগ বিচ্ছিন্ন হয়েছে৷"</string> <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ওয়াই ফাই এ একটি দণ্ড৷"</string> @@ -163,10 +163,10 @@ <string name="choose_profile" msgid="6921016979430278661">"প্রোফাইল বেছে নিন"</string> <string name="category_personal" msgid="1299663247844969448">"ব্যক্তিগত"</string> <string name="category_work" msgid="8699184680584175622">"কর্মক্ষেত্র"</string> - <string name="development_settings_title" msgid="215179176067683667">"বিকাশকারী বিকল্পগুলি"</string> - <string name="development_settings_enable" msgid="542530994778109538">"বিকাশকারী বিকল্পগুলি সক্ষম করুন"</string> + <string name="development_settings_title" msgid="215179176067683667">"ডেভেলপার বিকল্প"</string> + <string name="development_settings_enable" msgid="542530994778109538">"ডেভেলপার বিকল্প সক্ষম করুন"</string> <string name="development_settings_summary" msgid="1815795401632854041">"অ্যাপ্লিকেশান উন্নয়নের জন্য বিকল্পগুলি সেট করুন"</string> - <string name="development_settings_not_available" msgid="4308569041701535607">"এই ব্যবহারকারীর জন্য বিকাশকারী বিকল্পগুলি উপলব্ধ নয়"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"এই ব্যবহারকারীর জন্য ডেভেলপার বিকল্প উপলব্ধ নয়"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"এই ব্যবহারকারীর জন্য VPN সেটিংস উপলব্ধ নয়"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"এই ব্যবহারকারীর জন্য টেদারিং সেটিংস উপলব্ধ নয়"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"এই ব্যবহারকারীর জন্য অ্যাক্সেস পয়েন্ট নাম সেটিংস উপলব্ধ নয়"</string> @@ -230,7 +230,7 @@ <string name="adb_keys_warning_message" msgid="5659849457135841625">"আপনি আগে যে সব কম্পিউটার USB ডিবাগিং এর অ্যাক্সেসের অনুমতি দিয়েছিলেন তা প্রত্যাহার করবেন?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"উন্নতি সেটিংসের অনুমতি দেবেন?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"এইসব সেটিংস কেবলমাত্র উন্নত করার উদ্দেশ্য। সেগুলি কারণে আপনার ডিভাইস ভেঙ্গে এবং অ্যাপ্লিকেশানগুলি ভালো ভাবে কাজ করা নাও কারতে পারে।"</string> - <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB এর অ্যাপ্লিকেশানগুলি যাচাই করুন"</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB এর অ্যাপ্লিকেশনগুলি যাচাই করুন"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ক্ষতিকারক ক্রিয়াকলাপ করছে কিনা তার জন্য ADB/ADT মারফত ইনস্টল করা অ্যাপ্লিকেশানগুলি চেক করুন।"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"অপ্রত্যাশিত উচ্চ ভলিউম বা নিয়ন্ত্রণের অভাবের মত দূরবর্তী ডিভাইসের ভলিউম সমস্যাগুলির ক্ষেত্রে, ব্লুটুথ চুড়ান্ত ভলিউম বৈশিষ্ট্য অক্ষম করে৷"</string> <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ফোনের রিংটোন ব্লুটুথ হেডসেটে শোনা সক্ষম করুন"</string> @@ -247,7 +247,7 @@ <string name="wait_for_debugger" msgid="1202370874528893091">"ডিবাগারের জন্য অপেক্ষা করুন"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"চালানোর আগে সংযুক্ত করতে জন্য ডিবাগ করা অ্যাপ্লিকেশনটি ডিবাগারের জন্য অপেক্ষা করছে"</string> <string name="telephony_monitor_switch" msgid="1764958220062121194">"টেলিফোনি মনিটর"</string> - <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"টেলিফোনি মনিটর টেলিফোনি/মোডেমের কার্যকারিতায় কোনো সমস্যা শনাক্ত করলে সমস্যাটি লগ করবে এবং সমস্যাটি জানাতে একটি বাগ ফাইল করার জন্য ব্যবহারকারিকে বিজ্ঞপ্তি পাঠাবে"</string> + <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"টেলিফোনি মনিটর টেলিফোনি/মোডেমের কার্যকারিতায় কোনও সমস্যা শনাক্ত করলে সমস্যাটি লগ করবে এবং সমস্যাটি জানাতে একটি বাগ ফাইল করার জন্য ব্যবহারকারিকে বিজ্ঞপ্তি পাঠাবে"</string> <string name="debug_input_category" msgid="1811069939601180246">"ইনপুট"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"অঙ্কন"</string> <string name="debug_hw_drawing_category" msgid="6220174216912308658">"হার্ডওয়্যার দ্বারা চালিত রেন্ডারিং"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> বাকী আছে"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">^2</xliff:g> লাগবে"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"অজানা"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"চার্জ হচ্ছে"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"চার্জ হচ্ছে"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"চার্জ হচ্ছে না"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"প্লাগ-ইন করা হয়েছে কিন্তু এখনই চার্জ করা যাবে না"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"পূর্ণ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"প্রশাসকের দ্বারা নিয়ন্ত্রিত"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"প্রশাসক দ্বারা সক্ষম করা হয়েছে"</string> diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml index 2bfb4a574970..71d09582e3d2 100644 --- a/packages/SettingsLib/res/values-bs/arrays.xml +++ b/packages/SettingsLib/res/values-bs/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Koristi odabir sistema (Zadano)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Omogućite opcionalne kodeke"</item> - <item msgid="3304843301758635896">"Onemogućite opcionalne kodeke"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Koristi odabir sistema (Zadano)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Omogućite opcionalne kodeke"</item> - <item msgid="741805482892725657">"Onemogućite opcionalne kodeke"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Koristi odabir sistema (Zadano)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 614bdb1ba3ac..3986809da411 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - imate još <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> do potpune napunjenosti"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"punjenje"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ne puni se"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Priključen, trenutno se ne može puniti"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puna"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Pod kontrolom administratora"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Omogućio administrator"</string> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index bdc2cacd4a86..1382419058af 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Utilitza selecció del sistema (predeterminada)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Activa els còdecs opcionals"</item> - <item msgid="3304843301758635896">"Desactiva els còdecs opcionals"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Utilitza selecció del sistema (predeterminada)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Activa els còdecs opcionals"</item> - <item msgid="741805482892725657">"Desactiva els còdecs opcionals"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Utilitza selecció del sistema (predeterminada)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index b2b2b1cc372a..4ef2337239a3 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g>; temps restant: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> per completar la càrrega"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconegut"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"S\'està carregant"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"s\'està carregant"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"No s\'està carregant"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"El dispositiu està endollat però en aquests moments no es pot carregar"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Plena"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlat per l\'administrador"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Activada per l\'administrador"</string> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index 7457308b80a8..cbb3cc100ed4 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Použít systémový výběr (výchozí)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Povolit volitelné kodeky"</item> - <item msgid="3304843301758635896">"Zakázat volitelné kodeky"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Použít systémový výběr (výchozí)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Povolit volitelné kodeky"</item> - <item msgid="741805482892725657">"Zakázat volitelné kodeky"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Použít systémový výběr (výchozí)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index fcb0b028a251..5158277e7613 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zbývá <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – plně se nabije za <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Neznámé"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Nabíjí se"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nabíjení"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nenabíjí se"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Zapojeno, ale nelze nabíjet"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Nabitá"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Spravováno administrátorem"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Zapnuto administrátorem"</string> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 6c322ed741bb..055ee514dcc7 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Brug systemvalg (standard)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Aktivér Optional Codecs"</item> - <item msgid="3304843301758635896">"Deaktiver Optional Codecs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Brug systemvalg (standard)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Aktivér Optional Codecs"</item> - <item msgid="741805482892725657">"Deaktiver Optional Codecs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Brug systemvalg (standard)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 1c40c524db06..5a06613f22ff 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tilbage"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> til det er fuldt opladet"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Ukendt"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Oplader"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"oplader"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Oplader ikke"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Enheden er tilsluttet en strømkilde. Det er ikke muligt at oplade på nuværende tidspunkt."</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Fuld"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolleret af administratoren"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Aktiveret af administratoren"</string> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index 2c441a508117..ac61e8da94de 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Systemauswahl verwenden (Standard)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Optionale Codecs aktivieren"</item> - <item msgid="3304843301758635896">"Optionale Codecs deaktivieren"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Systemauswahl verwenden (Standard)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Optionale Codecs aktivieren"</item> - <item msgid="741805482892725657">"Optionale Codecs deaktivieren"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Systemauswahl verwenden (Standard)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 8c0e7271b0c8..86fc43ff38f7 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – noch <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> bis vollständig geladen"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Unbekannt"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Wird aufgeladen"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"wird aufgeladen..."</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Wird nicht geladen"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Angeschlossen, kann derzeit nicht geladen werden"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Voll"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Durch den Administrator verwaltet"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Vom Administrator aktiviert"</string> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index 2f86aa755ac4..3a99fd657af6 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Χρήση επιλογής συστήματος (Προεπιλογή)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Ενεργοποίηση προαιρετικών κωδικοποιητών"</item> - <item msgid="3304843301758635896">"Απενεργοποίηση προαιρετικών κωδικοποιητών"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Χρήση επιλογής συστήματος (Προεπιλογή)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Ενεργοποίηση προαιρετικών κωδικοποιητών"</item> - <item msgid="741805482892725657">"Απενεργοποίηση προαιρετικών κωδικοποιητών"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Χρήση επιλογής συστήματος (Προεπιλογή)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 46aa2c5a23c5..3a0c128e50ad 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - απομένει/ουν <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> για πλήρη φόρτιση"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Άγνωστο"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Φόρτιση"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"φόρτιση"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Δεν φορτίζει"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Συνδέθηκε, δεν είναι δυνατή η φόρτιση αυτήν τη στιγμή"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Πλήρης"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Ελέγχονται από το διαχειριστή"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Ενεργοποιήθηκε από τον διαχειριστή"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml index 77af30ecb6f8..bb48f2f29a34 100644 --- a/packages/SettingsLib/res/values-en-rAU/arrays.xml +++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Use System Selection (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Enable Optional Codecs"</item> - <item msgid="3304843301758635896">"Disable Optional Codecs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Use System Selection (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Enable Optional Codecs"</item> - <item msgid="741805482892725657">"Disable Optional Codecs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Use System Selection (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index bbc114463582..b427efe4a070 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Enabled by admin"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/arrays.xml b/packages/SettingsLib/res/values-en-rCA/arrays.xml new file mode 100644 index 000000000000..bb48f2f29a34 --- /dev/null +++ b/packages/SettingsLib/res/values-en-rCA/arrays.xml @@ -0,0 +1,239 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wifi_status"> + <item msgid="1922181315419294640"></item> + <item msgid="8934131797783724664">"Scanning…"</item> + <item msgid="8513729475867537913">"Connecting…"</item> + <item msgid="515055375277271756">"Authenticating…"</item> + <item msgid="1943354004029184381">"Obtaining IP address…"</item> + <item msgid="4221763391123233270">"Connected"</item> + <item msgid="624838831631122137">"Suspended"</item> + <item msgid="7979680559596111948">"Disconnecting…"</item> + <item msgid="1634960474403853625">"Disconnected"</item> + <item msgid="746097431216080650">"Unsuccessful"</item> + <item msgid="6367044185730295334">"Blocked"</item> + <item msgid="503942654197908005">"Temporarily avoiding poor connection"</item> + </string-array> + <string-array name="wifi_status_with_ssid"> + <item msgid="7714855332363650812"></item> + <item msgid="8878186979715711006">"Scanning…"</item> + <item msgid="355508996603873860">"Connecting to <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="554971459996405634">"Authenticating with <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="7928343808033020343">"Obtaining IP address from <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="8937994881315223448">"Connected to <xliff:g id="NETWORK_NAME">%1$s</xliff:g>"</item> + <item msgid="1330262655415760617">"Suspended"</item> + <item msgid="7698638434317271902">"Disconnecting from <xliff:g id="NETWORK_NAME">%1$s</xliff:g>…"</item> + <item msgid="197508606402264311">"Disconnected"</item> + <item msgid="8578370891960825148">"Unsuccessful"</item> + <item msgid="5660739516542454527">"Blocked"</item> + <item msgid="1805837518286731242">"Temporarily avoiding poor connection"</item> + </string-array> + <string-array name="hdcp_checking_titles"> + <item msgid="441827799230089869">"Never check"</item> + <item msgid="6042769699089883931">"Check for DRM content only"</item> + <item msgid="9174900380056846820">"Always check"</item> + </string-array> + <string-array name="hdcp_checking_summaries"> + <item msgid="505558545611516707">"Never use HDCP checking"</item> + <item msgid="3878793616631049349">"Use HDCP checking for DRM content only"</item> + <item msgid="45075631231212732">"Always use HDCP checking"</item> + </string-array> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP 1.4 (Default)"</item> + <item msgid="2089555299377409443">"AVRCP 1.5"</item> + <item msgid="2895327394279434278">"AVRCP 1.6"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="1913619118958233129">"avrcp15"</item> + <item msgid="7142710449249088270">"avrcp16"</item> + </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> + <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> + <item msgid="3093023430402746802">"Use System Selection (Default)"</item> + <item msgid="8895532488906185219">"44.1 kHz"</item> + <item msgid="2909915718994807056">"48.0 kHz"</item> + <item msgid="3347287377354164611">"88.2 kHz"</item> + <item msgid="1234212100239985373">"96.0 kHz"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_sample_rate_summaries"> + <item msgid="3214516120190965356">"Use System Selection (Default)"</item> + <item msgid="4482862757811638365">"44.1 kHz"</item> + <item msgid="354495328188724404">"48.0 kHz"</item> + <item msgid="7329816882213695083">"88.2 kHz"</item> + <item msgid="6967397666254430476">"96.0 kHz"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> + <item msgid="2684127272582591429">"Use System Selection (Default)"</item> + <item msgid="5618929009984956469">"16 bits/sample"</item> + <item msgid="3412640499234627248">"24 bits/sample"</item> + <item msgid="121583001492929387">"32 bits/sample"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> + <item msgid="1081159789834584363">"Use System Selection (Default)"</item> + <item msgid="4726688794884191540">"16 bits/sample"</item> + <item msgid="305344756485516870">"24 bits/sample"</item> + <item msgid="244568657919675099">"32 bits/sample"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> + <item msgid="5226878858503393706">"Use System Selection (Default)"</item> + <item msgid="4106832974775067314">"Mono"</item> + <item msgid="5571632958424639155">"Stereo"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> + <item msgid="4118561796005528173">"Use System Selection (Default)"</item> + <item msgid="8900559293912978337">"Mono"</item> + <item msgid="8883739882299884241">"Stereo"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles"> + <item msgid="7158319962230727476">"Optimised for Audio Quality (990kbps/909kbps)"</item> + <item msgid="2921767058740704969">"Balanced Audio And Connection Quality (660 kbps/606 kbps)"</item> + <item msgid="8860982705384396512">"Optimised for Connection Quality (330kbps/303kbps)"</item> + <item msgid="4414060457677684127">"Best Effort (Adaptive Bit Rate)"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> + <item msgid="6398189564246596868">"Optimised for Audio Quality"</item> + <item msgid="4327143584633311908">"Balanced Audio and Connection Quality"</item> + <item msgid="4681409244565426925">"Optimised for Connection Quality"</item> + <item msgid="364670732877872677">"Best Effort (Adaptive Bit Rate)"</item> + </string-array> + <string-array name="select_logd_size_titles"> + <item msgid="8665206199209698501">"Off"</item> + <item msgid="1593289376502312923">"64 K"</item> + <item msgid="487545340236145324">"256 K"</item> + <item msgid="2423528675294333831">"1 M"</item> + <item msgid="180883774509476541">"4 M"</item> + <item msgid="2803199102589126938">"16 M"</item> + </string-array> + <string-array name="select_logd_size_lowram_titles"> + <item msgid="6089470720451068364">"Off"</item> + <item msgid="4622460333038586791">"64 K"</item> + <item msgid="2212125625169582330">"256 K"</item> + <item msgid="1704946766699242653">"1 M"</item> + </string-array> + <string-array name="select_logd_size_summaries"> + <item msgid="6921048829791179331">"Off"</item> + <item msgid="2969458029344750262">"64 K per log buffer"</item> + <item msgid="1342285115665698168">"256 K per log buffer"</item> + <item msgid="1314234299552254621">"1 M per log buffer"</item> + <item msgid="3606047780792894151">"4 M per log buffer"</item> + <item msgid="5431354956856655120">"16 M per log buffer"</item> + </string-array> + <string-array name="select_logpersist_titles"> + <item msgid="1744840221860799971">"Off"</item> + <item msgid="3054662377365844197">"All"</item> + <item msgid="688870735111627832">"All but radio"</item> + <item msgid="2850427388488887328">"kernel only"</item> + </string-array> + <string-array name="select_logpersist_summaries"> + <item msgid="2216470072500521830">"Off"</item> + <item msgid="172978079776521897">"All log buffers"</item> + <item msgid="3873873912383879240">"All but radio log buffers"</item> + <item msgid="8489661142527693381">"kernel log buffer only"</item> + </string-array> + <string-array name="window_animation_scale_entries"> + <item msgid="8134156599370824081">"Animation off"</item> + <item msgid="6624864048416710414">"Animation scale .5x"</item> + <item msgid="2219332261255416635">"Animation scale 1x"</item> + <item msgid="3544428804137048509">"Animation scale 1.5x"</item> + <item msgid="3110710404225974514">"Animation scale 2x"</item> + <item msgid="4402738611528318731">"Animation scale 5x"</item> + <item msgid="6189539267968330656">"Animation scale 10x"</item> + </string-array> + <string-array name="transition_animation_scale_entries"> + <item msgid="8464255836173039442">"Animation off"</item> + <item msgid="3375781541913316411">"Animation scale .5x"</item> + <item msgid="1991041427801869945">"Animation scale 1x"</item> + <item msgid="4012689927622382874">"Animation scale 1.5x"</item> + <item msgid="3289156759925947169">"Animation scale 2x"</item> + <item msgid="7705857441213621835">"Animation scale 5x"</item> + <item msgid="6660750935954853365">"Animation scale 10x"</item> + </string-array> + <string-array name="animator_duration_scale_entries"> + <item msgid="6039901060648228241">"Animation off"</item> + <item msgid="1138649021950863198">"Animation scale .5x"</item> + <item msgid="4394388961370833040">"Animation scale 1x"</item> + <item msgid="8125427921655194973">"Animation scale 1.5x"</item> + <item msgid="3334024790739189573">"Animation scale 2x"</item> + <item msgid="3170120558236848008">"Animation scale 5x"</item> + <item msgid="1069584980746680398">"Animation scale 10x"</item> + </string-array> + <string-array name="overlay_display_devices_entries"> + <item msgid="1606809880904982133">"None"</item> + <item msgid="9033194758688161545">"480 p"</item> + <item msgid="1025306206556583600">"480p (secure)"</item> + <item msgid="1853913333042744661">"720p"</item> + <item msgid="3414540279805870511">"720p (secure)"</item> + <item msgid="9039818062847141551">"1080p"</item> + <item msgid="4939496949750174834">"1080p (secure)"</item> + <item msgid="1833612718524903568">"4K"</item> + <item msgid="238303513127879234">"4K (secure)"</item> + <item msgid="3547211260846843098">"4K (upscaled)"</item> + <item msgid="5411365648951414254">"4K (upscaled, secure)"</item> + <item msgid="1311305077526792901">"720p, 1080p (dual screen)"</item> + </string-array> + <string-array name="enable_opengl_traces_entries"> + <item msgid="3191973083884253830">"None"</item> + <item msgid="9089630089455370183">"Logcat"</item> + <item msgid="5397807424362304288">"Systrace (Graphics)"</item> + <item msgid="1340692776955662664">"Call stack on glGetError"</item> + </string-array> + <string-array name="show_non_rect_clip_entries"> + <item msgid="993742912147090253">"Off"</item> + <item msgid="675719912558941285">"Draw non-rectangular clip region in blue"</item> + <item msgid="1064373276095698656">"Highlight tested drawing commands in green"</item> + </string-array> + <string-array name="track_frame_time_entries"> + <item msgid="2193584639058893150">"Off"</item> + <item msgid="2751513398307949636">"On screen as bars"</item> + <item msgid="2355151170975410323">"In <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item> + </string-array> + <string-array name="debug_hw_overdraw_entries"> + <item msgid="8190572633763871652">"Off"</item> + <item msgid="7688197031296835369">"Show overdraw areas"</item> + <item msgid="2290859360633824369">"Show areas for Deuteranomaly"</item> + </string-array> + <string-array name="debug_hw_renderer_entries"> + <item msgid="2578620445459945681">"OpenGL (Default)"</item> + <item msgid="2839130076198120436">"OpenGL (Skia)"</item> + </string-array> + <string-array name="app_process_limit_entries"> + <item msgid="3401625457385943795">"Standard limit"</item> + <item msgid="4071574792028999443">"No background processes"</item> + <item msgid="4810006996171705398">"At most, 1 process"</item> + <item msgid="8586370216857360863">"At most, 2 processes"</item> + <item msgid="836593137872605381">"At most, 3 processes"</item> + <item msgid="7899496259191969307">"At most, 4 processes"</item> + </string-array> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"Charging"</item> + <item msgid="5220695614993094977">"MTP (Media Transfer Protocol)"</item> + <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol)"</item> + <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> + <item msgid="1718924214939774352">"Audio Source"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> +</resources> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..b427efe4a070 --- /dev/null +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -0,0 +1,391 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Can\'t scan for networks"</string> + <string name="wifi_security_none" msgid="7985461072596594400">"None"</string> + <string name="wifi_remembered" msgid="4955746899347821096">"Saved"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"Disabled"</string> + <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP Configuration Failure"</string> + <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Not connected due to low quality network"</string> + <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Wi-Fi Connection Failure"</string> + <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"Authentication problem"</string> + <string name="wifi_cant_connect" msgid="5410016875644565884">"Can\'t connect"</string> + <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"Can\'t connect to \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string> + <string name="wifi_check_password_try_again" msgid="516958988102584767">"Check password and try again"</string> + <string name="wifi_not_in_range" msgid="1136191511238508967">"Not in range"</string> + <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Won\'t automatically connect"</string> + <string name="wifi_no_internet" msgid="3880396223819116454">"No Internet access"</string> + <string name="saved_network" msgid="4352716707126620811">"Saved by <xliff:g id="NAME">%1$s</xliff:g>"</string> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatically connected via %1$s"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatically connected via network rating provider"</string> + <string name="connected_via_passpoint" msgid="2826205693803088747">"Connected via %1$s"</string> + <string name="available_via_passpoint" msgid="1617440946846329613">"Available via %1$s"</string> + <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Connected, no Internet"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"Access point temporarily full"</string> + <string name="connected_via_carrier" msgid="7583780074526041912">"Connected via %1$s"</string> + <string name="available_via_carrier" msgid="1469036129740799053">"Available via %1$s"</string> + <string name="speed_label_very_slow" msgid="1867055264243608530">"Very slow"</string> + <string name="speed_label_slow" msgid="813109590815810235">"Slow"</string> + <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string> + <string name="speed_label_medium" msgid="3175763313268941953">"Medium"</string> + <string name="speed_label_fast" msgid="7715732164050975057">"Fast"</string> + <string name="speed_label_very_fast" msgid="2265363430784523409">"Very fast"</string> + <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> + <string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string> + <string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string> + <string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string> + <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string> + <string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string> + <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string> + <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string> + <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string> + <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string> + <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string> + <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string> + <string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"Input device"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"Internet access"</string> + <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"Contact sharing"</string> + <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"Use for contact sharing"</string> + <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Internet connection sharing"</string> + <string name="bluetooth_profile_map" msgid="1019763341565580450">"Text messages"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string> + <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> + <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string> + <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string> + <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string> + <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"Connected to map"</string> + <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"Connected to SAP"</string> + <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"Not connected to file-transfer server"</string> + <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"Connected to input device"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"Connected to device for Internet access"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"Sharing local Internet connection with device"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"Use for Internet access"</string> + <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"Use for map"</string> + <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"Use for SIM access"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"Use for media audio"</string> + <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string> + <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string> + <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string> + <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Pairing grants access to your contacts and call history when connected."</string> + <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Couldn\'t pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Couldn\'t pair with <xliff:g id="DEVICE_NAME">%1$s</xliff:g> because of an incorrect PIN or passkey."</string> + <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Can\'t communicate with <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"Pairing rejected by <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> + <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wi-Fi off."</string> + <string name="accessibility_no_wifi" msgid="8834610636137374508">"Wi-Fi disconnected."</string> + <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wi-Fi one bar."</string> + <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"Wi-Fi two bars."</string> + <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"Wi-Fi three bars."</string> + <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"Wi-Fi signal full."</string> + <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"Open network"</string> + <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"Secure network"</string> + <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> + <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Removed apps"</string> + <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Removed apps and users"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB tethering"</string> + <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Portable hotspot"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth tethering"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Tethering"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Tethering & portable hotspot"</string> + <string name="managed_user_title" msgid="8109605045406748842">"All work apps"</string> + <string name="user_guest" msgid="8475274842845401871">"Guest"</string> + <string name="unknown" msgid="1592123443519355854">"Unknown"</string> + <string name="running_process_item_user_label" msgid="3129887865552025943">"User: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> + <string name="launch_defaults_some" msgid="313159469856372621">"Some defaults set"</string> + <string name="launch_defaults_none" msgid="4241129108140034876">"No defaults set"</string> + <string name="tts_settings" msgid="8186971894801348327">"Text-to-speech settings"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"Text-to-speech output"</string> + <string name="tts_default_rate_title" msgid="6030550998379310088">"Speech rate"</string> + <string name="tts_default_rate_summary" msgid="4061815292287182801">"Speed at which the text is spoken"</string> + <string name="tts_default_pitch_title" msgid="6135942113172488671">"Pitch"</string> + <string name="tts_default_pitch_summary" msgid="1944885882882650009">"Affects the tone of the synthesised speech"</string> + <string name="tts_default_lang_title" msgid="8018087612299820556">"Language"</string> + <string name="tts_lang_use_system" msgid="2679252467416513208">"Use system language"</string> + <string name="tts_lang_not_selected" msgid="7395787019276734765">"Language not selected"</string> + <string name="tts_default_lang_summary" msgid="5219362163902707785">"Sets the language-specific voice for the spoken text"</string> + <string name="tts_play_example_title" msgid="7094780383253097230">"Listen to an example"</string> + <string name="tts_play_example_summary" msgid="8029071615047894486">"Play a short demonstration of speech synthesis"</string> + <string name="tts_install_data_title" msgid="4264378440508149986">"Install voice data"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"Install the voice data required for speech synthesis"</string> + <string name="tts_engine_security_warning" msgid="8786238102020223650">"This speech synthesis engine may be able to collect all the text that will be spoken, including personal data like passwords and credit card numbers. It comes from the <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> engine. Enable the use of this speech synthesis engine?"</string> + <string name="tts_engine_network_required" msgid="1190837151485314743">"This language requires a working network connection for text-to-speech output."</string> + <string name="tts_default_sample_string" msgid="4040835213373086322">"This is an example of speech synthesis"</string> + <string name="tts_status_title" msgid="7268566550242584413">"Default language status"</string> + <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> is fully supported"</string> + <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> requires network connection"</string> + <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> is not supported"</string> + <string name="tts_status_checking" msgid="5339150797940483592">"Checking…"</string> + <string name="tts_engine_settings_title" msgid="3499112142425680334">"Settings for <xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>"</string> + <string name="tts_engine_settings_button" msgid="1030512042040722285">"Launch engine settings"</string> + <string name="tts_engine_preference_section_title" msgid="448294500990971413">"Preferred engine"</string> + <string name="tts_general_section_title" msgid="4402572014604490502">"General"</string> + <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Reset speech pitch"</string> + <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Reset the pitch at which the text is spoken to default."</string> + <string-array name="tts_rate_entries"> + <item msgid="6695494874362656215">"Very slow"</item> + <item msgid="4795095314303559268">"Slow"</item> + <item msgid="8903157781070679765">"Normal"</item> + <item msgid="164347302621392996">"Fast"</item> + <item msgid="5794028588101562009">"Faster"</item> + <item msgid="7163942783888652942">"Very fast"</item> + <item msgid="7831712693748700507">"Rapid"</item> + <item msgid="5194774745031751806">"Very rapid"</item> + <item msgid="9085102246155045744">"Fastest"</item> + </string-array> + <string name="choose_profile" msgid="6921016979430278661">"Choose profile"</string> + <string name="category_personal" msgid="1299663247844969448">"Personal"</string> + <string name="category_work" msgid="8699184680584175622">"Work"</string> + <string name="development_settings_title" msgid="215179176067683667">"Developer options"</string> + <string name="development_settings_enable" msgid="542530994778109538">"Enable developer options"</string> + <string name="development_settings_summary" msgid="1815795401632854041">"Set options for app development"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"Developer options are not available for this user"</string> + <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN settings are not available for this user"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"Tethering settings are not available for this user"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"Access Point Name settings are not available for this user"</string> + <string name="enable_adb" msgid="7982306934419797485">"USB debugging"</string> + <string name="enable_adb_summary" msgid="4881186971746056635">"Debug mode when USB is connected"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"Revoke USB debugging authorisations"</string> + <string name="bugreport_in_power" msgid="7923901846375587241">"Bug report shortcut"</string> + <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Show a button in the power menu for taking a bug report"</string> + <string name="keep_screen_on" msgid="1146389631208760344">"Stay awake"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"Screen will never sleep while charging"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Enable Bluetooth HCI snoop log"</string> + <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"Capture all Bluetooth HCI packets in a file"</string> + <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM unlocking"</string> + <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Allow the bootloader to be unlocked"</string> + <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"Allow OEM unlocking?"</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"WARNING: Device protection features will not work on this device while this setting is turned on."</string> + <string name="mock_location_app" msgid="7966220972812881854">"Select mock location app"</string> + <string name="mock_location_app_not_set" msgid="809543285495344223">"No mock location app set"</string> + <string name="mock_location_app_set" msgid="8966420655295102685">"Mock location app: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="debug_networking_category" msgid="7044075693643009662">"Networking"</string> + <string name="wifi_display_certification" msgid="8611569543791307533">"Wireless display certification"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"Enable Wi‑Fi verbose logging"</string> + <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Aggressive Wi‑Fi to mobile handover"</string> + <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Always allow Wi‑Fi Roam Scans"</string> + <string name="mobile_data_always_on" msgid="8774857027458200434">"Mobile data always active"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"Tethering hardware acceleration"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Disable absolute volume"</string> + <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"Enable in-band ringing"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP Version"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Select Bluetooth AVRCP Version"</string> + <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio Codec"</string> + <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Select Bluetooth Audio Codec"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth Audio Sample Rate"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Select Bluetooth Audio Codec:\nSample Rate"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"Bluetooth Audio Bits Per Sample"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Select Bluetooth Audio Codec:\nBits Per Sample"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth Audio Channel Mode"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Select Bluetooth Audio Codec:\nChannel Mode"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth Audio LDAC Codec: Playback Quality"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Select Bluetooth Audio LDAC Codec:\nPlayback Quality"</string> + <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Streaming: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> + <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Show options for wireless display certification"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Increase Wi‑Fi logging level, show per SSID RSSI in Wi‑Fi Picker"</string> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"When enabled, Wi‑Fi will be more aggressive in handing over the data connection to mobile, when Wi‑Fi signal is low"</string> + <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"Allow/Disallow Wi‑Fi Roam Scans based on the amount of data traffic present at the interface"</string> + <string name="select_logd_size_title" msgid="7433137108348553508">"Logger buffer sizes"</string> + <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Select Logger sizes per log buffer"</string> + <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"Clear logger persistent storage?"</string> + <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"When we are no longer monitoring with the persistent logger, we are required to erase the logger data resident on your device."</string> + <string name="select_logpersist_title" msgid="7530031344550073166">"Store logger data persistently on device"</string> + <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"Select log buffers to store persistently on device"</string> + <string name="select_usb_configuration_title" msgid="2649938511506971843">"Select USB Configuration"</string> + <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"Select USB Configuration"</string> + <string name="allow_mock_location" msgid="2787962564578664888">"Allow mock locations"</string> + <string name="allow_mock_location_summary" msgid="317615105156345626">"Allow mock locations"</string> + <string name="debug_view_attributes" msgid="6485448367803310384">"Enable view attribute inspection"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Always keep mobile data active, even when Wi‑Fi is active (for fast network switching)."</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"Use tethering hardware acceleration if available"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"Allow USB debugging?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB debugging is intended for development purposes only. Use it to copy data between your computer and your device, install apps on your device without notification and read log data."</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"Revoke access to USB debugging from all computers you\'ve previously authorised?"</string> + <string name="dev_settings_warning_title" msgid="7244607768088540165">"Allow development settings?"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"These settings are intended for development use only. They can cause your device and the applications on it to break or misbehave."</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verify apps over USB"</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"Check apps installed via ADB/ADT for harmful behaviour."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"Disables the Bluetooth absolute volume feature in case of volume issues with remote devices such as unacceptably loud volume or lack of control."</string> + <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"Allow ringtones on the phone to be played on Bluetooth headsets"</string> + <string name="enable_terminal_title" msgid="95572094356054120">"Local terminal"</string> + <string name="enable_terminal_summary" msgid="67667852659359206">"Enable terminal app that offers local shell access"</string> + <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP checking"</string> + <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"Set HDCP checking behaviour"</string> + <string name="debug_debugging_category" msgid="6781250159513471316">"Debugging"</string> + <string name="debug_app" msgid="8349591734751384446">"Select debug app"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"No debug application set"</string> + <string name="debug_app_set" msgid="2063077997870280017">"Debugging application: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="select_application" msgid="5156029161289091703">"Select application"</string> + <string name="no_application" msgid="2813387563129153880">"Nothing"</string> + <string name="wait_for_debugger" msgid="1202370874528893091">"Wait for debugger"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"Debugged application waits for debugger to attach before executing"</string> + <string name="telephony_monitor_switch" msgid="1764958220062121194">"Telephony Monitor"</string> + <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"TelephonyMonitor will collect logs when it detects a problem with telephony/modem functionality and prompt notification to user to file a bug"</string> + <string name="debug_input_category" msgid="1811069939601180246">"Input"</string> + <string name="debug_drawing_category" msgid="6755716469267367852">"Drawing"</string> + <string name="debug_hw_drawing_category" msgid="6220174216912308658">"Hardware accelerated rendering"</string> + <string name="media_category" msgid="4388305075496848353">"Media"</string> + <string name="debug_monitoring_category" msgid="7640508148375798343">"Monitoring"</string> + <string name="strict_mode" msgid="1938795874357830695">"Strict mode enabled"</string> + <string name="strict_mode_summary" msgid="142834318897332338">"Flash screen when apps do long operations on main thread"</string> + <string name="pointer_location" msgid="6084434787496938001">"Pointer location"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"Screen overlay showing current touch data"</string> + <string name="show_touches" msgid="2642976305235070316">"Show taps"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"Show visual feedback for taps"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"Show surface updates"</string> + <string name="show_screen_updates_summary" msgid="2569622766672785529">"Flash entire window surfaces when they update"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"Show GPU view updates"</string> + <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"Flash views inside windows when drawn with the GPU"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string> + <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string> + <string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string> + <string name="debug_hw_renderer" msgid="7568529019431785816">"Set GPU Renderer"</string> + <string name="disable_overlays" msgid="2074488440505934665">"Disable HW overlays"</string> + <string name="disable_overlays_summary" msgid="3578941133710758592">"Always use GPU for screen compositing"</string> + <string name="simulate_color_space" msgid="6745847141353345872">"Simulate colour space"</string> + <string name="enable_opengl_traces_title" msgid="6790444011053219871">"Enable OpenGL traces"</string> + <string name="usb_audio_disable_routing" msgid="8114498436003102671">"Disable USB audio routing"</string> + <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"Disable automatic routing to USB audio peripherals"</string> + <string name="debug_layout" msgid="5981361776594526155">"Show layout bounds"</string> + <string name="debug_layout_summary" msgid="2001775315258637682">"Show clip bounds, margins, etc."</string> + <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Force RTL layout direction"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Force screen layout direction to RTL for all locales"</string> + <string name="force_hw_ui" msgid="6426383462520888732">"Force GPU rendering"</string> + <string name="force_hw_ui_summary" msgid="5535991166074861515">"Force use of GPU for 2D drawing"</string> + <string name="force_msaa" msgid="7920323238677284387">"Force 4x MSAA"</string> + <string name="force_msaa_summary" msgid="9123553203895817537">"Enable 4x MSAA in OpenGL ES 2.0 apps"</string> + <string name="show_non_rect_clip" msgid="505954950474595172">"Debug non-rectangular clip operations"</string> + <string name="track_frame_time" msgid="6146354853663863443">"Profile GPU rendering"</string> + <string name="window_animation_scale_title" msgid="6162587588166114700">"Window animation scale"</string> + <string name="transition_animation_scale_title" msgid="387527540523595875">"Transition animation scale"</string> + <string name="animator_duration_scale_title" msgid="3406722410819934083">"Animator duration scale"</string> + <string name="overlay_display_devices_title" msgid="5364176287998398539">"Simulate secondary displays"</string> + <string name="debug_applications_category" msgid="4206913653849771549">"Apps"</string> + <string name="immediately_destroy_activities" msgid="1579659389568133959">"Don\'t keep activities"</string> + <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"Destroy every activity as soon as the user leaves it"</string> + <string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string> + <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> + <string name="show_notification_channel_warnings" msgid="1399948193466922683">"Show notification channel warnings"</string> + <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"Displays on-screen warning when an app posts a notification without a valid channel"</string> + <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> + <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"Make all activities resizable for multi-window, regardless of manifest values."</string> + <string name="enable_freeform_support" msgid="1461893351278940416">"Enable freeform windows"</string> + <string name="enable_freeform_support_summary" msgid="8247310463288834487">"Enable support for experimental freeform windows."</string> + <string name="local_backup_password_title" msgid="3860471654439418822">"Desktop backup password"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"Desktop full backups aren\'t currently protected"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"Tap to change or remove the password for desktop full backups"</string> + <string name="local_backup_password_toast_success" msgid="582016086228434290">"New backup password set"</string> + <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"New password and confirmation don\'t match"</string> + <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Failure setting backup password"</string> + <string-array name="color_mode_names"> + <item msgid="2425514299220523812">"Vibrant (default)"</item> + <item msgid="8446070607501413455">"Natural"</item> + <item msgid="6553408765810699025">"Standard"</item> + </string-array> + <string-array name="color_mode_descriptions"> + <item msgid="4979629397075120893">"Enhanced colours"</item> + <item msgid="8280754435979370728">"Natural colours as seen by the eye"</item> + <item msgid="5363960654009010371">"Colours optimised for digital content"</item> + </string-array> + <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string> + <string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string> + <string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string> + <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"Set WebView implementation"</string> + <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"This choice is no longer valid. Try again."</string> + <string name="convert_to_file_encryption" msgid="3060156730651061223">"Convert to file encryption"</string> + <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"Convert…"</string> + <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"Already file encrypted"</string> + <string name="title_convert_fbe" msgid="1263622876196444453">"Converting to file-based encryption"</string> + <string name="convert_to_fbe_warning" msgid="6139067817148865527">"Convert data partition to file-based encryption.\n !!Warning!! This will delete all your data.\n This feature is alpha, and may not work correctly.\n Press \'Wipe and convert…\' to continue."</string> + <string name="button_convert_fbe" msgid="5152671181309826405">"Wipe and convert…"</string> + <string name="picture_color_mode" msgid="4560755008730283695">"Picture colour mode"</string> + <string name="picture_color_mode_desc" msgid="1141891467675548590">"Use sRGB"</string> + <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Disabled"</string> + <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"Monochromacy"</string> + <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"Deuteranomaly (red-green)"</string> + <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomaly (red-green)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (blue-yellow)"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Colour correction"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string> + <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string> + <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string> + <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string> + <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – about <xliff:g id="TIME">^2</xliff:g> left"</string> + <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string> + <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string> + <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string> + <string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string> + <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> + <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> + <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> + <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"Enabled by admin"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"Disabled by admin"</string> + <string name="disabled" msgid="9206776641295849915">"Disabled"</string> + <string name="external_source_trusted" msgid="2707996266575928037">"Allowed"</string> + <string name="external_source_untrusted" msgid="2677442511837596726">"Not allowed"</string> + <string name="install_other_apps" msgid="6986686991775883017">"Install unknown apps"</string> + <string name="home" msgid="3256884684164448244">"Settings Home"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> + </string-array> + <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ago"</string> + <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> left"</string> + <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Small"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Default"</string> + <string name="screen_zoom_summary_large" msgid="4835294730065424084">"Large"</string> + <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Larger"</string> + <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Largest"</string> + <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> + <string name="retail_demo_reset_message" msgid="118771671364131297">"Enter password to perform factory reset in demo mode"</string> + <string name="retail_demo_reset_next" msgid="8356731459226304963">"Next"</string> + <string name="retail_demo_reset_title" msgid="696589204029930100">"Password required"</string> + <string name="active_input_method_subtypes" msgid="3596398805424733238">"Active input methods"</string> + <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Use system languages"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Failed to open settings for <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"This input method may be able to collect all the text that you type, including personal data like passwords and credit card numbers. It comes from the app <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Use this input method?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"Note: After a reboot, this app can\'t start until you unlock your phone"</string> +</resources> diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml index 77af30ecb6f8..bb48f2f29a34 100644 --- a/packages/SettingsLib/res/values-en-rGB/arrays.xml +++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Use System Selection (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Enable Optional Codecs"</item> - <item msgid="3304843301758635896">"Disable Optional Codecs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Use System Selection (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Enable Optional Codecs"</item> - <item msgid="741805482892725657">"Disable Optional Codecs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Use System Selection (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index bbc114463582..b427efe4a070 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Enabled by admin"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml index 77af30ecb6f8..bb48f2f29a34 100644 --- a/packages/SettingsLib/res/values-en-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Use System Selection (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Enable Optional Codecs"</item> - <item msgid="3304843301758635896">"Disable Optional Codecs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Use System Selection (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Enable Optional Codecs"</item> - <item msgid="741805482892725657">"Disable Optional Codecs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Use System Selection (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index bbc114463582..b427efe4a070 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Enabled by admin"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml index 1a110ea0ac5a..be061721acab 100644 --- a/packages/SettingsLib/res/values-en-rXC/arrays.xml +++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Use System Selection (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Enable Optional Codecs"</item> - <item msgid="3304843301758635896">"Disable Optional Codecs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Use System Selection (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Enable Optional Codecs"</item> - <item msgid="741805482892725657">"Disable Optional Codecs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Use System Selection (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 6af9692ad5cc..4cf842b7cfbd 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> until fully charged"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Not charging"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Plugged in, can\'t charge right now"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Full"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlled by admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Enabled by admin"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index ef6911401627..512591f12e06 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usar selección del sistema (predeterminado)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Habilitar códecs opcionales"</item> - <item msgid="3304843301758635896">"Inhabilitar códecs opcionales"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usar selección del sistema (predeterminado)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Habilitar códecs opcionales"</item> - <item msgid="741805482892725657">"Inhabilitar códecs opcionales"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usar selección del sistema (predeterminado)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 8eff989dc8ff..5869d13dfcee 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -119,7 +119,7 @@ <string name="user_guest" msgid="8475274842845401871">"Invitado"</string> <string name="unknown" msgid="1592123443519355854">"Desconocido"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Usuario: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> - <string name="launch_defaults_some" msgid="313159469856372621">"Hay algunas configuraciones predeterminadas establecidas."</string> + <string name="launch_defaults_some" msgid="313159469856372621">"Configuraciones predeterminadas establecidas"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"No hay configuraciones predeterminadas establecidas."</string> <string name="tts_settings" msgid="8186971894801348327">"Configuración de texto a voz"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Salida de texto a voz"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tiempo restante: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> (<xliff:g id="TIME">^2</xliff:g> para completar la carga)"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconocido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"No se está cargando."</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Conectado. No se puede cargar en este momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Cargado"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlada por el administrador"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"El administrador habilitó esta opción"</string> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index 53c547dacd85..55ff28bd1e75 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usar preferencia del sistema (predeter.)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Habilitar códecs opcionales"</item> - <item msgid="3304843301758635896">"Inhabilitar códecs opcionales"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usar preferencia del sistema (predeter.)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Habilitar códecs opcionales"</item> - <item msgid="741805482892725657">"Inhabilitar códecs opcionales"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usar preferencia del sistema (predeter.)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 4ac4b27db638..f57d70360188 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tiempo restante: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> para completar la carga"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconocido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"No se está cargando"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Se ha conectado, pero no se puede cargar en este momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Completa"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlada por el administrador"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Habilitada por el administrador"</string> diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml index 77668900b27e..b4cc90f527fd 100644 --- a/packages/SettingsLib/res/values-et/arrays.xml +++ b/packages/SettingsLib/res/values-et/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Süsteemi valiku kasutamine (vaikeseade)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Lubatakse valikulised kodekid"</item> - <item msgid="3304843301758635896">"Keelatakse valikulised kodekid"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Süsteemi valiku kasutamine (vaikeseade)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Lubatakse valikulised kodekid"</item> - <item msgid="741805482892725657">"Keelatakse valikulised kodekid"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Süsteemi valiku kasutamine (vaikeseade)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 28a2a596d627..156bca4db077 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> on jäänud"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> täislaadimiseni"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Tundmatu"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Laadimine"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laadimine"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ei lae"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Vooluvõrgus, praegu ei saa laadida"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Täis"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Juhib administraator"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Administraatori lubatud"</string> diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 444ffbc4de22..13912c145861 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Erabili sistema-hautapena (lehenetsia)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Gaitu aukerako kodekak"</item> - <item msgid="3304843301758635896">"Desgaitu aukerako kodekak"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Erabili sistema-hautapena (lehenetsia)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Gaitu aukerako kodekak"</item> - <item msgid="741805482892725657">"Desgaitu aukerako kodekak"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Erabili sistema-hautapena (lehenetsia)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 4e19b9942b91..831718cf3257 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> guztiz kargatu arte"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> guztiz kargatu arte"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Ezezaguna"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Kargatzen"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"kargatzen"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ez da kargatzen ari"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Konektatuta dago. Ezin da kargatu une honetan."</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Beteta"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Administratzaileak kontrolatzen du"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Administratzaileak gaitu du"</string> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index b9fa5e40f603..711a2e47ba2c 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp نسخه ۱۵"</item> <item msgid="7142710449249088270">"avrcp نسخه ۱۶"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"استفاده از انتخاب سیستم (پیشفرض)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"فعال کردن کدکهای اختیاری"</item> - <item msgid="3304843301758635896">"غیرفعال کردن کدکهای اختیاری"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"استفاده از انتخاب سیستم (پیشفرض)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"فعال کردن کدکهای اختیاری"</item> - <item msgid="741805482892725657">"غیرفعال کردن کدکهای اختیاری"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"استفاده از انتخاب سیستم (پیشفرض)"</item> <item msgid="8895532488906185219">"۴۴٫۱ کیلوهرتز"</item> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 15facd8bf190..b825d407c7a4 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> باقی مانده"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> مانده تا شارژ کامل"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ناشناس"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"در حال شارژ شدن"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"درحال شارژ شدن"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"شارژ نمیشود"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"به برق وصل شده است، درحالحاضر شارژ نمیشود"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"پر"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"توسط سرپرست سیستم کنترل میشود"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"فعالشده توسط سرپرست"</string> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index 7a5f8604face..2caae5b15474 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Käytä järjestelmän valintaa (oletus)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Ota valinnaiset koodekit käyttöön"</item> - <item msgid="3304843301758635896">"Poista valinnaiset koodekit käytöstä"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Käytä järjestelmän valintaa (oletus)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Ota valinnaiset koodekit käyttöön"</item> - <item msgid="741805482892725657">"Poista valinnaiset koodekit käytöstä"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Käytä järjestelmän valintaa (oletus)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 59ba1379d246..0e4ecad8c090 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -119,7 +119,7 @@ <string name="user_guest" msgid="8475274842845401871">"Vieras"</string> <string name="unknown" msgid="1592123443519355854">"Tuntematon"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Käyttäjä: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> - <string name="launch_defaults_some" msgid="313159469856372621">"Joitakin oletuksia on asetettu."</string> + <string name="launch_defaults_some" msgid="313159469856372621">"Joitakin oletuksia on asetettu"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Oletuksia ei asetettu."</string> <string name="tts_settings" msgid="8186971894801348327">"Tekstistä puheeksi -asetukset"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Tekstistä puheeksi -toisto"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> jäljellä"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> täyteen lataukseen"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Tuntematon"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Ladataan"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ladataan"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ei laturissa"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Kytketty virtalähteeseen, lataaminen ei onnistu"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Täynnä"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Järjestelmänvalvojan käyttöön ottama"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 29348c921595..996e3c2290ca 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Utiliser sélect. du système (par défaut)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Activer les codecs optionnels"</item> - <item msgid="3304843301758635896">"Désactiver les codecs optionnels"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Utiliser sélect. du système (par défaut)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Activer les codecs optionnels"</item> - <item msgid="741805482892725657">"Désactiver les codecs optionnels"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Utiliser sélect. du système (par défaut)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 201984c3415e..cd3defe3b36a 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – Temps restant : <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> : <xliff:g id="TIME">^2</xliff:g> jusqu\'à la charge complète"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Inconnu"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Charge en cours…"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"en cours de charge"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"N\'est pas en charge"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"L\'appareil est branché, mais il ne peut pas être chargé pour le moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Pleine"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Contrôlé par l\'administrateur"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Activé par l\'administrateur"</string> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index 1c3605e525b3..7d7706295dee 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Utiliser sélection système (par défaut)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Activer les codecs facultatifs"</item> - <item msgid="3304843301758635896">"Désactiver les codecs facultatifs"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Utiliser sélection système (par défaut)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Activer les codecs facultatifs"</item> - <item msgid="741805482892725657">"Désactiver les codecs facultatifs"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Utiliser sélection système (par défaut)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 281e9575371a..275f6d0b79a4 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – Temps restant : <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> jusqu\'à la charge complète"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Inconnu"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Batterie en charge"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"chargement…"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Pas en charge"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Appareil branché, mais impossible de le charger pour le moment"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"pleine"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Contrôlé par l\'administrateur"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Activé par l\'administrateur"</string> diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index 1bfbbdfe0870..163608cf8418 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usar selección sistema (predeterminado)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Activar códecs opcionais"</item> - <item msgid="3304843301758635896">"Desactivar códecs opcionais"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usa selección sistema (predeterminado)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Activa os códecs opcionais"</item> - <item msgid="741805482892725657">"Desactiva os códecs opcionais"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usar selección sistema (predeterminado)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 3311a5fe3017..523d5c2e3889 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> (tempo restante: <xliff:g id="TIME">^2</xliff:g>)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ata completar a carga"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> (<xliff:g id="TIME">^2</xliff:g>)"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Descoñecido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Non se está cargando"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Conectouse, pero non se pode cargar neste momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Completa"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Opción controlada polo administrador"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Activado polo administrador"</string> diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index 1fc1d7c5a1da..51537f2b0cbe 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"વૈકલ્પિક કોડેક સક્ષમ કરો"</item> - <item msgid="3304843301758635896">"વૈકલ્પિક કોડેક અક્ષમ કરો"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"વૈકલ્પિક કોડેક સક્ષમ કરો"</item> - <item msgid="741805482892725657">"વૈકલ્પિક કોડેક અક્ષમ કરો"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"સિસ્ટમ પસંદગીનો ઉપયોગ કરો (ડિફૉલ્ટ)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> @@ -238,7 +222,7 @@ </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"માનક સીમા"</item> - <item msgid="4071574792028999443">"કોઈ પૃષ્ઠભૂમિ પ્રક્રિયાઓ નથી"</item> + <item msgid="4071574792028999443">"કોઈ બૅકગ્રાઉન્ડ પ્રક્રિયાઓ નથી"</item> <item msgid="4810006996171705398">"સૌથી વધુ 1 પ્રક્રિયા"</item> <item msgid="8586370216857360863">"સૌથી વધુ 2 પ્રક્રિયા"</item> <item msgid="836593137872605381">"વધુમાં વધુ 3 પ્રક્રિયાઓ"</item> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index b931fd11ed74..8f236d8f9fa9 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -92,11 +92,11 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ફાઇલ સ્થાનાંતર માટે ઉપયોગ કરો"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ઇનપુટ માટે ઉપયોગ કરો"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"જોડી"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"જોડી કરો"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"જોડાણ બનાવો"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"રદ કરો"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"જોડી કરવી એ કનેક્ટ કરેલ હોય ત્યારે તમારા સંપર્કો અને કૉલ ઇતિહાસની અૅક્સેસ આપે છે."</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"એ કનેક્ટ કરેલ હોય ત્યારે જોડાણ બનાવવાથી તમારા સંપર્કો અને કૉલ ઇતિહાસનો અૅક્સેસ મળે છે."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડી કરી શક્યાં નહીં."</string> - <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"એક ખોટા PIN અથવા પાસકીને કારણે <xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડી બનાવી શકાઈ નથી."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"એક ખોટા પિન અથવા પાસકીને કારણે <xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડી બનાવી શકાઈ નથી."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે સંચાર કરી શકાતો નથી."</string> <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> દ્વારા જોડી કરવાનું નકાર્યું."</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi બંધ."</string> @@ -111,10 +111,10 @@ <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"દૂર કરેલી ઍપ્લિકેશનો"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"દૂર કરેલી ઍપ્લિકેશનો અને વપરાશકર્તાઓ"</string> <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ટિથરિંગ"</string> - <string name="tether_settings_title_wifi" msgid="3277144155960302049">"પોર્ટેબલ હોટસ્પોટ"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth ટિથરિંગ"</string> + <string name="tether_settings_title_wifi" msgid="3277144155960302049">"પોર્ટેબલ હૉટસ્પૉટ"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"બ્લૂટૂથ ટિથરિંગ"</string> <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ટિથરિંગ"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"ટિથરિંગ અને પોર્ટેબલ હોટસ્પોટ"</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="unknown" msgid="1592123443519355854">"અજાણ્યું"</string> @@ -175,10 +175,10 @@ <string name="clear_adb_keys" msgid="4038889221503122743">"USB ડીબગિંગ પ્રમાણીકરણોને રદબાતલ કરો"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"બગ રિપોર્ટ શોર્ટકટ"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"બગ રિપોર્ટ લેવા માટે પાવર મેનૂમાં એક બટન બતાવો"</string> - <string name="keep_screen_on" msgid="1146389631208760344">"જાગૃત રહો"</string> + <string name="keep_screen_on" msgid="1146389631208760344">"સક્રિય રાખો"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"ચાર્જિંગ દરમિયાન સ્ક્રીન ક્યારેય નિષ્ક્રિય થશે નહીં"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI સ્નૂપ લૉગ સક્ષમ કરો"</string> - <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ફાઇલમાં તમામ Bluetooth HCI પૅકેટ્સ કેપ્ચર કરો"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"બ્લૂટૂથ HCI સ્નૂપ લૉગ સક્ષમ કરો"</string> + <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ફાઇલમાં તમામ બ્લૂટૂથ HCI પૅકેટ્સ કેપ્ચર કરો"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM અનલૉકિંગ"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"બુટલોડર અનલૉક કરવાની મંજૂરી આપો"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ને અનલૉક કરવાની મંજૂરી આપીએ?"</string> @@ -187,31 +187,31 @@ <string name="mock_location_app_not_set" msgid="809543285495344223">"કોઈ મોક સ્થાન ઍપ્લિકેશન સેટ કરાયેલ નથી"</string> <string name="mock_location_app_set" msgid="8966420655295102685">"મોક સ્થાન ઍપ્લિકેશન: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"નેટવર્કિંગ"</string> - <string name="wifi_display_certification" msgid="8611569543791307533">"બિનતારી પ્રદર્શન પ્રમાણન"</string> - <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi-Fi વર્બોઝ લૉગિંગ સક્ષમ કરો"</string> + <string name="wifi_display_certification" msgid="8611569543791307533">"વાયરલેસ ડિસ્પ્લે પ્રમાણન"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"વાઇ-ફાઇ વર્બોઝ લૉગિંગ સક્ષમ કરો"</string> <string name="wifi_aggressive_handover" msgid="5309131983693661320">"સશક્ત Wi‑Fiથી મોબાઇલ પર હૅન્ડઓવર"</string> - <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"હંમેશા Wi‑Fi રોમ સ્કૅન્સને મંજૂરી આપો"</string> + <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"હંમેશા વાઇ-ફાઇ રોમ સ્કૅન્સને મંજૂરી આપો"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"મોબાઇલ ડેટા હંમેશાં સક્રિય"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ચોક્કસ વૉલ્યૂમને અક્ષમ કરો"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"બેંડમાં રિંગ કરવાનું સક્ષમ કરો"</string> - <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP સંસ્કરણ"</string> - <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Bluetooth AVRCP સંસ્કરણ પસંદ કરો"</string> - <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth ઑડિઓ કોડેક"</string> - <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Bluetooth ઑડિઓ LDAC કોડેક પસંદ કરો"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Bluetooth ઑડિઓ નમૂના દર"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"Bluetooth ઑડિઓ LDAC કોડેક પસંદ કરો:\nનમૂના દર"</string> - <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"નમૂના દીઠ Bluetooth ઑડિઓ બિટ"</string> - <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"Bluetooth ઑડિઓ કોડેક પસંદ કરો:\nનમૂના દીઠ બિટ"</string> - <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"Bluetooth ઑડિઓ ચેનલ મોડ"</string> - <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"Bluetooth ઑડિઓ કોડેક પસંદ કરો:\nચૅનલ મોડ"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"Bluetooth ઑડિઓ LDAC કોડેક: પ્લેબૅક ગુણવત્તા"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"Bluetooth ઑડિઓ LDAC કોડેક પસંદ કરો:\nપ્લેબૅક ગુણવત્તા"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"બ્લૂટૂથ AVRCP સંસ્કરણ"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"બ્લૂટૂથ AVRCP સંસ્કરણ પસંદ કરો"</string> + <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"બ્લૂટૂથ ઑડિઓ કોડેક"</string> + <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"બ્લૂટૂથ ઑડિઓ નમૂના દર"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો:\nનમૂના દર"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"નમૂના દીઠ બ્લૂટૂથ ઑડિઓ બિટ"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"બ્લૂટૂથ ઑડિઓ કોડેક પસંદ કરો:\nનમૂના દીઠ બિટ"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"બ્લૂટૂથ ઑડિઓ ચેનલ મોડ"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"બ્લૂટૂથ ઑડિઓ કોડેક પસંદ કરો:\nચૅનલ મોડ"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક: પ્લેબૅક ગુણવત્તા"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"બ્લૂટૂથ ઑડિઓ LDAC કોડેક પસંદ કરો:\nપ્લેબૅક ગુણવત્તા"</string> <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"સ્ટ્રીમિંગ: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Wi‑Fi લોગિંગ સ્તર વધારો, Wi‑Fi પીકરમાં SSID RSSI દીઠ બતાવો"</string> - <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"જ્યારે સક્ષમ કરેલ હોય, ત્યારે Wi‑Fi સિગ્નલ નબળું હોવા પર, Wi-Fi વધુ ઝડપથી ડેટા કનેક્શનને મોબાઇલ પર મોકલશે"</string> - <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ઇન્ટરફેસ પર હાજર ડેટા ટ્રાફિકના પ્રમાણનાં આધારે Wi‑Fi રોમ સ્કૅન્સને મંજૂરી આપો/નામંજૂર કરો"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"</string> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"જ્યારે સક્ષમ કરેલ હોય, ત્યારે વાઇ-ફાઇ સિગ્નલ નબળું હોવા પર, વાઇ-ફાઇ વધુ ઝડપથી ડેટા કનેક્શનને મોબાઇલ પર મોકલશે"</string> + <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"ઇન્ટરફેસ પર હાજર ડેટા ટ્રાફિકના પ્રમાણનાં આધારે વાઇ-ફાઇ રોમ સ્કૅન્સને મંજૂરી આપો/નામંજૂર કરો"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"લોગર બફર કદ"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"લૉગ દીઠ લૉગર કદ બફર પસંદ કરો"</string> <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"લૉગર નિરંતર સ્ટોરેજ સાફ કરીએ?"</string> @@ -223,7 +223,7 @@ <string name="allow_mock_location" msgid="2787962564578664888">"મોક સ્થાનોની મંજૂરી આપો"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"મોક સ્થાનોની મંજૂરી આપો"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"લક્ષણ નિરીક્ષણ જોવાનું સક્ષમ કરો"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Wi‑Fi સક્રિય હોય ત્યારે પણ, હંમેશા મોબાઇલ ડેટાને સક્રિય રાખો (ઝડપી નેટવર્ક સ્વિચિંગ માટે)."</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"વાઇ-ફાઇ સક્રિય હોય ત્યારે પણ, હંમેશા મોબાઇલ ડેટાને સક્રિય રાખો (ઝડપી નેટવર્ક સ્વિચિંગ માટે)."</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"જો ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ ઉપલબ્ધ હોય તો તેનો ઉપયોગ કરો"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB ડિબગિંગને મંજૂરી આપીએ?"</string> <string name="adb_warning_message" msgid="7316799925425402244">"USB ડિબગીંગ ફક્ત વિકાસ હેતુઓ માટે જ બનાવાયેલ છે. તેનો ઉપયોગ તમારા કમ્પ્યુટર અને તમારા ઉપકરણ વચ્ચે ડેટાને કૉપિ કરવા, સૂચના વગર તમારા ઉપકરણ પર ઍપ્લિકેશનો ઇન્સ્ટોલ કરવા અને લૉગ ડેટા વાંચવા માટે કરો."</string> @@ -232,8 +232,8 @@ <string name="dev_settings_warning_message" msgid="2298337781139097964">"આ સેટિંગ્સ ફક્ત વિકાસનાં ઉપયોગ માટે જ હેતુબદ્ધ છે. તે તમારા ઉપકરણ અને તેના પરની એપ્લિકેશન્સનાં ભંગ થવા અથવા ખરાબ વર્તનનું કારણ બની શકે છે."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB પર ઍપ્લિકેશનો ચકાસો"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"હાનિકારક વર્તણૂંક માટે ADB/ADT મારફતે ઇન્સ્ટોલ કરવામાં આવેલી ઍપ્લિકેશનો તપાસો."</string> - <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"રિમોટ ઉપકરણોમાં વધુ પડતું ઊંચું વૉલ્યૂમ અથવા નિયંત્રણની કમી જેવી વૉલ્યૂમની સમસ્યાઓની સ્થિતિમાં Bluetooth ચોક્કસ વૉલ્યૂમ સુવિધાને અક્ષમ કરે છે."</string> - <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ફોનનો રિંગટોન Bluetooth હેડસેટ પર વાગવાની મંજૂરી આપો"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"રિમોટ ઉપકરણોમાં વધુ પડતું ઊંચું વૉલ્યૂમ અથવા નિયંત્રણની કમી જેવી વૉલ્યૂમની સમસ્યાઓની સ્થિતિમાં બ્લૂટૂથ ચોક્કસ વૉલ્યૂમ સુવિધાને અક્ષમ કરે છે."</string> + <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"ફોનની રિંગટોન બ્લૂટૂથ હૅડસેટ પર વાગવાની મંજૂરી આપો"</string> <string name="enable_terminal_title" msgid="95572094356054120">"સ્થાનિક ટર્મિનલ"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"સ્થાનિક શેલ અૅક્સેસની ઑફર કરતી ટર્મિનલ એપ્લિકેશનને સક્ષમ કરો"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP તપાસણી"</string> @@ -290,9 +290,9 @@ <string name="debug_applications_category" msgid="4206913653849771549">"ઍપ્લિકેશનો"</string> <string name="immediately_destroy_activities" msgid="1579659389568133959">"પ્રવૃત્તિઓ રાખશો નહીં"</string> <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"જેવો વપરાશકર્તા તેને છોડે, તરત જ દરેક પ્રવૃત્તિ નષ્ટ કરો"</string> - <string name="app_process_limit_title" msgid="4280600650253107163">"પૃષ્ઠભૂમિ પ્રક્રિયા સીમા"</string> + <string name="app_process_limit_title" msgid="4280600650253107163">"બૅકગ્રાઉન્ડ પ્રક્રિયા સીમા"</string> <string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string> - <string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"બૅકગ્રાઉન્ડ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> <string name="show_notification_channel_warnings" msgid="1399948193466922683">"સૂચના ચૅનલની ચેતવણી બતાવો"</string> <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ઍપ્લિકેશન માન્ય ચૅનલ વિના સૂચના પોસ્ટ કરે તો સ્ક્રીન પર ચેતવણી દેખાય છે"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> બાકી"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - સંપૂર્ણપણે ચાર્જ થવા માટે <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"અજાણ્યું"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ચાર્જ થઈ રહ્યું છે"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ચાર્જ થઈ રહ્યું છે"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ચાર્જ થઈ રહ્યું નથી"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"પ્લગ ઇન કરેલ, હમણાં ચાર્જ કરી શકતા નથી"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"પૂર્ણ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"વ્યવસ્થાપક દ્વારા નિયંત્રિત"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"વ્યવસ્થાપકે સક્ષમ કરેલ"</string> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index e304e908564f..d677465e508a 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -25,7 +25,7 @@ <item msgid="8934131797783724664">"स्कैन कर रहा है…"</item> <item msgid="8513729475867537913">"कनेक्ट हो रहा है..."</item> <item msgid="515055375277271756">"प्रमाणीकरण कर रहा है…"</item> - <item msgid="1943354004029184381">"IP पता प्राप्त कर रहा है…"</item> + <item msgid="1943354004029184381">"आईपी पता ले रहा है…"</item> <item msgid="4221763391123233270">"कनेक्ट किया गया"</item> <item msgid="624838831631122137">"निलंबित"</item> <item msgid="7979680559596111948">"डिस्कनेक्ट हो रहा है..."</item> @@ -39,7 +39,7 @@ <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> + <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> से आईपी पता ले रहा है..."</item> <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> से कनेक्ट किया गया"</item> <item msgid="1330262655415760617">"निलंबित"</item> <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> से डिस्कनेक्ट कर रहा है…"</item> @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"वैकल्पिक कोडेक सक्षम करें"</item> - <item msgid="3304843301758635896">"वैकल्पिक कोडेक अक्षम करें"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"वैकल्पिक कोडेक सक्षम करें"</item> - <item msgid="741805482892725657">"वैकल्पिक कोडेक अक्षम करें"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"सिस्टम चयन का उपयोग करें (डिफ़ॉल्ट)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> @@ -215,7 +199,7 @@ <item msgid="3191973083884253830">"कोई नहीं"</item> <item msgid="9089630089455370183">"Logcat"</item> <item msgid="5397807424362304288">"Systrace (ग्राफ़िक)"</item> - <item msgid="1340692776955662664">"glGetError पर स्टैक कॉल करें"</item> + <item msgid="1340692776955662664">"glGetError पर कॉल स्टैक"</item> </string-array> <string-array name="show_non_rect_clip_entries"> <item msgid="993742912147090253">"बंद"</item> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index b383b2ebdc33..84c710e48159 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -92,13 +92,13 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फ़ाइल स्थानांतरण के लिए उपयोग करें"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट के लिए उपयोग करें"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"युग्म बनाएं"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"युग्मित करें"</string> - <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"अभी नहीं"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"दूसरे डिवाइस से जोड़ें"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करें"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट रहने पर, पेयरिंग आपको अपने संपर्कों और कॉल इतिहास की एक्सेस प्रदान करता है."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> के साथ युग्मित नहीं हो सका."</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"गलत पिन या पासकी के कारण <xliff:g id="DEVICE_NAME">%1$s</xliff:g> के साथ युग्मित नहीं हो सका."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> से संचार नहीं कर सकता."</string> - <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> द्वारा युग्मन अस्वीकृत किया गया."</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ने जोड़ने का अनुरोध नहीं माना."</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"वाई-फ़ाई बंद है."</string> <string name="accessibility_no_wifi" msgid="8834610636137374508">"वाई-फ़ाई डिसकनेक्ट है."</string> <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"वाई-फ़ाई का एक बार है."</string> @@ -163,20 +163,20 @@ <string name="choose_profile" msgid="6921016979430278661">"प्रोफ़ाइल चुनें"</string> <string name="category_personal" msgid="1299663247844969448">"व्यक्तिगत"</string> <string name="category_work" msgid="8699184680584175622">"कार्यालय"</string> - <string name="development_settings_title" msgid="215179176067683667">"डेवलपर विकल्प"</string> - <string name="development_settings_enable" msgid="542530994778109538">"डेवलपर विकल्प सक्षम करें"</string> + <string name="development_settings_title" msgid="215179176067683667">"डेवलपर के लिए सेटिंग और टूल"</string> + <string name="development_settings_enable" msgid="542530994778109538">"डेवलपर के लिए सेटिंग और टूल सक्षम करें"</string> <string name="development_settings_summary" msgid="1815795401632854041">"ऐप्स विकास के लिए विकल्प सेट करें"</string> - <string name="development_settings_not_available" msgid="4308569041701535607">"इस उपयोगकर्ता के लिए डेवलपर विकल्प उपलब्ध नहीं हैं"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"टेदरिंग सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस पॉइंट नाम सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस पॉइंट नाम सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करना"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"डीबग मोड जब USB कनेक्ट किया गया हो"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबगिंग प्राधिकरणों को निरस्त करें"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"बग रिपोर्ट शॉर्टकट"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"बग रिपोर्ट लेने के लिए पावर मेनू में कोई बटन दिखाएं"</string> - <string name="keep_screen_on" msgid="1146389631208760344">"सचेत रहें"</string> - <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज होने के दौरान स्क्रीन कभी निष्क्रिय नहीं होगी"</string> + <string name="keep_screen_on" msgid="1146389631208760344">"स्क्रीन को चालू रखें"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज करते समय स्क्रीन कभी भी कम बैटरी मोड में नहीं जाएगी"</string> <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग सक्षम करें"</string> <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"फ़ाइल के सभी ब्लूटूथ HCI पैकेट कैप्चर करें"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करना"</string> @@ -230,10 +230,10 @@ <string name="adb_keys_warning_message" msgid="5659849457135841625">"आपके द्वारा पूर्व में प्राधिकृत सभी कंप्यूटर से USB डीबगिंग की पहुंच निरस्त करें?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"विकास सेटिंग की अनुमति दें?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"ये सेटिंग केवल विकास संबंधी उपयोग के प्रयोजन से हैं. वे आपके डिवाइस और उस पर स्थित ऐप्स को खराब कर सकती हैं या उनके दुर्व्यवहार का कारण हो सकती हैं."</string> - <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB पर ऐप्स सत्यापित करें"</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB पर ऐप की पुष्टि करें"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"नुकसानदेह व्यवहार के लिए ADB/ADT के द्वारा इंस्टॉल किए गए ऐप्स जांचें."</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डिवाइस के साथ वॉल्यूम की समस्याओं जैसे अस्वीकार्य तेज़ वॉल्यूम या नियंत्रण की कमी की स्थिति में ब्लूटूथ पूर्ण वॉल्यूम सुविधा को अक्षम करता है."</string> - <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फ़ोन की रिंगटोन को ब्लूटूथ हैडसेट पर बजने दें"</string> + <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फ़ोन की रिंगटोन को ब्लूटूथ हेडसेट पर बजने दें"</string> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानीय टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानीय शेल एक्सेस ऑफ़र करने वाला टर्मिनल ऐप्स सक्षम करें"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP जांच"</string> @@ -247,7 +247,7 @@ <string name="wait_for_debugger" msgid="1202370874528893091">"डीबगर की प्रतीक्षा करें"</string> <string name="wait_for_debugger_summary" msgid="1766918303462746804">"डीबग किया गया ऐप्स निष्पादन के पहले अनुलग्न करने के लिए डीबगर की प्रतीक्षा करता है"</string> <string name="telephony_monitor_switch" msgid="1764958220062121194">"टेलीफ़ोनी मॉनिटर"</string> - <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"टेलीफ़ोनी मॉनिटर को जब टेलीफ़ोनी/मॉडेम कार्यक्षमता में कोई समस्या मिलती है तो वह लॉग इकट्ठा करता है और उपयोगकर्ता को एक बग दर्ज करने के लिए नोटिफ़िकेशन देता है"</string> + <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"टेलीफ़ोनी मॉनिटर को जब टेलीफ़ोनी/मॉडेम के फंक्शन में कोई समस्या मिलती है, तो वह लॉग इकट्ठा करता है और उपयोगकर्ता को एक गड़बड़ी दर्ज करने के लिए सूचना देता है"</string> <string name="debug_input_category" msgid="1811069939601180246">"हिंदी में लिखें"</string> <string name="debug_drawing_category" msgid="6755716469267367852">"ड्रॉइंग"</string> <string name="debug_hw_drawing_category" msgid="6220174216912308658">"हार्डवेयर त्वरित रेंडरिंग"</string> @@ -256,18 +256,18 @@ <string name="strict_mode" msgid="1938795874357830695">"सख्त मोड सक्षम किया गया"</string> <string name="strict_mode_summary" msgid="142834318897332338">"जब ऐप्स मुख्य थ्रेड पर लंबी कार्यवाही करते हैं तो स्क्रीन फ़्लैश करें"</string> <string name="pointer_location" msgid="6084434787496938001">"सूचक स्थान"</string> - <string name="pointer_location_summary" msgid="840819275172753713">"वर्तमान स्पर्श डेटा दिखाने वाला स्क्रीन ओवरले"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"मौजूदा स्पर्श डेटा दिखाने वाला स्क्रीन ओवरले"</string> <string name="show_touches" msgid="2642976305235070316">"टैप दिखाएं"</string> <string name="show_touches_summary" msgid="6101183132903926324">"टैप के लिए विज़ुअल फ़ीडबैक दिखाएं"</string> - <string name="show_screen_updates" msgid="5470814345876056420">"सतह के नई जानकारी दिखाएं"</string> - <string name="show_screen_updates_summary" msgid="2569622766672785529">"विंडो सतहें के नई जानकारी मिलने पर उन सभी को फ़्लैश करें"</string> - <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य की नई जानकारी दिखाएं"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"सर्फ़ेस अपडेट दिखाएं"</string> + <string name="show_screen_updates_summary" msgid="2569622766672785529">"अपडेट होने पर पूरे विंडो सर्फ़ेस को फ़्लैश करें"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU व्यू अपडेट दिखाएं"</string> <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU के साथ आरेखित करने पर विंडो में दृश्यों को फ़्लैश करें"</string> - <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर लेयर की नई जानकारी"</string> - <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेयर लेयर की नई जानकारी मिलने पर हरा फ़्लैश होता है"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर लेयर अपडेट दिखाएं"</string> + <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेयर लेयर अपडेट होने पर उनमें हरी रोशनी डालें"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओवरड्रॉ डीबग करें"</string> <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU दाता सेट करें"</string> - <string name="disable_overlays" msgid="2074488440505934665">"HW ओवरले अक्षम करें"</string> + <string name="disable_overlays" msgid="2074488440505934665">"HW ओवरले बंद करें"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन संयोजन के लिए हमेशा GPU का उपयोग करें"</string> <string name="simulate_color_space" msgid="6745847141353345872">"रंग स्पेस सिम्युलेट करें"</string> <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL चिह्न सक्षम करें"</string> @@ -289,7 +289,7 @@ <string name="overlay_display_devices_title" msgid="5364176287998398539">"द्वितीयक डिस्प्ले अनुरूपित करें"</string> <string name="debug_applications_category" msgid="4206913653849771549">"ऐप्स"</string> <string name="immediately_destroy_activities" msgid="1579659389568133959">"गतिविधियों को न रखें"</string> - <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"उपयोगकर्ता के छोड़ते ही प्रत्येक गतिविधि समाप्त करें"</string> + <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"उपयोगकर्ता के छोड़ते ही हर गतिविधि को खत्म करें"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string> <string name="show_all_anrs" msgid="28462979638729082">"सभी ANR दिखाएं"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि ऐप्स के लिए ऐप्स प्रतिसाद नहीं दे रहा डॉयलॉग दिखाएं"</string> @@ -298,7 +298,7 @@ <string name="force_allow_on_external" msgid="3215759785081916381">"ऐप्स को बाहरी मेमोरी पर बाध्य करें"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप्लिकेशन, मेनिफेस्ट मानों को अनदेखा करके, बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string> - <string name="force_resizable_activities_summary" msgid="6667493494706124459">"सभी गतिविधियों को एकाधिक विंडो के लिए आकार बदलने योग्य बनाएं, चाहे मेनिफेस्ट मान कुछ भी हों."</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"मेनिफेस्ट मान पर ध्यान दिए बिना, सभी गतिविधियों को मल्टी-विंडो (एक से ज़्यादा ऐप, एक साथ) के लिए आकार बदलने लायक बनाएं."</string> <string name="enable_freeform_support" msgid="1461893351278940416">"फ़्रीफ़ॉर्म विंडो सक्षम करें"</string> <string name="enable_freeform_support_summary" msgid="8247310463288834487">"प्रयोगात्मक फ़्रीफ़ॉर्म विंडो का समर्थन सक्षम करें."</string> <string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बैकअप पासवर्ड"</string> @@ -317,19 +317,19 @@ <item msgid="8280754435979370728">"आंखों को दिखाई देने वाले प्राकृतिक रंग"</item> <item msgid="5363960654009010371">"डिजिटल सामग्री के लिए ऑप्टिमाइज़़ किए गए रंग"</item> </string-array> - <string name="inactive_apps_title" msgid="1317817863508274533">"निष्क्रिय ऐप्स"</string> - <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"निष्क्रिय. टॉगल करने के लिए टैप करें."</string> + <string name="inactive_apps_title" msgid="1317817863508274533">"बंद एेप"</string> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"बंद है. टॉगल करने के लिए टैप करें."</string> <string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करने पर टैप करें."</string> <string name="runningservices_settings_title" msgid="8097287939865165213">"चल रही सेवाएं"</string> <string name="runningservices_settings_summary" msgid="854608995821032748">"वर्तमान में चल रही सेवाओं को देखें और नियंत्रित करें"</string> - <string name="select_webview_provider_title" msgid="4628592979751918907">"WebView कार्यान्वयन"</string> - <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView कार्यान्वयन सेट करें"</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"वेबव्यू लागू करें"</string> + <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"वेबव्यू सेट करें"</string> <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" 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="title_convert_fbe" msgid="1263622876196444453">"फ़ाइल आधारित एन्क्रिप्शन में रूपांतरित कर रहा है"</string> - <string name="convert_to_fbe_warning" msgid="6139067817148865527">"डेटा विभाजन को फ़ाइल आधारित एन्क्रिप्शन में रूपांतरित करें.\n !!चेतावनी!! इससे आपका सभी डेटा मिट जाएगा.\n यह सुविधा अल्फ़ा स्थिति में है और ठीक से कार्य नहीं कर सकती.\n जारी रखने के लिए \'वाइप करें और रूपांतरित करें…\' दबाएं."</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> <string name="picture_color_mode" msgid="4560755008730283695">"चित्र रंग मोड"</string> <string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB का उपयोग करें"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> शेष"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> पूरी तरह से चार्ज होने तक"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज हो रही है"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज किया जा रहा है"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"चार्ज नहीं हो रही है"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"प्लग इन है, अभी चार्ज नहीं हो सकती"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूरी"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"व्यवस्थापक द्वारा नियंत्रित"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"व्यवस्थापक ने सक्षम किया है"</string> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index 5deba6f32c84..36ba5c167e0d 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Upotreba odabira sustava (zadano)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Omogućivanje izbornih kodeka"</item> - <item msgid="3304843301758635896">"Onemogućivanje izbornih kodeka"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Upotreba odabira sustava (zadano)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Omogućivanje izbornih kodeka"</item> - <item msgid="741805482892725657">"Onemogućivanje izbornih kodeka"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Upotreba odabira sustava (zadano)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 0b8661578db7..03515b2785cd 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – još <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do potpune napunjenosti"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"punjenje"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ne puni se"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Uključen, trenutačno se ne može puniti"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puna"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolira administrator"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Omogućio administrator"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"Onemogućeno"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Dopušteno"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"Nije dopušteno"</string> - <string name="install_other_apps" msgid="6986686991775883017">"Instalacija nepoznatih aplikacija"</string> + <string name="install_other_apps" msgid="6986686991775883017">"Instalacija nepoznatih apl."</string> <string name="home" msgid="3256884684164448244">"Početni zaslon postavki"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index 81d69d030144..42e46bb88268 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Rendszerérték (alapértelmezett)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Nem kötelező kodekek engedélyezése"</item> - <item msgid="3304843301758635896">"Nem kötelező kodekek letiltása"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Rendszerérték (alapértelmezett)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Engedélyezi a nem kötelező kodekeket"</item> - <item msgid="741805482892725657">"Letiltja a nem kötelező kodekeket"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Rendszerérték (alapértelmezett)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index b6e55eca0c4d..1baa5a4f93a4 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> van hátra"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> a teljes feltöltésig"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Ismeretlen"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Töltés"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"töltés"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nem tölt"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Csatlakoztatva, jelenleg nem tölt"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Feltöltve"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Rendszergazda által irányítva"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"A rendszergazda bekapcsolta"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"Letiltva"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Engedélyezett"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"Nem engedélyezett"</string> - <string name="install_other_apps" msgid="6986686991775883017">"Ismeretlen alkalmazások telepítése"</string> + <string name="install_other_apps" msgid="6986686991775883017">"Új alkalmazások telepítése"</string> <string name="home" msgid="3256884684164448244">"Beállítások kezdőlapja"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-hy/arrays.xml b/packages/SettingsLib/res/values-hy/arrays.xml index 22de9389e9ad..a445eac89dce 100644 --- a/packages/SettingsLib/res/values-hy/arrays.xml +++ b/packages/SettingsLib/res/values-hy/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Օգտագործել համակարգի կարգավորումը (կանխադրված)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Միացնել լրացուցիչ կոդեկները"</item> - <item msgid="3304843301758635896">"Անջատել լրացուցիչ կոդեկները"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Օգտագործել համակարգի կարգավորումը (կանխադրված)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Միացնել լրացուցիչ կոդեկները"</item> - <item msgid="741805482892725657">"Անջատել լրացուցիչ կոդեկները"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Օգտագործել համակարգի կարգավորումը (կանխադրված)"</item> <item msgid="8895532488906185219">"44,1 կՀց"</item> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index e44e38707842..43c292d68a74 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - մնացել է <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> մինչև լրիվ լիցքավորումը"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Անհայտ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Լիցքավորում"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"լիցքավորում"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Չի լիցքավորվում"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Միացված է հոսանքի աղբյուրին, սակայն այս պահին չի կարող լիցքավորվել"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Լիցքավորված"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Վերահսկվում է ադմինիստրատորի կողմից"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Միացված է ադմինիստրատորի կողմից"</string> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 7f02a6a29fa1..ec1b6c4ff58b 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Gunakan Pilihan Sistem (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Aktifkan Codec Opsional"</item> - <item msgid="3304843301758635896">"Nonaktifkan Codec Opsional"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Gunakan Pilihan Sistem (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Aktifkan Codec Opsional"</item> - <item msgid="741805482892725657">"Nonaktifkan Codec Opsional"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Gunakan Pilihan Sistem (Default)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 89da94bdbb8f..24a91c27aec7 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tersisa"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> lagi terisi penuh"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Tidak diketahui"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Mengisi daya"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"mengisi daya baterai"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Tidak mengisi daya"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Tercolok, tidak dapat mengisi baterai sekarang"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Penuh"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Dikontrol oleh admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Diaktifkan oleh admin"</string> diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml index 7f6141d160e5..3c3aca039413 100644 --- a/packages/SettingsLib/res/values-is/arrays.xml +++ b/packages/SettingsLib/res/values-is/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Nota val kerfisins (sjálfgefið)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Gera valfrjálsa kóðara virka"</item> - <item msgid="3304843301758635896">"Gera valfrjálsa kóðara óvirka"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Nota val kerfisins (sjálfgefið)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Gera valfrjálsa kóðara virka"</item> - <item msgid="741805482892725657">"Gera valfrjálsa kóðara óvirka"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Nota val kerfisins (sjálfgefið)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index c5bca1c05167..718a862b312c 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> eftir"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> þar til fullri hleðslu er náð"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Óþekkt"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Í hleðslu"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"í hleðslu"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ekki í hleðslu"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Í sambandi, ekki hægt að hlaða eins og er"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Fullhlaðin"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Stjórnað af kerfisstjóra"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Gert virkt af kerfisstjóra"</string> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index cb6d5f7eaea6..d30befa663cd 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usa selezione di sistema (predefinita)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Attiva codec facoltativi"</item> - <item msgid="3304843301758635896">"Disattiva codec facoltativi"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usa selezione di sistema (predefinita)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Attiva codec facoltativi"</item> - <item msgid="741805482892725657">"Disattiva codec facoltativi"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usa selezione di sistema (predefinita)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index cd6b785e32be..f3a7253dbca5 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tempo rimanente: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> alla carica completa"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Sconosciuta"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"In carica"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"in carica"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Non in carica"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Collegato alla corrente. Impossibile caricare al momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Carica"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Gestita dall\'amministratore"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Attivata dall\'amministratore"</string> diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index 917f7108b851..5d7f220cc540 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"שימוש בבחירת המערכת (ברירת המחדל)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"הפעלה של Codecs אופציונליים"</item> - <item msgid="3304843301758635896">"השבתה של Codecs אופציונליים"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"השתמש בבחירת המערכת (ברירת המחדל)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"הפעלה של Codecs אופציונליים"</item> - <item msgid="741805482892725657">"השבתה של Codecs אופציונליים"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"שימוש בבחירת המערכת (ברירת המחדל)"</item> <item msgid="8895532488906185219">"44.1 קילו-הרץ"</item> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 3c0bf6bef275..cf3a92c24922 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - נותרו <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> עד לטעינה מלאה"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"לא ידוע"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"טוען"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"בטעינה"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"לא בטעינה"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"המכשיר מחובר, אבל לא ניתן לטעון עכשיו"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"מלא"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"נמצא בשליטת מנהל מערכת"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"מופעל על ידי מנהל המכשיר"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"מושבת"</string> <string name="external_source_trusted" msgid="2707996266575928037">"מורשה"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"לא מורשה"</string> - <string name="install_other_apps" msgid="6986686991775883017">"להתקין גם אם לא מוכר?"</string> + <string name="install_other_apps" msgid="6986686991775883017">"להתקין גם אם לא מוכר לך?"</string> <string name="home" msgid="3256884684164448244">"דף הבית של ההגדרות"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 779e2b11dbe8..3bec57059076 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -23,7 +23,7 @@ <string-array name="wifi_status"> <item msgid="1922181315419294640"></item> <item msgid="8934131797783724664">"スキャン中..."</item> - <item msgid="8513729475867537913">"接続中..."</item> + <item msgid="8513729475867537913">"接続処理中..."</item> <item msgid="515055375277271756">"認証中..."</item> <item msgid="1943354004029184381">"IPアドレスを取得中..."</item> <item msgid="4221763391123233270">"接続済み"</item> @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"システムの選択(デフォルト)を使用"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"オプションのコーデックの有効化"</item> - <item msgid="3304843301758635896">"オプションのコーデックの無効化"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"システムの選択(デフォルト)を使用"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"オプションのコーデックを有効にします"</item> - <item msgid="741805482892725657">"オプションのコーデックを無効にします"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"システムの選択(デフォルト)を使用"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 713f796a6a3a..597312471199 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -52,7 +52,7 @@ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="6557104142667339895">"切断"</string> <string name="bluetooth_disconnecting" msgid="8913264760027764974">"切断中..."</string> - <string name="bluetooth_connecting" msgid="8555009514614320497">"接続中..."</string> + <string name="bluetooth_connecting" msgid="8555009514614320497">"接続処理中..."</string> <string name="bluetooth_connected" msgid="6038755206916626419">"接続"</string> <string name="bluetooth_pairing" msgid="1426882272690346242">"ペアとして設定中..."</string> <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"接続済み(電話を除く)"</string> @@ -119,7 +119,7 @@ <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> + <string name="launch_defaults_some" msgid="313159469856372621">"一部デフォルトで設定"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"デフォルトの設定なし"</string> <string name="tts_settings" msgid="8186971894801348327">"テキスト読み上げの設定"</string> <string name="tts_settings_title" msgid="1237820681016639683">"テキスト読み上げの出力"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>(残り時間)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - フル充電まで <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"不明"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"充電しています"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"充電していません"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"接続されていますが、現在、充電できません"</string> <!-- String.format failed for translation --> <!-- no translation found for battery_info_status_full (2824614753861462808) --> <skip /> diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml index cf2113b60336..e9cfc61e0848 100644 --- a/packages/SettingsLib/res/values-ka/arrays.xml +++ b/packages/SettingsLib/res/values-ka/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"არასავალდებულო კოდეკების ჩართვა"</item> - <item msgid="3304843301758635896">"არასავალდებულო კოდეკების გათიშვა"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"არასავალდებულო კოდეკების ჩართვა"</item> - <item msgid="741805482892725657">"არასავალდებულო კოდეკების გათიშვა"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"სისტემის არჩეულის გამოყენება (ნაგულისხმევი)"</item> <item msgid="8895532488906185219">"44,1 კჰც"</item> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index ff275236e84f..b879e999a35f 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> — დარჩენილია <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> — სრულ დატენვამდე დარჩა <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> — <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"უცნობი"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"იტენება"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"იტენება"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"არ იტენება"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"მიერთებულია, დატენვა ამჟამად ვერ ხერხდება"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ბატარეა დატენილია"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"იმართება ადმინისტრატორის მიერ"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"ჩართულია ადმინისტრატორის მიერ"</string> diff --git a/packages/SettingsLib/res/values-kk/arrays.xml b/packages/SettingsLib/res/values-kk/arrays.xml index e3481084ab43..c856439eb6a8 100644 --- a/packages/SettingsLib/res/values-kk/arrays.xml +++ b/packages/SettingsLib/res/values-kk/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Жүйені таңдау (әдепкі)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Қосымша кодектерді қосу"</item> - <item msgid="3304843301758635896">"Қосымша кодектерді өшіру"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Жүйені таңдау (әдепкі)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Қосымша кодектерді қосу"</item> - <item msgid="741805482892725657">"Қосымша кодектерді өшіру"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Жүйені таңдау (әдепкі)"</item> <item msgid="8895532488906185219">"44,1 кГц"</item> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 5c0713914864..c9efc46e4c78 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> қалды"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – толық зарядталғанға дейін <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Белгісіз"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Зарядталуда"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"зарядталуда"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Зарядталу орындалып жатқан жоқ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Қосылған, зарядталмайды"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Толық"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Әкімші басқарады"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Әкімші қосқан"</string> diff --git a/packages/SettingsLib/res/values-km/arrays.xml b/packages/SettingsLib/res/values-km/arrays.xml index 27e0e5917f26..dcdc63a31a3e 100644 --- a/packages/SettingsLib/res/values-km/arrays.xml +++ b/packages/SettingsLib/res/values-km/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"បើកកូឌិកប្រភេទស្រេចចិត្ត"</item> - <item msgid="3304843301758635896">"បិទកូឌិកប្រភេទស្រេចចិត្ត"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"បើកកូឌិកប្រភេទស្រេចចិត្ត"</item> - <item msgid="741805482892725657">"បិទកូឌិកប្រភេទស្រេចចិត្ត"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"ប្រើការជ្រើសរើសប្រព័ន្ធ (លំនាំដើម)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 45687bfe30aa..9b868fb3fb95 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - នៅសល់ <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> រហូតដល់សាកពេញ"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"មិនស្គាល់"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"កំពុងបញ្ចូលថ្ម"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"កំពុងសាកថ្ម"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"មិនកំពុងបញ្ចូលថ្ម"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ដោតសាកថ្មរួចហើយ ប៉ុន្តែសាកថ្មមិនចូលទេឥឡូវនេះ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ពេញ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"គ្រប់គ្រងដោយអ្នកគ្រប់គ្រង"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"បើកដោយអ្នកគ្រប់គ្រង"</string> diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml index 810aefedb04d..2e4db0b1b951 100644 --- a/packages/SettingsLib/res/values-kn/arrays.xml +++ b/packages/SettingsLib/res/values-kn/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</item> - <item msgid="3304843301758635896">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</item> - <item msgid="741805482892725657">"ಐಚ್ಛಿಕ ಕೋಡೆಕ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"ಸಿಸ್ಟಂ ಆಯ್ಕೆಯನ್ನು ಬಳಸಿ (ಡಿಫಾಲ್ಟ್)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 0b39e26cf7df..b942e3a81cba 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ಉಳಿದಿದೆ"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ಅಪರಿಚಿತ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ಪ್ಲಗ್ ಇನ್ ಮಾಡಲಾಗಿದೆ, ಇದೀಗ ಚಾರ್ಜ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ಭರ್ತಿ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಯಂತ್ರಿಸಲಾಗಿದೆ"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"ನಿರ್ವಾಹಕರು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ"</string> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index dbbe89dbeed9..72ef56448541 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"시스템 설정 사용(기본)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"선택사항 코덱 사용 설정"</item> - <item msgid="3304843301758635896">"선택사항 코덱 사용 중지"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"시스템 설정 사용(기본)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"선택사항 코덱 사용 설정"</item> - <item msgid="741805482892725657">"선택사항 코덱 사용 중지"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"시스템 설정 사용(기본)"</item> <item msgid="8895532488906185219">"44.1kHz"</item> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 9bd711130759..6b8b00461d2b 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> 남음"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 충전 완료까지 <xliff:g id="TIME">^2</xliff:g> 남음"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"알 수 없음"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"충전 중"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"충전 중"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"충전 안함"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"전원이 연결되었지만 현재 충전할 수 없음"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"충전 완료"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"관리자가 제어"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"관리자가 사용 설정함"</string> diff --git a/packages/SettingsLib/res/values-ky/arrays.xml b/packages/SettingsLib/res/values-ky/arrays.xml index 9c8e28a1e42d..ecaa146bed4d 100644 --- a/packages/SettingsLib/res/values-ky/arrays.xml +++ b/packages/SettingsLib/res/values-ky/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Тутум тандаганды колдонуу (демейки)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Кошумча кодекстер иштетилсин"</item> - <item msgid="3304843301758635896">"Кошумча кодекстер өчүрүлсүн"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Тутум тандаганды колдонуу (демейки)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Кошумча кодекстер иштетилсин"</item> - <item msgid="741805482892725657">"Кошумча кодекстер өчүрүлсүн"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Тутум тандаганды колдонуу (демейки)"</item> <item msgid="8895532488906185219">"44,1 кГц"</item> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index f26ed8c6b6c5..ab880b8ff449 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -119,7 +119,7 @@ <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> + <string name="launch_defaults_some" msgid="313159469856372621">"Айрым демейки параметрлер туураланды"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Демейкилер коюлган жок"</string> <string name="tts_settings" msgid="8186971894801348327">"Кеп синтезаторунун жөндөөлөрү"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Текстти-оозекилөө"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> калды"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> кийин толук кубатталат"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Белгисиз"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Кубатталууда"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"кубатталууда"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Кубат алган жок"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Сайылып турат, учурда кубаттоо мүмкүн эмес"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Толук"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Администратор тарабынан көзөмөлдөнөт"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Администратор иштетип койгон"</string> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index 63889e03fc9e..302c80302ce7 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Use System Selection (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ເປີດໃຊ້ Codecs ແບບເສີມ"</item> - <item msgid="3304843301758635896">"ປິດການໃຊ້ Codecs ແບບເສີມ"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Use System Selection (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ເປີດໃຊ້ Codecs ແບບເສີມ"</item> - <item msgid="741805482892725657">"ປິດການໃຊ້ Codecs ແບບເສີມ"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Use System Selection (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 350066471dce..83bb4b74ac64 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - ຍັງເຫຼືອ <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ບໍ່ຮູ້ຈັກ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ກຳລັງສາກໄຟ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ກຳລັງສາກໄຟ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ບໍ່ໄດ້ສາກໄຟ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ສຽບສາຍແລ້ວ, ບໍ່ສາມາດສາກໄດ້ໃນຕອນນີ້"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ເຕັມ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ຄວບຄຸມໂດຍຜູ້ເບິ່ງແຍງ"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"ຜູ້ເບິ່ງແຍງລະບົບເປີດໃຫ້ໃຊ້ແລ້ວ"</string> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index 3c325c17320a..6def306353bc 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Naudoti sistemos pasirink. (numatytasis)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Įgalinti nebūtinus kodekus"</item> - <item msgid="3304843301758635896">"Išjungti nebūtinus kodekus"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Naudoti sistemos pasirink. (numatytasis)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Įgalinti nebūtinus kodekus"</item> - <item msgid="741805482892725657">"Išjungti nebūtinus kodekus"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Naudoti sistemos pasirink. (numatytasis)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 889f312c8edf..4b60d5a40636 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – liko <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> iki visiško įkrovimo"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nežinomas"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Kraunasi..."</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"įkraunama"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nekraunama"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Įjungta į maitinimo lizdą, bet šiuo metu įkrauti neįmanoma"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Visiškai įkrautas"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Valdo administratorius"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Įgalino administratorius"</string> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index 2c69c7e61f56..00b1e6ea1523 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Sistēmas atlases izmantošana (nokl.)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Iespējot neobligātos kodekus"</item> - <item msgid="3304843301758635896">"Atspējot neobligātos kodekus"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Sistēmas atlases izmantošana (nokl.)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Iespējot neobligātos kodekus"</item> - <item msgid="741805482892725657">"Atspējot neobligātos kodekus"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Sistēmas atlases izmantošana (nokl.)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 512ebaaba0ef..69be078865bd 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> — atlicis: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> — <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>, kamēr pilnībā uzlādēts"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> — <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nezināms"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Uzlāde"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"notiek uzlāde"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nenotiek uzlāde"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Pievienots, taču pašlaik nevar veikt uzlādi"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Pilns"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolē administrators"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Iespējoja administrators"</string> diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index 2da43f0925b8..680184edc7a0 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Користи избор на системот (стандардно)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Овозможување на „Кодеци по избор“"</item> - <item msgid="3304843301758635896">"Оневозможување на „Кодеци по избор“"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Користи избор на системот (стандардно)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Овозможи ја „Кодеци по избор“"</item> - <item msgid="741805482892725657">"Оневозможи ја „Кодеци по избор“"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Користи избор на системот (стандардно)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 0dbaae2fea0d..f4c4754c2f61 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - уште <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> дури се наполни целосно"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Непознато"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Се полни"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"се полни"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не се полни"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Приклучен е, но батеријата не може да се полни во моментов"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Полна"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Контролирано од администраторот"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Овозможено од администраторот"</string> diff --git a/packages/SettingsLib/res/values-ml/arrays.xml b/packages/SettingsLib/res/values-ml/arrays.xml index 57382f1a0c00..624edfeae649 100644 --- a/packages/SettingsLib/res/values-ml/arrays.xml +++ b/packages/SettingsLib/res/values-ml/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനക്ഷമമാക്കുക"</item> - <item msgid="3304843301758635896">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനരഹിതമാക്കുക"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനക്ഷമമാക്കുക"</item> - <item msgid="741805482892725657">"ഓപ്ഷണൽ കോഡെകുകൾ പ്രവർത്തനരഹിതമാക്കുക"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"സിസ്റ്റം സെലക്ഷൻ ഉപയോഗിക്കൂ (ഡിഫോൾട്ട്)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 84c1279dbdcb..a131ab83ac43 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -124,7 +124,7 @@ <string name="tts_settings" msgid="8186971894801348327">"ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ക്രമീകരണങ്ങൾ"</string> <string name="tts_settings_title" msgid="1237820681016639683">"ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ഔട്ട്പുട്ട്"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"വായന നിരക്ക്"</string> - <string name="tts_default_rate_summary" msgid="4061815292287182801">"വാചകം പറയുന്ന വേഗത"</string> + <string name="tts_default_rate_summary" msgid="4061815292287182801">"ടെക്സ്റ്റ് ചെയ്യൽ പറയുമ്പോഴുടെക്കുന്ന വേഗത"</string> <string name="tts_default_pitch_title" msgid="6135942113172488671">"പിച്ച്"</string> <string name="tts_default_pitch_summary" msgid="1944885882882650009">"സിന്തസൈസ് ചെയ്ത സംസാരത്തിന്റെ സ്വരഭേദത്തെ ബാധിക്കുന്നു"</string> <string name="tts_default_lang_title" msgid="8018087612299820556">"ഭാഷ"</string> @@ -261,7 +261,7 @@ <string name="show_touches_summary" msgid="6101183132903926324">"ടാപ്പുകൾക്ക് ദൃശ്യ ഫീഡ്ബാക്ക് കാണിക്കുക"</string> <string name="show_screen_updates" msgid="5470814345876056420">"സർഫേസ് അപ്ഡേറ്റ് കാണിക്കൂ"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"മുഴുവൻ വിൻഡോ സർഫേസുകളും അപ്ഡേറ്റുചെയ്തുകഴിയുമ്പോൾ അവ ഫ്ലാഷുചെയ്യുക"</string> - <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU കാഴ്ച അപ്ഡേറ്റ് കാണിക്കൂ"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU കാഴ്ചയുടെ അപ്ഡേറ്റുകൾ കാണിക്കൂ"</string> <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ഉപയോഗിച്ച് വലിക്കുമ്പോൾ വിൻഡോകൾക്കുള്ളിൽ കാഴ്ചകൾ ഫ്ലാഷുചെയ്യുക"</string> <string name="show_hw_layers_updates" msgid="5645728765605699821">"ഹാർഡ്വെയർ ലേയർ അപ്ഡേറ്റ് കാണിക്കൂ"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ഹാർഡ്വെയർ ലേയറുകളുടെ അപ്ഡേറ്റുകൾ പൂർത്തിയാകുമ്പോൾ അവ പച്ച നിറത്തിൽ പ്രകാശിപ്പിക്കുക"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ശേഷിക്കുന്നു"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ഫുൾ ചാർജാകാൻ <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"അജ്ഞാതം"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ചാർജ്ജുചെയ്യുന്നു"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ചാർജ് ചെയ്യുന്നു"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ചാർജ്ജുചെയ്യുന്നില്ല"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"പ്ലഗ് ഇൻ ചെയ്തു, ഇപ്പോൾ ചാർജ് ചെയ്യാനാവില്ല"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"നിറഞ്ഞു"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"അഡ്മിൻ നിയന്ത്രിക്കുന്നത്"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"അഡ്മിൻ പ്രവർത്തനക്ഷമമാക്കി"</string> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index d6a0772d36db..66806a79e869 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Нэмэлт кодлогчийг идэвхжүүлэх"</item> - <item msgid="3304843301758635896">"Нэмэлт кодлогчийг идэвхгүй болгох"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Нэмэлт кодлогчийг идэвхжүүлэх"</item> - <item msgid="741805482892725657">"Нэмэлт кодлогчийг идэвхгүй болгох"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Системийн сонголтыг ашиглах (Өгөгдмөл)"</item> <item msgid="8895532488906185219">"44.1 кГц"</item> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 8f4b695bf83d..fd79b4131acb 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> үлдсэн"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"бүрэн цэнэглэх хүртэл <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Тодорхойгүй"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Цэнэглэж байна"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"цэнэглэж байна"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Цэнэглэхгүй байна"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Залгаастай тул одоо цэнэглэх боломжгүй"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Дүүрэн"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Админ удирдсан"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Админ идэвхжүүлсэн"</string> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 5c7b15fa61fa..85e9955ef6df 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -25,7 +25,7 @@ <item msgid="8934131797783724664">"स्कॅन करत आहे…"</item> <item msgid="8513729475867537913">"कनेक्ट करत आहे..."</item> <item msgid="515055375277271756">"प्रमाणीकरण करत आहे…"</item> - <item msgid="1943354004029184381">"IP पत्ता प्राप्त करत आहे…"</item> + <item msgid="1943354004029184381">"IP पत्ता मिळवत आहे…"</item> <item msgid="4221763391123233270">"कनेक्ट केले"</item> <item msgid="624838831631122137">"निलंबित"</item> <item msgid="7979680559596111948">"डिस्कनेक्ट करत आहे..."</item> @@ -39,7 +39,7 @@ <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> + <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> वरून IP पत्ता मिळवत आहे…"</item> <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> वर कनेक्ट केले आहे"</item> <item msgid="1330262655415760617">"निलंबित"</item> <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> वरून डिस्कनेक्ट करत आहे…"</item> @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"पर्यायी कोडेक सक्षम करा"</item> - <item msgid="3304843301758635896">"पर्यायी कोडेक अक्षम करा"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"पर्यायी कोडेक सक्षम करा"</item> - <item msgid="741805482892725657">"पर्यायी कोडेक अक्षम करा"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> @@ -104,15 +88,15 @@ </string-array> <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> <item msgid="2684127272582591429">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> - <item msgid="5618929009984956469">"16 बिट/नमुना"</item> - <item msgid="3412640499234627248">"24 बिट/नमुना"</item> - <item msgid="121583001492929387">"32 बिट/नमुना"</item> + <item msgid="5618929009984956469">"16 बिट/पॅटर्न"</item> + <item msgid="3412640499234627248">"24 बिट/पॅटर्न"</item> + <item msgid="121583001492929387">"32 बिट/पॅटर्न"</item> </string-array> <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> <item msgid="1081159789834584363">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> - <item msgid="4726688794884191540">"16 बिट/नमुना"</item> - <item msgid="305344756485516870">"24 बिट/नमुना"</item> - <item msgid="244568657919675099">"32 बिट/नमुना"</item> + <item msgid="4726688794884191540">"16 बिट/पॅटर्न"</item> + <item msgid="305344756485516870">"24 बिट/पॅटर्न"</item> + <item msgid="244568657919675099">"32 बिट/पॅटर्न"</item> </string-array> <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> <item msgid="5226878858503393706">"प्रणाली निवड वापरा (डीफॉल्ट)"</item> @@ -128,13 +112,13 @@ <item msgid="7158319962230727476">"ऑडिओ गुणवत्ता (990kbps/909kbps) साठी ऑप्टिमाइझ केली"</item> <item msgid="2921767058740704969">"संतुलित ऑडिओ आणि कनेक्शन गुणवत्ता (660kbps/606kbps)"</item> <item msgid="8860982705384396512">"कनेक्शन गुणवत्ता (330kbps/303kbps) साठी ऑप्टिमाइझ केली"</item> - <item msgid="4414060457677684127">"सर्वोत्तम प्रयत्न (अनुकूल बिट दर)"</item> + <item msgid="4414060457677684127">"सर्वोत्तम प्रयत्न (अनुकूल बिट रेट)"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> <item msgid="6398189564246596868">"ऑडिओ गुणवत्तेसाठी ऑप्टिमाइझ केले"</item> <item msgid="4327143584633311908">"संतुलित ऑडिओ आणि कनेक्शन गुणवत्ता"</item> <item msgid="4681409244565426925">"कनेक्शन गुणवत्तेसाठी ऑप्टिमाइझ केले"</item> - <item msgid="364670732877872677">"सर्वोत्तम प्रयत्न (अनुकूल बिट दर)"</item> + <item msgid="364670732877872677">"सर्वोत्तम प्रयत्न (अनुकूल बिट रेट)"</item> </string-array> <string-array name="select_logd_size_titles"> <item msgid="8665206199209698501">"बंद"</item> @@ -220,7 +204,7 @@ <string-array name="show_non_rect_clip_entries"> <item msgid="993742912147090253">"बंद"</item> <item msgid="675719912558941285">"निळ्या रंगात आयताकार नसलेला क्लिप प्रांत रेखांकित करा"</item> - <item msgid="1064373276095698656">"चाचणी केलेले रेखांकित आदेश हिरव्या रंगामध्ये हायलाइट करा"</item> + <item msgid="1064373276095698656">"चाचणी केलेल्या रेखांकित कमांड हिरव्या रंगामध्ये हायलाइट करा"</item> </string-array> <string-array name="track_frame_time_entries"> <item msgid="2193584639058893150">"बंद"</item> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 4f7cff752c6b..c0cace5170cd 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -33,7 +33,7 @@ <string name="wifi_check_password_try_again" msgid="516958988102584767">"पासवर्ड तपासा आणि पुन्हा प्रयत्न करा"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"परिक्षेत्रामध्ये नाही"</string> <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"स्वयंचलितपणे कनेक्ट करणार नाही"</string> - <string name="wifi_no_internet" msgid="3880396223819116454">"इंटरनेट प्रवेश नाही"</string> + <string name="wifi_no_internet" msgid="3880396223819116454">"इंटरनेट अॅक्सेस नाही"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> द्वारे जतन केले"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s द्वारे स्वयंचलितपणे कनेक्ट केले"</string> <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"नेटवर्क रेटिंग प्रदात्याद्वारे स्वयंचलितपणे कनेक्ट केले"</string> @@ -66,11 +66,11 @@ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडिओ"</string> <string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कॉल"</string> <string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानांतरण"</string> - <string name="bluetooth_profile_hid" msgid="3680729023366986480">"इनपुट डिव्हाइस"</string> - <string name="bluetooth_profile_pan" msgid="3391606497945147673">"इंटरनेट प्रवेश"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"इनपुट डीव्हाइस"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"इंटरनेट अॅक्सेस"</string> <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"संपर्क सामायिकरण"</string> <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"संपर्क सामायिकरणासाठी वापरा"</string> - <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन सामायिकरण"</string> + <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन शेअररण"</string> <string name="bluetooth_profile_map" msgid="1019763341565580450">"मजकूर संदेश"</string> <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम प्रवेश"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> @@ -82,23 +82,23 @@ <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP शी कनेक्ट केले"</string> <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"फाइल स्थानांतर सर्व्हरशी कनेक्ट केले नाही"</string> <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"इनपुट डिव्हाइसवर कनेक्ट केले"</string> - <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"इंटरनेट प्रवेशासाठी डिव्हाइसवर कनेक्ट केले"</string> - <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"डिव्हाइससह स्थानिक इंटरनेट कनेक्शन सामायिक करत आहे"</string> - <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"इंटरनेट प्रवेशासाठी वापरा"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"इंटरनेट अॅक्सेससाठी डीव्हाइसवर कनेक्ट केले"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"डीव्हाइससह स्थानिक इंटरनेट कनेक्शन शेअर करत आहे"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"इंटरनेट अॅक्सेससाठी वापरा"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"नकाशासाठी वापरा"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM प्रवेशासाठी वापरा"</string> <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"मीडिया ऑडिओसाठी वापरा"</string> <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फोन ऑडिओसाठी वापरा"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फाईल स्थानांतरणासाठी वापरा"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट साठी वापरा"</string> - <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"जोडा"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"जोडा"</string> + <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"पेअर करा"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"पेअर करा"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करा"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट केल्यावर जोडणी आपले संपर्क आणि कॉल इतिहास यावरील प्रवेशास मंजूरी देते."</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"कनेक्ट केल्यावर पेअरींग तुमचे संपर्क आणि कॉल इतिहास यामध्ये अॅक्सेस देते."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> शी जोडू शकलो नाही."</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"अयोग्य पिन किंवा पासकीमुळे <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सह जोडू शकलो नाही."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> शी संप्रेषण करू शकत नाही."</string> - <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> द्वारे जोडणी नाकारली."</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> द्वारे पेअरींग नाकारले."</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"वाय फाय बंद."</string> <string name="accessibility_no_wifi" msgid="8834610636137374508">"वाय फाय डिस्कनेक्ट झाले."</string> <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"वाय फाय एक बार."</string> @@ -112,8 +112,8 @@ <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"काढलेले अॅप्स आणि वापरकर्ते"</string> <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB टेदरिंग"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"पोर्टेबल हॉटस्पॉट"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ब्लूटुथ टेदरिंग"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"टिथरिंग"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ब्लूटूथ टेदरिंग"</string> + <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> @@ -133,8 +133,8 @@ <string name="tts_default_lang_summary" msgid="5219362163902707785">"बोललेल्या मजकुरासाठी भाषा-विशिष्ट आवाज सेट करते"</string> <string name="tts_play_example_title" msgid="7094780383253097230">"उदाहरण ऐका"</string> <string name="tts_play_example_summary" msgid="8029071615047894486">"उच्चार संश्लेषणाचे एक छोटेसे प्रात्यक्षिक प्ले करा"</string> - <string name="tts_install_data_title" msgid="4264378440508149986">"व्हॉइस डेटा स्थापित करा"</string> - <string name="tts_install_data_summary" msgid="5742135732511822589">"उच्चार संश्लेषणासाठी आवश्यक आवाज डेटा स्थापित करा"</string> + <string name="tts_install_data_title" msgid="4264378440508149986">"व्हॉइस डेटा इंस्टॉल करा"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"उच्चार संश्लेषणासाठी आवश्यक आवाज डेटा इंस्टॉल करा"</string> <string name="tts_engine_security_warning" msgid="8786238102020223650">"हे उच्चार संश्लेषण इंजिन संकेतशब्द आणि क्रेडिट कार्ड नंबर यासारख्या वैयक्तिक मजकुरासह, बोलला जाणारा सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. हे <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> इंजिनवरून येते. या उच्चार संश्लेषण इंजिनचा वापर सक्षम करायचा?"</string> <string name="tts_engine_network_required" msgid="1190837151485314743">"या भाषेस टेक्स्ट टू स्पीचसाठी एका नेटवर्क कनेक्शनची आवश्यकता आहे."</string> <string name="tts_default_sample_string" msgid="4040835213373086322">"हे उच्चार संश्लेषणाचे एक उदाहरण आहे"</string> @@ -163,54 +163,54 @@ <string name="choose_profile" msgid="6921016979430278661">"प्रोफाइल निवडा"</string> <string name="category_personal" msgid="1299663247844969448">"वैयक्तिक"</string> <string name="category_work" msgid="8699184680584175622">"कार्य"</string> - <string name="development_settings_title" msgid="215179176067683667">"विकासक पर्याय"</string> - <string name="development_settings_enable" msgid="542530994778109538">"विकासक पर्याय सक्षम करा"</string> + <string name="development_settings_title" msgid="215179176067683667">"डेव्हलपर पर्याय"</string> + <string name="development_settings_enable" msgid="542530994778109538">"डेव्हलपर पर्याय सक्षम करा"</string> <string name="development_settings_summary" msgid="1815795401632854041">"अॅप विकासासाठी पर्याय सेट करा"</string> - <string name="development_settings_not_available" msgid="4308569041701535607">"या वापरकर्त्यासाठी विकासक पर्याय उपलब्ध नाहीत"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"या वापरकर्त्यासाठी डेव्हलपर पर्याय उपलब्ध नाहीत"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"या वापरकर्त्यासाठी VPN सेटिंग्ज उपलब्ध नाहीत"</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"या वापरकर्त्यासाठी टिथरिंग सेटिंग्ज उपलब्ध नाहीत"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"या वापरकर्त्यासाठी प्रवेश बिंदू नाव सेटिंग्ज उपलब्ध नाहीत"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"या वापरकर्त्यासाठी टेदरिंग सेटिंग्ज उपलब्ध नाहीत"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"या वापरकर्त्यासाठी अॅक्सेस बिंदू नाव सेटिंग्ज उपलब्ध नाहीत"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करणे"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"USB कनेक्ट केलेले असताना डीबग मोड"</string> - <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करणारी प्रमाणिकरणे पुनर्प्राप्त करा"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करणारी प्रमाणीकरणे रीव्होक करा"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"दोष अहवाल शॉर्टकट"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"दोष अहवाल घेण्यासाठी पॉवर मेनूमध्ये एक बटण दर्शवा"</string> <string name="keep_screen_on" msgid="1146389631208760344">"सक्रिय रहा"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"चार्ज होत असताना स्क्रीन कधीही निष्क्रिय होणार नाही"</string> - <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटुथ HCI स्नूप लॉग सक्षम करा"</string> - <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"सर्व ब्लूटुथ HCI पॅकेट एका फाईलमध्ये कॅप्चर करा"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ब्लूटूथ HCI स्नूप लॉग सक्षम करा"</string> + <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"सर्व ब्लूटूथ HCI पॅकेट एका फाईलमध्ये कॅप्चर करा"</string> <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM अनलॉक करणे"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"बूटलोडर अनलॉक करण्यासाठी अनुमती द्या"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM अनलॉक करण्यास अनुमती द्यायची?"</string> - <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"चेतावणी: ही सेटिंग चालू असताना या डिव्हाइसवर डिव्हाइस संरक्षण वैशिष्ट्ये कार्य करणार नाहीत."</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"चेतावणी: हे सेटिंग चालू असताना या डीव्हाइस वर डीव्हाइस संरक्षण वैशिष्ट्ये काम करणार नाहीत."</string> <string name="mock_location_app" msgid="7966220972812881854">"बनावट स्थान अॅप निवडा"</string> <string name="mock_location_app_not_set" msgid="809543285495344223">"कोणताही बनावट स्थान अॅप सेट केला नाही"</string> <string name="mock_location_app_set" msgid="8966420655295102685">"बनावट स्थान अॅप: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"नेटवर्किंग"</string> - <string name="wifi_display_certification" msgid="8611569543791307533">"वायरलेस प्रदर्शन प्रमाणीकरण"</string> - <string name="wifi_verbose_logging" msgid="4203729756047242344">"वाय-फाय शब्दपाल्हाळ लॉगिंग सक्षम करा"</string> - <string name="wifi_aggressive_handover" msgid="5309131983693661320">"मोबाइलकडे सोपवण्यासाठी आक्रमक वाय-फाय"</string> + <string name="wifi_display_certification" msgid="8611569543791307533">"वायरलेस डिस्प्ले प्रमाणीकरण"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"वाय-फाय व्हर्बोझ लॉगिंग सक्षम करा"</string> + <string name="wifi_aggressive_handover" msgid="5309131983693661320">"मोबाइलकडे सोपवण्यासाठी अॅग्रेसिव्ह वाय-फाय"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"वाय-फाय रोम स्कॅनला नेहमी अनुमती द्या"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"मोबाइल डेटा नेहमी सक्रिय"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"टेदरिंग हार्डवेअर प्रवेग"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"संपूर्ण आवाज अक्षम करा"</string> <string name="bluetooth_enable_inband_ringing" msgid="3291686366721786740">"इन-बँड रिंगिंग सक्षम करा"</string> - <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटुथ AVRCP आवृत्ती"</string> - <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटुथ AVRCP आवृत्ती निवडा"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ब्लूटूथ AVRCP आवृत्ती"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ब्लूटूथ AVRCP आवृत्ती निवडा"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ब्लूटूथ ऑडिओ कोडेक"</string> - <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ब्लूटुथ ऑडिओ कोडेक निवडा"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ब्लूटूथ ऑडिओ नमुना दर"</string> - <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ब्लूटुथ ऑडिओ कोडेक निवडा:\nनमुना दर"</string> - <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"प्रति नमुना ब्लूटुथ ऑडिओ बिट"</string> - <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ब्लूटुथ ऑडिओ कोडेक निवडा:\nबिट प्रति नमुना"</string> + <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ब्लूटूथ ऑडिओ कोडेक निवडा"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ब्लूटूथ ऑडिओ पॅटर्न दर"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ब्लूटूध ऑडिओ कोडेक निवडा:\nपॅटर्न दर"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"प्रति पॅटर्न ब्लूटूध ऑडिओ बिट"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ब्लूटूध ऑडिओ कोडेक निवडा:\nबिट प्रति पॅटर्न"</string> <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ब्लूटूथ ऑडिओ चॅनेल मोड"</string> - <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लूटुथ ऑडिओ कोडेक निवडा:\nचॅनेल मोड"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लूटुथ ऑडिओ LDAC कोडेक: प्लेबॅक गुणवत्ता"</string> - <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लूटुथ ऑडिओ LDAC कोडेक निवडा:\nप्लेबॅक गुणवत्ता"</string> - <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"धारावाहिक: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> - <string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस प्रदर्शन प्रमाणिकरणासाठी पर्याय दर्शवा"</string> - <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय निवडकामध्ये प्रति SSID RSSI दर्शवा"</string> - <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"सक्षम केले असताना, वाय-फाय सिग्नल कमी असताना, मोबाइलकडे डेटा कनेक्शन सोपवण्यासाठी वाय-फाय अधिक आक्रमक असेल."</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ब्लूटूथ ऑडिओ कोडेक निवडा:\nचॅनेल मोड"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ब्लूटूथ ऑडिओ LDAC कोडेक: प्लेबॅक गुणवत्ता"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ब्लूटूथ ऑडिओ LDAC कोडेक निवडा:\nप्लेबॅक गुणवत्ता"</string> + <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"स्ट्रीमिंग: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> + <string name="wifi_display_certification_summary" msgid="1155182309166746973">"वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय सिलेक्टरमध्ये प्रति SSID RSSI दर्शवा"</string> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"सक्षम केले असताना, वाय-फाय सिग्नल कमी असताना, मोबाइलकडे डेटा कनेक्शन सोपवण्यासाठी वाय-फाय अधिक अॅग्रेसिव्ह असेल."</string> <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"वाय-फाय रोम स्कॅनला इंटरफेसवर उपस्थित असलेल्या रहदारी डेटाच्या प्रमाणावर आधारित अनुमती द्या/अनुमती देऊ नका"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"लॉगर बफर आकार"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"प्रति लॉग बफर लॉगर आकार निवडा"</string> @@ -223,29 +223,29 @@ <string name="allow_mock_location" msgid="2787962564578664888">"बनावट स्थानांना अनुमती द्या"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"बनावट स्थानांना अनुमती द्या"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"दृश्य विशेषता तपासणी सक्षम करा"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"जरी वाय-फाय सक्रिय असले तरीही, नेहमी मोबाईल डेटा सक्रिय ठेवा (जलद नेटवर्क स्विच करण्यासाठी)."</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"जरी वाय-फाय चालू असले तरीही, मोबाईल डेटा नेहमी चालू ठेवा (नेटवर्क जलदरीत्या स्विच करण्यासाठी)."</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"उपलब्ध असल्यास टेदरिंग हार्डवेअर प्रवेग वापरा"</string> <string name="adb_warning_title" msgid="6234463310896563253">"USB डीबग करण्यास अनुमती द्यायची?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करण्याचा हेतू फक्त विकासाच्या उद्देशांसाठी आहे. याचा वापर आपला संगणक आणि आपले डिव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय आपल्या डिव्हाइसवर अॅप्स स्थापित करा आणि लॉग डेटा वाचा."</string> - <string name="adb_keys_warning_message" msgid="5659849457135841625">"आपण पूर्वी प्राधिकृत केलेल्या सर्व संगणकांवरुन USB डीबग करण्यासाठी प्रवेश पुनर्प्राप्त करायचा?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB डीबग करण्याचा हेतू फक्त विकास उद्देशांसाठी आहे. याचा वापर तुमचा कॉंप्युटर आणि तुमचे डीव्हाइस यांच्या दरम्यान डेटा कॉपी करण्यासाठी करा, सूचनेशिवाय तुमच्या डीव्हाइस वर अॅप्स इंस्टॉल करा आणि लॉग डेटा वाचा."</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"आपण पूर्वी अॉथोराइझ केलेल्या सर्व संगणकांवरुन USB डीबग करण्यासाठी अॅक्सेस रीव्होक करायचा?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"विकास सेटिंग्जला अनुमती द्यायची?"</string> - <string name="dev_settings_warning_message" msgid="2298337781139097964">"या सेटिंग्जचा हेतू फक्त विकास करण्याच्या वापरासाठी आहे. त्यामुळे आपले डिव्हाइस आणि त्यावरील अनुप्रयोग विघटित होऊ शकतात किंवा गैरवर्तन करू शकतात."</string> - <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वरील अॅप्स सत्यापित करा"</string> - <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक वर्तनासाठी ADB/ADT द्वारे स्थापित अॅप्स तपासा."</string> - <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डिव्हाइसेसमध्ये सहन न होणारा मोठा आवाज किंवा नियंत्रणचा अभाव यासारखी आवाजाची समस्या असल्यास ब्लूटुथ संपूर्ण आवाज वैशिष्ट्य अक्षम करते."</string> - <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फोनवरील रिंगटोन ब्लूटुथ हेडसेटवर वाजू द्या"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"या सेटिंग्जचा हेतू फक्त विकास वापरासाठी आहे. त्यामुळे तुमचे डीव्हाइस आणि त्यावरील अॅप्लिकेशन ब्रेक होऊ शकतात किंवा नेहमीपेक्षा वेगळे वर्तन करू शकतात."</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB वर अॅप्स पडताळून पाहा"</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"हानिकारक वर्तनासाठी ADB/ADT द्वारे इंस्टॉल अॅप्स तपासा."</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"दूरस्थ डीव्हाइसमध्ये सहन न होणारा मोठा आवाज किंवा नियंत्रणचा अभाव यासारखी आवाजाची समस्या असल्यास ब्लूटूथ संपूर्ण आवाज वैशिष्ट्य अक्षम करते."</string> + <string name="bluetooth_enable_inband_ringing_summary" msgid="2787866074741784975">"फोनवरील रिंगटोन ब्लूटूथ हेडसेटवर वाजू द्या"</string> <string name="enable_terminal_title" msgid="95572094356054120">"स्थानिक टर्मिनल"</string> <string name="enable_terminal_summary" msgid="67667852659359206">"स्थानिक शेल प्रवेश देणारा टर्मिनल अॅप सक्षम करा"</string> <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP तपासणी"</string> <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP तपासणी वर्तन सेट करा"</string> <string name="debug_debugging_category" msgid="6781250159513471316">"डीबग करणे"</string> <string name="debug_app" msgid="8349591734751384446">"डीबग अॅप निवडा"</string> - <string name="debug_app_not_set" msgid="718752499586403499">"कोणताही डीबग अनुप्रयोग सेट नाही"</string> - <string name="debug_app_set" msgid="2063077997870280017">"अनुप्रयोग डीबग करीत आहे: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> - <string name="select_application" msgid="5156029161289091703">"अनुप्रयोग निवडा"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"कोणतेही डीबग अॅप्लिकेशन सेट नाही"</string> + <string name="debug_app_set" msgid="2063077997870280017">"अॅप्लिकेशन डीबग करीत आहे: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="select_application" msgid="5156029161289091703">"अॅप्लिकेशन निवडा"</string> <string name="no_application" msgid="2813387563129153880">"काहीही नाही"</string> <string name="wait_for_debugger" msgid="1202370874528893091">"डीबगरची प्रतीक्षा करा"</string> - <string name="wait_for_debugger_summary" msgid="1766918303462746804">"डीबग केलेला अनुप्रयोग अंमलात आणण्यापूर्वी डीबगर संलग्न करण्याची प्रतीक्षा करतो"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"डीबग केलेले अॅप्लिकेशन अंमलात आणण्यापूर्वी डीबगर संलग्न करण्याची प्रतीक्षा करतो"</string> <string name="telephony_monitor_switch" msgid="1764958220062121194">"टेलिफोनी मॉनिटर"</string> <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"टेलिफोनी/मोडेमच्या कार्यक्षमतेत समस्या आढळल्यावर टेलिफोनी मॉनिटर लॉग्ज गोळा करेल आणि दोष फाइल करण्यासाठी वापरकर्त्याला सूचनेचे संकेत देईल"</string> <string name="debug_input_category" msgid="1811069939601180246">"इनपुट"</string> @@ -256,18 +256,18 @@ <string name="strict_mode" msgid="1938795874357830695">"कठोर मोड सक्षम"</string> <string name="strict_mode_summary" msgid="142834318897332338">"मुख्य थ्रेडवर अॅप्स मोठी कार्ये करतात तेव्हा स्क्रीन फ्लॅश करा"</string> <string name="pointer_location" msgid="6084434787496938001">"पॉइंटर स्थान"</string> - <string name="pointer_location_summary" msgid="840819275172753713">"वर्तमान स्पर्श डेटा दर्शविणारे स्क्रीन आच्छादन"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"वर्तमान स्पर्श डेटा दर्शविणारे स्क्रीन ओव्हरले"</string> <string name="show_touches" msgid="2642976305235070316">"टॅप दर्शवा"</string> <string name="show_touches_summary" msgid="6101183132903926324">"टॅपसाठी दृश्यमान अभिप्राय दर्शवा"</string> - <string name="show_screen_updates" msgid="5470814345876056420">"पृष्ठभाग अद्यतने दर्शवा"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"पृष्ठभाग अपडेट दर्शवा"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"संपूर्ण विंडो पृष्ठभाग अद्ययावत होतात तेव्हा ते फ्लॅश करा"</string> - <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य अद्यतने दर्शवा"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU दृश्य अपडेट दर्शवा"</string> <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU सह रेखांकित करताना विंडोच्या आतील दृश्ये फ्लॅश करा"</string> - <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेअर स्तर अद्यतने दर्शवा"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेअर स्तर अपडेट दर्शवा"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेअर स्तर अद्ययावत झाल्यावर ते हिरव्या रंगात फ्लॅश करा"</string> - <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU अधोरेखांकित डीबग करा"</string> + <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओव्हरड्रॉ डीबग करा"</string> <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU प्रदाता सेट करा"</string> - <string name="disable_overlays" msgid="2074488440505934665">"HW आच्छादने अक्षम करा"</string> + <string name="disable_overlays" msgid="2074488440505934665">"HW ओव्हरले अक्षम करा"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन तयार करण्यासाठी नेहमी GPU वापरा"</string> <string name="simulate_color_space" msgid="6745847141353345872">"रंग स्थानाची बतावणी करा"</string> <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ट्रेस सक्षम करा"</string> @@ -288,8 +288,8 @@ <string name="animator_duration_scale_title" msgid="3406722410819934083">"अॅनिमेटर कालावधी स्केल"</string> <string name="overlay_display_devices_title" msgid="5364176287998398539">"दुय्यम प्रदर्शनांची बतावणी करा"</string> <string name="debug_applications_category" msgid="4206913653849771549">"अॅप्स"</string> - <string name="immediately_destroy_activities" msgid="1579659389568133959">"क्रियाकलाप ठेवू नका"</string> - <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"वापरकर्त्याने प्रत्येक क्रियाकलाप सोडताच तो नष्ट करा"</string> + <string name="immediately_destroy_activities" msgid="1579659389568133959">"अॅक्टिव्हिटी ठेवू नका"</string> + <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"वापरकर्त्याने प्रत्येक अॅक्टिव्हिटी सोडताच ती नष्ट करा"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"पार्श्वभूमी प्रक्रिया मर्यादा"</string> <string name="show_all_anrs" msgid="28462979638729082">"सर्व ANR दर्शवा"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पार्श्वभूमी अॅप्ससाठी अॅप प्रतिसाद देत नाही संवाद दर्शवा"</string> @@ -304,9 +304,9 @@ <string name="local_backup_password_title" msgid="3860471654439418822">"डेस्कटॉप बॅकअप संकेतशब्द"</string> <string name="local_backup_password_summary_none" msgid="6951095485537767956">"डेस्कटॉप पूर्ण बॅक अप सध्या संरक्षित नाहीत"</string> <string name="local_backup_password_summary_change" msgid="5376206246809190364">"डेस्कटॉपच्या पूर्ण बॅकअपसाठी असलेला संकेतशब्द बदलण्यासाठी किंवा काढण्यासाठी टॅप करा"</string> - <string name="local_backup_password_toast_success" msgid="582016086228434290">"नवीन बॅक अप संकेतशब्द सेट झाला"</string> + <string name="local_backup_password_toast_success" msgid="582016086228434290">"नवीन बॅक अप पासवर्ड सेट झाला"</string> <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"नवीन संकेतशब्द आणि पुष्टीकरण जुळत नाही"</string> - <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"बॅक अप संकेतशब्द सेट करणे अयशस्वी"</string> + <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"बॅक अप पासवर्ड सेट करणे अयशस्वी"</string> <string-array name="color_mode_names"> <item msgid="2425514299220523812">"सशक्त (डीफॉल्ट)"</item> <item msgid="8446070607501413455">"नैसर्गिक"</item> @@ -327,7 +327,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> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> शिल्लक"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - पूर्णपणे चार्ज होण्यात <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज होत आहे"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज होत आहे"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"चार्ज होत नाही"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"प्लग इन केलेले आहे, आता चार्ज करू शकत नाही"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूर्ण"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"प्रशासकाने नियंत्रित केलेले"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"प्रशासकाने सक्षम केलेले"</string> @@ -365,8 +363,8 @@ <string name="disabled" msgid="9206776641295849915">"अक्षम"</string> <string name="external_source_trusted" msgid="2707996266575928037">"अनुमती आहे"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"अनुमती नाही"</string> - <string name="install_other_apps" msgid="6986686991775883017">"अज्ञात अॅप्स स्थापित करा"</string> - <string name="home" msgid="3256884684164448244">"सेटिंग्ज मुख्यपृष्ठ"</string> + <string name="install_other_apps" msgid="6986686991775883017">"अज्ञात अॅप्स इंस्टॉल करा"</string> + <string name="home" msgid="3256884684164448244">"सेटिंग्ज होम"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> <item msgid="8934126114226089439">"50%"</item> @@ -389,5 +387,5 @@ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टीम भाषा वापरा"</string> <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> साठी सेटिंग्ज उघडण्यात अयशस्वी"</string> <string name="ime_security_warning" msgid="4135828934735934248">"ही इनपुट पद्धत संकेतशब्द आणि क्रेडिट कार्ड नंबर यासह, आपण टाइप करता तो सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. ही <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> अॅपवरून येते. ही इनपुट पद्धत वापरायची?"</string> - <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"टीप: रीबूट केल्यानंतर, आपण आपला फोन अनलॉक करे पर्यंत हा अॅप प्रारंभ होऊ शकत नाही"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"टीप: रीबूट केल्यानंतर, तुम्ही आपला फोन अनलॉक करे पर्यंत हे अॅप सुरू होऊ शकत नाही"</string> </resources> diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml index bab4642fc1a4..d6fd2ec2a85f 100644 --- a/packages/SettingsLib/res/values-ms/arrays.xml +++ b/packages/SettingsLib/res/values-ms/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Gunakan Pilihan Sistem (Lalai)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Dayakan Codec Pilihan"</item> - <item msgid="3304843301758635896">"Lumpuhkan Codec Pilihan"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Gunakan Pilihan Sistem (Lalai)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Dayakan Codec Pilihan"</item> - <item msgid="741805482892725657">"Lumpuhkan Codec Pilihan"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Gunakan Pilihan Sistem (Lalai)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index eef4dd5d7688..0310185a7f39 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> lagi"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> sehingga dicas penuh"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Tidak diketahui"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Mengecas"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"mengecas"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Tidak mengecas"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Dipalamkan, tidak boleh mengecas sekarang"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Penuh"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Dikawal oleh pentadbir"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Didayakan oleh pentadbir"</string> diff --git a/packages/SettingsLib/res/values-my/arrays.xml b/packages/SettingsLib/res/values-my/arrays.xml index 97a9c53a70ff..732599e03cf1 100644 --- a/packages/SettingsLib/res/values-my/arrays.xml +++ b/packages/SettingsLib/res/values-my/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"စနစ်ရွေးချယ်မှုကို အသုံးပြုပါ (မူရင်း)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"စိတ်ကြိုက်ထည့်သွင်းနိုင်သော ကိုးဒက်ခ်များကို ဖွင့်ပါ"</item> - <item msgid="3304843301758635896">"စိတ်ကြိုက်ထည့်သွင်းနိုင်သော ကိုးဒက်ခ်များကို ပိတ်ပါ"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"စနစ်ရွေးချယ်မှုကို အသုံးပြုပါ (မူရင်း)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"စိတ်ကြိုက်ထည့်သွင်းနိုင်သော ကိုးဒက်ခ်များကို ဖွင့်ပါ"</item> - <item msgid="741805482892725657">"စိတ်ကြိုက်ထည့်သွင်းနိုင်သော ကိုးဒက်ခ်များကို ပိတ်ပါ"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"စနစ်ရွေးချယ်မှုကို အသုံးပြုပါ (မူရင်း)"</item> <item msgid="8895532488906185219">"၄၄.၁ kHz"</item> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 6aad3aabf651..8610140d5687 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -45,7 +45,7 @@ <string name="available_via_carrier" msgid="1469036129740799053">"%1$s မှတစ်ဆင့် ရနိုင်သည်"</string> <string name="speed_label_very_slow" msgid="1867055264243608530">"အလွန်နှေး"</string> <string name="speed_label_slow" msgid="813109590815810235">"နှေး"</string> - <string name="speed_label_okay" msgid="2331665440671174858">"OK"</string> + <string name="speed_label_okay" msgid="2331665440671174858">"အိုကေ"</string> <string name="speed_label_medium" msgid="3175763313268941953">"အတော်အသင့်"</string> <string name="speed_label_fast" msgid="7715732164050975057">"မြန်"</string> <string name="speed_label_very_fast" msgid="2265363430784523409">"အလွန်မြန်"</string> @@ -119,7 +119,7 @@ <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> + <string name="launch_defaults_some" msgid="313159469856372621">"မူရင်းအချို့ သတ်မှတ်ပြီး"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"ပုံမှန်သတ်မှတ်ထားခြင်းမရှိ"</string> <string name="tts_settings" msgid="8186971894801348327">"စာသားမှစကားပြောပြောင်း ဆက်တင်များ"</string> <string name="tts_settings_title" msgid="1237820681016639683">"စာသားမှ အသံထွက်စေခြင်း"</string> @@ -351,21 +351,19 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ကျန်သည်"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> − အားပြည့်ရန် <xliff:g id="TIME">^2</xliff:g> ကျန်သည်"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"အကြောင်းအရာ မသိရှိ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"အားသွင်းနေပါသည်"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"အားသွင်းနေပါသည်"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"အားသွင်းမနေပါ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ပလပ်ထိုးထားသောကြောင့် ယခုအားသွင်း၍ မရသေးပါ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"အပြည့်"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"စီမံခန့်ခွဲသူမှ ထိန်းချုပ်ပါသည်"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"စီမံခန့်ခွဲသူက ဖွင့်ထားသည်"</string> <string name="disabled_by_admin" msgid="8505398946020816620">"စီမံခန့်ခွဲသူက ပိတ်ထားသည်"</string> <string name="disabled" msgid="9206776641295849915">"ပိတ်ထားပြီး"</string> <string name="external_source_trusted" msgid="2707996266575928037">"ခွင့်ပြုထားသည်"</string> - <string name="external_source_untrusted" msgid="2677442511837596726">"ခွင့်ပြုမထားပါ"</string> - <string name="install_other_apps" msgid="6986686991775883017">"အမျိုးအမည်မသိအက်ပ် ထည့်သွင်းနိုင်ခြင်း"</string> + <string name="external_source_untrusted" msgid="2677442511837596726">"ခွင့်မပြုပါ"</string> + <string name="install_other_apps" msgid="6986686991775883017">"အမည်မသိအက်ပ်"</string> <string name="home" msgid="3256884684164448244">"ဆက်တင် ပင်မစာမျက်နှာ"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"၀%"</item> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index 287c38618802..86d0c1ec9a0a 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Bruk systemvalg (standard)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Slå på valgfrie kodeker"</item> - <item msgid="3304843301758635896">"Slå av valgfrie kodeker"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Bruk systemvalg (standard)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Slå på valgfrie kodeker"</item> - <item msgid="741805482892725657">"Slå av valgfrie kodeker"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Bruk systemvalg (standard)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 756c2fc94096..de6284da2502 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> gjenstår"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> til det er fulladet"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Ukjent"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Lader"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"lader"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Lader ikke"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Laderen er koblet til – kan ikke lade akkurat nå"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Fullt"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrollert av administratoren"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Slått på av administratoren"</string> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index ba7affd95971..6079a758b1db 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"वैकल्पिक कोडेकहरूलाई सक्षम पार्नुहोस्"</item> - <item msgid="3304843301758635896">"वैकल्पिक कोडेकहरूलाई असक्षम पार्नुहोस्"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"वैकल्पिक कोडेकहरूलाई सक्षम पार्नुहोस्"</item> - <item msgid="741805482892725657">"वैकल्पिक कोडेकहरूलाई असक्षम पार्नुहोस्"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"प्रणालीको चयन प्रयोग गर्नुहोस् (पूर्वनिर्धारित)"</item> <item msgid="8895532488906185219">"४४.१ kHz"</item> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 03d39afe0c25..6d161bc150c8 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"बाँकी समय <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">^2</xliff:g> बाँकी"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज हुँदै"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज हुँदै"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"चार्ज भइरहेको छैन"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"प्लगइन गरिएको छ, अहिले नै चार्ज गर्न सकिँदैन"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूर्ण"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"प्रशासकद्वारा नियन्त्रित"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"प्रशासकद्वारा सक्षम पारिएको छ"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index 25b803ac6771..996bb1087244 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Systeemselectie gebruiken (standaard)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Optionele codecs inschakelen"</item> - <item msgid="3304843301758635896">"Optionele codecs uitschakelen"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Systeemselectie gebruiken (standaard)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Optionele codecs inschakelen"</item> - <item msgid="741805482892725657">"Optionele codecs uitschakelen"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Systeemselectie gebruiken (standaard)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 6ca23af74946..c4f18705ee69 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -163,7 +163,7 @@ <string name="choose_profile" msgid="6921016979430278661">"Profiel kiezen"</string> <string name="category_personal" msgid="1299663247844969448">"Persoonlijk"</string> <string name="category_work" msgid="8699184680584175622">"Werk"</string> - <string name="development_settings_title" msgid="215179176067683667">"Opties voor ontwikkelaars"</string> + <string name="development_settings_title" msgid="215179176067683667">"Ontwikkelaarsopties"</string> <string name="development_settings_enable" msgid="542530994778109538">"Opties voor ontwikkelaars inschakelen"</string> <string name="development_settings_summary" msgid="1815795401632854041">"Opties instellen voor appontwikkeling"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Ontwikkelaarsopties zijn niet beschikbaar voor deze gebruiker"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> resterend"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tot volledig opgeladen"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Onbekend"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Opladen"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"opladen"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Wordt niet opgeladen"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Aangesloten, kan nu niet opladen"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Volledig"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Ingesteld door beheerder"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Ingeschakeld door beheerder"</string> diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml index 2715f9d78df8..ca369d1cec47 100644 --- a/packages/SettingsLib/res/values-pa/arrays.xml +++ b/packages/SettingsLib/res/values-pa/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਯੋਗ ਬਣਾਓ"</item> - <item msgid="3304843301758635896">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਅਯੋਗ ਬਣਾਓ"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਯੋਗ ਬਣਾਓ"</item> - <item msgid="741805482892725657">"ਵਿਕਲਪਿਕ ਕੋਡੈਕ ਅਯੋਗ ਬਣਾਓ"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"ਸਿਸਟਮ ਚੋਣ ਦੀ ਵਰਤੋਂ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 3a4349575696..1bbfab340fd4 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -66,7 +66,7 @@ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਔਡੀਓ"</string> <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ਫ਼ੋਨ ਕਾਲਾਂ"</string> <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string> - <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ਇਨਪੁਟ ਡੀਵਾਈਸ"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ਇਨਪੁੱਟ ਡੀਵਾਈਸ"</string> <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ"</string> <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ"</string> <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"ਸੰਪਰਕ ਸ਼ੇਅਰਿੰਗ ਲਈ ਵਰਤੋ"</string> @@ -81,9 +81,9 @@ <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"ਨਕਸ਼ੇ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ"</string> - <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ਇਨਪੁਟ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> - <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> - <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ਡੀਵਾਈਸ ਨਾਲ ਸਥਾਨਕ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਸ਼ੇਅਰ ਕਰ ਰਿਹਾ ਹੈ"</string> + <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ਇਨਪੁੱਟ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="4602294638909590612">"ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਲਈ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1561383706411975199">"ਡੀਵਾਈਸ ਨਾਲ ਸਥਾਨਕ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਸਾਂਝਾ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="bluetooth_pan_profile_summary_use_for" msgid="5664884523822068653">"ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"ਨਕਸ਼ੇ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ਪਹੁੰਚ ਲਈ ਵਰਤੋ"</string> @@ -96,7 +96,7 @@ <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ਰੱਦ ਕਰੋ"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ਪੇਅਰ ਕਰਨਾ ਕਨੈਕਟ ਕੀਤੇ ਜਾਣ ਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ ਅਤੇ ਕਾਲ ਇਤਿਹਾਸ ਤੱਕ ਪਹੁੰਚ ਦੀ ਅਨੁਮਤੀ ਦਿੰਦਾ ਹੈ।"</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਪੇਅਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string> - <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ਇੱਕ ਗ਼ਲਤ PIN ਜਾਂ ਪਾਸਕੁੰਜੀ ਦੇ ਕਾਰਨ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਪੇਅਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।"</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ਇੱਕ ਗ਼ਲਤ ਪਿੰਨ ਜਾਂ ਪਾਸਕੁੰਜੀ ਦੇ ਕਾਰਨ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਜੋੜਾਬੱਧ ਨਹੀਂ ਹੋ ਸਕਿਆ।"</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਨਾਲ ਸੰਚਾਰ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string> <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"ਪੇਅਰਿੰਗ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ਵੱਲੋਂ ਰੱਦ ਕੀਤੀ ਗਈ।"</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ਬੰਦ।"</string> @@ -144,7 +144,7 @@ <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ"</string> <string name="tts_status_checking" msgid="5339150797940483592">"ਜਾਂਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."</string> <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> ਲਈ ਸੈਟਿੰਗਾਂ"</string> - <string name="tts_engine_settings_button" msgid="1030512042040722285">"ਇੰਜਨ ਸੈਟਿੰਗਾਂ ਲੌਂਚ ਕਰੋ"</string> + <string name="tts_engine_settings_button" msgid="1030512042040722285">"ਇੰਜਨ ਸੈਟਿੰਗਾਂ ਲਾਂਚ ਕਰੋ"</string> <string name="tts_engine_preference_section_title" msgid="448294500990971413">"ਤਰਜੀਹੀ ਇੰਜਣ"</string> <string name="tts_general_section_title" msgid="4402572014604490502">"ਸਧਾਰਨ"</string> <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"ਬੋਲਣ ਦੀ ਪਿੱਚ ਨੂੰ ਦੁਬਾਰਾ ਮੁੜ-ਸੈੱਟ ਕਰੋ"</string> @@ -182,7 +182,7 @@ <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ਅਨਲੌਕ ਕਰਨਾ"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"ਬੂਟਲੋਡਰ ਨੂੰ ਅਨਲੌਕ ਕੀਤੇ ਜਾਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ਕੀ OEM ਨੂੰ ਅਨਲੌਕ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਡੀਵਾਈਸ ਸੁਰੱਖਿਆ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਉਦੋਂ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ਚਿਤਾਵਨੀ: ਉਦੋਂ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਨਗੀਆਂ ਜਦੋਂ ਇਹ ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇਗੀ।"</string> <string name="mock_location_app" msgid="7966220972812881854">"ਮੌਕ ਸਥਾਨ ਐਪ ਚੁਣੋ"</string> <string name="mock_location_app_not_set" msgid="809543285495344223">"ਕੋਈ ਵੀ ਮੌਕ ਸਥਾਨ ਐਪ ਸੈੱਟ ਨਹੀਂ ਕੀਤੀ ਗਈ"</string> <string name="mock_location_app_set" msgid="8966420655295102685">"ਮੌਕ ਸਥਾਨ ਐਪ: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -215,7 +215,7 @@ <string name="select_logd_size_title" msgid="7433137108348553508">"ਲੌਗਰ ਬਫਰ ਆਕਾਰ"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ਪ੍ਰਤੀ ਲੌਗ ਬਫਰ ਲੌਗਰ ਆਕਾਰ ਚੁਣੋ"</string> <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ਕੀ ਲੌਗਰ ਪ੍ਰਸਿੱਸਟੈਂਟ ਸਟੋਰੇਜ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਹੈ?"</string> - <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"ਜਦੋਂ ਅਸੀਂ ਪ੍ਰਸਿੱਸਟੈਂਟ ਲੌਗਰ ਨਾਲ ਨਿਗਰਾਨੀ ਨਹੀਂ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਸਾਨੂੰ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਵਿੱਚ ਮੌਜੂਦ ਲੌਗਰ ਡੈਟੇ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ।"</string> + <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"ਜਦੋਂ ਅਸੀਂ ਪ੍ਰਸਿੱਸਟੈਂਟ ਲੌਗਰ ਨਾਲ ਨਿਗਰਾਨੀ ਨਹੀਂ ਕਰ ਰਹੇ ਹੁੰਦੇ ਹਾਂ, ਤਾਂ ਸਾਨੂੰ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਮੌਜੂਦ ਲੌਗਰ ਡਾਟੇ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ।"</string> <string name="select_logpersist_title" msgid="7530031344550073166">"ਡੀਵਾਈਸ \'ਤੇ ਲੌਗ ਬਫ਼ਰਾਂ ਨੂੰ ਸਥਾਈ ਤੌਰ \'ਤੇ ਸਟੋਰ ਕਰੋ"</string> <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ਡੀਵਾਈਸ \'ਤੇ ਸਥਾਈ ਤੌਰ \'ਤੇ ਸਟੋਰ ਕਰਨ ਲਈ ਲੌਗ ਬਫ਼ਰਾਂ ਨੂੰ ਚੁਣੋ"</string> <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB ਕੌਂਫਿਗਰੇਸ਼ਨ ਚੁਣੋ"</string> @@ -223,13 +223,13 @@ <string name="allow_mock_location" msgid="2787962564578664888">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="allow_mock_location_summary" msgid="317615105156345626">"ਨਕਲੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"ਗੁਣ ਛਾਣਬੀਣ ਦੇਖੋ ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ"</string> - <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ਹਮੇਸ਼ਾ ਮੋਬਾਈਲ ਡੇਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ ਭਾਵੇਂ Wi‑Fi ਕਿਰਿਆਸ਼ੀਲ ਹੋਵੇ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ਹਮੇਸ਼ਾ ਮੋਬਾਈਲ ਡਾਟਾ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਰੱਖੋ ਭਾਵੇਂ ਵਾਈ-ਫਾਈ ਕਿਰਿਆਸ਼ੀਲ ਹੋਵੇ (ਤੇਜ਼ ਨੈੱਟਵਰਕ ਸਵਿੱਚਿੰਗ ਲਈ)।"</string> <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਟੈਦਰਿੰਗ ਹਾਰਡਵੇਅਰ ਐਕਸੇਲਰੇਸ਼ਨ ਵਰਤੋ"</string> <string name="adb_warning_title" msgid="6234463310896563253">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB ਡੀਬਗਿੰਗ ਕੇਵਲ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੀ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਡੈਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੀ ਡੀਵਾਈਸ ਤੇ ਐਪਸ ਇੰਸਟੌਲ ਕਰੋ ਅਤੇ ਲੌਗ ਡੈਟਾ ਪੜ੍ਹੋ।"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB ਡੀਬਗਿੰਗ ਕੇਵਲ ਵਿਕਾਸ ਮੰਤਵਾਂ ਲਈ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ ਅਤੇ ਆਪਣੇ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਡਾਟਾ ਕਾਪੀ ਕਰਨ ਲਈ ਵਰਤੋ, ਸੂਚਨਾ ਦੇ ਬਿਨਾਂ ਆਪਣੇ ਡੀਵਾਈਸ ਤੇ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ ਅਤੇ ਲੌਗ ਡਾਟਾ ਪੜ੍ਹੋ।"</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"ਕੀ ਉਹਨਾਂ ਸਾਰੇ ਕੰਪਿਊਟਰਾਂ ਤੋਂ USB ਡੀਬਗਿੰਗ ਤੱਕ ਪਹੁੰਚ ਰੱਦ ਕਰਨੀ ਹੈ, ਜਿਹਨਾਂ ਲਈ ਪਹਿਲਾਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਕੀਤਾ ਹੈ?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"ਕੀ ਵਿਕਾਸ ਸੈਟਿੰਗਾਂ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> - <string name="dev_settings_warning_message" msgid="2298337781139097964">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"ਇਹ ਸੈਟਿੰਗਾਂ ਕੇਵਲ ਵਿਕਾਸਕਾਰ ਦੀ ਵਰਤੋਂ ਲਈ ਹਨ। ਇਹ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਅਤੇ ਇਸਤੇ ਮੌਜੂਦ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬ੍ਰੇਕ ਕਰਨ ਜਾਂ ਦੁਰਵਿਵਹਾਰ ਕਰਨ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੇ ਹਨ।"</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ਤੇ ਐਪਸ ਨੂੰ ਪ੍ਰਮਾਣਿਤ ਕਰੋ"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ਹਾਨੀਕਾਰਕ ਵਿਵਹਾਰ ਲਈ ADB/ADT ਰਾਹੀਂ ਇੰਸਟੌਲ ਕੀਤੇ ਐਪਸ ਦੀ ਜਾਂਚ ਕਰੋ।"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ਰਿਮੋਟ ਡੀਵਾਈਸਾਂ ਨਾਲ ਵੌਲਿਊਮ ਸਮੱਸਿਆਵਾਂ ਜਿਵੇਂ ਕਿ ਨਾ ਪਸੰਦ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਉੱਚੀ ਵੌਲਿਊਮ ਜਾਂ ਕੰਟਰੋਲ ਦੀ ਕਮੀ ਵਰਗੀ ਹਾਲਤ ਵਿੱਚ ਬਲੂਟੁੱਥ ਪੂਰਨ ਵੌਲਿਊਮ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਅਯੋਗ ਬਣਾਉਂਦਾ ਹੈ।"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ਬਾਕੀ"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਤੱਕ <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ਅਗਿਆਤ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜਿੰਗ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ਪਲੱਗ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਇਸ ਸਮੇਂ ਚਾਰਜ ਨਹੀਂ ਹੋ ਸਕਦੀ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ਪੂਰੀ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕੀਤੀ ਗਈ"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਯੋਗ ਬਣਾਇਆ ਗਿਆ"</string> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index 375615f7b801..175d11bafcfb 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Użyj wyboru systemu (domyślnie)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Włącz opcjonalne kodeki"</item> - <item msgid="3304843301758635896">"Wyłącz opcjonalne kodeki"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Użyj wyboru systemu (domyślnie)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Włączenie opcjonalnych kodeków"</item> - <item msgid="741805482892725657">"Wyłączenie opcjonalnych kodeków"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Użyj wyboru systemu (domyślnie)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index a635a85f31b3..a3a717ad02ba 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zostało <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do pełnego naładowania"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nieznane"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Ładowanie"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ładowanie"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nie podłączony"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Podłączony. Nie można teraz ładować"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Naładowana"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolowane przez administratora"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Włączone przez administratora"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml index e3f287bb3829..19bd0d32fd79 100644 --- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usar seleção do sistema (padrão)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Ativar codecs opcionais"</item> - <item msgid="3304843301758635896">"Desativar codecs opcionais"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usar seleção do sistema (padrão)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Ativar codecs opcionais"</item> - <item msgid="741805482892725657">"Desativar codecs opcionais"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usar seleção do sistema (padrão)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 2e1855bfc332..f9f68a77b4ea 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> restante(s)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> até a carga completa"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Carregando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"carregando"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Não está carregando"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Conectado. Não é possível carregar no momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Cheio"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlada pelo admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Ativado pelo administrador"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 3eeade0644d0..833c7959997e 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Utilizar seleção do sistema (predef.)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Ativar codecs opcionais"</item> - <item msgid="3304843301758635896">"Desativar codecs opcionais"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Utilizar seleção do sistema (predef.)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Ativar codecs opcionais"</item> - <item msgid="741805482892725657">"Desativar codecs opcionais"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Utilizar seleção do sistema (predef.)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 02af40fc27d3..c2c8758df5bd 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – resta(m) <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> até ficar totalmente carregada"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"A carregar"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"a carregar…"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Não está a carregar"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Ligada à corrente, não é possível carregar neste momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Completo"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlado pelo administrador"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Ativada pelo administrador"</string> diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml index e3f287bb3829..19bd0d32fd79 100644 --- a/packages/SettingsLib/res/values-pt/arrays.xml +++ b/packages/SettingsLib/res/values-pt/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Usar seleção do sistema (padrão)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Ativar codecs opcionais"</item> - <item msgid="3304843301758635896">"Desativar codecs opcionais"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Usar seleção do sistema (padrão)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Ativar codecs opcionais"</item> - <item msgid="741805482892725657">"Desativar codecs opcionais"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Usar seleção do sistema (padrão)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 2e1855bfc332..f9f68a77b4ea 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> restante(s)"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> até a carga completa"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Carregando"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"carregando"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Não está carregando"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Conectado. Não é possível carregar no momento"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Cheio"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlada pelo admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Ativado pelo administrador"</string> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index 39ebb82345c0..d6488954f45d 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Folosiți selectarea sist. (prestabilit)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Activați codecurile opționale"</item> - <item msgid="3304843301758635896">"Dezactivați codecurile opționale"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Folosiți selectarea sist. (prestabilit)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Activați codecurile opționale"</item> - <item msgid="741805482892725657">"Dezactivați codecurile opționale"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Folosiți selectarea sist. (prestabilit)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 3ecec0ebae6d..9f63e043954b 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – timp rămas: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> până la încărcarea completă"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Necunoscut"</string> - <string name="battery_info_status_charging" msgid="1705179948350365604">"Încarcă"</string> + <string name="battery_info_status_charging" msgid="1705179948350365604">"Se încarcă"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"se încarcă"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nu se încarcă"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Conectat, nu se poate încărca chiar acum"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Complet"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Controlată de administrator"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Activat de administrator"</string> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index 784e48e7031f..a8315cb81f61 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Выбор системы (по умолчанию)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Включить дополнительные кодеки"</item> - <item msgid="3304843301758635896">"Отключить дополнительные кодеки"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Выбор системы (по умолчанию)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Включить дополнительные кодеки"</item> - <item msgid="741805482892725657">"Отключить дополнительные кодеки"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Выбор системы (по умолчанию)"</item> <item msgid="8895532488906185219">"44,1 кГц"</item> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index c35a1e1c7359..e9327b2754c2 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -276,12 +276,12 @@ <string name="debug_layout" msgid="5981361776594526155">"Показывать границы элементов"</string> <string name="debug_layout_summary" msgid="2001775315258637682">"Показывать границы обрезки, поля и т. п."</string> <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"Отразить интерфейс"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Включить написание справа налево для всех языков"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"Принудительно расположить элементы интерфейса справа налево во всех локалях"</string> <string name="force_hw_ui" msgid="6426383462520888732">"GPU-ускорение"</string> <string name="force_hw_ui_summary" msgid="5535991166074861515">"Всегда использовать GPU для двухмерного рисования"</string> <string name="force_msaa" msgid="7920323238677284387">"Включить 4x MSAA"</string> <string name="force_msaa_summary" msgid="9123553203895817537">"Включить 4x MSAA в приложениях OpenGL ES 2.0"</string> - <string name="show_non_rect_clip" msgid="505954950474595172">"Отладить операции непрямоугольного усечения"</string> + <string name="show_non_rect_clip" msgid="505954950474595172">"Отладка операций усечения сложной формы"</string> <string name="track_frame_time" msgid="6146354853663863443">"Профилировать GPU-отрисовку"</string> <string name="window_animation_scale_title" msgid="6162587588166114700">"Анимация окон"</string> <string name="transition_animation_scale_title" msgid="387527540523595875">"Анимация переходов"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g>, осталось: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до полной зарядки"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Неизвестно"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Идет зарядка"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"заряжается"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не заряжается"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Подключено, не заряжается"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Батарея заряжена"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Контролируется администратором"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Включено администратором"</string> diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml index 582c2482d1ec..a3c4934dca1a 100644 --- a/packages/SettingsLib/res/values-si/arrays.xml +++ b/packages/SettingsLib/res/values-si/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"පද්ධති තේරීම භාවිත කරන්න (පෙරනිමි)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"විකල්පමය කොඩෙක් සබල කරන්න"</item> - <item msgid="3304843301758635896">"විකල්පමය කොඩෙක් අබල කරන්න"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"පද්ධති තේරීම භාවිත කරන්න (පෙරනිමි)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"විකල්පමය කොඩෙක් සබල කරන්න"</item> - <item msgid="741805482892725657">"විකල්පමය කොඩෙක් අබල කරන්න"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"පද්ධති තේරීම භාවිත කරන්න (පෙරනිමි)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 5e8011a870d7..d008fef93af6 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - ඉතිරි <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> සම්පූර්ණයෙන් ආරෝපණය වන තෙක්"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"නොදනී"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ආරෝපණය වෙමින්"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ආරෝපණය වේ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ආරෝපණය නොවේ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"පේනුගත කර ඇත, මේ අවස්ථාවේදී ආරෝපණය කළ නොහැකිය"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"පූර්ණ"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"පරිපාලක විසින් පාලනය කරන ලදී"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"පරිපාලක විසින් සබල කර ඇත"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"අබල කර ඇත"</string> <string name="external_source_trusted" msgid="2707996266575928037">"ඉඩ දුන්"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"ඉඩ නොදෙන"</string> - <string name="install_other_apps" msgid="6986686991775883017">"නොදන්නා යෙදුම් ස්ථාපනය කරන්න"</string> + <string name="install_other_apps" msgid="6986686991775883017">"නොදන්නා යෙදුම් ස්ථාප."</string> <string name="home" msgid="3256884684164448244">"සැකසීම් මුල් පිටුව"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml index b7ac4353d3de..dbffb0c120d2 100644 --- a/packages/SettingsLib/res/values-sk/arrays.xml +++ b/packages/SettingsLib/res/values-sk/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Použiť voľbu systému (predvolené)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Povoliť voliteľné kodeky"</item> - <item msgid="3304843301758635896">"Zakázať voliteľné kodeky"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Použiť voľbu systému (predvolené)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Povoliť voliteľné kodeky"</item> - <item msgid="741805482892725657">"Zakázať voliteľné kodeky"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Použiť voľbu systému (predvolené)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> @@ -245,7 +229,7 @@ <item msgid="7899496259191969307">"Najviac 4 procesy"</item> </string-array> <string-array name="usb_configuration_titles"> - <item msgid="488237561639712799">"Nabíjanie"</item> + <item msgid="488237561639712799">"Nabíja sa"</item> <item msgid="5220695614993094977">"MTP (Media Transfer Protocol – protokol na prenos médií)"</item> <item msgid="2086000968159047375">"PTP (Picture Transfer Protocol – protokol na prenos obrázkov)"</item> <item msgid="7398830860950841822">"RNDIS (USB Ethernet)"</item> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index b81fee1f3d41..ebef1ada3ad4 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"Siete sa nedajú vyhľadávať"</string> <string name="wifi_security_none" msgid="7985461072596594400">"Žiadne"</string> <string name="wifi_remembered" msgid="4955746899347821096">"Uložené"</string> - <string name="wifi_disabled_generic" msgid="4259794910584943386">"Zakázané"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"Vypnuté"</string> <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"Zlyhanie konfigurácie adresy IP"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"Nepripojené z dôvodu siete nízkej kvality"</string> <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"Zlyhanie pripojenia Wi-Fi"</string> @@ -119,7 +119,7 @@ <string name="user_guest" msgid="8475274842845401871">"Hosť"</string> <string name="unknown" msgid="1592123443519355854">"Neznáme"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Používateľ: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> - <string name="launch_defaults_some" msgid="313159469856372621">"Predvolená pre niektoré akcie"</string> + <string name="launch_defaults_some" msgid="313159469856372621">"Pre niektoré akcie"</string> <string name="launch_defaults_none" msgid="4241129108140034876">"Nie je predvolená pre žiadne akcie"</string> <string name="tts_settings" msgid="8186971894801348327">"Nastavenia prevodu textu na reč"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Prevod textu na reč"</string> @@ -333,7 +333,7 @@ <string name="button_convert_fbe" msgid="5152671181309826405">"Vymazať a konvertovať…"</string> <string name="picture_color_mode" msgid="4560755008730283695">"Farebný režim obrázka"</string> <string name="picture_color_mode_desc" msgid="1141891467675548590">"Použije sa sRGB"</string> - <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Zakázané"</string> + <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"Vypnuté"</string> <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"Monochromázia (úplna farbosleposť)"</string> <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"Deuteranomália (červená a zelená)"</string> <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"Protanomália (červená a zelená)"</string> @@ -351,18 +351,16 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zostávajúci čas: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do úplného nabitia"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Neznáme"</string> - <string name="battery_info_status_charging" msgid="1705179948350365604">"Nabíjanie"</string> - <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nabíjanie"</string> + <string name="battery_info_status_charging" msgid="1705179948350365604">"Nabíja sa"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nabíja sa"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nenabíja sa"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Pripojené, ale nie je možné nabíjať"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Nabitá"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Ovládané správcom"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Povolené správcom"</string> <string name="disabled_by_admin" msgid="8505398946020816620">"Zakázané správcom"</string> - <string name="disabled" msgid="9206776641295849915">"Zakázané"</string> + <string name="disabled" msgid="9206776641295849915">"Deaktivované"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Povolené"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"Nie je povolené"</string> <string name="install_other_apps" msgid="6986686991775883017">"Inštalácia neznámych aplikácií"</string> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index 5ffdd17f1407..699409662c76 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Uporabi sistemsko izbiro (privzeto)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Omogoči izbirne kodeke"</item> - <item msgid="3304843301758635896">"Onemogoči izbirne kodeke"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Uporabi sistemsko izbiro (privzeto)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Omogoči izbirne kodeke"</item> - <item msgid="741805482892725657">"Onemogoči izbirne kodeke"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Uporabi sistemsko izbiro (privzeto)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 4f3bce1f9ad1..dc27278441ea 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -351,20 +351,18 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – še <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do napolnjenosti"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Neznano"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Polnjenje"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"polnjenje"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Se ne polni"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Priključeno, trenutno ni mogoče polniti"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Poln"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Nadzira skrbnik"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Omogočil skrbnik"</string> <string name="disabled_by_admin" msgid="8505398946020816620">"Onemogočil skrbnik"</string> <string name="disabled" msgid="9206776641295849915">"Onemogočeno"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Dovoljene"</string> - <string name="external_source_untrusted" msgid="2677442511837596726">"Nedovoljene"</string> + <string name="external_source_untrusted" msgid="2677442511837596726">"Ni dovoljeno"</string> <string name="install_other_apps" msgid="6986686991775883017">"Nameščanje neznanih aplikacij"</string> <string name="home" msgid="3256884684164448244">"Začetna stran nastavitev"</string> <string-array name="battery_labels"> diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml index 3db4250bac59..5f6845013125 100644 --- a/packages/SettingsLib/res/values-sq/arrays.xml +++ b/packages/SettingsLib/res/values-sq/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Aktivizo kodekët opsionalë"</item> - <item msgid="3304843301758635896">"Çaktivizo kodekët opsionalë"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Aktivizo kodekët opsionalë"</item> - <item msgid="741805482892725657">"Çaktivizo kodekët opsionalë"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Përdor përzgjedhjen e sistemit (e parazgjedhur)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 0558c362f2f3..97c506fd9a26 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> të mbetura"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> derisa të mbushet plotësisht"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"I panjohur"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Po ngarkohet"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"po ngarkohet"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Nuk po ngarkohet"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Në prizë, por nuk mund të ngarkohet për momentin"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"E mbushur"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontrolluar nga administratori"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Aktivizuar nga administratori"</string> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index ef1c9de94847..8c79f56f6bff 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Користи избор система (подразумевано)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Омогући опционалне кодеке"</item> - <item msgid="3304843301758635896">"Онемогући опционалне кодеке"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Користи избор система (подразумевано)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Омогући опционалне кодеке"</item> - <item msgid="741805482892725657">"Онемогући опционалне кодеке"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Користи избор система (подразумевано)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index f1506d277aa1..7d07e4f08cf5 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"Преостало је <xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до потпуног пуњења"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Непознато"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Пуњење"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"пуни се"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не пуни се"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Прикључено је, али пуњење тренутно није могуће"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Пуно"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Контролише администратор"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Омогућио је администратор"</string> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index 23bb7977f934..008a2df6857a 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Använd systemval (standardinställning)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Aktivera valfria kodekar"</item> - <item msgid="3304843301758635896">"Inaktivera valfria kodekar"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Använd systemval (standardinställning)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Aktivera valfria kodekar"</item> - <item msgid="741805482892725657">"Inaktivera valfria kodekar"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Använd systemval (standardinställning)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 97511cf01ca5..617eac38bec4 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> kvar"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tills det är fulladdat"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Okänd"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Laddar"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laddas"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Laddar inte"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Inkopplad, kan inte laddas just nu"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Fullt"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Strys av administratören"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Aktiverad av administratör"</string> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index b5953a347c79..70553680186a 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Washa Kodeki Zisizo za Lazima"</item> - <item msgid="3304843301758635896">"Zima Kodeki Zisizo za Lazima"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Washa Kodeki Zisizo za Lazima"</item> - <item msgid="741805482892725657">"Zima Kodeki Zisizo za Lazima"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> <item msgid="8895532488906185219">"kHz 44.1"</item> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 6e4e85e1d732..ebc722c4e56d 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"Imechaji <xliff:g id="LEVEL">^1</xliff:g> - Zimesalia <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> hadi ijae chaji"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Haijulikani"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Inachaji"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"inachaji"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Haichaji"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Haiwezi kuchaji kwa sasa"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Imejaa"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Imedhibitiwa na msimamizi"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Imewashwa na msimamizi"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"Imezimwa"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Imeruhusiwa"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"Hairuhusiwi"</string> - <string name="install_other_apps" msgid="6986686991775883017">"Sakinisha programu ambazo hazijulikani"</string> + <string name="install_other_apps" msgid="6986686991775883017">"Kuweka programu zisizojulikana"</string> <string name="home" msgid="3256884684164448244">"Ukurasa wa Kwanza wa Mipangilio"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-ta/arrays.xml b/packages/SettingsLib/res/values-ta/arrays.xml index 96c9122357ed..d45034de118f 100644 --- a/packages/SettingsLib/res/values-ta/arrays.xml +++ b/packages/SettingsLib/res/values-ta/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"கட்டாயமில்லா கோடெக்குகளை இயக்கு"</item> - <item msgid="3304843301758635896">"கட்டாயமில்லா கோடெக்குகளை முடக்கு"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"கட்டாயமில்லா கோடெக்குகளை இயக்கு"</item> - <item msgid="741805482892725657">"கட்டாயமில்லா கோடெக்குகளை முடக்கு"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"சாதனத் தேர்வைப் பயன்படுத்து (இயல்பு)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index e707596ad62d..f2d0b11b33db 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> மீதமுள்ளது"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">^2</xliff:g> ஆகும்"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"அறியப்படாத"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"சார்ஜ் ஏற்றப்படுகிறது"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"சார்ஜாகிறது"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"சார்ஜ் செய்யப்படவில்லை"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"செருகப்பட்டது, ஆனால் இப்போது சார்ஜ் செய்ய முடியவில்லை"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"முழுமை"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"நிர்வாகி கட்டுப்படுத்துகிறார்"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"நிர்வாகி இயக்கியுள்ளார்"</string> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index cc771390d7b2..7061ff1f8c93 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"ఐచ్ఛిక కోడెక్లను ప్రారంభించు"</item> - <item msgid="3304843301758635896">"ఐచ్ఛిక కోడెక్లను నిలిపివేయి"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"ఐచ్ఛిక కోడెక్లను ప్రారంభించు"</item> - <item msgid="741805482892725657">"ఐచ్ఛిక కోడెక్లను నిలిపివేయి"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 20e8931ed73e..e868f111d9be 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -96,7 +96,7 @@ <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"రద్దు చేయి"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"జత చేయడం వలన కనెక్ట్ చేయబడినప్పుడు మీ పరిచయాలకు మరియు కాల్ చరిత్రకు ప్రాప్యతను మంజూరు చేస్తుంది."</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>తో జత చేయడం సాధ్యపడలేదు."</string> - <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"పిన్ లేదా పాస్కీ చెల్లని కారణంగా <xliff:g id="DEVICE_NAME">%1$s</xliff:g>తో జత చేయడం సాధ్యపడలేదు."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"పిన్ లేదా పాస్కీ చెల్లని కారణంగా <xliff:g id="DEVICE_NAME">%1$s</xliff:g>తో జత చేయడం సాధ్యపడలేదు."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>తో కమ్యూనికేట్ చేయడం సాధ్యపడదు."</string> <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> జత చేయడాన్ని తిరస్కరించింది."</string> <string name="accessibility_wifi_off" msgid="1166761729660614716">"Wifi ఆఫ్లో ఉంది."</string> @@ -169,11 +169,11 @@ <string name="development_settings_not_available" msgid="4308569041701535607">"ఈ వినియోగదారు కోసం డెవలపర్ ఎంపికలు అందుబాటులో లేవు"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN సెట్టింగ్లు ఈ వినియోగదారుకి అందుబాటులో లేవు"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"టీథరింగ్ సెట్టింగ్లు ఈ వినియోగదారుకి అందుబాటులో లేవు"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"ప్రాప్యత స్థానం పేరు సెట్టింగ్లు ఈ వినియోగదారుకి అందుబాటులో లేవు"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"యాక్సెస్ స్థానం పేరు సెట్టింగ్లు ఈ వినియోగదారుకి అందుబాటులో లేవు"</string> <string name="enable_adb" msgid="7982306934419797485">"USB డీబగ్గింగ్"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"USB కనెక్ట్ చేయబడినప్పుడు డీబగ్ మోడ్"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB డీబగ్ ప్రామాణీకరణలను ఉపసంహరించు"</string> - <string name="bugreport_in_power" msgid="7923901846375587241">"బగ్ నివేదిక సత్వరమార్గం"</string> + <string name="bugreport_in_power" msgid="7923901846375587241">"బగ్ నివేదిక షార్ట్కట్"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"బగ్ నివేదికను తీసుకోవడానికి పవర్ మెనులో బటన్ను చూపు"</string> <string name="keep_screen_on" msgid="1146389631208760344">"సక్రియంగా ఉంచు"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"ఛార్జ్ చేస్తున్నప్పుడు స్క్రీన్ ఎప్పటికీ నిద్రావస్థలోకి వెళ్లదు"</string> @@ -184,8 +184,8 @@ <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM అన్లాకింగ్ను అనుమతించాలా?"</string> <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"హెచ్చరిక: ఈ సెట్టింగ్ ఆన్ చేయబడినప్పుడు పరికరం రక్షణ లక్షణాలు ఈ పరికరంలో పని చేయవు."</string> <string name="mock_location_app" msgid="7966220972812881854">"అనుకృత స్థాన అనువర్తనాన్ని ఎంచుకోండి"</string> - <string name="mock_location_app_not_set" msgid="809543285495344223">"అనుకృత స్థాన అనువర్తనం ఏదీ సెట్ చేయబడలేదు"</string> - <string name="mock_location_app_set" msgid="8966420655295102685">"అనుకృత స్థాన అనువర్తనం: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="mock_location_app_not_set" msgid="809543285495344223">"అనుకృత స్థాన యాప్ ఏదీ సెట్ చేయబడలేదు"</string> + <string name="mock_location_app_set" msgid="8966420655295102685">"అనుకృత స్థాన యాప్: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="debug_networking_category" msgid="7044075693643009662">"నెట్వర్కింగ్"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"వైర్లెస్ ప్రదర్శన ప్రమాణీకరణ"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi విశదీకృత లాగింగ్ను ప్రారంభించండి"</string> @@ -229,7 +229,7 @@ <string name="adb_warning_message" msgid="7316799925425402244">"USB డీబగ్గింగ్ అనేది అభివృద్ధి ప్రయోజనాల కోసం మాత్రమే ఉద్దేశించబడింది. మీ కంప్యూటర్ మరియు మీ పరికరం మధ్య డేటాను కాపీ చేయడానికి, నోటిఫికేషన్ లేకుండా మీ పరికరంలో అనువర్తనాలను ఇన్స్టాల్ చేయడానికి మరియు లాగ్ డేటాను చదవడానికి దీన్ని ఉపయోగించండి."</string> <string name="adb_keys_warning_message" msgid="5659849457135841625">"మీరు గతంలో ప్రామాణీకరించిన అన్ని కంప్యూటర్ల నుండి USB డీబగ్గింగ్కు ప్రాప్యతను ఉపసంహరించాలా?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"అభివృద్ధి సెట్టింగ్లను అనుమతించాలా?"</string> - <string name="dev_settings_warning_message" msgid="2298337781139097964">"ఈ సెట్టింగ్లు అభివృద్ధి వినియోగం కోసం మాత్రమే ఉద్దేశించబడినవి. వీటి వలన మీ పరికరం మరియు దీనిలోని అనువర్తనాలు విచ్ఛిన్నం కావచ్చు లేదా తప్పుగా ప్రవర్తించవచ్చు."</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"ఈ సెట్టింగ్లు అభివృద్ధి వినియోగం కోసం మాత్రమే ఉద్దేశించబడినవి. వీటి వలన మీ పరికరం మరియు దీనిలోని యాప్లు విచ్ఛిన్నం కావచ్చు లేదా తప్పుగా ప్రవర్తించవచ్చు."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ద్వారా అనువర్తనాలను ధృవీకరించు"</string> <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"హానికరమైన ప్రవర్తన కోసం ADB/ADT ద్వారా ఇన్స్టాల్ చేయబడిన అనువర్తనాలను తనిఖీ చేయి."</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"రిమోట్ పరికరాల్లో ఆమోదించలేని స్థాయిలో అధిక వాల్యూమ్ ఉండటం లేదా వాల్యూమ్ నియంత్రణ లేకపోవడం వంటి సమస్యలు ఉంటే బ్లూటూత్ సంపూర్ణ వాల్యూమ్ లక్షణాన్ని నిలిపివేస్తుంది."</string> @@ -240,12 +240,12 @@ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP తనిఖీ ప్రవర్తనను సెట్ చేయండి"</string> <string name="debug_debugging_category" msgid="6781250159513471316">"డీబగ్గింగ్"</string> <string name="debug_app" msgid="8349591734751384446">"డీబగ్ అనువర్తనాన్ని ఎంచుకోండి"</string> - <string name="debug_app_not_set" msgid="718752499586403499">"డీబగ్ అనువర్తనం సెట్ చేయబడలేదు"</string> - <string name="debug_app_set" msgid="2063077997870280017">"డీబగ్గింగ్ అనువర్తనం: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"డీబగ్ యాప్ సెట్ చేయబడలేదు"</string> + <string name="debug_app_set" msgid="2063077997870280017">"డీబగ్గింగ్ యాప్: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="select_application" msgid="5156029161289091703">"అనువర్తనాన్ని ఎంచుకోండి"</string> <string name="no_application" msgid="2813387563129153880">"ఏదీ వద్దు"</string> <string name="wait_for_debugger" msgid="1202370874528893091">"డీబగ్గర్ కోసం వేచి ఉండండి"</string> - <string name="wait_for_debugger_summary" msgid="1766918303462746804">"డీబగ్ చేయబడిన అనువర్తనం అమలు కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"డీబగ్ చేయబడిన యాప్ అమలు కావడానికి ముందు జోడించాల్సిన డీబగ్గర్ కోసం వేచి ఉంటుంది"</string> <string name="telephony_monitor_switch" msgid="1764958220062121194">"టెలిఫోనీ మానిటర్"</string> <string name="telephony_monitor_switch_summary" msgid="7695552966547975635">"టెలిఫోనీ/మోడెమ్ కార్యాచరణలో సమస్యను గుర్తించినప్పుడు TelephonyMonitor లాగ్లను సేకరిస్తుంది మరియు బగ్ని ఫైల్ చేయమని వినియోగదారును ప్రోత్సహిస్తుంది"</string> <string name="debug_input_category" msgid="1811069939601180246">"ఇన్పుట్"</string> @@ -259,11 +259,11 @@ <string name="pointer_location_summary" msgid="840819275172753713">"ప్రస్తుత స్పర్శ డేటాను చూపేలా స్క్రీన్ అతివ్యాప్తి చేయండి"</string> <string name="show_touches" msgid="2642976305235070316">"నొక్కినవి చూపు"</string> <string name="show_touches_summary" msgid="6101183132903926324">"నొక్కినవాటికి సంబంధించిన దృశ్య అభిప్రాయాన్ని చూపు"</string> - <string name="show_screen_updates" msgid="5470814345876056420">"సర్ఫేస్ నవీకరణలను చూపండి"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"సర్ఫేస్ అప్డేట్లను చూపండి"</string> <string name="show_screen_updates_summary" msgid="2569622766672785529">"పూర్తి విండో ఉపరితలాలు నవీకరించబడినప్పుడు వాటిని ఫ్లాష్ చేయండి"</string> - <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU వీక్షణ నవీకరణలను చూపండి"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU వీక్షణ అప్డేట్లను చూపండి"</string> <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPUతో గీసినప్పుడు విండోల లోపల వీక్షణలను ఫ్లాష్ చేయండి"</string> - <string name="show_hw_layers_updates" msgid="5645728765605699821">"హార్డ్వేర్ లేయర్ల నవీకరణలను చూపండి"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"హార్డ్వేర్ లేయర్ల అప్డేట్లను చూపండి"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"హార్డ్వేర్ లేయర్లు నవీకరించబడినప్పుడు వాటిని ఆకుపచ్చ రంగులో ఫ్లాష్ చేయండి"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ఓవర్డ్రాను డీబగ్ చేయండి"</string> <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU Rendererని సెట్ చేయండి"</string> @@ -292,9 +292,9 @@ <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ప్రతి కార్యాచరణను వినియోగదారు నిష్క్రమించిన వెంటనే తొలగించండి"</string> <string name="app_process_limit_title" msgid="4280600650253107163">"నేపథ్య ప్రాసెస్ పరిమితి"</string> <string name="show_all_anrs" msgid="28462979638729082">"అన్ని ANRలను చూపు"</string> - <string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య అనువర్తనాల కోసం అనువర్తనం ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య యాప్ల కోసం యాప్ ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string> <string name="show_notification_channel_warnings" msgid="1399948193466922683">"ఛానెల్ హెచ్చరికల నోటిఫికేషన్ను చూపు"</string> - <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"చెల్లుబాటు అయ్యే ఛానెల్ లేకుండా అనువర్తనం నోటిఫికేషన్ను పోస్ట్ చేస్తున్నప్పుడు స్క్రీన్పై హెచ్చరికను చూపిస్తుంది"</string> + <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"చెల్లుబాటు అయ్యే ఛానెల్ లేకుండా యాప్ నోటిఫికేషన్ను పోస్ట్ చేస్తున్నప్పుడు స్క్రీన్పై హెచ్చరికను చూపిస్తుంది"</string> <string name="force_allow_on_external" msgid="3215759785081916381">"అనువర్తనాలను బాహ్య నిల్వలో నిర్బంధంగా అనుమతించు"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయడానికి అనుమతిస్తుంది"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"కార్యాచరణలను పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string> @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> మిగిలి ఉంది"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>లో పూర్తిగా ఛార్జ్ అవుతుంది"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"తెలియదు"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ఛార్జ్ అవుతోంది"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ఛార్జ్ అవుతోంది"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ఛార్జ్ కావడం లేదు"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ప్లగ్ ఇన్ చేయబడింది, ప్రస్తుతం ఛార్జ్ చేయడం సాధ్యం కాదు"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"నిండింది"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"నిర్వాహకుని ద్వారా నియంత్రించబడింది"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"నిర్వాహకులు ప్రారంభించారు"</string> @@ -389,5 +387,5 @@ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"సిస్టమ్ భాషలను ఉపయోగించు"</string> <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> యొక్క సెట్టింగ్లను తెరవడం విఫలమైంది"</string> <string name="ime_security_warning" msgid="4135828934735934248">"ఈ ఇన్పుట్ పద్ధతి మీరు టైప్ చేసే మొత్తం వచనాన్ని అలాగే పాస్వర్డ్లు మరియు క్రెడిట్ కార్డు నంబర్ల వంటి వ్యక్తిగత డేటాను సేకరించగలదు. ఇది <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> అనువర్తనంలో అందించబడుతుంది. ఈ ఇన్పుట్ పద్ధతిని ఉపయోగించాలా?"</string> - <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"గమనిక: రీబూట్ చేసాక, మీరు మీ ఫోన్ను అన్లాక్ చేసే వరకు ఈ అనువర్తనం ప్రారంభం కాదు"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"గమనిక: రీబూట్ చేసాక, మీరు మీ ఫోన్ను అన్లాక్ చేసే వరకు ఈ యాప్ ప్రారంభం కాదు"</string> </resources> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index d46fc7d2c616..4d42934c4fc1 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"เปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item> - <item msgid="3304843301758635896">"ปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"เปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item> - <item msgid="741805482892725657">"ปิดใช้ตัวแปลงรหัสที่ไม่บังคับ"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"ใช้การเลือกระบบ (ค่าเริ่มต้น)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index ef215848fd44..007d3a5abf7b 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - เหลืออีก <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> จนกว่าจะชาร์จเต็ม"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ไม่ทราบ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"กำลังชาร์จ"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"กำลังชาร์จ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ไม่ได้ชาร์จ"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"เสียบอยู่ ไม่สามารถชาร์จได้ในขณะนี้"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"เต็ม"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ผู้ดูแลระบบเป็นผู้ควบคุม"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"เปิดใช้โดยผู้ดูแลระบบ"</string> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index 2a82ab6647c3..e6c47daa13e5 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Gamitin ang Pagpili ng System (Default)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"I-enable ang Mga Opsyonal na Codec"</item> - <item msgid="3304843301758635896">"I-disable ang Mga Opsyonal na Codec"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Gamitin ang Pagpili ng System (Default)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"I-enable ang Mga Opsyonal na Codec"</item> - <item msgid="741805482892725657">"I-disable ang Mga Opsyonal na Codec"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Gamitin ang Pagpili ng System (Default)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 51630dac9f9f..c1f0a23b7a4a 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> pa"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> hanggang sa makumpleto ang charge"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Hindi Kilala"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Nagcha-charge"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nagcha-charge"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Hindi nagcha-charge"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Nakasaksak, hindi makapag-charge sa ngayon"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puno"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Pinapamahalaan ng admin"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Na-enable ng admin"</string> @@ -365,7 +363,7 @@ <string name="disabled" msgid="9206776641295849915">"Naka-disable"</string> <string name="external_source_trusted" msgid="2707996266575928037">"Pinapayagan"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"Hindi pinapayagan"</string> - <string name="install_other_apps" msgid="6986686991775883017">"Mag-install ng mga hindi alam na app"</string> + <string name="install_other_apps" msgid="6986686991775883017">"Mag-install ng di-kilalang app"</string> <string name="home" msgid="3256884684164448244">"Home ng Mga Setting"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index bb43ec7537d8..a76f0f107cf9 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Sistem Seçimini Kullan (Varsayılan)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"İsteğe Bağlı Codec\'leri Etkinleştir"</item> - <item msgid="3304843301758635896">"İsteğe Bağlı Codec\'leri Devre Dışı Bırak"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Sistem Seçimini Kullan (Varsayılan)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"İsteğe Bağlı Codec\'leri Etkinleştir"</item> - <item msgid="741805482892725657">"İsteğe Bağlı Codec\'leri Devre Dışı Bırak"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Sistem Seçimini Kullan (Varsayılan)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index f2f94a22b02c..a3f3ad1cb804 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> kaldı"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - Tam şarj olmasına <xliff:g id="TIME">^2</xliff:g> kaldı"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Bilinmiyor"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Şarj oluyor"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"şarj oluyor"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Şarj olmuyor"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Prize takıldı, şu anda şarj olamıyor"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Dolu"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Yönetici tarafından denetleniyor"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Yönetici tarafından etkinleştirildi"</string> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index a8705e729356..aac23570cd6b 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Використовувати вибір системи (за умовчанням)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Увімкнути додаткові кодеки"</item> - <item msgid="3304843301758635896">"Вимкнути додаткові кодеки"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Використовувати вибір системи (за умовчанням)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Увімкнути додаткові кодеки"</item> - <item msgid="741805482892725657">"Вимкнути додаткові кодеки"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Використовувати вибір системи (за умовчанням)"</item> <item msgid="8895532488906185219">"44,1 кГц"</item> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 7f329ce2ab0d..7bf924360690 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – залишилося <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до повного заряду"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Невідомо"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Заряджається"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"заряджається"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не заряджається"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Підключено. Не вдається зарядити"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Акумулятор заряджено"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Керується адміністратором"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Увімкнено адміністратором"</string> diff --git a/packages/SettingsLib/res/values-ur/arrays.xml b/packages/SettingsLib/res/values-ur/arrays.xml index 6da98dcf67d5..631d87e0da30 100644 --- a/packages/SettingsLib/res/values-ur/arrays.xml +++ b/packages/SettingsLib/res/values-ur/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"اختیاری کوڈیکز کو فعال کریں"</item> - <item msgid="3304843301758635896">"اختیاری کوڈیکز کو غیر فعال کریں"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"اختیاری کوڈیکز کو فعال کریں"</item> - <item msgid="741805482892725657">"اختیاری کوڈیکز کو غیر فعال کریں"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"سسٹم انتخاب کا استعمال کریں (ڈیفالٹ)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 9d37602c99fa..c2819ae7942e 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> باقی ہے"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> پوری طرح چارج ہونے تک"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"نامعلوم"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"چارج ہو رہا ہے"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"چارج ہو رہا ہے"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"چارج نہیں ہو رہا ہے"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"پلگ ان ہے، ابھی چارج نہیں کر سکتے"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"مکمل"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"کنٹرول کردہ بذریعہ منتظم"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"منتظم کی طرف سے فعال کردہ"</string> diff --git a/packages/SettingsLib/res/values-uz/arrays.xml b/packages/SettingsLib/res/values-uz/arrays.xml index 1d4e1e986954..08b4112b9a24 100644 --- a/packages/SettingsLib/res/values-uz/arrays.xml +++ b/packages/SettingsLib/res/values-uz/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Tizim tanlovi (birlamchi)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Boshqa kodeklarni yoqish"</item> - <item msgid="3304843301758635896">"Boshqa kodeklarni o‘chirib qo‘yish"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Tizim tanlovi (birlamchi)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Boshqa kodeklarni yoqish"</item> - <item msgid="741805482892725657">"Boshqa kodeklarni o‘chirib qo‘yish"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Tizim tanlovi (birlamchi)"</item> <item msgid="8895532488906185219">"44.1 kGs"</item> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 872d1215348a..f7bb82506e20 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> qoldi"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> ichida to‘ladi"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Noma’lum"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Quvvat olmoqda"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"quvvat olmoqda"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Quvvat olmayapti"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Ulangan, lekin quvvat olmayapti"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"To‘la"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Administrator tomonidan boshqariladi"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Administrator tomonidan yoqilgan"</string> diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml index 134dc8be7a79..966fcea80fa5 100644 --- a/packages/SettingsLib/res/values-vi/arrays.xml +++ b/packages/SettingsLib/res/values-vi/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Sử dụng lựa chọn hệ thống (Mặc định)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"Bật codec tùy chọn"</item> - <item msgid="3304843301758635896">"Tắt codec tùy chọn"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Sử dụng lựa chọn hệ thống (Mặc định)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"Bật codec tùy chọn"</item> - <item msgid="741805482892725657">"Tắt codec tùy chọn"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Sử dụng lựa chọn hệ thống (Mặc định)"</item> <item msgid="8895532488906185219">"44,1 kHz"</item> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 1c9f917ed17f..4a32d272b3dd 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - còn lại <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> cho tới khi được sạc đầy"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Không xác định"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Đang sạc"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"đang sạc"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Hiện không sạc"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Đã cắm nhưng không thể sạc ngay"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Đầy"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Do quản trị viên kiểm soát"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Kích hoạt bởi quản trị viên"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index fadc7a9a76b6..f53b8ff70818 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"使用系统选择(默认)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"启用可选编解码器"</item> - <item msgid="3304843301758635896">"停用可选编解码器"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"使用系统选择(默认)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"启用可选编解码器"</item> - <item msgid="741805482892725657">"停用可选编解码器"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"使用系统选择(默认)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index c1643474d59a..40a0d7efe3e2 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 还可用 <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 还需 <xliff:g id="TIME">^2</xliff:g>充满"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"未知"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"正在充电"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"正在充电"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"未在充电"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"已插入电源,但是现在无法充电"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"电量充足"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"由管理员控制"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"已被管理员启用"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml index 7f4c427edc1e..1047c5e81f9b 100644 --- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"使用系統選擇 (預設)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"啟用選用的編解碼器"</item> - <item msgid="3304843301758635896">"停用選用的編解碼器"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"使用系統選擇 (預設)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"啟用選用的編解碼器"</item> - <item msgid="741805482892725657">"停用選用的編解碼器"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"使用系統選擇 (預設)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 4fadad1693ae..56336ecfc7e4 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 尚餘 <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 還需 <xliff:g id="TIME">^2</xliff:g>才能充滿電"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"未知"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"正在充電"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"非充電中"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"已插入電源插座,但目前無法充電"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"電量已滿"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"已由管理員停用"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"已由管理員啟用"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index 0f3bf239117a..915fbd82a237 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"avrcp15"</item> <item msgid="7142710449249088270">"avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"使用系統選擇 (預設)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"LDAC"</item> - <item msgid="723675059572222462">"啟用選用的轉碼器"</item> - <item msgid="3304843301758635896">"停用選用的轉碼器"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"使用系統選擇 (預設)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"LDAC"</item> - <item msgid="2209680154067241740">"啟用選用的轉碼器"</item> - <item msgid="741805482892725657">"停用選用的轉碼器"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"使用系統選擇 (預設)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index ed21c9a2a99a..3ff0f194ff7a 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 還剩 <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>後充飽"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"不明"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"充電中"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"非充電中"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"已接上電源,但現在無法充電"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"電力充足"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"已由管理員停用"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"已由管理員啟用"</string> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index d7449f1de0e7..98a1bf972dba 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -68,26 +68,10 @@ <item msgid="1913619118958233129">"I-avrcp15"</item> <item msgid="7142710449249088270">"I-avrcp16"</item> </string-array> - <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="7065842274271279580">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item> - <item msgid="7539690996561263909">"SBC"</item> - <item msgid="686685526567131661">"I-AAC"</item> - <item msgid="8910200421843557332">"aptX"</item> - <item msgid="8434403964359457768">"aptX HD"</item> - <item msgid="6751080638867012696">"I-LDAC"</item> - <item msgid="723675059572222462">"Nika amandla amakhodekhi akhethekayo"</item> - <item msgid="3304843301758635896">"Khubaza amakhodekhi akhethekayo"</item> - </string-array> - <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="5062108632402595000">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item> - <item msgid="6898329690939802290">"SBC"</item> - <item msgid="6839647709301342559">"I-AAC"</item> - <item msgid="2279916056363477395">"aptX"</item> - <item msgid="6641171061200063516">"aptX HD"</item> - <item msgid="7950781694447359344">"I-LDAC"</item> - <item msgid="2209680154067241740">"Nika amandla amakhodekhi akhethekayo"</item> - <item msgid="741805482892725657">"Khubaza amakhodekhi akhethekayo"</item> - </string-array> + <!-- no translation found for bluetooth_a2dp_codec_titles:3 (965655874372831982) --> + <!-- no translation found for bluetooth_a2dp_codec_titles:4 (1736964107585972103) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:3 (3558743545747527853) --> + <!-- no translation found for bluetooth_a2dp_codec_summaries:4 (9167103241281353659) --> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Sebenzisa ukukhetha kwesistimu (Okuzenzakalelayo)"</item> <item msgid="8895532488906185219">"44.1 kHz"</item> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index b5982978be04..19b98c2ab746 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -351,13 +351,11 @@ <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> okusele"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> kuze ligcwale ngokuphelele"</string> - <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Akwaziwa"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Iyashaja"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"iyashaja"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ayishaji"</string> - <!-- no translation found for battery_info_status_not_charging (8523453668342598579) --> - <skip /> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"Kuxhunyiwe, ayikwazi ukushaja khona manje"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Kugcwele"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kulawulwa umqondisi"</string> <string name="enabled_by_admin" msgid="5302986023578399263">"Kunikwe amandla umlawuli"</string> diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index db3274ab478c..0bf2eda8cc1f 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -121,8 +121,8 @@ <item>Use System Selection (Default)</item> <item>SBC</item> <item>AAC</item> - <item>aptX</item> - <item>aptX HD</item> + <item><xliff:g id="qualcomm">Qualcomm®</xliff:g> <xliff:g id="aptx">aptX™</xliff:g> audio</item> + <item><xliff:g id="qualcomm">Qualcomm®</xliff:g> <xliff:g id="aptx_hd">aptX™ HD</xliff:g> audio</item> <item>LDAC</item> <item>Enable Optional Codecs</item> <item>Disable Optional Codecs</item> @@ -145,8 +145,8 @@ <item>Use System Selection (Default)</item> <item>SBC</item> <item>AAC</item> - <item>aptX</item> - <item>aptX HD</item> + <item><xliff:g id="qualcomm">Qualcomm®</xliff:g> <xliff:g id="aptx">aptX™</xliff:g> audio</item> + <item><xliff:g id="qualcomm">Qualcomm®</xliff:g> <xliff:g id="aptx_hd">aptX™ HD</xliff:g> audio</item> <item>LDAC</item> <item>Enable Optional Codecs</item> <item>Disable Optional Codecs</item> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index fd5b70e3142f..7b51725f7a16 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -867,8 +867,6 @@ <string name="power_charging"><xliff:g id="level">%1$s</xliff:g> - <xliff:g id="state">%2$s</xliff:g></string> <!-- [CHAR_LIMIT=40] Label for battery level chart when charging with duration --> <string name="power_charging_duration"><xliff:g id="level">^1</xliff:g> - <xliff:g id="time">^2</xliff:g> until fully charged</string> - <!-- [CHAR_LIMIT=40] Short label for battery level chart when charging with duration --> - <string name="power_charging_duration_short"><xliff:g id="level">^1</xliff:g> - <xliff:g id="time">^2</xliff:g></string> <!-- Battery Info screen. Value for a status item. Used for diagnostic info screens, precise translation isn't needed --> <string name="battery_info_status_unknown">Unknown</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index 7d4bc83e3385..28105e2630a4 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -200,7 +200,7 @@ public class BluetoothEventManager { cachedDevice.setRssi(rssi); cachedDevice.setBtClass(btClass); cachedDevice.setNewName(name); - cachedDevice.setVisible(true); + cachedDevice.setJustDiscovered(true); } } @@ -352,7 +352,7 @@ public class BluetoothEventManager { if (device != null && device.getBondState() == BluetoothDevice.BOND_NONE) { CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device); if (cachedDevice != null) { - cachedDevice.setVisible(false); + cachedDevice.setJustDiscovered(false); } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 4bb4b402b990..109446d8ed4a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -50,8 +50,11 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> private final LocalBluetoothAdapter mLocalAdapter; private final LocalBluetoothProfileManager mProfileManager; private final BluetoothDevice mDevice; + //TODO: consider remove, BluetoothDevice.getName() is already cached private String mName; + // Need this since there is no method for getting RSSI private short mRssi; + //TODO: consider remove, BluetoothDevice.getBluetoothClass() is already cached private BluetoothClass mBtClass; private HashMap<LocalBluetoothProfile, Integer> mProfileConnectionState; @@ -65,7 +68,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> // Device supports PANU but not NAP: remove PanProfile after device disconnects from NAP private boolean mLocalNapRoleConnected; - private boolean mVisible; + private boolean mJustDiscovered; private int mMessageRejectionCount; @@ -360,7 +363,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> migrateMessagePermissionChoice(); fetchMessageRejectionCount(); - mVisible = false; dispatchAttributesChanged(); } @@ -395,10 +397,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * user changes the device name + * User changes the device name + * @param name new alias name to be set, should never be null */ public void setName(String name) { - if (!mName.equals(name)) { + // Prevent mName to be set to null if setName(null) is called + if (name != null && !TextUtils.equals(name, mName)) { mName = name; mDevice.setAlias(name); dispatchAttributesChanged(); @@ -420,6 +424,14 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** + * Checks if device has a human readable name besides MAC address + * @return true if device's alias name is not null nor empty, false otherwise + */ + public boolean hasHumanReadableName() { + return !TextUtils.isEmpty(mDevice.getAliasName()); + } + + /** * Get battery level from remote device * @return battery level in percentage [0-100], or {@link BluetoothDevice#BATTERY_LEVEL_UNKNOWN} */ @@ -431,13 +443,9 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> dispatchAttributesChanged(); } - public boolean isVisible() { - return mVisible; - } - - public void setVisible(boolean visible) { - if (mVisible != visible) { - mVisible = visible; + public void setJustDiscovered(boolean justDiscovered) { + if (mJustDiscovered != justDiscovered) { + mJustDiscovered = justDiscovered; dispatchAttributesChanged(); } } @@ -500,7 +508,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> ParcelUuid[] localUuids = mLocalAdapter.getUuids(); if (localUuids == null) return false; - /** + /* * Now we know if the device supports PBAP, update permissions... */ processPhonebookAccess(); @@ -661,8 +669,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> (getBondState() == BluetoothDevice.BOND_BONDED ? 1 : 0); if (comparison != 0) return comparison; - // Visible above not visible - comparison = (another.mVisible ? 1 : 0) - (mVisible ? 1 : 0); + // Just discovered above discovered in the past + comparison = (another.mJustDiscovered ? 1 : 0) - (mJustDiscovered ? 1 : 0); if (comparison != 0) return comparison; // Stronger signal above weaker signal diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index abd4e294fecb..5b39ee4b57f1 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -47,7 +47,7 @@ public class CachedBluetoothDeviceManager { } public static boolean onDeviceDisappeared(CachedBluetoothDevice cachedDevice) { - cachedDevice.setVisible(false); + cachedDevice.setJustDiscovered(false); return cachedDevice.getBondState() == BluetoothDevice.BOND_NONE; } @@ -131,7 +131,7 @@ public class CachedBluetoothDeviceManager { // Iterate in reverse order since devices may be removed. for (int i = mCachedDevices.size() - 1; i >= 0; i--) { CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); - cachedDevice.setVisible(false); + cachedDevice.setJustDiscovered(false); } } @@ -156,7 +156,7 @@ public class CachedBluetoothDeviceManager { for (int i = mCachedDevices.size() - 1; i >= 0; i--) { CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); if (cachedDevice.getBondState() != BluetoothDevice.BOND_BONDED) { - cachedDevice.setVisible(false); + cachedDevice.setJustDiscovered(false); mCachedDevices.remove(i); } else { // For bonded devices, we need to clear the connection status so that diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index b8c5aca4b946..330eaf0e18ba 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -51,6 +51,7 @@ import android.support.annotation.NonNull; import android.text.Spannable; import android.text.SpannableString; import android.text.TextUtils; +import android.text.format.DateUtils; import android.text.style.TtsSpan; import android.util.Log; @@ -124,11 +125,20 @@ public class AccessPoint implements Comparable<AccessPoint> { private final ConcurrentHashMap<String, ScanResult> mScanResultCache = new ConcurrentHashMap<String, ScanResult>(32); - /** Map of BSSIDs to speed values for individual ScanResults. */ - private final Map<String, Integer> mScanResultScores = new HashMap<>(); + /** + * Map of BSSIDs to scored networks for individual bssids. + * + * <p>This cache should not be evicted with scan results, as the values here are used to + * generate a fallback in the absence of scores for the visible APs. + */ + private final Map<String, TimestampedScoredNetwork> mScoredNetworkCache = new HashMap<>(); + + /** Maximum age in millis of cached scored networks in {@link #mScoredNetworkCache}. */ + @VisibleForTesting static final long MAX_CACHED_SCORE_AGE_MILLIS = + 24 * DateUtils.DAY_IN_MILLIS; /** Maximum age of scan results to hold onto while actively scanning. **/ - private static final long MAX_SCAN_RESULT_AGE_MS = 15000; + private static final long MAX_SCAN_RESULT_AGE_MILLIS = 15000; static final String KEY_NETWORKINFO = "key_networkinfo"; static final String KEY_WIFIINFO = "key_wifiinfo"; @@ -138,6 +148,7 @@ public class AccessPoint implements Comparable<AccessPoint> { static final String KEY_SPEED = "key_speed"; static final String KEY_PSKTYPE = "key_psktype"; static final String KEY_SCANRESULTCACHE = "key_scanresultcache"; + static final String KEY_SCOREDNETWORKCACHE = "key_scorednetworkcache"; static final String KEY_CONFIG = "key_config"; static final String KEY_FQDN = "key_fqdn"; static final String KEY_PROVIDER_FRIENDLY_NAME = "key_provider_friendly_name"; @@ -188,7 +199,7 @@ public class AccessPoint implements Comparable<AccessPoint> { private Object mTag; - private int mSpeed = Speed.NONE; + @Speed private int mSpeed = Speed.NONE; private boolean mIsScoredNetworkMetered = false; // used to co-relate internal vs returned accesspoint. @@ -238,6 +249,13 @@ public class AccessPoint implements Comparable<AccessPoint> { mScanResultCache.put(result.BSSID, result); } } + if (savedState.containsKey(KEY_SCOREDNETWORKCACHE)) { + ArrayList<TimestampedScoredNetwork> scoredNetworkArrayList = + savedState.getParcelableArrayList(KEY_SCOREDNETWORKCACHE); + for (TimestampedScoredNetwork timedScore : scoredNetworkArrayList) { + mScoredNetworkCache.put(timedScore.getScore().networkKey.wifiKey.bssid, timedScore); + } + } if (savedState.containsKey(KEY_FQDN)) { mFqdn = savedState.getString(KEY_FQDN); } @@ -308,8 +326,8 @@ public class AccessPoint implements Comparable<AccessPoint> { this.mNetworkInfo = that.mNetworkInfo; this.mScanResultCache.clear(); this.mScanResultCache.putAll(that.mScanResultCache); - this.mScanResultScores.clear(); - this.mScanResultScores.putAll(that.mScanResultScores); + this.mScoredNetworkCache.clear(); + this.mScoredNetworkCache.putAll(that.mScoredNetworkCache); this.mId = that.mId; this.mSpeed = that.mSpeed; this.mIsScoredNetworkMetered = that.mIsScoredNetworkMetered; @@ -347,7 +365,7 @@ public class AccessPoint implements Comparable<AccessPoint> { if (isSaved() && !other.isSaved()) return -1; if (!isSaved() && other.isSaved()) return 1; - // Faster speeds go before slower speeds + // Faster speeds go before slower speeds - but only if visible change in speed label if (getSpeed() != other.getSpeed()) { return other.getSpeed() - getSpeed(); } @@ -425,7 +443,6 @@ public class AccessPoint implements Comparable<AccessPoint> { */ boolean update(WifiNetworkScoreCache scoreCache, boolean scoringUiEnabled) { boolean scoreChanged = false; - mScanResultScores.clear(); if (scoringUiEnabled) { scoreChanged = updateScores(scoreCache); } @@ -435,38 +452,99 @@ public class AccessPoint implements Comparable<AccessPoint> { /** * Updates the AccessPoint rankingScore and speed, returning true if the data has changed. * + * <p>Any cached {@link TimestampedScoredNetwork} objects older than + * {@link #MAX_CACHED_SCORE_AGE_MILLIS} will be removed when this method is invoked. + * + * <p>Precondition: {@link #mRssi} is up to date before invoking this method. + * * @param scoreCache The score cache to use to retrieve scores. + * @return true if the set speed has changed */ private boolean updateScores(WifiNetworkScoreCache scoreCache) { - int oldSpeed = mSpeed; - mSpeed = Speed.NONE; - + long nowMillis = SystemClock.elapsedRealtime(); for (ScanResult result : mScanResultCache.values()) { ScoredNetwork score = scoreCache.getScoredNetwork(result); if (score == null) { continue; } - - int speed = score.calculateBadge(result.level); - mScanResultScores.put(result.BSSID, speed); - mSpeed = Math.max(mSpeed, speed); + TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(result.BSSID); + if (timedScore == null) { + mScoredNetworkCache.put( + result.BSSID, new TimestampedScoredNetwork(score, nowMillis)); + } else { + // Update data since the has been seen in the score cache + timedScore.update(score, nowMillis); + } } - // set mSpeed to the connected ScanResult if the AccessPoint is the active network + // Remove old cached networks + long evictionCutoff = nowMillis - MAX_CACHED_SCORE_AGE_MILLIS; + Iterator<TimestampedScoredNetwork> iterator = mScoredNetworkCache.values().iterator(); + iterator.forEachRemaining(timestampedScoredNetwork -> { + if (timestampedScoredNetwork.getUpdatedTimestampMillis() < evictionCutoff) { + iterator.remove(); + } + }); + + return updateSpeed(); + } + + /** + * Updates the internal speed, returning true if the update resulted in a speed label change. + */ + private boolean updateSpeed() { + int oldSpeed = mSpeed; + mSpeed = generateAverageSpeedForSsid(); + + // set speed to the connected ScanResult if the AccessPoint is the active network if (isActive() && mInfo != null) { - NetworkKey key = new NetworkKey(new WifiKey( - AccessPoint.convertToQuotedString(ssid), mInfo.getBSSID())); - ScoredNetwork score = scoreCache.getScoredNetwork(key); - if (score != null) { - mSpeed = score.calculateBadge(mInfo.getRssi()); + TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(mInfo.getBSSID()); + if (timedScore != null) { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Set score using specific access point curve for connected AP: " + + getSsidStr()); + } + // TODO(b/63073866): Map using getLevel rather than specific rssi value so score + // doesn't change without a visible wifi bar change. + int speed = timedScore.getScore().calculateBadge(mInfo.getRssi()); + if (speed != Speed.NONE) { + mSpeed = speed; + } } } - if(WifiTracker.sVerboseLogging) { + boolean changed = oldSpeed != mSpeed; + if(WifiTracker.sVerboseLogging && changed) { Log.i(TAG, String.format("%s: Set speed to %d", ssid, mSpeed)); } + return changed; + } - return oldSpeed != mSpeed; + /** Creates a speed value for the current {@link #mRssi} by averaging all non zero badges. */ + @Speed private int generateAverageSpeedForSsid() { + if (mScoredNetworkCache.isEmpty()) { + return Speed.NONE; + } + + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, String.format("Generating fallbackspeed for %s using cache: %s", + getSsidStr(), mScoredNetworkCache)); + } + + int count = 0; + int totalSpeed = 0; + for (TimestampedScoredNetwork timedScore : mScoredNetworkCache.values()) { + int speed = timedScore.getScore().calculateBadge(mRssi); + if (speed != Speed.NONE) { + count++; + totalSpeed += speed; + } + } + int speed = count == 0 ? Speed.NONE : totalSpeed / count; + if (WifiTracker.sVerboseLogging) { + Log.i(TAG, String.format("%s generated fallback speed is: %d", getSsidStr(), speed)); + } + return roundToClosestSpeedEnum(speed); } /** @@ -501,7 +579,7 @@ public class AccessPoint implements Comparable<AccessPoint> { for (Iterator<ScanResult> iter = mScanResultCache.values().iterator(); iter.hasNext(); ) { ScanResult result = iter.next(); // result timestamp is in microseconds - if (nowMs - result.timestamp / 1000 > MAX_SCAN_RESULT_AGE_MS) { + if (nowMs - result.timestamp / 1000 > MAX_SCAN_RESULT_AGE_MILLIS) { iter.remove(); } } @@ -582,8 +660,6 @@ public class AccessPoint implements Comparable<AccessPoint> { /** Updates {@link #mSeen} based on the scan result cache. */ private void updateSeen() { - // TODO(sghuman): Set to now if connected - long seen = 0; for (ScanResult result : mScanResultCache.values()) { if (result.timestamp > seen) { @@ -942,17 +1018,23 @@ public class AccessPoint implements Comparable<AccessPoint> { } stringBuilder.append("=").append(result.frequency); stringBuilder.append(",").append(result.level); - if (hasSpeed(result)) { + int speed = getSpecificApSpeed(result); + if (speed != Speed.NONE) { stringBuilder.append(",") - .append(getSpeedLabel(mScanResultScores.get(result.BSSID))); + .append(getSpeedLabel(speed)); } stringBuilder.append("}"); return stringBuilder.toString(); } - private boolean hasSpeed(ScanResult result) { - return mScanResultScores.containsKey(result.BSSID) - && mScanResultScores.get(result.BSSID) != Speed.NONE; + @Speed private int getSpecificApSpeed(ScanResult result) { + TimestampedScoredNetwork timedScore = mScoredNetworkCache.get(result.BSSID); + if (timedScore == null) { + return Speed.NONE; + } + // For debugging purposes we may want to use mRssi rather than result.level as the average + // speed wil be determined by mRssi + return timedScore.getScore().calculateBadge(result.level); } /** @@ -1067,6 +1149,8 @@ public class AccessPoint implements Comparable<AccessPoint> { evictOldScanResults(); savedState.putParcelableArrayList(KEY_SCANRESULTCACHE, new ArrayList<ScanResult>(mScanResultCache.values())); + savedState.putParcelableArrayList(KEY_SCOREDNETWORKCACHE, + new ArrayList<>(mScoredNetworkCache.values())); if (mNetworkInfo != null) { savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo); } @@ -1105,8 +1189,12 @@ public class AccessPoint implements Comparable<AccessPoint> { updateRssi(); int newLevel = getLevel(); - if (newLevel > 0 && newLevel != oldLevel && mAccessPointListener != null) { - mAccessPointListener.onLevelChanged(this); + if (newLevel > 0 && newLevel != oldLevel) { + // Only update labels on visible rssi changes + updateSpeed(); + if (mAccessPointListener != null) { + mAccessPointListener.onLevelChanged(this); + } } // This flag only comes from scans, is not easily saved in config if (security == SECURITY_PSK) { @@ -1191,7 +1279,23 @@ public class AccessPoint implements Comparable<AccessPoint> { } @Nullable - private String getSpeedLabel(int speed) { + @Speed + private int roundToClosestSpeedEnum(int speed) { + if (speed < Speed.SLOW) { + return Speed.NONE; + } else if (speed < (Speed.SLOW + Speed.MODERATE) / 2) { + return Speed.SLOW; + } else if (speed < (Speed.MODERATE + Speed.FAST) / 2) { + return Speed.MODERATE; + } else if (speed < (Speed.FAST + Speed.VERY_FAST) / 2) { + return Speed.FAST; + } else { + return Speed.VERY_FAST; + } + } + + @Nullable + private String getSpeedLabel(@Speed int speed) { switch (speed) { case Speed.VERY_FAST: return mContext.getString(R.string.speed_label_very_fast); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java index 93bf3c7ec20e..3dec1d382026 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java @@ -24,6 +24,7 @@ import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.os.Bundle; import android.support.annotation.Keep; + import com.android.settingslib.wifi.AccessPoint.Speed; import java.util.ArrayList; @@ -58,6 +59,7 @@ public class TestAccessPointBuilder { Context mContext; private ArrayList<ScanResult> mScanResultCache; + private ArrayList<TimestampedScoredNetwork> mScoredNetworkCache; @Keep public TestAccessPointBuilder(Context context) { @@ -85,6 +87,9 @@ public class TestAccessPointBuilder { if (mScanResultCache != null) { bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, mScanResultCache); } + if (mScoredNetworkCache != null) { + bundle.putParcelableArrayList(AccessPoint.KEY_SCOREDNETWORKCACHE, mScoredNetworkCache); + } bundle.putInt(AccessPoint.KEY_SECURITY, mSecurity); bundle.putInt(AccessPoint.KEY_SPEED, mSpeed); bundle.putBoolean(AccessPoint.KEY_IS_CARRIER_AP, mIsCarrierAp); @@ -238,4 +243,10 @@ public class TestAccessPointBuilder { mCarrierName = carrierName; return this; } + + public TestAccessPointBuilder setScoredNetworkCache( + ArrayList<TimestampedScoredNetwork> scoredNetworkCache) { + mScoredNetworkCache = scoredNetworkCache; + return this; + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java new file mode 100644 index 000000000000..cb15a795fe9b --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TimestampedScoredNetwork.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2017 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.settingslib.wifi; + +import android.net.ScoredNetwork; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Data encapsulation object to associate a time with a {@link ScoredNetwork} + */ +class TimestampedScoredNetwork implements Parcelable { + private ScoredNetwork mScore; + private long mUpdatedTimestampMillis; + + TimestampedScoredNetwork(ScoredNetwork score, long updatedTimestampMillis) { + mScore = score; + mUpdatedTimestampMillis = updatedTimestampMillis; + } + + protected TimestampedScoredNetwork(Parcel in) { + mScore = ScoredNetwork.CREATOR.createFromParcel(in); + mUpdatedTimestampMillis = in.readLong(); + } + + public void update(ScoredNetwork score, long updatedTimestampMillis) { + mScore = score; + mUpdatedTimestampMillis = updatedTimestampMillis; + } + + public ScoredNetwork getScore() { + return mScore; + } + + public long getUpdatedTimestampMillis() { + return mUpdatedTimestampMillis; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(mScore, flags); + dest.writeLong(mUpdatedTimestampMillis); + } + + public static final Creator<TimestampedScoredNetwork> CREATOR = + new Creator<TimestampedScoredNetwork>() { + @Override + public TimestampedScoredNetwork createFromParcel(Parcel in) { + return new TimestampedScoredNetwork(in); + } + + @Override + public TimestampedScoredNetwork[] newArray(int size) { + return new TimestampedScoredNetwork[size]; + } + }; +} diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java index ae59d3781430..6f1b25f6747e 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java @@ -21,8 +21,6 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -50,8 +48,8 @@ import android.text.SpannableString; import android.text.style.TtsSpan; import com.android.settingslib.R; - import com.android.settingslib.wifi.AccessPoint.Speed; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -59,17 +57,36 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; @SmallTest @RunWith(AndroidJUnit4.class) public class AccessPointTest { - private static final String TEST_SSID = "test_ssid"; + private static final String TEST_SSID = "\"test_ssid\""; + private static final int NUM_SCAN_RESULTS = 5; + + private static final ArrayList<ScanResult> SCAN_RESULTS = buildScanResultCache(); + + private static final RssiCurve FAST_BADGE_CURVE = + new RssiCurve(-150, 10, new byte[]{Speed.FAST}); + public static final String TEST_BSSID = "00:00:00:00:00:00"; + private Context mContext; @Mock private RssiCurve mockBadgeCurve; @Mock private WifiNetworkScoreCache mockWifiNetworkScoreCache; + private static ScanResult createScanResult(String ssid, String bssid, int rssi) { + ScanResult scanResult = new ScanResult(); + scanResult.SSID = ssid; + scanResult.level = rssi; + scanResult.BSSID = bssid; + scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; + scanResult.capabilities = ""; + return scanResult; + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -400,7 +417,7 @@ public class AccessPointTest { } @Test - public void testSpeedLabel_isDerivedFromConnectedBssid() { + public void testSpeedLabel_isDerivedFromConnectedBssidWhenScoreAvailable() { int rssi = -55; String bssid = "00:00:00:00:00:00"; int networkId = 123; @@ -411,24 +428,42 @@ public class AccessPointTest { info.setBSSID(bssid); info.setNetworkId(networkId); + ArrayList<ScanResult> scanResults = new ArrayList<>(); + ScanResult scanResultUnconnected = createScanResult(TEST_SSID, "11:11:11:11:11:11", rssi); + scanResults.add(scanResultUnconnected); + + ScanResult scanResultConnected = createScanResult(TEST_SSID, bssid, rssi); + scanResults.add(scanResultConnected); + AccessPoint ap = new TestAccessPointBuilder(mContext) .setActive(true) .setNetworkId(networkId) .setSsid(TEST_SSID) - .setScanResultCache(buildScanResultCache()) + .setScanResultCache(scanResults) .setWifiInfo(info) .build(); - NetworkKey key = new NetworkKey(new WifiKey('"' + TEST_SSID + '"', bssid)); - when(mockWifiNetworkScoreCache.getScoredNetwork(key)) + when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultUnconnected)) .thenReturn(buildScoredNetworkWithMockBadgeCurve()); - when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) AccessPoint.Speed.FAST); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) Speed.SLOW); + + int connectedSpeed = Speed.VERY_FAST; + RssiCurve connectedBadgeCurve = mock(RssiCurve.class); + Bundle attr1 = new Bundle(); + attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, connectedBadgeCurve); + ScoredNetwork connectedScore = new ScoredNetwork( + NetworkKey.createFromScanResult(scanResultConnected), + connectedBadgeCurve, + false /* meteredHint */, + attr1); + when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultConnected)) + .thenReturn(connectedScore); + when(connectedBadgeCurve.lookupScore(anyInt())).thenReturn((byte) connectedSpeed); ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); - verify(mockWifiNetworkScoreCache, times(2)).getScoredNetwork(key); - assertThat(ap.getSpeed()).isEqualTo(AccessPoint.Speed.FAST); + assertThat(ap.getSpeed()).isEqualTo(connectedSpeed); } @Test @@ -562,11 +597,16 @@ public class AccessPointTest { } private ScoredNetwork buildScoredNetworkWithMockBadgeCurve() { + return buildScoredNetworkWithGivenBadgeCurve(mockBadgeCurve); + + } + + private ScoredNetwork buildScoredNetworkWithGivenBadgeCurve(RssiCurve badgeCurve) { Bundle attr1 = new Bundle(); - attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve); + attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, badgeCurve); return new ScoredNetwork( - new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00")), - mockBadgeCurve, + new NetworkKey(new WifiKey(TEST_SSID, TEST_BSSID)), + badgeCurve, false /* meteredHint */, attr1); @@ -574,19 +614,14 @@ public class AccessPointTest { private AccessPoint createAccessPointWithScanResultCache() { Bundle bundle = new Bundle(); - ArrayList<ScanResult> scanResults = buildScanResultCache(); - bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, scanResults); + bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, SCAN_RESULTS); return new AccessPoint(mContext, bundle); } - private ArrayList<ScanResult> buildScanResultCache() { + private static ArrayList<ScanResult> buildScanResultCache() { ArrayList<ScanResult> scanResults = new ArrayList<>(); for (int i = 0; i < 5; i++) { - ScanResult scanResult = new ScanResult(); - scanResult.level = i; - scanResult.BSSID = "bssid-" + i; - scanResult.timestamp = SystemClock.elapsedRealtime() * 1000; - scanResult.capabilities = ""; + ScanResult scanResult = createScanResult(TEST_SSID, "bssid-" + i, i); scanResults.add(scanResult); } return scanResults; @@ -600,6 +635,18 @@ public class AccessPointTest { return configuration; } + private AccessPoint createApWithFastTimestampedScoredNetworkCache( + long elapsedTimeMillis) { + TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork( + buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE), + elapsedTimeMillis); + return new TestAccessPointBuilder(mContext) + .setSsid(TEST_SSID) + .setScoredNetworkCache( + new ArrayList<>(Arrays.asList(recentScore))) + .build(); + } + /** * Assert that the first AccessPoint appears before the second AccessPoint * once sorting has been completed. @@ -849,4 +896,194 @@ public class AccessPointTest { ap.update(null, wifiInfo, networkInfo); } + + @Test + public void testSpeedLabelAveragesAllBssidScores() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + int speed1 = Speed.MODERATE; + RssiCurve badgeCurve1 = mock(RssiCurve.class); + when(badgeCurve1.lookupScore(anyInt())).thenReturn((byte) speed1); + when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(0))) + .thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve1)); + int speed2 = Speed.VERY_FAST; + RssiCurve badgeCurve2 = mock(RssiCurve.class); + when(badgeCurve2.lookupScore(anyInt())).thenReturn((byte) speed2); + when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1))) + .thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2)); + + int expectedSpeed = (speed1 + speed2) / 2; + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(expectedSpeed); + } + + @Test + public void testSpeedLabelAverageIgnoresNoSpeedScores() { + AccessPoint ap = createAccessPointWithScanResultCache(); + + int speed1 = Speed.VERY_FAST; + RssiCurve badgeCurve1 = mock(RssiCurve.class); + when(badgeCurve1.lookupScore(anyInt())).thenReturn((byte) speed1); + when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(0))) + .thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve1)); + int speed2 = Speed.NONE; + RssiCurve badgeCurve2 = mock(RssiCurve.class); + when(badgeCurve2.lookupScore(anyInt())).thenReturn((byte) speed2); + when(mockWifiNetworkScoreCache.getScoredNetwork(SCAN_RESULTS.get(1))) + .thenReturn(buildScoredNetworkWithGivenBadgeCurve(badgeCurve2)); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(speed1); + } + + @Test + public void testSpeedLabelUsesFallbackScoreWhenConnectedAccessPointScoreUnavailable() { + int rssi = -55; + String bssid = "00:00:00:00:00:00"; + int networkId = 123; + + WifiInfo info = new WifiInfo(); + info.setRssi(rssi); + info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID)); + info.setBSSID(bssid); + info.setNetworkId(networkId); + + ArrayList<ScanResult> scanResults = new ArrayList<>(); + ScanResult scanResultUnconnected = createScanResult(TEST_SSID, "11:11:11:11:11:11", rssi); + scanResults.add(scanResultUnconnected); + + ScanResult scanResultConnected = createScanResult(TEST_SSID, bssid, rssi); + scanResults.add(scanResultConnected); + + AccessPoint ap = + new TestAccessPointBuilder(mContext) + .setActive(true) + .setNetworkId(networkId) + .setSsid(TEST_SSID) + .setScanResultCache(scanResults) + .setWifiInfo(info) + .build(); + + int fallbackSpeed = Speed.SLOW; + when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultUnconnected)) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) fallbackSpeed); + + when(mockWifiNetworkScoreCache.getScoredNetwork(scanResultConnected)) + .thenReturn(null); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(fallbackSpeed); + } + + @Test + public void testScoredNetworkCacheBundling() { + long timeMillis = SystemClock.elapsedRealtime(); + AccessPoint ap = createApWithFastTimestampedScoredNetworkCache(timeMillis); + Bundle bundle = new Bundle(); + ap.saveWifiState(bundle); + + ArrayList<TimestampedScoredNetwork> list = + bundle.getParcelableArrayList(AccessPoint.KEY_SCOREDNETWORKCACHE); + assertThat(list).hasSize(1); + assertThat(list.get(0).getUpdatedTimestampMillis()).isEqualTo(timeMillis); + + RssiCurve curve = list.get(0).getScore().attributes.getParcelable( + ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE); + assertThat(curve).isEqualTo(FAST_BADGE_CURVE); + } + + @Test + public void testRecentNetworkScoresAreUsedForSpeedLabelGeneration() { + AccessPoint ap = + createApWithFastTimestampedScoredNetworkCache(SystemClock.elapsedRealtime()); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(Speed.FAST); + } + + @Test + public void testNetworkScoresAreUsedForSpeedLabelGenerationWhenWithinAgeRange() { + long withinRangeTimeMillis = + SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS - 10000); + AccessPoint ap = + createApWithFastTimestampedScoredNetworkCache(withinRangeTimeMillis); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(Speed.FAST); + } + + @Test + public void testOldNetworkScoresAreNotUsedForSpeedLabelGeneration() { + long tooOldTimeMillis = + SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1); + AccessPoint ap = + createApWithFastTimestampedScoredNetworkCache(tooOldTimeMillis); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + assertThat(ap.getSpeed()).isEqualTo(Speed.NONE); + } + + @Test + public void testUpdateScoresRefreshesScoredNetworkCacheTimestamps () { + long tooOldTimeMillis = + SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1); + + ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE); + TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork( + scoredNetwork, + tooOldTimeMillis); + AccessPoint ap = new TestAccessPointBuilder(mContext) + .setSsid(TEST_SSID) + .setBssid(TEST_BSSID) + .setActive(true) + .setScoredNetworkCache( + new ArrayList(Arrays.asList(recentScore))) + .setScanResultCache(SCAN_RESULTS) + .build(); + + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(scoredNetwork); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + // Fast should still be returned since cache was updated with recent time + assertThat(ap.getSpeed()).isEqualTo(Speed.FAST); + } + + @Test + public void testUpdateScoresRefreshesScoredNetworkCacheWithNewSpeed () { + long tooOldTimeMillis = + SystemClock.elapsedRealtime() - (AccessPoint.MAX_CACHED_SCORE_AGE_MILLIS + 1); + + ScoredNetwork scoredNetwork = buildScoredNetworkWithGivenBadgeCurve(FAST_BADGE_CURVE); + TimestampedScoredNetwork recentScore = new TimestampedScoredNetwork( + scoredNetwork, + tooOldTimeMillis); + AccessPoint ap = new TestAccessPointBuilder(mContext) + .setSsid(TEST_SSID) + .setBssid(TEST_BSSID) + .setActive(true) + .setScoredNetworkCache( + new ArrayList(Arrays.asList(recentScore))) + .setScanResultCache(SCAN_RESULTS) + .build(); + + int newSpeed = Speed.MODERATE; + when(mockWifiNetworkScoreCache.getScoredNetwork(any(ScanResult.class))) + .thenReturn(buildScoredNetworkWithMockBadgeCurve()); + when(mockBadgeCurve.lookupScore(anyInt())).thenReturn((byte) newSpeed); + + ap.update(mockWifiNetworkScoreCache, true /* scoringUiEnabled */); + + // Fast should still be returned since cache was updated with recent time + assertThat(ap.getSpeed()).isEqualTo(newSpeed); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index e2ebbeb411fb..b1dbb0af54a7 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -17,8 +17,12 @@ package com.android.settingslib.bluetooth; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothAdapter; @@ -42,6 +46,10 @@ import org.robolectric.annotation.Config; @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, resourceDir = "../../res") public class CachedBluetoothDeviceTest { + private final static String DEVICE_NAME = "TestName"; + private final static String DEVICE_ALIAS = "TestAlias"; + private final static String DEVICE_ADDRESS = "AA:BB:CC:DD:EE:FF"; + private final static String DEVICE_ALIAS_NEW = "TestAliasNew"; @Mock private LocalBluetoothAdapter mAdapter; @Mock @@ -62,6 +70,7 @@ public class CachedBluetoothDeviceTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; + when(mDevice.getAddress()).thenReturn(DEVICE_ADDRESS); when(mAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON); when(mHfpProfile.isProfileReady()).thenReturn(true); when(mA2dpProfile.isProfileReady()).thenReturn(true); @@ -152,4 +161,49 @@ public class CachedBluetoothDeviceTest { mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isNull(); } + + @Test + public void testDeviceName_testAliasNameAvailable() { + when(mDevice.getAliasName()).thenReturn(DEVICE_ALIAS); + when(mDevice.getName()).thenReturn(DEVICE_NAME); + CachedBluetoothDevice cachedBluetoothDevice = + new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice); + // Verify alias is returned on getName + assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS); + // Verify device is visible + assertThat(cachedBluetoothDevice.hasHumanReadableName()).isTrue(); + } + + @Test + public void testDeviceName_testNameNotAvailable() { + CachedBluetoothDevice cachedBluetoothDevice = + new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice); + // Verify device address is returned on getName + assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ADDRESS); + // Verify device is not visible + assertThat(cachedBluetoothDevice.hasHumanReadableName()).isFalse(); + } + + @Test + public void testDeviceName_testRenameDevice() { + final String[] alias = {DEVICE_ALIAS}; + doAnswer(invocation -> alias[0]).when(mDevice).getAliasName(); + doAnswer(invocation -> { + alias[0] = (String) invocation.getArguments()[0]; + return true; + }).when(mDevice).setAlias(anyString()); + when(mDevice.getName()).thenReturn(DEVICE_NAME); + CachedBluetoothDevice cachedBluetoothDevice = + new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice); + // Verify alias is returned on getName + assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS); + // Verify null name does not get set + cachedBluetoothDevice.setName(null); + verify(mDevice, never()).setAlias(any()); + // Verify new name is set properly + cachedBluetoothDevice.setName(DEVICE_ALIAS_NEW); + verify(mDevice).setAlias(DEVICE_ALIAS_NEW); + // Verify new alias is returned on getName + assertThat(cachedBluetoothDevice.getName()).isEqualTo(DEVICE_ALIAS_NEW); + } } diff --git a/packages/SettingsProvider/res/values-en-rCA/defaults.xml b/packages/SettingsProvider/res/values-en-rCA/defaults.xml new file mode 100644 index 000000000000..4a87a1250404 --- /dev/null +++ b/packages/SettingsProvider/res/values-en-rCA/defaults.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2009, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> + <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> + <string name="def_nfc_payment_component" msgid="5861297439873026958"></string> +</resources> diff --git a/packages/SettingsProvider/res/values-en-rCA/strings.xml b/packages/SettingsProvider/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..c19fdd7aed7f --- /dev/null +++ b/packages/SettingsProvider/res/values-en-rCA/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2007, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4567566098528588863">"Settings Storage"</string> +</resources> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 53ffe9503f4d..7d7f9ae7f19e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2896,7 +2896,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 147; + private static final int SETTINGS_VERSION = 148; private final int mUserId; @@ -3345,22 +3345,11 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion == 141) { - // Version 142: We added the notion of a default and whether the system set - // the setting. This is used for resetting the internal state and we need - // to make sure this value is updated for the existing settings, otherwise - // we would delete system set settings while they should stay unmodified. - SettingsState globalSettings = getGlobalSettingsLocked(); - ensureLegacyDefaultValueAndSystemSetUpdatedLocked(globalSettings); - globalSettings.persistSyncLocked(); - - SettingsState secureSettings = getSecureSettingsLocked(mUserId); - ensureLegacyDefaultValueAndSystemSetUpdatedLocked(secureSettings); - secureSettings.persistSyncLocked(); - - SettingsState systemSettings = getSystemSettingsLocked(mUserId); - ensureLegacyDefaultValueAndSystemSetUpdatedLocked(systemSettings); - systemSettings.persistSyncLocked(); - + // This implementation was incorrectly setting the current value of + // settings changed by non-system packages as the default which default + // is set by the system. We add a new upgrade step at the end to properly + // handle this case which would also fix incorrect changes made by the + // old implementation of this step. currentVersion = 142; } @@ -3407,24 +3396,51 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion == 145) { - // Version 146: Set the default value for WIFI_WAKEUP_AVAILABLE. + // Version 146: In step 142 we had a bug where incorrectly + // some settings were considered system set and as a result + // made the default and marked as the default being set by + // the system. Here reevaluate the default and default system + // set flags. This would both fix corruption by the old impl + // of step 142 and also properly handle devices which never + // run 142. + if (userId == UserHandle.USER_SYSTEM) { + SettingsState globalSettings = getGlobalSettingsLocked(); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(globalSettings, userId); + globalSettings.persistSyncLocked(); + } + + SettingsState secureSettings = getSecureSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(secureSettings, userId); + secureSettings.persistSyncLocked(); + + SettingsState systemSettings = getSystemSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(systemSettings, userId); + systemSettings.persistSyncLocked(); + + currentVersion = 146; + } + + if (currentVersion == 146) { + // Version 147: Set the default value for WIFI_WAKEUP_AVAILABLE. if (userId == UserHandle.USER_SYSTEM) { final SettingsState globalSettings = getGlobalSettingsLocked(); final Setting currentSetting = globalSettings.getSettingLocked( Settings.Global.WIFI_WAKEUP_AVAILABLE); - final int defaultValue = getContext().getResources().getInteger( - com.android.internal.R.integer.config_wifi_wakeup_available); - globalSettings.insertSettingLocked( - Settings.Global.WIFI_WAKEUP_AVAILABLE, - String.valueOf(defaultValue), - null, true, SettingsState.SYSTEM_PACKAGE_NAME); + if (currentSetting.getValue() == null) { + final int defaultValue = getContext().getResources().getInteger( + com.android.internal.R.integer.config_wifi_wakeup_available); + globalSettings.insertSettingLocked( + Settings.Global.WIFI_WAKEUP_AVAILABLE, + String.valueOf(defaultValue), + null, true, SettingsState.SYSTEM_PACKAGE_NAME); + } } - currentVersion = 146; + currentVersion = 147; } - if (currentVersion == 146) { - // Version 146: Set the default value for DEFAULT_RESTRICT_BACKGROUND_DATA. + if (currentVersion == 147) { + // Version 148: Set the default value for DEFAULT_RESTRICT_BACKGROUND_DATA. if (userId == UserHandle.USER_SYSTEM) { final SettingsState globalSettings = getGlobalSettingsLocked(); final Setting currentSetting = globalSettings.getSettingLocked( @@ -3437,7 +3453,7 @@ public class SettingsProvider extends ContentProvider { null, true, SettingsState.SYSTEM_PACKAGE_NAME); } } - currentVersion = 147; + currentVersion = 148; } // vXXX: Add new settings above this point. @@ -3458,19 +3474,46 @@ public class SettingsProvider extends ContentProvider { } } - private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings) { + private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings, + int userId) { List<String> names = settings.getSettingNamesLocked(); final int nameCount = names.size(); for (int i = 0; i < nameCount; i++) { String name = names.get(i); Setting setting = settings.getSettingLocked(name); - if (setting.getDefaultValue() == null) { - boolean systemSet = SettingsState.isSystemPackage(getContext(), - setting.getPackageName()); + + // In the upgrade case we pretend the call is made from the app + // that made the last change to the setting to properly determine + // whether the call has been made by a system component. + int callingUid = -1; + try { + callingUid = mPackageManager.getPackageUid(setting.getPackageName(), 0, userId); + } catch (RemoteException e) { + /* ignore - handled below */ + } + if (callingUid < 0) { + Slog.e(LOG_TAG, "Unknown package: " + setting.getPackageName()); + continue; + } + try { + final boolean systemSet = SettingsState.isSystemPackage(getContext(), + setting.getPackageName(), callingUid); if (systemSet) { settings.insertSettingLocked(name, setting.getValue(), setting.getTag(), true, setting.getPackageName()); + } else if (setting.getDefaultValue() != null && setting.isDefaultFromSystem()) { + // We had a bug where changes by non-system packages were marked + // as system made and as a result set as the default. Therefore, if + // the package changed the setting last is not a system one but the + // setting is marked as its default coming from the system we clear + // the default and clear the system set flag. + settings.resetSettingDefaultValueLocked(name); } + } catch (IllegalStateException e) { + // If the package goes over its quota during the upgrade, don't + // crash but just log the error as the system does the upgrade. + Slog.e(LOG_TAG, "Error upgrading setting: " + setting.getName(), e); + } } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index d3ac11a7942e..4151ada9ce80 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -298,6 +298,22 @@ final class SettingsState { } // The settings provider must hold its lock when calling here. + public void resetSettingDefaultValueLocked(String name) { + Setting oldSetting = getSettingLocked(name); + if (oldSetting != null && !oldSetting.isNull() && oldSetting.getDefaultValue() != null) { + String oldValue = oldSetting.getValue(); + String oldDefaultValue = oldSetting.getDefaultValue(); + Setting newSetting = new Setting(name, oldSetting.getValue(), null, + oldSetting.getPackageName(), oldSetting.getTag(), false, + oldSetting.getId()); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + scheduleWriteIfNeededLocked(); + } + } + + // The settings provider must hold its lock when calling here. public boolean insertSettingLocked(String name, String value, String tag, boolean makeDefault, String packageName) { if (TextUtils.isEmpty(name)) { @@ -1007,6 +1023,10 @@ final class SettingsState { } public static boolean isSystemPackage(Context context, String packageName) { + return isSystemPackage(context, packageName, Binder.getCallingUid()); + } + + public static boolean isSystemPackage(Context context, String packageName, int callingUid) { synchronized (sLock) { if (SYSTEM_PACKAGE_NAME.equals(packageName)) { return true; @@ -1019,7 +1039,7 @@ final class SettingsState { } // Native services running as a special UID get a pass - final int callingAppId = UserHandle.getAppId(Binder.getCallingUid()); + final int callingAppId = UserHandle.getAppId(callingUid); if (callingAppId < FIRST_APPLICATION_UID) { sSystemUids.put(callingAppId, callingAppId); return true; @@ -1030,7 +1050,7 @@ final class SettingsState { // profile for the purpose of determining whether the other end is a // system component we need to use the user id of the caller for // pulling information about the caller from the package manager. - final int callingUserId = UserHandle.getCallingUserId(); + final int callingUserId = UserHandle.getUserId(callingUid); final long identity = Binder.clearCallingIdentity(); try { diff --git a/packages/Shell/res/values-ar/strings.xml b/packages/Shell/res/values-ar/strings.xml index 1d64c995b4dc..b81a904a6f91 100644 --- a/packages/Shell/res/values-ar/strings.xml +++ b/packages/Shell/res/values-ar/strings.xml @@ -21,7 +21,7 @@ <string name="bugreport_in_progress_title" msgid="4311705936714972757">"جارٍ إنشاء تقرير الخطأ <xliff:g id="ID">#%d</xliff:g>."</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"تم تسجيل تقرير الخطأ <xliff:g id="ID">#%d</xliff:g>."</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"إضافة تفاصيل إلى تقرير الخطأ"</string> - <string name="bugreport_updating_wait" msgid="3322151947853929470">"الرجاء الانتظار…"</string> + <string name="bugreport_updating_wait" msgid="3322151947853929470">"يُرجى الانتظار…"</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"سيظهر تقرير الخطأ على الهاتف بعد قليل"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"اختر لمشاركة تقرير الخطأ"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"انقر لمشاركة تقرير الخطأ."</string> diff --git a/packages/Shell/res/values-en-rCA/strings.xml b/packages/Shell/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..546281360131 --- /dev/null +++ b/packages/Shell/res/values-en-rCA/strings.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="3701846017049540910">"Shell"</string> + <string name="bugreport_notification_channel" msgid="2574150205913861141">"Bug reports"</string> + <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Bug report <xliff:g id="ID">#%d</xliff:g> is being generated"</string> + <string name="bugreport_finished_title" msgid="4429132808670114081">"Bug report <xliff:g id="ID">#%d</xliff:g> captured"</string> + <string name="bugreport_updating_title" msgid="4423539949559634214">"Adding details to the bug report"</string> + <string name="bugreport_updating_wait" msgid="3322151947853929470">"Please wait…"</string> + <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"The bug report will appear on the phone shortly"</string> + <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Select to share your bug report"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Tap to share your bug report"</string> + <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Select to share your bug report without a screenshot or wait for the screenshot to finish"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Tap to share your bug report without a screenshot or wait for the screenshot to finish"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tap to share your bug report without a screenshot or wait for the screenshot to finish"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Bug reports contain data from the system\'s various log files, which may include data that you consider sensitive (such as app-usage and location data). Only share bug reports with people and apps that you trust."</string> + <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Don\'t show again"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Bug reports"</string> + <string name="bugreport_unreadable_text" msgid="586517851044535486">"Bug report file could not be read"</string> + <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Couldn\'t add bug report details to zip file"</string> + <string name="bugreport_unnamed" msgid="2800582406842092709">"unnamed"</string> + <string name="bugreport_info_action" msgid="2158204228510576227">"Details"</string> + <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Screenshot"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Screenshot taken successfully."</string> + <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Screenshot could not be taken."</string> + <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Bug report <xliff:g id="ID">#%d</xliff:g> details"</string> + <string name="bugreport_info_name" msgid="4414036021935139527">"Filename"</string> + <string name="bugreport_info_title" msgid="2306030793918239804">"Bug title"</string> + <string name="bugreport_info_description" msgid="5072835127481627722">"Bug summary"</string> + <string name="save" msgid="4781509040564835759">"Save"</string> + <string name="bugreport_intent_chooser_title" msgid="7605709494790894076">"Share Bug report"</string> +</resources> diff --git a/packages/Shell/res/values-hi/strings.xml b/packages/Shell/res/values-hi/strings.xml index 66ad35c63795..6992240e33f9 100644 --- a/packages/Shell/res/values-hi/strings.xml +++ b/packages/Shell/res/values-hi/strings.xml @@ -24,7 +24,7 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"कृपया प्रतीक्षा करें…"</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"बग रिपोर्ट थोड़ी ही देर में फ़ोन पर दिखाई देगी"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"अपनी बग रिपोर्ट साझा करना चुनें"</string> - <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"अपनी बग रिपोर्ट साझा करने के लिए टैप करें"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"अपनी बग रिपोर्ट शेयर करने के लिए टैप करें"</string> <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"किसी स्क्रीनशॉट के बिना अपनी बग रिपोर्ट साझा करना चुनें या स्क्रीनशॉट पूरा होने तक इंतज़ार करें"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"अपनी बग रिपोर्ट को बिना स्क्रीनशॉट साझा करने हेतु टैप करें या स्क्रीनशॉट पूरा होने की प्रतीक्षा करें"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"अपनी बग रिपोर्ट को बिना स्क्रीनशॉट साझा करने हेतु टैप करें या स्क्रीनशॉट पूरा होने की प्रतीक्षा करें"</string> diff --git a/packages/Shell/res/values-te/strings.xml b/packages/Shell/res/values-te/strings.xml index dd2d9100056e..8db9b889dea7 100644 --- a/packages/Shell/res/values-te/strings.xml +++ b/packages/Shell/res/values-te/strings.xml @@ -24,7 +24,7 @@ <string name="bugreport_updating_wait" msgid="3322151947853929470">"దయచేసి వేచి ఉండండి..."</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"బగ్ నివేదిక త్వరలో ఫోన్లో కనిపిస్తుంది"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి"</string> - <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి నొక్కండి"</string> + <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"మీ బగ్ నివేదికను షేర్ చేయడానికి నొక్కండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివేదికను భాగస్వామ్యం చేయడానికి ఎంచుకోండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"స్క్రీన్షాట్ లేకుండా మీ బగ్ నివే. భాగ. చేయడానికి నొక్కండి లేదా స్క్రీన్షాట్ ముగిసేదాకా వేచి ఉండండి"</string> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 24f6c138e081..c99716084e38 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -108,6 +108,7 @@ <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <!-- Keyguard --> + <uses-permission android:name="com.android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS" /> <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java deleted file mode 100644 index 925214e3ab3a..000000000000 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2017 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.plugins; - -import android.app.Activity; -import android.content.Context; -import android.content.res.Resources; -import android.os.Bundle; - -import com.android.systemui.plugins.annotations.ProvidesInterface; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * A PluginActivity is an activity that replaces another full activity (e.g. RecentsActivity) - * at runtime within the sysui process. - */ -@ProvidesInterface(version = PluginActivity.VERSION) -public abstract class PluginActivity extends Activity implements Plugin { - - public static final int VERSION = 1; - - public static final String ACTION_RECENTS = "com.android.systemui.action.PLUGIN_RECENTS"; - - private Context mSysuiContext; - private boolean mSettingActionBar; - - @Override - public final void onCreate(Context sysuiContext, Context pluginContext) { - mSysuiContext = sysuiContext; - super.attachBaseContext(pluginContext); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Theme theme = getClass().getDeclaredAnnotation(Theme.class); - if (theme != null && theme.value() != 0) { - setTheme(theme.value()); - } - mSettingActionBar = true; - getActionBar(); - mSettingActionBar = false; - } - - @Override - public Resources getResources() { - return mSettingActionBar ? mSysuiContext.getResources() : super.getResources(); - } - - @Override - protected void attachBaseContext(Context newBase) { - mSysuiContext = newBase; - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - public Context getSysuiContext() { - return mSysuiContext; - } - - public Context getPluginContext() { - return getBaseContext(); - } - - /** - * Since PluginActivities are declared as services instead of activities (since they - * are plugins), they can't have a theme attached to them. Instead a PluginActivity - * can annotate itself with @Theme to specify the resource of the style it wants - * to be themed with. - */ - @Retention(RetentionPolicy.RUNTIME) - public @interface Theme { - int value(); - } -} diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java index db2e3765d2d0..25ce3ddf8169 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java @@ -21,11 +21,6 @@ public class PluginDependency { public static final int VERSION = 1; static DependencyProvider sProvider; - /** - * Allows a plugin to get a hold of static dependencies if they have declared dependence - * on their interface. For one-shot plugins this will only work during onCreate and will - * not work afterwards. - */ public static <T> T get(Plugin p, Class<T> cls) { return sProvider.get(p, cls); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java index 5243228121c6..1285ed87718e 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java @@ -27,7 +27,7 @@ public interface NavBarButtonProvider extends Plugin { public static final String ACTION = "com.android.systemui.action.PLUGIN_NAV_BUTTON"; - public static final int VERSION = 2; + public static final int VERSION = 3; /** * Returns a view in the nav bar. If the id is set "back", "home", "recent_apps", "menu", @@ -46,8 +46,6 @@ public interface NavBarButtonProvider extends Plugin { void setVertical(boolean vertical); - void setCarMode(boolean carMode); - void setDarkIntensity(float intensity); } } diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml index 8cbd94bd0cb4..db508c91e0de 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_esim_area.xml @@ -25,8 +25,7 @@ android:id="@+id/keyguard_disable_esim" android:visibility="gone" android:text="@string/disable_carrier_button_text" - style="?android:attr/buttonBarButtonStyle" + style="@style/Keyguard.TextView" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="@dimen/kg_status_line_font_size" - android:textColor="?android:attr/textColorSecondary" android:textAllCaps="@bool/kg_use_all_caps" /> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml index 7291cd44c8ac..29376ce01e4f 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_host_view.xml @@ -45,7 +45,9 @@ android:layout_height="match_parent" android:clipChildren="false" android:clipToPadding="false" - android:paddingTop="@dimen/keyguard_security_view_margin" + android:paddingTop="@dimen/keyguard_security_view_top_margin" + android:paddingStart="@dimen/keyguard_security_view_lateral_margin" + android:paddingEnd="@dimen/keyguard_security_view_lateral_margin" android:gravity="center"> </com.android.keyguard.KeyguardSecurityViewFlipper> </com.android.keyguard.KeyguardSecurityContainer> diff --git a/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml index 2c209e244816..38d2ecc3ddb5 100644 --- a/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw320dp/dimens.xml @@ -19,7 +19,8 @@ --> <resources> - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> + <!-- Height of the sliding KeyguardSecurityContainer + (includes 2x keyguard_security_view_top_margin) --> <dimen name="keyguard_security_height">345dp</dimen> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml index 38658caeb443..90c4795d1e56 100644 --- a/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw360dp/dimens.xml @@ -20,6 +20,6 @@ <resources> <!-- Height of the sliding KeyguardSecurityContainer (includes 2x - keyguard_security_view_margin) --> + keyguard_security_view_top_margin) --> <dimen name="keyguard_security_height">400dp</dimen> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw540dp-port/dimens.xml b/packages/SystemUI/res-keyguard/values-sw540dp-port/dimens.xml index de3106f9571b..9ea04dc72ba9 100644 --- a/packages/SystemUI/res-keyguard/values-sw540dp-port/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw540dp-port/dimens.xml @@ -19,6 +19,6 @@ --> <resources> <!-- Height of the sliding KeyguardSecurityContainer - (includes 2x keyguard_security_view_margin) --> + (includes 2x keyguard_security_view_top_margin) --> <dimen name="keyguard_security_height">500dp</dimen> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml index 9e788bec49cd..4ae7cb97e1a2 100644 --- a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml @@ -23,7 +23,7 @@ <dimen name="kg_status_line_font_size">16sp</dimen> <!-- Margin around the various security views --> - <dimen name="keyguard_security_view_margin">12dp</dimen> + <dimen name="keyguard_security_view_top_margin">12dp</dimen> <!-- Overload default clock widget parameters --> <dimen name="widget_big_font_size">100dp</dimen> diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml index 7eb63d7b100a..9157822db960 100644 --- a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml @@ -18,10 +18,8 @@ --> <resources> - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">420dp</dimen> - - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> + <!-- Height of the sliding KeyguardSecurityContainer + (includes 2x keyguard_security_view_top_margin) --> <dimen name="keyguard_security_height">420dp</dimen> <dimen name="widget_big_font_size">100dp</dimen> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index a721dd0609dc..bcac07295cce 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -22,17 +22,20 @@ <!-- Size of the generic status lines keyguard's status view --> <dimen name="kg_status_line_font_size">14sp</dimen> - <!-- Width of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> - <dimen name="keyguard_security_width">320dp</dimen> + <!-- Maximum width of the sliding KeyguardSecurityContainer --> + <dimen name="keyguard_security_width">420dp</dimen> - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> + <!-- Height of the sliding KeyguardSecurityContainer + (includes 2x keyguard_security_view_top_margin) --> <dimen name="keyguard_security_height">400dp</dimen> - <!-- Max Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> + <!-- Max Height of the sliding KeyguardSecurityContainer + (includes 2x keyguard_security_view_top_margin) --> <dimen name="keyguard_security_max_height">450dp</dimen> <!-- Margin around the various security views --> - <dimen name="keyguard_security_view_margin">8dp</dimen> + <dimen name="keyguard_security_view_top_margin">8dp</dimen> + <dimen name="keyguard_security_view_lateral_margin">36dp</dimen> <!-- EmergencyCarrierArea overlap - amount to overlap the emergency button and carrier text. Should be 0 on devices with plenty of room (e.g. tablets) --> diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml index bc290129f545..dde2db2f484f 100644 --- a/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml +++ b/packages/SystemUI/res/layout/car_fullscreen_user_pod.xml @@ -20,10 +20,7 @@ android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/car_fullscreen_user_pod_margin_side" - android:layout_marginRight="@dimen/car_fullscreen_user_pod_margin_side" - android:gravity="center" - android:layout_weight="1" > + android:gravity="center" > <ImageView android:id="@+id/user_avatar" android:layout_gravity="center" @@ -31,10 +28,13 @@ android:layout_height="@dimen/car_fullscreen_user_pod_image_avatar_height" /> <TextView android:id="@+id/user_name" - android:layout_width="wrap_content" + android:layout_width="@dimen/car_fullscreen_user_pod_width" android:layout_height="wrap_content" android:layout_marginTop="@dimen/car_fullscreen_user_pod_margin_above_text" android:textSize="@dimen/car_fullscreen_user_pod_text_size" android:textColor="@color/qs_user_detail_name" + android:ellipsize="end" + android:singleLine="true" + android:gravity="center_horizontal" android:layout_gravity="center_horizontal" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml b/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml index 8c556801cf9b..99d010f2ac2b 100644 --- a/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml +++ b/packages/SystemUI/res/layout/car_fullscreen_user_pod_container.xml @@ -18,7 +18,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center"> + android:gravity="center" + android:layout_gravity="center" > <!-- car_fullscreen_user_pods will be dynamically added here. --> </LinearLayout> diff --git a/packages/SystemUI/res/layout/car_qs_panel.xml b/packages/SystemUI/res/layout/car_qs_panel.xml index d1f7ff83db93..0b46b0bdaa1c 100644 --- a/packages/SystemUI/res/layout/car_qs_panel.xml +++ b/packages/SystemUI/res/layout/car_qs_panel.xml @@ -24,4 +24,11 @@ <include layout="@layout/car_status_bar_header" /> <include layout="@layout/car_qs_footer" /> + + <com.android.systemui.statusbar.car.UserGridView + android:id="@+id/user_grid" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/car_margin" + android:layout_marginRight="@dimen/car_margin" /> </LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index a99fb6cdcfce..cdd732b01419 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Die rekenaar se RSA-sleutel-vingerafdruk is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-ontfouting word nie toegelaat nie"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Stoor tans skermkiekie..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Kom meer te wete"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Jy is gekoppel aan <xliff:g id="VPN_APP">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Maak VPN-instellings oop"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Maak vertroude eiebewyse oop"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Jou administrateur het netwerkloglêers aangeskakel wat verkeer op jou toestel monitor.\n\nKontak jou administrateur vir meer inligting."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minuut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batterygebruik"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterybespaarder is nie beskikbaar wanneer gelaai word nie"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterybespaarder"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Verminder werkverrigting en agtergronddata"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Knoppie <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimeer"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Maak toe"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Sleep af om toe te maak"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Prent op prent-kieslys"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in beeld-in-beeld"</string> <string name="pip_notification_message" msgid="5619512781514343311">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk moet gebruik nie, tik om instellings oop te maak en skakel dit af."</string> <string name="pip_play" msgid="1417176722760265888">"Speel"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Kieslys"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g>-program"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Opletberigte"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Battery"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Skermkiekies"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Algemene boodskappe"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Berging"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index a7b04c4cf749..0bda81cb4159 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"የኮምፒውተሩ RSA ቁልፍ ጣት አሻራ ይሄ ነው፦\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ሁልጊዜ ከዚህ ኮምፒውተር ፍቀድ"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"የዩኤስቢ እርማት አይፈቀድም"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string> <string name="compat_mode_on" msgid="6623839244840638213">"ማያ እንዲሞላ አጉላ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"የበለጠ ለመረዳት"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="VPN_APP">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"የቪፒኤን ቅንብሮችን ይክፈቱ"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"የታመኑ ምስክርነቶችን ክፈት"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"የእርስዎ አስተዳዳሪ የአውታረ መረብ ምዝግብ ማስታወሻ መያዝን አብርተዋል፣ ይህም በመሣሪያዎ ላይ ያለውን ትራፊክ ይከታተላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> @@ -587,8 +585,10 @@ <item quantity="other"> %d ደቂቃዎች</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"የባትሪ አጠቃቀም"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ኃይል በሚሞላበት ጊዜ ባትሪ ቆጣቢ አይገኝም"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ባትሪ ቆጣቢ"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"አፈጻጸምን እና የጀርባ ውሂብን ይቀንሳል"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"አዝራር <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"መነሻ"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"አሳንስ"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ዝጋ"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ለማሰናበት ወደ ታች ይጎትቱ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"በስዕል ምናሌ ውስጥ ያለ ስዕል"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> በስዕል-ላይ-ስዕል ውስጥ ነው"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string> <string name="pip_play" msgid="1417176722760265888">"አጫውት"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"ምናሌ"</string> <string name="tuner_app" msgid="3507057938640108777">"የ<xliff:g id="APP">%1$s</xliff:g> መተግበሪያ"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"ማንቂያዎች"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"ባትሪ"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"ቅጽበታዊ ገጽ እይታዎች"</string> <string name="notification_channel_general" msgid="4525309436693914482">"አጠቃላይ መልዕክቶች"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"ማከማቻ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 3632fe02d9d8..04a7daaf49f2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -68,8 +68,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"الملف المرجعي الرئيسي لـ RSA في هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"السماح دائمًا من هذا الكمبيوتر"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"لا يُسمح بتصحيح أخطاء USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string> <string name="compat_mode_on" msgid="6623839244840638213">"تكبير/تصغير لملء الشاشة"</string> <string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"جارٍ حفظ لقطة الشاشة..."</string> @@ -465,8 +464,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"مزيد من المعلومات"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"لقد اتصلت بتطبيق <xliff:g id="VPN_APP">%1$s</xliff:g>، الذي يمكن أن يراقب نشاط الشبكة، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"فتح إعدادات الشبكة الافتراضية الخاصة (VPN)"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"فتح بيانات الاعتماد الموثوق بها"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"شغَّل المشرف ميزة تسجيل بيانات الشبكة، والتي يتم من خلالها مراقبة حركة البيانات على جهازك.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف."</string> @@ -611,8 +609,10 @@ <item quantity="one">دقيقة واحدة</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"استخدام البطارية"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"وضع توفير شحن البطارية غير متاح أثناء الشحن."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"توفير شحن البطارية"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"لخفض مستوى الأداء وبيانات الخلفية"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"الزر <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -752,7 +752,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"تصغير"</string> <string name="pip_phone_close" msgid="8416647892889710330">"إغلاق"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"اسحب لأسفل للإلغاء"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"قائمة صورة داخل صورة"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> يظهر في صورة داخل صورة"</string> <string name="pip_notification_message" msgid="5619512781514343311">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم أوقِف تشغيل هذه الميزة."</string> <string name="pip_play" msgid="1417176722760265888">"تشغيل"</string> @@ -780,8 +781,7 @@ <string name="tuner_menu" msgid="191640047241552081">"القائمة"</string> <string name="tuner_app" msgid="3507057938640108777">"تطبيق <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"التنبيهات"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"البطارية"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"لقطات الشاشة"</string> <string name="notification_channel_general" msgid="4525309436693914482">"رسائل عامة"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"سعة التخزين"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index a20df383d54e..d5935e6f31d2 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debaq prosesinə icazə verilmir"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skrinşot yadda saxlanılır..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Ətraflı məlumat"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"<xliff:g id="VPN_APP">%1$s</xliff:g> tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizə nəzarət edə bilər."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" ("</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN ayarlarını açın"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Etibarlı kredensialları açın"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Admin, cihazdakı trafikə nəzarət edən şəbəkə loqlarını aktiv etdi.\n\nƏtraflı məlumat üçün administrator ilə əlaqə saxlayın."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d dəqiqə</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batareya istifadəsi"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Enerji Qənaəti doldurulma zamanı əlçatan deyil"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Enerji Qənaəti"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Performansı azaldır və arxa fon datasını məhdudlaşdırır"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Düymə <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Əsas səhifə"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Kiçildin"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Bağlayın"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Rədd etmək üçün aşağı çəkin"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Şəkil-içində-şəkil menyusu"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> şəkil içində şəkildədir"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> tətbiqinin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string> <string name="pip_play" msgid="1417176722760265888">"Oxudun"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menyu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> tətbiqi"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Siqnallar"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batareya"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Skrinşotlar"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Ümumi Mesajlar"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Yaddaş"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 57a3af109852..7a793a60c85d 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Digitalni otisak RSA ključa ovog računara je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvek dozvoli sa ovog računara"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj na celom ekranu"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci na ceo ekran"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Čuvanje snimka ekrana..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saznajte više"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Povezani ste sa aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Otvori podešavanja VPN-a"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Otvorite pouzdane akreditive"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administrator je uključio evidentiranje mreže, koje prati saobraćaj na uređaju.\n\nKontaktirajte administratora za više informacija."</string> @@ -593,8 +591,10 @@ <item quantity="other">%d minuta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ušteda baterije nije dostupna tokom punjenja"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ušteda baterije"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Smanjuje performanse i pozadinske podatke"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Taster Početna"</string> @@ -734,7 +734,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Umanji"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Prevucite nadole da biste odbili"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Meni Slika u slici"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je slika u slici"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da biste otvorili podešavanja i isključili je."</string> <string name="pip_play" msgid="1417176722760265888">"Pusti"</string> @@ -762,8 +763,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meni"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Obaveštenja"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterija"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Opšte poruke"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Memorijski prostor"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 707ffb5cd22e..b6e006234447 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -601,8 +601,10 @@ <item quantity="other">%d хвіліны</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Выкарыстанне зараду"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Эканомія зараду акумулятара недаступная падчас зарадкі"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Эканомія зараду"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Памяншае прадукцыйнасць і фонавую перадачу даных"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -742,7 +744,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Згарнуць"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Закрыць"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Перацягніце ўніз, каб адхіліць"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Відарыс у відарысе\""</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> з’яўляецца відарысам у відарысе"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць яе."</string> <string name="pip_play" msgid="1417176722760265888">"Прайграць"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 9c72f8209798..f36d797e18dc 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Отпечатъкът на RSA ключа на компютъра е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Винаги да се разрешава от този компютър"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстраняването на грешки през USB не е разрешено"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Мащаб – запълва екрана"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Екранната снимка се запазва..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Научете повече"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Установена е връзка с приложението <xliff:g id="VPN_APP">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, вкл. имейли, приложения и уебсайтове."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Отваряне на настройките за VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Отваряне на надеждните идентификационни данни"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Администраторът ви е включил функцията за регистриране на мрежовата активност, която следи трафика на устройството ви.\n\nЗа повече информация се свържете с администратора си."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d минута</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Ползв. на батерията"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Режимът за запазване на батерията не е налице при зареждане"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Режим за запазване на батерията"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Намалява ефективността и данните на заден план"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Бутон „<xliff:g id="NAME">%1$s</xliff:g>“"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Начало"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Намаляване"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Затваряне"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Преместете надолу с плъзгане, за да отхвърлите"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Меню за режима „Картина в картината“"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> е в режима „Картина в картината“"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string> <string name="pip_play" msgid="1417176722760265888">"Пускане"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Меню"</string> <string name="tuner_app" msgid="3507057938640108777">"Приложение <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Сигнали"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батерия"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Екранни снимки"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Общи съобщения"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Хранилище"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index f8b245ffb4af..f06f48b95373 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -587,8 +587,10 @@ <item quantity="other">%d মিনিট</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ব্যাটারির ব্যবহার"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"চার্জ করার সময় ব্যাটারি সেভার উপলব্ধ নয়"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ব্যাটারি সেভার"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"কার্য-সম্পাদনা ও পশ্চাদপট ডেটাকে কমিয়ে দেয়"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> বোতাম"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"হোম"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ছোটো করুন"</string> <string name="pip_phone_close" msgid="8416647892889710330">"বন্ধ করুন"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"খারিজ করতে নিচের দিকে টেনে আনুন"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"পিকচার ইন পিকচার মেনু"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"ছবির-মধ্যে-ছবি তে <xliff:g id="NAME">%s</xliff:g> আছেন"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে ট্যাপ করে সেটিংসে গিয়ে সেটি বন্ধ করে দিন।"</string> <string name="pip_play" msgid="1417176722760265888">"চালান"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index e6a754525120..31ae3f6a1b49 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"RSA otisak prsta za otključavanje računara je: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dozvoli sa ovog računara"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Uvećaj prikaz na ekran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci prikaz na ekran"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spašavanje snimka ekrana..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saznajte više"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke i web lokacije."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Otvorite postavke VPN mreže"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Otvorite pouzdane akreditive"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Vaš administrator je uključio zapisivanje na mreži, čime se prati saobraćaj na vašem uređaju.\n\nZa više informacija, obratite se administratoru."</string> @@ -595,8 +593,10 @@ <item quantity="other">%d minuta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ušteda baterije je isključena prilikom punjenja"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ušteda baterije"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Ograničava rad i prijenos podataka u pozadini"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Tipka za početak"</string> @@ -736,7 +736,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Umanji"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povucite prema dolje da odbacite"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Meni za način rada Slika u slici"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je u načinu priakza Slika u slici"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string> <string name="pip_play" msgid="1417176722760265888">"Reproduciraj"</string> @@ -764,8 +765,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meni"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterija"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimci ekrana"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Opće poruke"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 2778c3918d2a..21b02dd6b49c 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"L\'empremta digital de la clau de l\'RSA de l\'equip és:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Dona sempre permís des d\'aquest equip"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No es permet la depuració USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per omplir pantalla"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"S\'està desant captura de pantalla..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Més informació"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Estàs connectat a <xliff:g id="VPN_APP">%1$s</xliff:g>, que pot supervisar la teva activitat a la xarxa, com els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Obre la configuració de la VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Obre les credencials de confiança"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Ús de la bateria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"La funció Estalvi de bateria no està disponible durant la càrrega"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Estalvi de bateria"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Redueix el rendiment i les dades en segon pla"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botó <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Inici"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimitza"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Tanca"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrossega cap avall per ignorar-ho"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menú per a Pantalla en pantalla"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> està en pantalla en pantalla"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string> <string name="pip_play" msgid="1417176722760265888">"Reprodueix"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplicació <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Bateria"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Captures de pantalla"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Missatges generals"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Emmagatzematge"</string> diff --git a/packages/SystemUI/res/values-ca/strings_tv.xml b/packages/SystemUI/res/values-ca/strings_tv.xml index 6e9fae5e7481..a6c17f8e5f50 100644 --- a/packages/SystemUI/res/values-ca/strings_tv.xml +++ b/packages/SystemUI/res/values-ca/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="134047986446577723">"Imatge en imatge"</string> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantalla en pantalla"</string> <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programa sense títol)"</string> <string name="pip_close" msgid="3480680679023423574">"Tanca PIP"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index f1092aa1be25..ea77a5e9ebac 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -601,8 +601,8 @@ <item quantity="one">%d minuta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Využití baterie"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Spořič baterie při nabíjení není k dispozici."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Spořič baterie"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Spořič baterie při nabíjení není k dispozici"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Spořič baterie"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Omezuje výkon a data na pozadí"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Tlačítko <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -742,7 +742,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizovat"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zavřít"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Nápovědu zavřete přetažením dolů"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Nabídka režimu obraz v obraze"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Nabídka"</string> <string name="pip_notification_title" msgid="3204024940158161322">"Aplikace <xliff:g id="NAME">%s</xliff:g> je v režimu obraz v obraze"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string> <string name="pip_play" msgid="1417176722760265888">"Přehrát"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index c2a0fa2147ab..7542f1f6c574 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeraftrykket for computerens RSA-nøgle er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillad altid fra denne computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-fejlretning er ikke tilladt"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom til fuld skærm"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Gemmer screenshot..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Få flere oplysninger"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Du har forbindelse til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Åbn VPN-indstillinger"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Åbn pålidelige loginoplysninger"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Din administrator har aktiveret netværksregistrering, som overvåger trafik på din enhed.\n\nKontakt din administrator for at få flere oplysninger."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d minutter</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batteriforbrug"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterisparefunktionen er ikke tilgængelig under opladning"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterisparefunktion"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reducerer ydeevne og baggrundsdata"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g>-knap"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimer"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Luk"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Træk nedad for at afvise"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu for integreret billede"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> vises som integreret billede"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string> <string name="pip_play" msgid="1417176722760265888">"Afspil"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Appen <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Underretninger"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batteri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Generelle meddelelser"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Lagerplads"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 4ae58ca5598f..c6d2619dc0a6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -591,8 +591,10 @@ <item quantity="one">%d Minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akkunutzung"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Der Energiesparmodus ist beim Aufladen nicht verfügbar."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Energiesparmodus"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduzierung der Leistung und Hintergrunddaten"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Taste <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Pos1"</string> @@ -732,7 +734,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimieren"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Schließen"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zum Schließen nach unten ziehen"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menü \"Bild im Bild\""</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ist in Bild im Bild"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string> <string name="pip_play" msgid="1417176722760265888">"Wiedergeben"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index a7e1a833c3f4..edc6b2fe0615 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d λεπτό</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Χρήση της μπαταρίας"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Η εξοικονόμηση μπαταρίας δεν είναι διαθέσιμη κατά τη διάρκεια της φόρτισης"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Εξοικονόμηση μπαταρίας"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Μειώνει την απόδοση και τα δεδομένα παρασκηνίου"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Κουμπί <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Ελαχιστοποίηση"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Κλείσιμο"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Σύρετε προς τα κάτω για παράβλεψη"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Μενού λειτουργίας Picture in picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"Η λειτουργία picture-in-picture είναι ενεργή σε <xliff:g id="NAME">%s</xliff:g>."</string> <string name="pip_notification_message" msgid="5619512781514343311">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string> <string name="pip_play" msgid="1417176722760265888">"Αναπαραγωγή"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 6d0eebef2a4c..6a84a779fed5 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Find out more"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Open VPN settings"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Open trusted credentials"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin."</string> @@ -587,8 +585,8 @@ <item quantity="one">%d minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Battery Saver not available during charging"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Battery Saver not available during charging"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Battery Saver"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduces performance and background data"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Close"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="pip_play" msgid="1417176722760265888">"Play"</string> @@ -756,8 +754,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Battery"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> diff --git a/packages/SystemUI/res/values-en-rCA-land/strings.xml b/packages/SystemUI/res/values-en-rCA-land/strings.xml new file mode 100644 index 000000000000..ba773b8f8b13 --- /dev/null +++ b/packages/SystemUI/res/values-en-rCA-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="toast_rotation_locked" msgid="7609673011431556092">"Screen is now locked in landscape orientation."</string> +</resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index eb01ff688ae3..bd4c8578d00d 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Find out more"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Open VPN settings"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Open trusted credentials"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin."</string> @@ -587,8 +585,8 @@ <item quantity="one">%d minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Battery Saver not available during charging"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Battery Saver not available during charging"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Battery Saver"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduces performance and background data"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Close"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="pip_play" msgid="1417176722760265888">"Play"</string> @@ -756,8 +754,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Battery"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings_car.xml b/packages/SystemUI/res/values-en-rCA/strings_car.xml new file mode 100644 index 000000000000..27b916e9a2e6 --- /dev/null +++ b/packages/SystemUI/res/values-en-rCA/strings_car.xml @@ -0,0 +1,24 @@ +<?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. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="unknown_user_label" msgid="4323896111737677955">"Unknown"</string> + <string name="start_driving" msgid="864023351402918991">"Start Driving"</string> +</resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings_tv.xml b/packages/SystemUI/res/values-en-rCA/strings_tv.xml new file mode 100644 index 000000000000..31cbd8377fd5 --- /dev/null +++ b/packages/SystemUI/res/values-en-rCA/strings_tv.xml @@ -0,0 +1,26 @@ +<?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. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-picture"</string> + <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(No title program)"</string> + <string name="pip_close" msgid="3480680679023423574">"Close PIP"</string> + <string name="pip_fullscreen" msgid="8604643018538487816">"Full screen"</string> +</resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 6d0eebef2a4c..6a84a779fed5 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Find out more"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Open VPN settings"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Open trusted credentials"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin."</string> @@ -587,8 +585,8 @@ <item quantity="one">%d minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Battery Saver not available during charging"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Battery Saver not available during charging"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Battery Saver"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduces performance and background data"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Close"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="pip_play" msgid="1417176722760265888">"Play"</string> @@ -756,8 +754,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Battery"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 6d0eebef2a4c..6a84a779fed5 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saving screenshot…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Find out more"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"You\'re connected to <xliff:g id="VPN_APP">%1$s</xliff:g>, which can monitor your network activity, including emails, apps and websites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Open VPN settings"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Open trusted credentials"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin."</string> @@ -587,8 +585,8 @@ <item quantity="one">%d minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Battery Saver not available during charging"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Battery Saver not available during charging"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Battery Saver"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduces performance and background data"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimise"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Close"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="pip_play" msgid="1417176722760265888">"Play"</string> @@ -756,8 +754,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alerts"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Battery"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"General Messages"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 27980eedfbfd..434c67b7da18 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -585,8 +585,8 @@ <item quantity="one">%d minute</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Battery Saver not available during charging"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Battery saver not available during charging"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Battery saver"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduces performance and background data"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -726,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimize"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Close"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Drag down to dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Picture in picture menu"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"If you don\'t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="pip_play" msgid="1417176722760265888">"Play"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index b7e0f72fef0f..814708084882 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -589,8 +589,10 @@ <item quantity="one">%d minuto</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ahorro de batería no está disponible durante la carga"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ahorro de batería"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y el uso de datos en segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Página principal"</string> @@ -730,7 +732,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Cerrar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra hacia abajo para descartar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menú de Imagen en imagen"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está en modo de imagen en imagen"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string> <string name="pip_play" msgid="1417176722760265888">"Reproducir"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 0a24d92cc050..5e73ef604f2b 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde este ordenador"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuración USB no permitida"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ajustar"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Guardando captura..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Más información"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Te has conectado a <xliff:g id="VPN_APP">%1$s</xliff:g>, que puede controlar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Abrir ajustes de VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Abrir credenciales de confianza"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Tu administrador ha activado el registro de la red para supervisar el tráfico en tu dispositivo.\n\nPonte en contacto con él para obtener más información."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d minuto</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ahorro de batería no disponible mientras se carga el dispositivo"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Ahorro de batería"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Inicio"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Cerrar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra hacia abajo para ignorar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menú del modo Imagen en imagen"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está en imagen en imagen"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string> <string name="pip_play" msgid="1417176722760265888">"Reproducir"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menú"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplicación <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batería"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de pantalla"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mensajes generales"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Almacenamiento"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 0ef25323cb07..975dfa21a209 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Arvuti RSA-võtme sõrmejälg:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Luba alati sellest arvutist"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-silumine pole lubatud"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Suumi ekraani täitmiseks"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Venita ekraani täitmiseks"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Kuvatõmmise salvestamine ..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Lisateave"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Olete ühendatud rakendusega <xliff:g id="VPN_APP">%1$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN-i seadete avamine"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Ava usaldusväärsed mandaadid"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Teie administraator on sisse lülitanud võrgu logimise funktsiooni, mis jälgib teie seadmes liiklust.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akukasutus"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Akusäästja pole laadimise ajal saadaval"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Akusäästja"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Vähendab jõudlust ja taustaandmeid"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Nupp <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Avaekraan"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimeeri"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Sule"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Loobumiseks lohistage alla"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menüü Pilt pildis"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> on režiimis Pilt pildis"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string> <string name="pip_play" msgid="1417176722760265888">"Esita"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menüü"</string> <string name="tuner_app" msgid="3507057938640108777">"Rakendus <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Teatised"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Aku"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekraanipildid"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Üldised sõnumid"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Salvestusruum"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index ebbdf87c568e..8e9bcacc981d 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren hatz-marka hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Handiagotu pantaila betetzeko"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Luzatu pantaila betetzeko"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Pantaila-argazkia gordetzen…"</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Informazio gehiago"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Ireki VPN ezarpenak"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Ireki kredentzial fidagarriak"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d minutu</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Bateriaren erabilera"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Bateria-aurrezlea ez dago erabilgarri gailua kargatzen ari denean"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Bateria-aurrezlea"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Errendimendua eta atzeko planoko datuen erabilera murrizten ditu"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> botoia"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Hasiera"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizatu"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Itxi"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Baztertzeko, arrastatu behera"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Pantaila txiki gainjarriaren menua"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"Pantaila txiki gainjarrian dago <xliff:g id="NAME">%s</xliff:g>"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string> <string name="pip_play" msgid="1417176722760265888">"Erreproduzitu"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menua"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> aplikazioa"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Abisuak"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Bateria"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Pantaila-argazkiak"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mezu orokorrak"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Memoria"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 58a5946ba70e..de2c77029f9a 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"اثر انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"همیشه از این رایانه انجام شود"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"اشکالزدایی USB مجاز نیست"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمیتواند اشکالزدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string> <string name="compat_mode_on" msgid="6623839244840638213">"بزرگنمایی برای پر کردن صفحه"</string> <string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن صفحه"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"در حال ذخیره عکس صفحهنمایش..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"بیشتر بدانید"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"به <xliff:g id="VPN_APP">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شما را (ازجمله رایانامهها، برنامهها و وبسایتها) کنترل کند."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"باز کردن تنظیمات VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"باز کردن اعتبارنامه مورداعتماد"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"سرپرست سیستم شما گزارشگیری شبکه را (که بر ترافیک دستگاهتان نظارت میکند) روشن کرده است.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d دقیقه</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"مصرف باتری"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"هنگام شارژ شدن، «بهینهسازی باتری» در دسترس نیست"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"بهینهسازی باتری"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"عملکرد و اطلاعات پسزمینه را کاهش میدهد"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"دکمه <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"ابتدا"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"کوچک کردن"</string> <string name="pip_phone_close" msgid="8416647892889710330">"بستن"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"برای نپذیرفتن، به پایین بکشید"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"منوی تصویر در تصویر"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> درحالت تصویر در تصویر است"</string> <string name="pip_notification_message" msgid="5619512781514343311">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و آن را خاموش کنید."</string> <string name="pip_play" msgid="1417176722760265888">"پخش"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"منو"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> برنامه"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"هشدارها"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"باتری"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"عکسهای صفحهنمایش"</string> <string name="notification_channel_general" msgid="4525309436693914482">"پیامهای عمومی"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"فضای ذخیرهسازی"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 3469a23cc518..6b39ef87e781 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Tietokoneen RSA-avaintunnistetiedosto on:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Salli aina tällä tietokoneella"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-vianetsintää ei sallita"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomaa koko näyttöön"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Tallennetaan kuvakaappausta..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Lisätietoja"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Olet yhteydessä sovellukseen <xliff:g id="VPN_APP">%1$s</xliff:g>, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Avaa VPN-asetukset"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Avaa luotetut todennustiedot"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen. Sen avulla seurataan laitteellasi tapahtuvaa liikennettä.\n\nPyydä lisätietoja järjestelmänvalvojalta."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minuutti</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akun käyttö"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Virransäästö ei ole käytettävissä latauksen aikana."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Virransäästö"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Rajoittaa suorituskykyä ja taustatiedonsiirtoa."</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Painike <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Pienennä"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Sulje"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Hylkää vetämällä alas."</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Kuva kuvassa ‑valikko"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> on kuva kuvassa ‑tilassa"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string> <string name="pip_play" msgid="1417176722760265888">"Toista"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Valikko"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> sovellus"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Ilmoitukset"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Akku"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Kuvakaappaukset"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Yleiset viestit"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Tallennustila"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a4f5712af523..cc705f9f7e5b 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string> @@ -270,8 +269,8 @@ <string name="start_dreams" msgid="5640361424498338327">"Écran de veille"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string> - <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priorités seulement"</string> - <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string> + <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires seulement"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes seulement"</string> <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Aucune interruption"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string> @@ -373,7 +372,7 @@ <string name="interruption_level_none_with_warning" msgid="5114872171614161084">"Aucune interruption : le son des lecteurs d\'écran sera également désactivé."</string> <string name="interruption_level_none" msgid="6000083681244492992">"Aucune interruption"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priorités seulement"</string> - <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes uniquement"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes seulement"</string> <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Aucune\ninterruption"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Priorités\nuniquement"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Alarmes\nuniquement"</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"En savoir plus"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Ouvrir les paramètres RPV"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Ouvrir les authentifiants de confiance"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil.\n\nPour en savoir plus, communiquez avec lui."</string> @@ -589,8 +587,10 @@ <item quantity="other">%d minutes</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Utilisation de la pile"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Le mode Économie d\'énergie n\'est pas accessible pendant la charge"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Économie d\'énergie"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Réduit les performances et les données en arrière-plan"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Accueil"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu d\'incrustation d\'image"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode d\'incrustation d\'image"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string> <string name="pip_play" msgid="1417176722760265888">"Lire"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Application <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Pile"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Saisies d\'écran"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Messages généraux"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Stockage"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index cb8f6bcc5379..d580de17a96e 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Enregistrement capture écran…"</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"En savoir plus"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Vous êtes connecté à <xliff:g id="VPN_APP">%1$s</xliff:g>, qui peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Ouvrir les paramètres VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Ouvrir les certificats de confiance"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil.\n\nPour en savoir plus, contactez-le."</string> @@ -589,8 +587,10 @@ <item quantity="other">%d minutes</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Utilisation batterie"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"L\'économiseur de batterie n\'est pas disponible lorsque l\'appareil est en charge."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Économiseur de batterie"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Limite les performances et les données en arrière-plan."</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Accueil"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string> <string name="pip_play" msgid="1417176722760265888">"Lecture"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Application <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batterie"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Captures d\'écran"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Nouveaux messages"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Espace de stockage"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 01167e043c06..8549de7706c3 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -589,8 +589,10 @@ <item quantity="one">%d minuto</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Uso de batería"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"A función de aforro da batería non está dispoñible durante a carga"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Aforro de batería"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce o rendemento e os datos en segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Inicio"</string> @@ -730,7 +732,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Pechar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra cara abaixo para ignorar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menú de pantalla superposta"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca a configuración para abrir as opcións e desactivar a función."</string> <string name="pip_play" msgid="1417176722760265888">"Reproducir"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 70b108cfb1d4..a8346b6486fd 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -587,8 +587,10 @@ <item quantity="other">%d મિનિટ</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"બૅટરી વપરાશ"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ચાર્જિંગ દરમિયાન બૅટરી સેવર ઉપલબ્ધ નથી"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"બૅટરી સેવર"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"પ્રદર્શન અને બૅકગ્રાઉન્ડ ડેટા ઘટાડે છે"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"બટન <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"નાનું કરો"</string> <string name="pip_phone_close" msgid="8416647892889710330">"બંધ કરો"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"છોડી દેવા માટે નીચે ખેંચો"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ચિત્રમાં ચિત્ર મેનૂ"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ચિત્રમાં-ચિત્રની અંદર છે"</string> <string name="pip_notification_message" msgid="5619512781514343311">"જો તમે નથી ઈચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તે સુવિધાને બંધ કરો."</string> <string name="pip_play" msgid="1417176722760265888">"ચલાવો"</string> diff --git a/packages/SystemUI/res/values-hi-land/strings.xml b/packages/SystemUI/res/values-hi-land/strings.xml index de6a6c994fb2..ed0070d4ba19 100644 --- a/packages/SystemUI/res/values-hi-land/strings.xml +++ b/packages/SystemUI/res/values-hi-land/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="toast_rotation_locked" msgid="7609673011431556092">"स्क्रीन को अभी भूदृश्य अभिविन्यास में लॉक किया गया है."</string> + <string name="toast_rotation_locked" msgid="7609673011431556092">"स्क्रीन अभी लैंडस्केप दिशा में लॉक है."</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index c6be6e0c31ec..01f182d5dceb 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"कंप्यूटर का RSA कुंजी फ़िंगरप्रिंट है:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"इस कंप्यूटर से हमेशा अनुमति दें"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबगिंग की अनुमति नहीं है"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"इस डिवाइस में वर्तमान में प्रवेश किया हुआ उपयोगकर्ता USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का उपयोग करने के लिए, प्राथमिक उपयोगकर्ता पर स्विच करें."</string> <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरने के लिए ज़ूम करें"</string> <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन भरने के लिए खींचें"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रीनशॉट सहेजा जा रहा है..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"अधिक जानें"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"आप <xliff:g id="VPN_APP">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी नेटवर्क गतिविधि को मॉनिटर कर सकता है."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN सेटिंग खोलें"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"विश्वसनीय क्रेडेंशियल खोलें"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"आपके व्यवस्थापक ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nअधिक जानकारी के लिए अपने व्यवस्थापक से संपर्क करें."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d मिनट</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"बैटरी उपयोग"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"चार्ज किए जाने के दौरान बैटरी सेवर उपलब्ध नहीं है"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"बैटरी सेवर"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"निष्पादन और पृष्ठभूमि डेटा को कम करता है"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"बटन <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"छोटा करें"</string> <string name="pip_phone_close" msgid="8416647892889710330">"बंद करें"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"खारिज करने के लिए नीचे खींचें और छोड़ें"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"चित्र में चित्र मेनू"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> पिक्चर में पिक्चर के अंदर है"</string> <string name="pip_notification_message" msgid="5619512781514343311">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने के लिए टैप करें और उसे बंद करें ."</string> <string name="pip_play" msgid="1417176722760265888">"चलाएं"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"मेनू"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> ऐप"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"सूचनाएं"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"बैटरी"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"स्क्रीनशॉट"</string> <string name="notification_channel_general" msgid="4525309436693914482">"सामान्य संदेश"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"जगह"</string> diff --git a/packages/SystemUI/res/values-hi/strings_tv.xml b/packages/SystemUI/res/values-hi/strings_tv.xml index 5e65e4668950..357f7a6d197d 100644 --- a/packages/SystemUI/res/values-hi/strings_tv.xml +++ b/packages/SystemUI/res/values-hi/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="134047986446577723">"स्क्रीन में स्क्रीन"</string> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"पिक्चर में पिक्चर"</string> <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(कोई शीर्षक कार्यक्रम नहीं)"</string> <string name="pip_close" msgid="3480680679023423574">"PIP बंद करें"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"पूर्ण स्क्रीन"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index be8268fdce56..8cecc46b4adb 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Otisak prsta RSA ključa računala je: \n <xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog računala"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj i ispuni zaslon"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spremanje snimke zaslona..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saznajte više"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Povezani ste s aplikacijom <xliff:g id="VPN_APP">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Otvorite postavke VPN-a"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Otvorite pouzdane vjerodajnice"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administrator je uključio mrežni zapisnik koji prati promet na vašem uređaju.\n\nViše informacija možete saznati od administratora."</string> @@ -593,8 +591,10 @@ <item quantity="other">%d minuta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Štednja baterije nije dostupna tijekom punjenja"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Štednja baterije"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Smanjuje količinu rada i pozadinske podatke"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Tipka <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Početak"</string> @@ -734,7 +734,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimiziraj"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zatvori"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povucite prema dolje da biste odbacili"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Izbornik slike u slici"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> jest na slici u slici"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string> <string name="pip_play" msgid="1417176722760265888">"Reproduciraj"</string> @@ -762,8 +763,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Izbornik"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Upozorenja"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterija"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Snimke zaslona"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Općenite poruke"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Pohrana"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 98022718d616..9ed6f63804ab 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"A számítógép RSA kulcs ujjlenyomata:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Mindig engedélyezze erről a számítógépről"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Az USB hibakeresése nem engedélyezett"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Nagyítás a kitöltéshez"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Képernyőkép mentése..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"További információ"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Ön kapcsolódik ehhez: <xliff:g id="VPN_APP">%1$s</xliff:g>, amely figyelheti hálózati tevékenységét, köztük a levelezést, az alkalmazás- és webhelyhasználatot."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN-beállítások megnyitása"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Megbízható hitelesítési adatok megnyitása"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"A rendszergazda bekapcsolta az eszköz forgalmát figyelő hálózati naplózást.\n\nHa további információra van szüksége, forduljon a rendszergazdához."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d perc</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akkumulátorhasználat"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Az Akkumulátorkímélő módot töltés közben nem lehet használni"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Akkumulátorkímélő mód"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Csökkenti a teljesítményt és a háttéradatok használatát"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> gomb"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Kezdőképernyő"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Kis méret"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Bezárás"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Elvetéshez húzza lefelé"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Kép a képben menü"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"A(z) <xliff:g id="NAME">%s</xliff:g> kép a képben funkciót használ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string> <string name="pip_play" msgid="1417176722760265888">"Lejátszás"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menü"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> alkalmazás"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Értesítések"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Akkumulátor"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Képernyőképek"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Általános üzenetek"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Tárhely"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 01a1e1b33a0c..5ceb4ae463aa 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -587,8 +587,10 @@ <item quantity="other">%d րոպե</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Մարտկոցի օգտագործում"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Մարտկոցի տնտեսումը լիցքավորման ժամանակ հասանելի չէ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Մարտկոցի տնտեսում"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> կոճակ"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Գլխավոր էջ"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Ծալել"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Փակել"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Քաշեք վար՝ փակելու համար"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"«Նկար նկարի մեջ» ռեժիմի ընտրացանկ"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>-ը «Նկար նկարի մեջ» ռեժիմում է"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string> <string name="pip_play" msgid="1417176722760265888">"Նվագարկել"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index eb392bd84be8..9948ab31501f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Sidik jari kunci RSA komputer adalah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Selalu izinkan dari komputer ini"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB tidak diizinkan"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Perbesar utk mengisi layar"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan screenshot..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Pelajari lebih lanjut"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Anda tersambung ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Buka setelan VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Buka kredensial terpercaya"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Admin telah mengaktifkan pencatatan log jaringan, yang memantau traffic di perangkat.\n\nUntuk informasi selengkapnya, hubungi admin."</string> @@ -587,8 +585,8 @@ <item quantity="one">%d menit</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Pemakaian baterai"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Penghemat Baterai tidak tersedia selama pengisian daya"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Penghemat Baterai"</string> + <string name="battery_detail_charging_summary" msgid="4055327085770378335">"Penghemat baterai tidak tersedia selama mengisi daya"</string> + <string name="battery_detail_switch_title" msgid="8763441006881907058">"Penghemat baterai"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Mengurangi performa dan data latar belakang"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Tombol <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +726,7 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalkan"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Tutup"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Seret ke bawah untuk menutup"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu picture in picture"</string> + <string name="pip_menu_title" msgid="4707292089961887657">"Menu"</string> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> adalah picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string> <string name="pip_play" msgid="1417176722760265888">"Putar"</string> @@ -756,8 +754,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplikasi <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Notifikasi"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterai"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshot"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Pesan Umum"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Penyimpanan"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index b38614d80deb..8c033359bc56 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -587,8 +587,10 @@ <item quantity="other">%d mínútur</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Rafhlöðunotkun"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Ekki er hægt að nota rafhlöðusparnað meðan á hleðslu stendur"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Rafhlöðusparnaður"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Dregur úr afköstum og bakgrunnsgögnum"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Hnappur <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minnka"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Loka"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Draga niður til að hunsa"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Valmynd fyrir mynd í mynd"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> er með mynd í mynd"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string> <string name="pip_play" msgid="1417176722760265888">"Spila"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 7d4617ced6bf..c410f88ccdcd 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Fingerprint della chiave RSA del computer: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Consenti sempre da questo computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB non consentito"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per riempire schermo"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Salvataggio screenshot..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Ulteriori informazioni"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Sei connesso a <xliff:g id="VPN_APP">%1$s</xliff:g>, che consente di monitorare le attività di rete, inclusi siti web, email e app."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Apri impostazioni VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Apri credenziali attendibili"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico sul dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d minuto</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Utilizzo batteria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Risparmio energetico non disponibile durante la ricarica"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Risparmio energetico"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Riduce le prestazioni e i dati in background"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Pulsante <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home page"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Riduci a icona"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Chiudi"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Trascina verso il basso per ignorare"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture in picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> è in Picture in picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string> <string name="pip_play" msgid="1417176722760265888">"Riproduci"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"App <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Avvisi"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batteria"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshot"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Messaggi generali"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Spazio di archiviazione"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 246e4d1826ea..cf6b2d76d8a4 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -66,8 +66,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"טביעת האצבע של מפתח ה-RSA של המחשב היא:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"אפשר תמיד ממחשב זה"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"לא ניתן לבצע ניפוי באגים ב-USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string> <string name="compat_mode_on" msgid="6623839244840638213">"הגדל תצוגה כדי למלא את המסך"</string> <string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי למלא את המסך"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"שומר צילום מסך..."</string> @@ -461,8 +460,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"למידע נוסף"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"אתה מחובר לאפליקציה <xliff:g id="VPN_APP">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"להגדרות ה-VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"פתח את פרטי הכניסה המהימנים"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, צור קשר עם מנהל המערכת."</string> @@ -599,8 +597,10 @@ <item quantity="one">דקה</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"שימוש בסוללה"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"תכונת החיסכון בסוללה אינה זמינה בעת טעינת המכשיר"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"חיסכון בסוללה"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"מפחית את רמת הביצועים ואת נתוני הרקע"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"לחצן <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"דף הבית"</string> @@ -740,7 +740,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"מזער"</string> <string name="pip_phone_close" msgid="8416647892889710330">"סגור"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"גרור למטה כדי לסגור"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"תפריט \'תמונה בתוך תמונה\'"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> במצב תמונה בתוך תמונה"</string> <string name="pip_notification_message" msgid="5619512781514343311">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."</string> <string name="pip_play" msgid="1417176722760265888">"הפעל"</string> @@ -768,8 +769,7 @@ <string name="tuner_menu" msgid="191640047241552081">"תפריט"</string> <string name="tuner_app" msgid="3507057938640108777">"האפליקציה <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"התראות"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"סוללה"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"צילומי מסך"</string> <string name="notification_channel_general" msgid="4525309436693914482">"הודעות כלליות"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"אחסון"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 38e872ca4331..1884d4f5cd13 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"このパソコンのRSAキーのフィンガープリント:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"このパソコンからのUSBデバッグを常に許可する"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBデバッグは許可されていません"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"この端末に現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string> <string name="compat_mode_on" msgid="6623839244840638213">"画面サイズに合わせて拡大"</string> <string name="compat_mode_off" msgid="4434467572461327898">"画面サイズに合わせて拡大"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"スクリーンショットを保存中..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"詳細"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"「<xliff:g id="VPN_APP">%1$s</xliff:g>」に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN 設定を開く"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"信頼できる認証情報を開く"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"管理者がネットワーク ログを有効にしているため、この端末のトラフィックは監視されています。\n\n詳しくは管理者にお問い合わせください。"</string> @@ -589,8 +587,10 @@ <item quantity="one">%d分</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"電池の使用状況"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"充電中はバッテリー セーバーは利用できません"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"バッテリー セーバー"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"パフォーマンスとバックグラウンド データを制限します"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> ボタン"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string> <string name="pip_phone_close" msgid="8416647892889710330">"閉じる"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"下にドラッグして閉じる"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ピクチャー イン ピクチャー メニュー"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>はピクチャー イン ピクチャーで表示中です"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string> <string name="pip_play" msgid="1417176722760265888">"再生"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"メニュー"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> アプリ"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"電池"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"スクリーンショット"</string> <string name="notification_channel_general" msgid="4525309436693914482">"一般メッセージ"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"ストレージ"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 02b15352d793..885fe58d222b 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d წუთი</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ბატარეის მოხმარება"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ბატარეის დამზოგი დატენვისას მიწვდომელია"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ბატარეის დამზოგი"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ამცირებს წარმადობას და ფონურ მონაცემებს"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ღილაკი „<xliff:g id="NAME">%1$s</xliff:g>“"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ჩაკეცვა"</string> <string name="pip_phone_close" msgid="8416647892889710330">"დახურვა"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"დასახურად ჩავლებით ჩამოიტანეთ ქვემოთ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"მენიუ „ეკრანი ეკრანში“"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> იყენებს რეჟიმს „ეკრანი ეკრანში“"</string> <string name="pip_notification_message" msgid="5619512781514343311">"თუ არ გსურთ, რომ <xliff:g id="NAME">%s</xliff:g> ამ ფუნქციას იყენებდეს, აქ შეხებით შეგიძლიათ გახსნათ პარამეტრები და გამორთოთ ის."</string> <string name="pip_play" msgid="1417176722760265888">"დაკვრა"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index caa4eb9e9440..e7bced87a4a4 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Бұл компьютердің RSA перне саусақ таңбасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Осы компьютерден әрқашан рұқсат беру"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB жөндеу рұқсат етілмеген"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Экранды толтыру үшін ұлғайту"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтыру үшін созу"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Скриншотты сақтауда…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Толығырақ"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Желідегі әрекеттерді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылайтын <xliff:g id="VPN_APP">%1$s</xliff:g> қолданбасына қосылдыңыз."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN параметрлерін ашу"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Сенімді тіркелу деректерін ашу"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Әкімші құрылғыдағы трафикті қадағалау үшін желі журналын жүргізуді қосып қойған.\n\nТолығырақ ақпарат алу үшін әкімшімен хабарласыңыз."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d минут</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Батареяны пайдалану"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Зарядтау кезінде Батарея үнемдегіш қол жетімді емес"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Батарея үнемдегіш"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Өнімділікті және фондық деректерді азайтады"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> түймесі"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Кішірейту"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Жабу"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Жабу үшін төмен қарай сүйреңіз"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"\"Сурет ішіндегі сурет\" мәзірі"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> \"сурет ішіндегі сурет\" режимінде"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл мүмкіндікті пайдалануын қаламасаңыз, параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string> <string name="pip_play" msgid="1417176722760265888">"Ойнату"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Mәзір"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> қолданбасы"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Дабылдар"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батарея"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Скриншоттар"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Жалпы хабарлар"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Жад"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 5c74dbfc928a..60c7d17ba3d0 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាមម្រាមដៃ RSA របស់កុំព្យូទ័រគឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាតជានិច្ចសម្រាប់កុំព្យូទ័រនេះ"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"មិនអនុញ្ញាតការកែកំហុសតាមរយៈយូអេសប៊ីទេ"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"អ្នកប្រើដែលបច្ចុប្បន្នបានចូលគណនីនៅលើឧបករណ៍នេះមិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string> <string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីកដើម្បីឲ្យពេញអេក្រង់"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ទាញដើម្បីឲ្យពេញអេក្រង់"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុងរក្សាទុករូបថតអេក្រង់…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"ស្វែងយល់បន្ថែម"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"អ្នកបានភ្ជាប់ទៅ <xliff:g id="VPN_APP">%1$s</xliff:g> ដែលអាចតាមដានសកម្មភាពក្នុងបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"បើកការកំណត់ VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"បើកព័ត៌មានសម្គាល់ខ្លួនដែលទុកចិត្ត"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"អ្នកគ្រប់គ្រងរបស់អ្នកបានបើកការធ្វើកំណត់ហេតុបណ្តាញ ដែលនឹងតាមដានចរាចរណ៍នៅលើឧបករណ៍របស់អ្នក។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> @@ -587,8 +585,10 @@ <item quantity="one">%d នាទី</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ការប្រើប្រាស់ថ្ម"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"កម្មវិធីសន្សំថ្មមិនអាចប្រើបានអំឡុងពេលសាកថ្មទេ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"កម្មវិធីសន្សំថ្ម"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"កាត់បន្ថយប្រតិបត្តិការ និងទិន្នន័យផ្ទៃខាងក្រោយ"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ប៊ូតុង <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"បង្រួម"</string> <string name="pip_phone_close" msgid="8416647892889710330">"បិទ"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"អូសចុះក្រោមដើម្បីបដិសេធ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ម៉ឺនុយរូបក្នុងរូប"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ស្ថិតក្នុងមុខងាររូបក្នុងរូប"</string> <string name="pip_notification_message" msgid="5619512781514343311">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះ សូមចុចបើកការកំណត់ រួចបិទវា។"</string> <string name="pip_play" msgid="1417176722760265888">"លេង"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"ម៉ឺនុយ"</string> <string name="tuner_app" msgid="3507057938640108777">"កម្មវិធី <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"ការជូនដំណឹង"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"ថ្ម"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"រូបថតអេក្រង់"</string> <string name="notification_channel_general" msgid="4525309436693914482">"សារទូទៅ"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"ទំហំផ្ទុក"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 8422ac879a84..b5189bee3b05 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -499,7 +499,7 @@ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ಬ್ಲೂಟೂತ್"</string> <string name="stream_dtmf" msgid="2447177903892477915">"ಡ್ಯುಯಲ್ ಬಹು ಟೋನ್ ಆವರ್ತನೆ"</string> <string name="stream_accessibility" msgid="301136219144385106">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string> - <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ಅನ್ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <string name="volume_stream_content_description_unmute" msgid="4436631538779230857">"%1$s. ಅನ್ಮ್ಯೂಟ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_stream_content_description_vibrate" msgid="1187944970457807498">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> @@ -587,8 +587,10 @@ <item quantity="other">%d ನಿಮಿಷಗಳು</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ಬ್ಯಾಟರಿ ಬಳಕೆ"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ಚಾರ್ಜಿಂಗ್ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಟರಿ ಸೇವರ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ಬ್ಯಾಟರಿ ಸೇವರ್"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> ಬಟನ್"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ಕುಗ್ಗಿಸಿ"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ಮುಚ್ಚಿ"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ವಜಾಗೊಳಿಸಲು ಕೆಳಕ್ಕೆ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ ಮೆನು"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ಚಿತ್ರದಲ್ಲಿನ ಚಿತ್ರದಲ್ಲಿದೆ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಲು ಮತ್ತು ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="pip_play" msgid="1417176722760265888">"ಪ್ಲೇ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 1815eca842a1..ff7ef21447df 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"컴퓨터 RSA 키 지문:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"이 컴퓨터에서 항상 허용"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB 디버깅이 허용되지 않음"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string> <string name="compat_mode_on" msgid="6623839244840638213">"전체화면 모드로 확대"</string> <string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"캡쳐화면 저장 중..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"자세히 알아보기"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"<xliff:g id="VPN_APP">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"공개 VPN 설정"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"신뢰할 수 있는 사용자 인증 정보 열기"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"관리자가 기기에서 발생하는 트래픽을 모니터링하는 네트워크 로깅을 사용 설정했습니다.\n\n자세한 정보는 관리자에게 문의하세요."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d분</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"배터리 사용량"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"충전하는 동안 배터리 세이버는 사용할 수 없습니다."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"배터리 세이버"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"성능 및 백그라운드 데이터를 줄입니다."</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> 버튼"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"최소화"</string> <string name="pip_phone_close" msgid="8416647892889710330">"닫기"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"아래로 드래그하여 닫기"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"PIP 메뉴"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>에서 PIP 사용 중"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string> <string name="pip_play" msgid="1417176722760265888">"재생"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"메뉴"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> 앱"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"알림"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"배터리"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"스크린샷"</string> <string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"저장공간"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 40d8585afb63..864e42f2d001 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Компүтердин RSA ачкычынын контролдук суммасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Бул компүтерден дайыма уруксат берилсин"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Учурда бул түзмөккө каттоо эсеби менен кирген колдонуучу USB мүчүлүштүктөрүн оңдоо функциясын күйгүзө албай жатат. Бул функцияны колдонуу үчүн негизги колдонуучунун каттоо эсебине которулуңуз."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Экрнд тлтр ү. чен өлч өзг"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтуруу ү-н чоюу"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Скриншот сакталууда…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Кеңири маалымат"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган <xliff:g id="VPN_APP">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN жөндөөлөрүн ачуу"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Ишенимдүү эсептик дайындар баракчасын ачыңыз"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Администраторуңуз тармактын таржымалын алууну иштетти, андыктан түзмөгүңүздөгү трафик көзөмөлгө алынды.\n\nКеңири маалымат алуу үчүн администраторуңузга кайрылыңыз."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d мүнөт</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Батарея колдонулушу"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Батареяны үнөмдөгүч түзмөк кубатталып жатканда иштебейт"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Батареяны үнөмдөгүч"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Иштин майнаптуулугун начарлатып, фондук дайындарды чектейт"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> баскычы"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Башкы бет"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Кичирейтүү"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Жабуу"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Четке кагуу үчүн төмөн сүйрөңүз"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Сүрөт ичиндеги сүрөт менюсу"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> – сүрөт ичиндеги сүрөт"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string> <string name="pip_play" msgid="1417176722760265888">"Ойнотуу"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Меню"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> колдонмосу"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Эскертүүлөр"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батарея"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Скриншоттор"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Жалпы билдирүүлөр"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Сактагыч"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index a22d6e613960..d130187ebfb5 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d ນາທີ</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ການໃຊ້ແບັດເຕີຣີ"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ຕົວປະຢັດແບັດເຕີຣີບໍ່ມີໃຫ້ນຳໃຊ້ໃນລະຫວ່າງການສາກ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ຕົວປະຢັດແບັດເຕີຣີ"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ຫຼຸດປະສິທິພາບການໃຊ້ງານ ແລະ ຂໍ້ມູນພື້ນຫຼັງ"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ປຸ່ມ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ຫຍໍ້"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ປິດ"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ລາກລົງເພື່ອປິດໄວ້"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ເມນູຊ້ອນຮູບພາບ"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ແມ່ນເປັນການສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string> <string name="pip_play" msgid="1417176722760265888">"ຫຼິ້ນ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 014c9bf34352..d88ec75aef2d 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -66,8 +66,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Šio kompiuterio RSA rakto kontrolinis kodas yra:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Visada leisti iš šio kompiuterio"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB derinimas neleidžiamas"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Keisti mast., kad atit. ekr."</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Išsaugoma ekrano kopija..."</string> @@ -461,8 +460,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Sužinoti daugiau"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Esate prisijungę prie programos „<xliff:g id="VPN_APP">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Atidaryti VPN nustatymus"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Atidaryti patikimų prisijungimo duomenų puslapį"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų įrenginyje.\n\nJei reikia daugiau informacijos, susisiekite su administratoriumi."</string> @@ -599,8 +597,10 @@ <item quantity="other">%d minučių</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akum. energ. vartoj."</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Akumuliatoriaus tausojimo priemonė nepasiekiama įkraunant"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Akumuliatoriaus tausojimo priemonė"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Sumažinamas našumas ir foninių duomenų naudojimas"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Mygtukas <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Pagrindinis"</string> @@ -740,7 +740,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Sumažinti"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Uždaryti"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Nuvilkite žemyn, kad atsisakytumėte"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Vaizdo vaizde meniu"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> rodom. vaizdo vaizde"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Jei nenorite, kad „<xliff:g id="NAME">%s</xliff:g>“ naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string> <string name="pip_play" msgid="1417176722760265888">"Leisti"</string> @@ -768,8 +769,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meniu"</string> <string name="tuner_app" msgid="3507057938640108777">"Programa „<xliff:g id="APP">%1$s</xliff:g>“"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Įspėjimai"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Akumuliatorius"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekrano kopijos"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Bendrieji pranešimai"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Saugykla"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 33a63cfef529..8e4fd8e805f2 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Datora RSA atslēgas ciparfails: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Vienmēr atļaut no šī datora"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB atkļūdošana nav atļauta"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Tālumm., lai aizp. ekr."</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Saglabā ekrānuzņēmumu…"</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Uzzināt vairāk"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Ir izveidots savienojums ar lietotni <xliff:g id="VPN_APP">%1$s</xliff:g>, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Atvērt VPN iestatījumus"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Atvērt uzticamo akreditācijas datu sadaļu"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administrators ir ieslēdzis tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu ierīcē.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> @@ -593,8 +591,10 @@ <item quantity="other">%d minūtes</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Akumulatora lietojums"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Akumulatora jaudas taupīšanas režīms uzlādes laikā nav pieejams."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Akumulatora jaudas taupīšanas režīms"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Samazina veiktspēju un fona datus."</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Poga <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Sākumvietas taustiņš"</string> @@ -734,7 +734,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizēt"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Aizvērt"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Velciet lejup, lai noraidītu"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Izvēlne attēlam attēlā"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ir attēlā attēlā"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un izslēgtu funkciju."</string> <string name="pip_play" msgid="1417176722760265888">"Atskaņot"</string> @@ -762,8 +763,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Izvēlne"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> lietotne"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Brīdinājumi"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Akumulators"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ekrānuzņēmumi"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Vispārīgi ziņojumi"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Krātuve"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index b7c53bafec5b..e87b80290d99 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Клучниот отпечаток на RSA на компјутерот е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Секогаш дозволувај од овој компјутер"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстранувањето грешки на USB не е дозволено"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај да се исполни екранот"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Растегни да се исполни екранот"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Сликата на екранот се зачувува..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Дознајте повеќе"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Поврзани сте на <xliff:g id="VPN_APP">%1$s</xliff:g>, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Отворете „Поставки за VPN“"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Отворете ги доверливите акредитиви"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Вашиот администратор вклучил евиденција на мрежата, што подразбира следење на сообраќајот на вашиот уред.\n\nЗа повеќе информации, контактирајте со администраторот."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d минути</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Користење батерија"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Штедачот на батерија не е достапен при полнење"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Штедач на батерија"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Ја намалува изведбата и податоците во заднина"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Копче <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home-копче"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Минимизирај"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Затвори"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Повлечете надолу за да отфрлите"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Мени слика во слика"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> е во слика во слика"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и да ја исклучите."</string> <string name="pip_play" msgid="1417176722760265888">"Пушти"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Мени"</string> <string name="tuner_app" msgid="3507057938640108777">"Апликација <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Предупредувања"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батерија"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Слики од екранот"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Општи пораки"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Капацитет"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 9128c7cc5536..ceef96d9ade5 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d മിനിറ്റ്</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ബാറ്ററി ഉപയോഗം"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ചാർജുചെയ്യുന്ന സമയത്ത് ബാറ്ററി ലാഭിക്കൽ നടക്കില്ല"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ബാറ്ററി ലാഭിക്കൽ"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്ക്കുന്നു"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ബട്ടൺ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"ഹോം"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ചെറുതാക്കുക"</string> <string name="pip_phone_close" msgid="8416647892889710330">"അടയ്ക്കുക"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"തള്ളിക്കളയാൻ താഴേക്ക് വലിച്ചിടുക"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മെനു"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ചിത്രത്തിനുള്ളിലെ ചിത്രത്തിലാണ്"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string> <string name="pip_play" msgid="1417176722760265888">"പ്ലേ ചെയ്യുക"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 3c88c4dcb952..0ad2ece5cd12 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -62,8 +62,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны хээ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Энэ компьютерээс орохыг байнга зөвшөөрөх"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB алдаа засалт хийх боломжгүй"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Дэлгэц дүүргэх бол өсгөнө үү"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Дэлгэц дүүргэх бол татна уу"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Дэлгэцийн агшинг хадгалж байна…"</string> @@ -455,8 +454,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Дэлгэрэнгүй үзэх"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN тохиргоог нээх"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Итгэмжлэгдсэн мандат үнэмлэхийг нээх"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d минут</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Тэжээл ашиглалт"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Цэнэглэх үед тэжээл хэмнэгч ажиллахгүй"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Тэжээл хэмнэгч"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Гүйцэтгэл болон дэвсгэрийн датаг багасгадаг"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> товчлуур"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Нүүр хуудас"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Багасгах"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Хаах"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Хаахын тулд доош чирэх"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Дэлгэцэн доторх дэлгэцийн цэс"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> дэлгэцэн доторх дэлгэцэд байна"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглуулахыг хүсэхгүй байвал тохиргоог нээгээд, үүнийг унтраана уу."</string> <string name="pip_play" msgid="1417176722760265888">"Тоглуулах"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Цэс"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> апп"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Сануулга"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батерей"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Дэлгэцийн зураг дарах"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Энгийн зурвас"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Хадгалах сан"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index b3a9152bf8f6..2c5eb5280241 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -587,8 +587,10 @@ <item quantity="other"> %d मिनिटे</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"बॅटरी वापर"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"चार्ज करताना बॅटरी बचतकर्ता उपलब्ध नाही"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"बॅटरी बचतकर्ता"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"कामगिरी आणि पार्श्वभूमीवरील डेटा कमी करते"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"बटण <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"लहान करा"</string> <string name="pip_phone_close" msgid="8416647892889710330">"बंद करा"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"डिसमिस करण्यासाठी खाली ड्रॅग करा"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"चित्र मेनूमधील चित्र"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> चित्रामध्ये चित्र मध्ये आहे"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g>ने हे वैशिष्ट्य वापरू नये असे तुम्हाला वाटत असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string> <string name="pip_play" msgid="1417176722760265888">"प्ले करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 594b25d68295..7318e9e2c56b 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Cap jari kekunci RSA komputer ialah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Sentiasa benarkan komputer ini"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Penyahpepijatan USB tidak dibenarkan"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zum untuk memenuhi skrin"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Menyimpan tangkapan skrin..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Ketahui lebih lanjut"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Anda disambungkan ke <xliff:g id="VPN_APP">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Buka tetapan VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Buka bukti kelayakan yang dipercayai"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik pada peranti anda.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minit</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Penggunaan bateri"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Penjimat Bateri tidak tersedia semasa mengecas"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Penjimat Bateri"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Mengurangkan prestasi dan data latar belakang"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Butang <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Skrin Utama"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimumkan"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Tutup"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Seret ke bawah untuk mengetepikan"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu gambar dalam gambar"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> terdapat dalam gambar dalam gambar"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikan ciri."</string> <string name="pip_play" msgid="1417176722760265888">"Main"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Apl <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Makluman"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Bateri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Tangkapan skrin"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mesej Am"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storan"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 0897832d451d..a4eae8631d35 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string> <string name="compat_mode_on" msgid="6623839244840638213">"ဇူးမ်အပြည့်ဆွဲခြင်း"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ဖန်သားပြင်ဓါတ်ပုံသိမ်းစဉ်.."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"ပိုမိုလေ့လာရန်"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="VPN_APP">%1$s</xliff:g> သို့ သင်သည် ချိတ်ဆက်ထားပါသည်။"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN ဆက်တင်များကို ဖွင့်ရန်"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"ယုံကြည်စိတ်ချရသော အထောက်အထားများကို ဖွင့်ရန်"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"သင့်စီမံခန့်ခွဲသူသည် စက်ပစ္စည်းပေါ်ရှိ ဒေတာအသွားအလာကို စောင့်ကြည့်နိုင်သည့် ကွန်ရက်အတွက် မှတ်တမ်းတင်ခြင်းကို ဖွင့်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string> @@ -587,8 +585,10 @@ <item quantity="one">%d မိနစ်</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ဘက်ထရီ အသုံးပြုမှု"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"အားသွင်းနေချိန်မှာ Battery Saver ကို သုံးမရပါ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Battery Saver"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"လုပ်ဆောင်မှု နှင့် နောက်ခံ ဒေတာကို လျော့နည်းစေပါသည်"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ခလုတ် <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"ပင်မ"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ချုံ့ရန်"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ပိတ်ရန်"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ပယ်ရန်အတွက် အောက်သို့ ပွတ်ဆွဲပါ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"တစ်ခုပေါ်တစ်ခု ထပ်၍ ဖွင့်ခြင်းမီနူး"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> သည် တစ်ခုပေါ် တစ်ခုထပ်၍ ဖွင့်ထားသည်"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> အား ဤဝန်ဆောင်မှုကို အသုံးမပြုစေလိုလျှင် ဆက်တင်ကိုဖွင့်ရန် တို့ပြီး ၎င်းဝန်ဆောင်မှုကို ပိတ်လိုက်ပါ။"</string> <string name="pip_play" msgid="1417176722760265888">"ဖွင့်ရန်"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"မီနူး"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> အက်ပ်"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"သတိပေးချက်များ"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"ဘက်ထရီ"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"မျက်နှာပြင်ဓာတ်ပုံများ"</string> <string name="notification_channel_general" msgid="4525309436693914482">"အထွေထွေ မက်ဆေ့ဂျ်များ"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"သိုလှောင်မှုများ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index bb9b77cde2d4..63bf4e0b5013 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Datamaskinens nøkkelfingeravtrykk for RSA er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillat alltid fra denne datamaskinen"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-feilsøking er ikke tillatt"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom for å fylle skjermen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Lagrer skjermdumpen …"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Finn ut mer"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Enheten er koblet til <xliff:g id="VPN_APP">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Åpne VPN-innstillingene"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Åpne pålitelig legitimasjon"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratoren din har slått på loggføring av nettverk, som overvåker trafikken på enheten din.\n\nKontakt administratoren for mer informasjon."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minutt</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batteribruk"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterisparing er ikke tilgjengelig under lading"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterisparing"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduserer ytelsen og begrenser bakgrunnsdataene"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g>-knappen"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Startskjerm"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimer"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Lukk"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Dra ned for å avvise"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Bilde-i-bilde-meny"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> er i bilde-i-bilde"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string> <string name="pip_play" msgid="1417176722760265888">"Spill av"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meny"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g>-appen"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Varsler"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batteri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Skjermdumper"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Generelle meldinger"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 9abd8569c408..dda06f3bbc9c 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d मिनेट</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ब्याट्री उपयोग"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"चार्ज गर्ने समयमा ब्याट्री सेभर उपलब्ध छैन"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ब्याट्री सेभर"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"कार्यसम्पादन र पृष्ठभूमि डेटा घटाउँछ"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> बटन"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"सानो बनाउनुहोस्"</string> <string name="pip_phone_close" msgid="8416647892889710330">"बन्द गर्नुहोस्"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"खारेज गर्न तल तान्नुहोस्"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"तस्बिर मेनुमा तस्बिर"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> Picture-in-picture मा छ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले सुविधा प्रयोग नगरोस् भन्ने चाहनुहुन्छ भने ट्याप गरेर सेटिङहरू खोल्नुहोस् र यसलाई निष्क्रिय पार्नुहोस्।"</string> <string name="pip_play" msgid="1417176722760265888">"प्ले गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 81b74e1dbe8c..9bbe57023ca7 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"De vingerafdruk voor de RSA-sleutel van de computer is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Altijd toestaan vanaf deze computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-foutopsporing niet toegestaan"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom om scherm te vullen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Screenshot opslaan..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Meer informatie"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Je bent verbonden met <xliff:g id="VPN_APP">%1$s</xliff:g>, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN-instellingen openen"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Vertrouwde gegevens openen"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Je beheerder heeft netwerkregistratie ingeschakeld, waarmee verkeer op je apparaat wordt bijgehouden.\n\nNeem contact op met je beheerder voor meer informatie."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minuut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Accugebruik"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterijbesparing niet beschikbaar tijdens opladen"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterijbesparing"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Vermindert de prestaties en achtergrondgegevens"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Knop <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimaliseren"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Sluiten"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Sleep omlaag om te sluiten"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Scherm-in-scherm-menu"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> is in scherm-in-scherm"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string> <string name="pip_play" msgid="1417176722760265888">"Afspelen"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Apps <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Meldingen"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batterij"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Screenshots"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Algemene berichten"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Opslag"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 5c3a8e18e541..eeccd35e7367 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -587,8 +587,10 @@ <item quantity="other"> %d ਮਿੰਟ</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"ਬੈਟਰੀ ਵਰਤੋਂ"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਰਜਿੰਗ ਦੌਰਾਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"ਬੈਟਰੀ ਸੇਵਰ"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ਕਾਰਗੁਜ਼ਾਰੀ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਡੈਟੇ ਨੂੰ ਘਟਾਉਂਦਾ ਹੈ"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ਬਟਨ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ਛੋਟਾ ਕਰੋ"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ਬੰਦ ਕਰੋ"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ਖਾਰਜ ਕਰਨ ਲਈ ਹੇਠਾਂ ਘਸੀਟੋ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ ਮੀਨੂ"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ \'ਚ ਹੈ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string> <string name="pip_play" msgid="1417176722760265888">"ਚਲਾਓ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 3905ec857125..ef0c7d4a53c4 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -599,8 +599,10 @@ <item quantity="one">]%d minuta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Wykorzystanie baterii"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Oszczędzanie baterii nie jest dostępne podczas ładowania"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Oszczędzanie baterii"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Zmniejsza wydajność i ogranicza dane w tle"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Przycisk <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -740,7 +742,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizuj"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zamknij"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Przeciągnij w dół, by zamknąć"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu funkcji Obraz w obrazie"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"Aplikacja <xliff:g id="NAME">%s</xliff:g> działa w trybie obraz w obrazie"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string> <string name="pip_play" msgid="1417176722760265888">"Odtwórz"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 9a281ea463a2..88f470d7f01a 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -589,8 +589,10 @@ <item quantity="other">%d minutos</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"A Economia de bateria não fica disponível durante o carregamento"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Economia de bateria"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduz o desempenho e os dados em segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +732,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arraste para baixo para dispensar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Se você não deseja que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string> <string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 83f5630b4941..dcd7285f768a 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA do computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre a partir deste computador"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para preencher o ecrã"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"A guardar captura de ecrã..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saiba mais"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Abrir as definições de VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Abrir credenciais fidedignas"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"O seu administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara obter mais informações, contacte o administrador."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d minutos</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Utiliz. da bateria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Poupança de bateria não disponível durante o carregamento"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Poupança de bateria"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduz o desempenho e os dados de segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Início"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastar para baixo para ignorar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu de ecrã no ecrã"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"A aplicação <xliff:g id="NAME">%s</xliff:g> está no modo de ecrã no ecrã"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> <string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplicação <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Bateria"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturas de ecrã"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mensagens gerais"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Armazenamento"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 9a281ea463a2..88f470d7f01a 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -589,8 +589,10 @@ <item quantity="other">%d minutos</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"A Economia de bateria não fica disponível durante o carregamento"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Economia de bateria"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduz o desempenho e os dados em segundo plano"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +732,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fechar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arraste para baixo para dispensar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está em picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Se você não deseja que o app <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string> <string name="pip_play" msgid="1417176722760265888">"Reproduzir"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index ec1cc4b79b28..382a7a1bec80 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Înt. pt. a umple ecranul"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Se salv. captura de ecran..."</string> @@ -461,8 +460,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Aflați mai multe"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"V-ați conectat la aplicația <xliff:g id="VPN_APP">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Deschideți Setări VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Deschideți datele de conectare de încredere"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs.\n\nPentru mai multe informații, contactați administratorul."</string> @@ -595,8 +593,10 @@ <item quantity="one">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Utilizarea bateriei"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Economisirea bateriei nu este disponibilă pe durata încărcării"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Economisirea bateriei"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Reduce performanța și datele de fundal"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Butonul <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"La început"</string> @@ -736,7 +736,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizați"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Închideți"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Trageți în jos pentru a închide"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Meniul picture-in-picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> este în modul picture-in-picture"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string> <string name="pip_play" msgid="1417176722760265888">"Redați"</string> @@ -764,8 +765,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meniu"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplicația <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alerte"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterie"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Capturi de ecran"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mesaje generale"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Stocare"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 9bb93d6eb9ff..4153e66da835 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -601,8 +601,10 @@ <item quantity="other">%d минуты</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Уровень заряда"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Режим энергосбережения нельзя включить во время зарядки"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Режим энергосбережения"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Ограничивает производительность и фоновую передачу данных"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Главный экран"</string> @@ -742,7 +744,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Свернуть"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Закрыть"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Чтобы закрыть, потяните вниз"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Картинка в картинке\""</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> находится в режиме \"Картинка в картинке\""</string> <string name="pip_notification_message" msgid="5619512781514343311">"Чтобы отключить эту функцию для приложения \"<xliff:g id="NAME">%s</xliff:g>\", перейдите в настройки."</string> <string name="pip_play" msgid="1417176722760265888">"Воспроизвести"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 108a8e08dcbe..5454ca2799bb 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -587,8 +587,10 @@ <item quantity="other">මිනිත්තු %d</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"බැටරි භාවිතය"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ආරෝපණය අතරතුර බැටරි සුරැකුම ලබා ගත නොහැකිය."</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"බැටරි සුරැකුම"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ක්රියාකාරිත්වය සහ පසුබිම් දත්ත අඩු කරන්න"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> බොත්තම"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home යතුර"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"කුඩා කරන්න"</string> <string name="pip_phone_close" msgid="8416647892889710330">"වසන්න"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ඉවත ලෑමට පහළට ඇදගෙන යන්න"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"පින්තූරය තුළ පින්තූරය මෙනුව"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> පින්තූරය-තුළ-පින්තූරය තුළ වේ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string> <string name="pip_play" msgid="1417176722760265888">"ධාවනය කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 724f3ef40ccb..d5c87c5399c8 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -601,8 +601,10 @@ <item quantity="one">%d minúta</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Využitie batérie"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Počas nabíjania nie je Šetrič batérie k dispozícii"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Šetrič batérie"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Obmedzí výkonnosť a údaje na pozadí"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Tlačidlo <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Domov"</string> @@ -742,7 +744,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimalizovať"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zavrieť"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zrušíte presunutím nadol"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Ponuka režimu obraz v obraze"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je v režime obraz v obraze"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string> <string name="pip_play" msgid="1417176722760265888">"Prehrať"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 17c2997aa4a6..f8b403df6631 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -601,8 +601,10 @@ <item quantity="other">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Poraba akumulatorja"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Varčevanje z energijo akumulatorja med polnjenjem ni na voljo"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Varčevanje z energijo akumulatorja"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Omeji zmogljivost delovanja in prenos podatkov v ozadju"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Gumb <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Začetek"</string> @@ -742,7 +744,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimiraj"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Zapri"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Povlecite navzdol, da opustite"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Meni za sliko v sliki"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> je v načinu slika v sliki"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string> <string name="pip_play" msgid="1417176722760265888">"Predvajaj"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 3f0bb964e0ed..799f24a1e078 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Shenja e gishtit të tastit \"RSA\" së kompjuterit është:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Lejo gjithmonë nga ky kompjuter"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Korrigjimi i USB-së nuk lejohet"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zmadho për të mbushur ekranin"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Shtrije për të mbushur ekranin"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Po ruan pamjen e ekranit..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Mëso më shumë"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Je i lidhur me aplikacionin <xliff:g id="VPN_APP">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Hap cilësimet e VPN-së"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Hap kredencialet e besuara"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratori yt ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në pajisjen tënde.\n\nPër më shumë informacione, kontakto me administratorin."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minutë</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Përdorimi i baterisë"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"\"Kursyesi i baterisë\" nuk është i disponueshëm gjatë karikimit"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Kursyesi i baterisë"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Pakëson veprimtarinë dhe të dhënat në sfond"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Butoni <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Kreu"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizo"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Mbyll"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Zvarrit poshtë për të larguar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menyja e \"Figurës brenda figurës\""</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> është në figurë brenda figurës"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string> <string name="pip_play" msgid="1417176722760265888">"Luaj"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menyja"</string> <string name="tuner_app" msgid="3507057938640108777">"Aplikacioni <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Sinjalizimet"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Bateria"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Pamjet e ekranit"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mesazhe të përgjithshme"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Hapësira ruajtëse"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 16caf06b0e77..9a7245d57da0 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -65,8 +65,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Дигитални отисак RSA кључа овог рачунара је:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Увек дозволи са овог рачунара"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отклањање грешака на USB-у није дозвољено"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај на целом екрану"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Чување снимка екрана..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Сазнајте више"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Повезани сте са апликацијом <xliff:g id="VPN_APP">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Отвори подешавања VPN-а"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Отворите поуздане акредитиве"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Администратор је укључио евидентирање мреже, које прати саобраћај на уређају.\n\nКонтактирајте администратора за више информација."</string> @@ -593,8 +591,10 @@ <item quantity="other">%d минута</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Потрошња батерије"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Уштеда батерије није доступна током пуњења"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Уштеда батерије"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Смањује перформансе и позадинске податке"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Дугме <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Тастер Почетна"</string> @@ -734,7 +734,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Умањи"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Затвори"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Превуците надоле да бисте одбили"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Мени Слика у слици"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> је слика у слици"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ако не желите да <xliff:g id="NAME">%s</xliff:g> користи ову функцију, додирните да бисте отворили подешавања и искључили је."</string> <string name="pip_play" msgid="1417176722760265888">"Пусти"</string> @@ -762,8 +763,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Мени"</string> <string name="tuner_app" msgid="3507057938640108777">"Апликација <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Обавештења"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Батерија"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Снимци екрана"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Опште поруке"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Меморијски простор"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index eaf713b90487..2daef09ddb7e 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeravtrycket för datorns RSA-nyckel är:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillåt alltid på den här datorn"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-felsökning är inte tillåtet"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zooma för att fylla skärm"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Skärmdumpen sparas ..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Läs mer"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Du är ansluten till <xliff:g id="VPN_APP">%1$s</xliff:g> som kan övervaka din aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Öppna VPN-inställningarna"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Öppna betrodda användaruppgifter"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Administratören har aktiverat nätverksloggning som övervakar trafik på enheten.\n\nKontakta administratören om du vill veta mer."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batteriförbrukning"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterisparläget är inte tillgängligt vid laddning"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Batterisparläge"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Minskar prestanda och bakgrundsdata"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Knappen <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Start"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimera"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Stäng"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Tryck och dra nedåt för att ignorera"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Bild-i-bild-meny"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> visas i bild-i-bild"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Om du inte vill att den här funktionen används i <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string> <string name="pip_play" msgid="1417176722760265888">"Spela upp"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Meny"</string> <string name="tuner_app" msgid="3507057938640108777">"Appen <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Varningar"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Batteri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Skärmdumpar"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Allmänna meddelanden"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a500f4d461f1..569b57a75331 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Alama ya kidole ya kitufe cha RSA ya kompyuta ni:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Utatuzi wa USB hauruhusiwi"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Inahifadhi picha ya skrini..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Pata maelezo zaidi"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Umeunganishwa kwenye <xliff:g id="VPN_APP">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Fungua mipangilio ya VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Fungua vitambulisho vinavyoaminika"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni ambayo hufuatilia shughuli kwenye kifaa chako.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako."</string> @@ -587,8 +585,10 @@ <item quantity="one">Dakika %d</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Matumizi ya betri"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Kiokoa Betri hakipatikani unapochaji betri"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Kiokoa Betri"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Hupunguza data ya chini chini na utendaji"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Kitufe cha <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Mwanzo"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Punguza"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Funga"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Buruta ili uondoe"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menyu ya picha ndani ya picha"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> iko katika hali ya picha ndani ya picha nyingine"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> itumie kipengele hiki, gonga ili ufungue mipangilio na uizime."</string> <string name="pip_play" msgid="1417176722760265888">"Cheza"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menyu"</string> <string name="tuner_app" msgid="3507057938640108777">"Programu ya <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Arifa"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Betri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Picha za skrini"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Ujumbe wa Jumla"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Hifadhi"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 72c6bb031fbd..e1e9ae2038cf 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"பின்வருவது கணினியின் RSA விசை கைரேகையாகும்:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"இந்தக் கணினியிலிருந்து எப்போதும் அனுமதி"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB பிழைத்திருத்தம் அனுமதிக்கப்படவில்லை"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைத்திருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்."</string> <string name="compat_mode_on" msgid="6623839244840638213">"திரையை நிரப்ப அளவை மாற்று"</string> <string name="compat_mode_off" msgid="4434467572461327898">"திரையை நிரப்ப இழு"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"மேலும் அறிக"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"<xliff:g id="VPN_APP">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"VPN அமைப்புகளைத் திற"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"நம்பகமான அனுமதிச் சான்றுகளைத் திற"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"உங்கள் நிர்வாகி நெட்வொர்க் பதிவெடுத்தலை இயக்கியுள்ளார், இது சாதனத்தில் ட்ராஃபிக்கைக் கண்காணிக்கும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> @@ -587,8 +585,10 @@ <item quantity="one">%d நிமிடம்</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"பேட்டரி உபயோகம்"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"சார்ஜ் செய்யும் போது பேட்டரி சேமிப்பானைப் பயன்படுத்த முடியாது"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"பேட்டரி சேமிப்பான்"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"செயல்திறனையும் பின்புலத்தில் தரவு செயலாக்கப்படுவதையும் குறைக்கும்"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> பொத்தான்"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"ஹோம்"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"சிறிதாக்கு"</string> <string name="pip_phone_close" msgid="8416647892889710330">"மூடு"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"நிராகரிக்க, கீழே இழுக்கவும்"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"பிக்ச்சர்-இன்-பிக்ச்சர் மெனு"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> தற்போது பிக்ச்சர்-இன்-பிக்ச்சரில் உள்ளது"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string> <string name="pip_play" msgid="1417176722760265888">"இயக்கு"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"மெனு"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> பயன்பாடு"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"விழிப்பூட்டல்கள்"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"பேட்டரி"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"ஸ்கிரீன் ஷாட்டுகள்"</string> <string name="notification_channel_general" msgid="4525309436693914482">"பொதுச் செய்திகள்"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"சேமிப்பிடம்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 7250e277fffd..da48df5e8d57 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d నిమిషం</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"బ్యాటరీ వినియోగం"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ఛార్జ్ అవుతున్న సమయంలో బ్యాటరీ సేవర్ అందుబాటులో ఉండదు"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"బ్యాటరీ సేవర్"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"బటన్ <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"కనిష్టీకరించు"</string> <string name="pip_phone_close" msgid="8416647892889710330">"మూసివేయి"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"తీసివేయడానికి కిందికి లాగండి"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"చిత్రంలో చిత్రం మెను"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> చిత్రంలో చిత్రం రూపంలో ఉంది"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string> <string name="pip_play" msgid="1417176722760265888">"ప్లే చేయి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 9e1783ad63d1..d8ba45a7473b 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string> <string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"กำลังบันทึกภาพหน้าจอ..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"เรียนรู้เพิ่มเติม"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"คุณเชื่อมต่อกับ <xliff:g id="VPN_APP">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"เปิดการตั้งค่า VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"เปิดข้อมูลรับรองที่เชื่อถือได้"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"ผู้ดูแลระบบได้เปิดการทำบันทึกเครือข่าย ซึ่งจะติดตามดูการรับส่งข้อมูลบนอุปกรณ์ของคุณ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม"</string> @@ -587,8 +585,10 @@ <item quantity="one">%d นาที</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"การใช้งานแบตเตอรี่"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"ไม่สามารถใช้โหมดประหยัดแบตเตอรี่ระหว่างการชาร์จ"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"โหมดประหยัดแบตเตอรี่"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"ลดประสิทธิภาพการทำงานและข้อมูลแบ็กกราวด์"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"ปุ่ม <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"ย่อเล็กสุด"</string> <string name="pip_phone_close" msgid="8416647892889710330">"ปิด"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ลากลงเพื่อปิด"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"เมนูการแสดงภาพซ้อนภาพ"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงภาพซ้อนภาพ"</string> <string name="pip_notification_message" msgid="5619512781514343311">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string> <string name="pip_play" msgid="1417176722760265888">"เล่น"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"เมนู"</string> <string name="tuner_app" msgid="3507057938640108777">"แอป <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"การแจ้งเตือน"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"แบตเตอรี"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"ภาพหน้าจอ"</string> <string name="notification_channel_general" msgid="4525309436693914482">"ข้อความทั่วไป"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"พื้นที่เก็บข้อมูล"</string> diff --git a/packages/SystemUI/res/values-th/strings_tv.xml b/packages/SystemUI/res/values-th/strings_tv.xml index 3a5eba10b046..5c492913d1b5 100644 --- a/packages/SystemUI/res/values-th/strings_tv.xml +++ b/packages/SystemUI/res/values-th/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="134047986446577723">"การแสดงผลหลายแหล่งพร้อมกัน"</string> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"การแสดงภาพซ้อนภาพ"</string> <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(ไม่มีชื่อรายการ)"</string> <string name="pip_close" msgid="3480680679023423574">"ปิด PIP"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"เต็มหน้าจอ"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index ee1105c34f41..a46d572eaa25 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Ang RSA key fingerprint ng computer ay:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Palaging payagan mula sa computer na ito"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string> <string name="compat_mode_on" msgid="6623839244840638213">"I-zoom upang punan screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Sine-save ang screenshot…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Matuto pa"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Kumonekta ka sa <xliff:g id="VPN_APP">%1$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kasama ang mga email, app at website."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Buksan ang mga setting ng VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Buksan ang mga pinagkakatiwalaang kredensyal"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko ng device mo.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d na minuto</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Paggamit ng baterya"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Hindi available ang Pangtipid sa Baterya kapag nagcha-charge"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Pangtipid sa Baterya"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Binabawasan ang performance at data sa background"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Button na <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"I-minimize"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Isara"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"I-drag pababa upang i-dismiss"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu ng picture in picture"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"Nasa picture-in-picture ang <xliff:g id="NAME">%s</xliff:g>"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Kung ayaw mong magamit ni <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string> <string name="pip_play" msgid="1417176722760265888">"I-play"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> app"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Mga Alerto"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Baterya"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Mga Screenshot"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Mga Pangkalahatang Mensahe"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Storage"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 376aca5d4b2c..2e898250cc98 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d dakika</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Pil kullanımı"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Şarj sırasında Pil Tasarrufu özelliği kullanılamaz"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Pil Tasarrufu"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Performansı ve arka plan verilerini azaltır"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> düğmesi"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Simge durumuna getir"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Kapat"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Kapatmak için aşağıya sürükleyin"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Pencere içinde pencere menüsü"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>, pencere içinde pencere özelliğini kullanıyor"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve söz konusu özelliği kapatın."</string> <string name="pip_play" msgid="1417176722760265888">"Oynat"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 826d3ca6df6f..1c8abb4eeefa 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -66,8 +66,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Цифровий відбиток ключа RSA комп’ютера:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Завжди дозволяти з цього комп’ютера"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ви не можете вмикати налагодження USB"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Масштабув. на весь екран"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Розтягнути на весь екран"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Збереження знімка екрана..."</string> @@ -463,8 +462,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Докладніше"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Під’єднано додаток <xliff:g id="VPN_APP">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, як-от доступ до електронної пошти, додатків і веб-сайтів."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Відкрити налаштування мережі VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Відкрити надійні облікові дані"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Ваш адміністратор увімкнув реєстрацію в мережі, під час якої на вашому пристрої відстежується трафік.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором."</string> @@ -601,8 +599,10 @@ <item quantity="other">%d хвилини</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Використання заряду"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Режим енергозбереження не можна ввімкнути під час заряджання"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Режим енергозбереження"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Знижується продуктивність і обмежується обмін даними у фоновому режимі"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -742,7 +742,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Згорнути"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Закрити"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Перетягніть униз, щоб закрити"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Меню \"Картинка в картинці\""</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"У додатку <xliff:g id="NAME">%s</xliff:g> є функція \"Картинка в картинці\""</string> <string name="pip_notification_message" msgid="5619512781514343311">"Щоб додаток <xliff:g id="NAME">%s</xliff:g> не використовував цю функцію, вимкніть її в налаштуваннях."</string> <string name="pip_play" msgid="1417176722760265888">"Відтворити"</string> @@ -770,8 +771,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Меню"</string> <string name="tuner_app" msgid="3507057938640108777">"Додаток <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Сповіщення"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Акумулятор"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Знімки екрана"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Загальні повідомлення"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Пам’ять"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index c2305504b8b9..b13d00d829e0 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d منٹ</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"بیٹری کا استعمال"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"چارجنگ کے دوران بیٹری سیور دستیاب نہیں ہے"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"بیٹری سیور"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"بٹن <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"چھوٹی کریں"</string> <string name="pip_phone_close" msgid="8416647892889710330">"بند کریں"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"برخاست کرنے کیلئے نیچے گھسیٹیں"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"تصویر کے مینو میں تصویر"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> تصویر میں تصویر میں ہے"</string> <string name="pip_notification_message" msgid="5619512781514343311">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کے لیے تھپتھپا کر اسے آف کرے۔"</string> <string name="pip_play" msgid="1417176722760265888">"چلائیں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index e9ff6d1505ff..b7242a649290 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -589,8 +589,10 @@ <item quantity="one">%d daqiqa</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Batareya sarfi"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Quvvat tejash rejimidan quvvatlash vaqtida foydalanib bo‘lmaydi"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Quvvat tejash rejimi"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Unumdorlik pasayadi va fonda internetdan foydalanish cheklanadi"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> tugmasi"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Bosh ekran"</string> @@ -730,7 +732,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Yig‘ish"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Yopish"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Yopish uchun pastga torting"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Tasvir ustida tasvir menyusi"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> tasvir ustida tasvir rejimida"</string> <string name="pip_notification_message" msgid="5619512781514343311">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali faolsizlantirish mumkin."</string> <string name="pip_play" msgid="1417176722760265888">"Ijro"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index bc0505885086..14f2bb00ddc9 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Tệp tham chiếu khóa RSA của máy tính là:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Luôn cho phép từ máy tính này"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Tính năng gỡ lỗi USB không được phép"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string> <string name="compat_mode_on" msgid="6623839244840638213">"T.phóng để lấp đầy m.hình"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Đang lưu ảnh chụp màn hình..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Tìm hiểu thêm"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Bạn đang kết nối với <xliff:g id="VPN_APP">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Mở cài đặt VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Mở thông tin xác thực tin cậy"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Quản trị viên đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trên thiết bị của bạn.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> @@ -589,8 +587,10 @@ <item quantity="one">%d phút</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Mức sử dụng pin"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Trình tiết kiệm pin không khả dụng trong khi sạc"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Trình tiết kiệm pin"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Giảm hiệu suất và dữ liệu nền"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Nút <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Thu nhỏ"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Đóng"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Kéo xuống để loại bỏ"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu ảnh trong ảnh"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> đang ở chế độ ảnh trong ảnh"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string> <string name="pip_play" msgid="1417176722760265888">"Phát"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Menu"</string> <string name="tuner_app" msgid="3507057938640108777">"Ứng dụng <xliff:g id="APP">%1$s</xliff:g>"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Cảnh báo"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Pin"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Ảnh chụp màn hình"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Thông báo chung"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Bộ nhớ"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index e2bf586dad77..6c82e67bfe6c 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -587,8 +587,10 @@ <item quantity="one">%d 分钟</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"电池使用情况"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"充电过程中无法使用省电模式"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"省电模式"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"降低性能并限制后台流量"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g>按钮"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -728,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string> <string name="pip_phone_close" msgid="8416647892889710330">"关闭"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖动即可关闭"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"画中画菜单"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g>目前位于“画中画”中"</string> <string name="pip_notification_message" msgid="5619512781514343311">"如果您不想让“<xliff:g id="NAME">%s</xliff:g>”使用此功能,请点按以打开设置,然后关闭此功能。"</string> <string name="pip_play" msgid="1417176722760265888">"播放"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 4483c49eaac7..f05b94f4f275 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"這部電腦的 RSA 密鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這部電腦進行"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允許 USB 偵錯"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string> <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷取畫面..."</string> @@ -459,8 +458,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"瞭解詳情"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"您已連接至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"開啟 VPN 設定"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"開啟信任的憑證"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"您的管理員已開啟網絡記錄功能,以監控您裝置上的流量。\n\n如需瞭解詳情,請聯絡您的管理員。"</string> @@ -589,8 +587,10 @@ <item quantity="one">%d 分鐘</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"充電時無法使用「省電模式」"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"省電模式"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"降低效能並限制背景數據傳輸"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> 鍵"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home"</string> @@ -730,7 +730,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string> <string name="pip_phone_close" msgid="8416647892889710330">"關閉"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖曳即可關閉"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"畫中畫選單"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在畫中畫模式"</string> <string name="pip_notification_message" msgid="5619512781514343311">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string> <string name="pip_play" msgid="1417176722760265888">"播放"</string> @@ -758,8 +759,7 @@ <string name="tuner_menu" msgid="191640047241552081">"選單"</string> <string name="tuner_app" msgid="3507057938640108777">"「<xliff:g id="APP">%1$s</xliff:g>」應用程式"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"電池"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string> <string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 16a4369a5f00..8c1104537f9a 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"這台電腦的 RSA 金鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這台電腦進行"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"無權使用 USB 偵錯功能"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string> <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"正在儲存螢幕擷取畫面…"</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"瞭解詳情"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"由於你已連結至「<xliff:g id="VPN_APP">%1$s</xliff:g>」,你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"開啟 VPN 設定"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"開啟信任的憑證"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"你的管理員已啟用網路紀錄功能,可監控你裝置的流量。\n\n如需詳細資訊,請與你的管理員聯絡。"</string> @@ -587,8 +585,10 @@ <item quantity="one">%d 分鐘</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"充電時無法使用節約耗電量模式"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"節約耗電量"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"降低效能並限制背景資料傳輸"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"<xliff:g id="NAME">%1$s</xliff:g> 按鈕"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Home 鍵"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"最小化"</string> <string name="pip_phone_close" msgid="8416647892889710330">"關閉"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"向下拖曳即可關閉"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"子母畫面選單"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"「<xliff:g id="NAME">%s</xliff:g>」目前在子母畫面中"</string> <string name="pip_notification_message" msgid="5619512781514343311">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string> <string name="pip_play" msgid="1417176722760265888">"播放"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"選單"</string> <string name="tuner_app" msgid="3507057938640108777">"「<xliff:g id="APP">%1$s</xliff:g>」應用程式"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"快訊"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"電池"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"螢幕擷取畫面"</string> <string name="notification_channel_general" msgid="4525309436693914482">"一般訊息"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"儲存空間"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 7cd1bd56bf91..23fb48d76ca0 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -64,8 +64,7 @@ <string name="usb_debugging_message" msgid="2220143855912376496">"Izigxivizo zeminwe zokhiye we-RSA wekhompyutha ngu:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Hlala uvumela njalo kusuka kule khompyutha"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ukususa iphutha kwe-USB akuvunyelwe"</string> - <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> - <skip /> + <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Ilondoloz umfanekiso weskrini..."</string> @@ -457,8 +456,7 @@ <string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Funda kabanzi"</string> <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Uxhumeke ku-<xliff:g id="VPN_APP">%1$s</xliff:g>, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> - <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> - <skip /> + <string name="monitoring_description_vpn_settings" msgid="6434859242636063861">"Vula izilungiselelo ze-VPN"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Vula ukuqinisekisa okuthenjiwe"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Umlawuli wakho uvule ukungena kwenethiwekhi, okuhlola ithrafikhi kudivayisi yakho.\n\nNgolwazi olubanzi xhumana nomlawuli wakho."</string> @@ -587,8 +585,10 @@ <item quantity="other">%d amaminithi</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Ukusetshenziswa kwebhethri"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Isilondolozi sebhethri asitholakali ngesikhathi sokushaja"</string> - <string name="battery_detail_switch_title" msgid="6285872470260795421">"Isilondolozi sebhethri"</string> + <!-- no translation found for battery_detail_charging_summary (4055327085770378335) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (8763441006881907058) --> + <skip /> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Sehlisa ukusebenza nedatha yasemuva"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Inkinobho <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="2243500072071305073">"Ekhaya"</string> @@ -728,7 +728,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Nciphisa"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Vala"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Hudulela phansi ukuze ucashise"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Isithombe ngemenyu yesithombe ngesithombe"</string> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> <string name="pip_notification_title" msgid="3204024940158161322">"U-<xliff:g id="NAME">%s</xliff:g> ungaphakathi kwesithombe esiphakathi kwesithombe"</string> <string name="pip_notification_message" msgid="5619512781514343311">"Uma ungafuni i-<xliff:g id="NAME">%s</xliff:g> ukuthi isebenzise lesi sici, thepha ukuze uvule izilungiselelo uphinde uyivale."</string> <string name="pip_play" msgid="1417176722760265888">"Dlala"</string> @@ -756,8 +757,7 @@ <string name="tuner_menu" msgid="191640047241552081">"Imenyu"</string> <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> uhlelo lokusebenza"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Izexwayiso"</string> - <!-- no translation found for notification_channel_battery (5786118169182888462) --> - <skip /> + <string name="notification_channel_battery" msgid="5786118169182888462">"Ibhethri"</string> <string name="notification_channel_screenshot" msgid="6314080179230000938">"Izithombe-skrini"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Imilayezo ejwayelekile"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Isitoreji"</string> diff --git a/packages/SystemUI/res/values/dimens_car.xml b/packages/SystemUI/res/values/dimens_car.xml index 89078f5272bf..5f56c4ea6f2d 100644 --- a/packages/SystemUI/res/values/dimens_car.xml +++ b/packages/SystemUI/res/values/dimens_car.xml @@ -18,11 +18,12 @@ <resources> <dimen name="car_margin">148dp</dimen> - <dimen name="car_fullscreen_user_pod_margin_side">44dp</dimen> <dimen name="car_fullscreen_user_pod_margin_above_text">24dp</dimen> + <dimen name="car_fullscreen_user_pod_margin_between">24dp</dimen> <dimen name="car_fullscreen_user_pod_icon_text_size">96dp</dimen> <dimen name="car_fullscreen_user_pod_image_avatar_width">192dp</dimen> <dimen name="car_fullscreen_user_pod_image_avatar_height">192dp</dimen> + <dimen name="car_fullscreen_user_pod_width">264dp</dimen> <dimen name="car_fullscreen_user_pod_text_size">40sp</dimen> <!-- B1 --> <dimen name="car_navigation_button_width">64dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 9b2bffdda040..340b2e167e7b 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2051,4 +2051,10 @@ <!-- Prompt to turn off data usage [CHAR LIMIT=NONE] --> <string name="data_usage_disable_mobile" msgid="8656552431969276305">Turn off mobile data?</string> + <!-- Warning shown when user input has been blocked due to another app overlaying screen + content. Since we don't know what the app is showing on top of the input target, we + can't verify user consent. [CHAR LIMIT=NONE] --> + <string name="touch_filtered_warning">Because an app is obscuring a permission request, Settings + can’t verify your response.</string> + </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java b/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java index ce3068d765a8..cb5afec79073 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardEsimArea.java @@ -72,6 +72,7 @@ class KeyguardEsimArea extends Button implements View.OnClickListener { public KeyguardEsimArea(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + mEuiccManager = (EuiccManager) context.getSystemService(Context.EUICC_SERVICE); setOnClickListener(this); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 669594b86e54..bb6213b8921f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1157,10 +1157,16 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + private boolean shouldListenForFingerprintAssistant() { + return mAssistantVisible && mKeyguardOccluded + && !mUserFingerprintAuthenticated.get(getCurrentUser(), false) + && !mUserHasTrust.get(getCurrentUser(), false); + } + private boolean shouldListenForFingerprint() { return (mKeyguardIsVisible || !mDeviceInteractive || (mBouncer && !mKeyguardGoingAway) || mGoingToSleep || - (mAssistantVisible && mKeyguardOccluded)) + shouldListenForFingerprintAssistant()) && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser()) && !mKeyguardGoingAway; } diff --git a/packages/SystemUI/src/com/android/systemui/ChargingView.java b/packages/SystemUI/src/com/android/systemui/ChargingView.java index 555cc740c373..33f8b069b751 100644 --- a/packages/SystemUI/src/com/android/systemui/ChargingView.java +++ b/packages/SystemUI/src/com/android/systemui/ChargingView.java @@ -19,9 +19,11 @@ package com.android.systemui; import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; +import android.os.UserHandle; import android.util.AttributeSet; import android.widget.ImageView; +import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -34,14 +36,28 @@ public class ChargingView extends ImageView implements BatteryController.BatteryStateChangeCallback, ConfigurationController.ConfigurationListener { + private static final long CHARGING_INDICATION_DELAY_MS = 1000; + + private final AmbientDisplayConfiguration mConfig; + private final Runnable mClearSuppressCharging = this::clearSuppressCharging; private BatteryController mBatteryController; private int mImageResource; private boolean mCharging; private boolean mDark; + private boolean mSuppressCharging; + + + private void clearSuppressCharging() { + mSuppressCharging = false; + removeCallbacks(mClearSuppressCharging); + updateVisibility(); + } public ChargingView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + mConfig = new AmbientDisplayConfiguration(context); + TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.src}); int srcResId = a.getResourceId(0, 0); @@ -67,14 +83,30 @@ public class ChargingView extends ImageView implements super.onDetachedFromWindow(); mBatteryController.removeCallback(this); Dependency.get(ConfigurationController.class).removeCallback(this); + removeCallbacks(mClearSuppressCharging); } @Override public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { + boolean startCharging = charging && !mCharging; + if (startCharging && deviceWillWakeUpWhenPluggedIn() && mDark) { + // We're about to wake up, and thus don't want to show the indicator just for it to be + // hidden again. + clearSuppressCharging(); + mSuppressCharging = true; + postDelayed(mClearSuppressCharging, CHARGING_INDICATION_DELAY_MS); + } mCharging = charging; updateVisibility(); } + private boolean deviceWillWakeUpWhenPluggedIn() { + boolean plugTurnsOnScreen = getResources().getBoolean( + com.android.internal.R.bool.config_unplugTurnsOnScreen); + boolean aod = mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT); + return !aod && plugTurnsOnScreen; + } + @Override public void onDensityOrFontScaleChanged() { setImageResource(mImageResource); @@ -82,10 +114,13 @@ public class ChargingView extends ImageView implements public void setDark(boolean dark) { mDark = dark; + if (!dark) { + clearSuppressCharging(); + } updateVisibility(); } private void updateVisibility() { - setVisibility(mCharging && mDark ? VISIBLE : INVISIBLE); + setVisibility(mCharging && !mSuppressCharging && mDark ? VISIBLE : INVISIBLE); } } diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index ecc211136667..49253ec536cd 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -34,7 +34,6 @@ import com.android.systemui.fragments.FragmentService; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.PluginManager; import com.android.systemui.plugins.PluginManagerImpl; @@ -295,8 +294,6 @@ public class Dependency extends SystemUI { mProviders.put(UiOffloadThread.class, UiOffloadThread::new); - mProviders.put(PluginActivityManager.class, - () -> new PluginActivityManager(mContext, getDependency(PluginManager.class))); mProviders.put(PowerUI.WarningsUI.class, () -> new PowerNotificationWarnings(mContext)); diff --git a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java index 9fe730affbd9..81e4db3b2561 100644 --- a/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java +++ b/packages/SystemUI/src/com/android/systemui/DockedStackExistsListener.java @@ -33,6 +33,7 @@ public class DockedStackExistsListener { private static final String TAG = "DockedStackExistsListener"; private static ArrayList<WeakReference<Consumer<Boolean>>> sCallbacks = new ArrayList<>(); + private static boolean mLastExists; static { try { @@ -73,6 +74,7 @@ public class DockedStackExistsListener { private static void onDockedStackExistsChanged(boolean exists) { + mLastExists = exists; synchronized (sCallbacks) { sCallbacks.removeIf(wf -> { Consumer<Boolean> l = wf.get(); @@ -83,6 +85,7 @@ public class DockedStackExistsListener { } public static void register(Consumer<Boolean> callback) { + callback.accept(mLastExists); synchronized (sCallbacks) { sCallbacks.add(new WeakReference<>(callback)); } diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index e3eaadd2c66c..4b377153e558 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -439,7 +439,12 @@ public class SwipeHelper implements Gefingerpoken { public void onAnimationEnd(Animator animation) { updateSwipeProgressFromOffset(animView, canBeDismissed); mDismissPendingMap.remove(animView); - if (!mCancelled) { + boolean wasRemoved = false; + if (animView instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) animView; + wasRemoved = row.isRemoved(); + } + if (!mCancelled || wasRemoved) { mCallback.onChildDismissed(animView); } if (endAction != null) { diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 49a076f07a25..9adafda7adf5 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -16,7 +16,6 @@ package com.android.systemui; -import android.app.Activity; import android.app.ActivityThread; import android.app.Application; import android.content.BroadcastReceiver; @@ -41,7 +40,6 @@ import com.android.systemui.pip.PipUI; import com.android.systemui.plugins.GlobalActions; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.Plugin; -import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.PluginManager; import com.android.systemui.power.PowerUI; @@ -281,10 +279,4 @@ public class SystemUIApplication extends Application implements SysUiServiceProv public SystemUI[] getServices() { return mServices; } - - @Override - public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) { - if (!mServicesStarted) return null; - return Dependency.get(PluginActivityManager.class).instantiate(cl, className, intent); - } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index 63f5d97542f6..02a725df303c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -36,10 +36,21 @@ public class DozeScreenState implements DozeMachine.Part { @Override public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { int screenState = newState.screenState(); + + if (newState == DozeMachine.State.FINISH) { + // Make sure not to apply the screen state after DozeService was destroyed. + mPendingScreenState = Display.STATE_UNKNOWN; + mHandler.removeCallbacks(mApplyPendingScreenState); + + applyScreenState(screenState); + return; + } + if (screenState == Display.STATE_UNKNOWN) { // We'll keep it in the existing state return; } + boolean messagePending = mHandler.hasCallbacks(mApplyPendingScreenState); if (messagePending || oldState == DozeMachine.State.INITIALIZED) { // During initialization, we hide the navigation bar. That is however only applied after diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index 9b4832097528..8ddd8882788b 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -31,7 +31,6 @@ import android.content.res.Resources; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; -import android.graphics.RectF; import android.os.Handler; import android.os.RemoteException; import android.util.Log; @@ -47,10 +46,8 @@ import android.view.accessibility.AccessibilityWindowInfo; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.policy.PipSnapAlgorithm; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.FlingAnimationUtils; -import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; @@ -90,6 +87,8 @@ public class PipTouchHandler { // The current movement bounds private Rect mMovementBounds = new Rect(); + // The reference inset bounds, used to determine the dismiss fraction + private Rect mInsetBounds = new Rect(); // The reference bounds used to calculate the normal/expanded target bounds private Rect mNormalBounds = new Rect(); private Rect mNormalMovementBounds = new Rect(); @@ -311,6 +310,7 @@ public class PipTouchHandler { mNormalMovementBounds = normalMovementBounds; mExpandedMovementBounds = expandedMovementBounds; mDisplayRotation = displayRotation; + mInsetBounds.set(insetBounds); updateMovementBounds(mMenuState); // If we have a deferred resize, apply it now @@ -385,7 +385,7 @@ public class PipTouchHandler { } case MotionEvent.ACTION_HOVER_ENTER: case MotionEvent.ACTION_HOVER_MOVE: { - if (!mSendingHoverAccessibilityEvents) { + if (mAccessibilityManager.isEnabled() && !mSendingHoverAccessibilityEvents) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); event.setImportantForAccessibility(true); @@ -398,7 +398,7 @@ public class PipTouchHandler { break; } case MotionEvent.ACTION_HOVER_EXIT: { - if (mSendingHoverAccessibilityEvents) { + if (mAccessibilityManager.isEnabled() && mSendingHoverAccessibilityEvents) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); event.setImportantForAccessibility(true); @@ -418,9 +418,12 @@ public class PipTouchHandler { * Updates the appearance of the menu and scrim on top of the PiP while dismissing. */ private void updateDismissFraction() { - if (mMenuController != null) { + // Skip updating the dismiss fraction when the IME is showing. This is to work around an + // issue where starting the menu activity for the dismiss overlay will steal the window + // focus, which closes the IME. + if (mMenuController != null && !mIsImeShowing) { Rect bounds = mMotionHelper.getBounds(); - final float target = mMovementBounds.bottom + bounds.height(); + final float target = mInsetBounds.bottom; float fraction = 0f; if (bounds.bottom > target) { final float distance = bounds.bottom - target; diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java deleted file mode 100644 index 9becc38d760e..000000000000 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 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.plugins; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.text.TextUtils; -import android.util.ArrayMap; - -public class PluginActivityManager { - - private final Context mContext; - private final PluginManager mPluginManager; - private final ArrayMap<String, String> mActionLookup = new ArrayMap<>(); - - public PluginActivityManager(Context context, PluginManager pluginManager) { - mContext = context; - mPluginManager = pluginManager; - } - - public void addActivityPlugin(String className, String action) { - mActionLookup.put(className, action); - } - - public Activity instantiate(ClassLoader cl, String className, Intent intent) { - String action = mActionLookup.get(className); - if (TextUtils.isEmpty(action)) return null; - return mPluginManager.getOneShotPlugin(action, PluginActivity.class); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java index a96839943cad..493d244f5e99 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java @@ -42,6 +42,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper; +import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.annotations.ProvidesInterface; import dalvik.system.PathClassLoader; @@ -119,21 +120,14 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage } PluginInstanceManager<T> p = mFactory.createPluginInstanceManager(mContext, action, null, false, mLooper, cls, this); - PluginListener<Plugin> listener = new PluginListener<Plugin>() { - @Override - public void onPluginConnected(Plugin plugin, Context pluginContext) { } - }; - mPluginMap.put(listener, p); mPluginPrefs.addAction(action); - PluginInstanceManager.PluginInfo<T> info = p.getPlugin(); + PluginInfo<T> info = p.getPlugin(); if (info != null) { mOneShotPackages.add(info.mPackage); mHasOneShot = true; startListening(); - mPluginMap.remove(listener); return info.mPlugin; } - mPluginMap.remove(listener); return null; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java index e574c01dd077..a48bcbd1f840 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java @@ -310,11 +310,47 @@ public class QSSecurityFooter implements OnClickListener, DialogInterface.OnClic vpnWarning.setMovementMethod(new LinkMovementMethod()); } + // Note: if a new section is added, should update configSubtitleVisibility to include + // the handling of the subtitle + configSubtitleVisibility(managementMessage != null, + caCertsMessage != null, + networkLoggingMessage != null, + vpnMessage != null, + dialogView); + mDialog.show(); mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } + protected void configSubtitleVisibility(boolean showDeviceManagement, boolean showCaCerts, + boolean showNetworkLogging, boolean showVpn, View dialogView) { + // Device Management title should always been shown + // When there is a Device Management message, all subtitles should be shown + if (showDeviceManagement) { + return; + } + // Hide the subtitle if there is only 1 message shown + int mSectionCountExcludingDeviceMgt = 0; + if (showCaCerts) { mSectionCountExcludingDeviceMgt++; } + if (showNetworkLogging) { mSectionCountExcludingDeviceMgt++; } + if (showVpn) { mSectionCountExcludingDeviceMgt++; } + + // No work needed if there is no sections or more than 1 section + if (mSectionCountExcludingDeviceMgt != 1) { + return; + } + if (showCaCerts) { + dialogView.findViewById(R.id.ca_certs_subtitle).setVisibility(View.GONE); + } + if (showNetworkLogging) { + dialogView.findViewById(R.id.network_logging_subtitle).setVisibility(View.GONE); + } + if (showVpn) { + dialogView.findViewById(R.id.vpn_subtitle).setVisibility(View.GONE); + } + } + private String getSettingsButton() { return mContext.getString(R.string.monitoring_button_view_policies); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java index 9730f29da977..d42b87bcef28 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java @@ -18,6 +18,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.support.annotation.Nullable; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; @@ -27,6 +28,7 @@ import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSFooter; import com.android.systemui.qs.QSPanel; +import com.android.systemui.statusbar.car.UserGridView; import com.android.systemui.statusbar.phone.MultiUserSwitch; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.UserInfoController; @@ -37,10 +39,13 @@ import com.android.systemui.statusbar.policy.UserInfoController; */ public class CarQSFooter extends RelativeLayout implements QSFooter, UserInfoController.OnUserInfoChangedListener { + private static final String TAG = "CarQSFooter"; + private UserInfoController mUserInfoController; private MultiUserSwitch mMultiUserSwitch; private ImageView mMultiUserAvatar; + private UserGridView mUserGridView; public CarQSFooter(Context context, AttributeSet attrs) { super(context, attrs); @@ -54,6 +59,19 @@ public class CarQSFooter extends RelativeLayout implements QSFooter, mUserInfoController = Dependency.get(UserInfoController.class); + mMultiUserSwitch.setOnClickListener(v -> { + if (mUserGridView == null) { + Log.e(TAG, "CarQSFooter not properly set up; cannot display user switcher."); + return; + } + + if (!mUserGridView.isShowing()) { + mUserGridView.show(); + } else { + mUserGridView.hide(); + } + }); + findViewById(R.id.settings_button).setOnClickListener(v -> { ActivityStarter activityStarter = Dependency.get(ActivityStarter.class); @@ -80,6 +98,10 @@ public class CarQSFooter extends RelativeLayout implements QSFooter, } } + public void setUserGridView(UserGridView view) { + mUserGridView = view; + } + @Override public void setListening(boolean listening) { if (listening) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java index 7c2a8129813a..13298d378845 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java @@ -22,9 +22,12 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.qs.QS; import com.android.systemui.qs.QSFooter; +import com.android.systemui.statusbar.car.UserGridView; +import com.android.systemui.statusbar.policy.UserSwitcherController; /** * A quick settings fragment for the car. For auto, there is no row for quick settings or ability @@ -33,7 +36,8 @@ import com.android.systemui.qs.QSFooter; */ public class CarQSFragment extends Fragment implements QS { private View mHeader; - private QSFooter mFooter; + private CarQSFooter mFooter; + private UserGridView mUserGridView; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @@ -46,6 +50,12 @@ public class CarQSFragment extends Fragment implements QS { super.onViewCreated(view, savedInstanceState); mHeader = view.findViewById(R.id.header); mFooter = view.findViewById(R.id.qs_footer); + + mUserGridView = view.findViewById(R.id.user_grid); + mUserGridView.init(null, Dependency.get(UserSwitcherController.class), + false /* showInitially */); + + mFooter.setUserGridView(mUserGridView); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index d10e080a5443..4a8b43ec62db 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -43,14 +43,11 @@ import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.systemui.Dependency; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SystemUI; -import com.android.systemui.plugins.PluginActivity; -import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.ConfigurationChangedEvent; import com.android.systemui.recents.events.activity.DockedTopTaskEvent; @@ -239,8 +236,6 @@ public class Recents extends SystemUI registerWithSystemUser(); } putComponent(Recents.class, this); - Dependency.get(PluginActivityManager.class).addActivityPlugin(RecentsImpl.RECENTS_ACTIVITY, - PluginActivity.ACTION_RECENTS); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 585b151cd693..f8448661d799 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -69,6 +69,7 @@ import com.android.systemui.recents.events.activity.ToggleRecentsEvent; import com.android.systemui.recents.events.component.ActivityUnpinnedEvent; import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; import com.android.systemui.recents.events.component.ScreenPinningRequestEvent; +import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent; import com.android.systemui.recents.events.ui.AllTaskViewsDismissedEvent; import com.android.systemui.recents.events.ui.DeleteTaskDataEvent; import com.android.systemui.recents.events.ui.HideIncompatibleAppOverlayEvent; @@ -366,7 +367,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD }); // Set the window background - getWindow().setBackgroundDrawable(mRecentsView.getBackgroundScrim()); + mRecentsView.updateBackgroundScrim(getWindow(), isInMultiWindowMode()); // Create the home intent runnable mHomeIntent = new Intent(Intent.ACTION_MAIN, null); @@ -517,6 +518,11 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD public void onEnterAnimationComplete() { super.onEnterAnimationComplete(); EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); + + // Workaround for b/64694148: The animation started callback is not made (see + // RecentsImpl.getThumbnailTransitionActivityOptions) so reset the transition-waiting state + // once the enter animation has completed. + EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); } @Override @@ -550,6 +556,9 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD public void onMultiWindowModeChanged(boolean isInMultiWindowMode) { super.onMultiWindowModeChanged(isInMultiWindowMode); + // Set the window background + mRecentsView.updateBackgroundScrim(getWindow(), isInMultiWindowMode); + reloadTaskStack(isInMultiWindowMode, true /* sendConfigChangedEvent */); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 86e93fdd63ad..79558a33fc4e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -35,6 +35,7 @@ import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.SystemClock; +import android.util.ArraySet; import android.util.Log; import android.util.MutableBoolean; import android.util.Pair; @@ -75,6 +76,7 @@ import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener; import com.android.systemui.recents.model.RecentsTaskLoadPlan; import com.android.systemui.recents.model.RecentsTaskLoader; import com.android.systemui.recents.model.Task; +import com.android.systemui.recents.model.Task.TaskKey; import com.android.systemui.recents.model.TaskGrouping; import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.model.ThumbnailData; @@ -109,6 +111,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // duration, then we will toggle recents after this duration. private final static int FAST_ALT_TAB_DELAY_MS = 225; + private final static ArraySet<TaskKey> EMPTY_SET = new ArraySet<>(); + public final static String RECENTS_PACKAGE = "com.android.systemui"; public final static String RECENTS_ACTIVITY = "com.android.systemui.recents.RecentsActivity"; @@ -128,39 +132,38 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // Preloads the next task RecentsConfiguration config = Recents.getConfiguration(); if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) { - // Load the next task only if we aren't svelte SystemServicesProxy ssp = Recents.getSystemServices(); ActivityManager.RunningTaskInfo runningTaskInfo = ssp.getRunningTask(); RecentsTaskLoader loader = Recents.getTaskLoader(); RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); loader.preloadTasks(plan, -1, false /* includeFrontMostExcludedTask */); + TaskStack stack = plan.getTaskStack(); + RecentsActivityLaunchState launchState = new RecentsActivityLaunchState(); + RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); - // This callback is made when a new activity is launched and the old one is paused - // so ignore the current activity and try and preload the thumbnail for the - // previous one. - VisibilityReport visibilityReport; - synchronized (mDummyStackView) { - mDummyStackView.getStack().removeAllTasks(false /* notifyStackChanges */); - mDummyStackView.setTasks(plan.getTaskStack(), false /* allowNotify */); - updateDummyStackViewLayout(plan.getTaskStack(), + synchronized (mBackgroundLayoutAlgorithm) { + // This callback is made when a new activity is launched and the old one is + // paused so ignore the current activity and try and preload the thumbnail for + // the previous one. + updateDummyStackViewLayout(mBackgroundLayoutAlgorithm, stack, getWindowRect(null /* windowRectOverride */)); // Launched from app is always the worst case (in terms of how many // thumbnails/tasks visible) - RecentsActivityLaunchState launchState = new RecentsActivityLaunchState(); launchState.launchedFromApp = true; - mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */, launchState); - visibilityReport = mDummyStackView.computeStackVisibilityReport(); + mBackgroundLayoutAlgorithm.update(plan.getTaskStack(), EMPTY_SET, launchState); + VisibilityReport visibilityReport = + mBackgroundLayoutAlgorithm.computeStackVisibilityReport( + stack.getStackTasks()); + + launchOpts.runningTaskId = runningTaskInfo != null ? runningTaskInfo.id : -1; + launchOpts.numVisibleTasks = visibilityReport.numVisibleTasks; + launchOpts.numVisibleTaskThumbnails = visibilityReport.numVisibleThumbnails; + launchOpts.onlyLoadForCache = true; + launchOpts.onlyLoadPausedActivities = true; + launchOpts.loadThumbnails = true; } - - RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); - launchOpts.runningTaskId = runningTaskInfo != null ? runningTaskInfo.id : -1; - launchOpts.numVisibleTasks = visibilityReport.numVisibleTasks; - launchOpts.numVisibleTaskThumbnails = visibilityReport.numVisibleThumbnails; - launchOpts.onlyLoadForCache = true; - launchOpts.onlyLoadPausedActivities = true; - launchOpts.loadThumbnails = true; loader.loadTasks(mContext, plan, launchOpts); } } @@ -229,17 +232,15 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener boolean mLaunchedWhileDocking; // Task launching - Rect mTaskStackBounds = new Rect(); + Rect mTmpBounds = new Rect(); TaskViewTransform mTmpTransform = new TaskViewTransform(); - int mStatusBarHeight; - int mNavBarHeight; - int mNavBarWidth; int mTaskBarHeight; // Header (for transition) TaskViewHeader mHeaderBar; final Object mHeaderBarLock = new Object(); - protected TaskStackView mDummyStackView; + private TaskStackView mDummyStackView; + private TaskStackLayoutAlgorithm mBackgroundLayoutAlgorithm; // Variables to keep track of if we need to start recents after binding protected boolean mTriggeredFromAltTab; @@ -258,6 +259,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public RecentsImpl(Context context) { mContext = context; mHandler = new Handler(); + mBackgroundLayoutAlgorithm = new TaskStackLayoutAlgorithm(context, null); // Initialize the static foreground thread ForegroundThread.get(); @@ -287,8 +289,9 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void onConfigurationChanged() { reloadResources(); - synchronized (mDummyStackView) { - mDummyStackView.reloadOnConfigurationChange(); + mDummyStackView.reloadOnConfigurationChange(); + synchronized (mBackgroundLayoutAlgorithm) { + mBackgroundLayoutAlgorithm.reloadOnConfigurationChange(mContext); } } @@ -663,7 +666,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener mWaitingForTransitionStart = waitingForTransitionStart; if (!waitingForTransitionStart && mToggleFollowingTransitionStart) { - toggleRecents(DividerView.INVALID_RECENTS_GROW_TARGET); + mHandler.post(() -> toggleRecents(DividerView.INVALID_RECENTS_GROW_TARGET)); } mToggleFollowingTransitionStart = false; } @@ -697,12 +700,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener private void reloadResources() { Resources res = mContext.getResources(); - mStatusBarHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.status_bar_height); - mNavBarHeight = res.getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_height); - mNavBarWidth = res.getDimensionPixelSize( - com.android.internal.R.dimen.navigation_bar_width); mTaskBarHeight = TaskStackLayoutAlgorithm.getDimensionForDevice(mContext, R.dimen.recents_task_view_header_height, R.dimen.recents_task_view_header_height, @@ -718,7 +715,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener mHeaderBar.setLayoutDirection(res.getConfiguration().getLayoutDirection()); } - private void updateDummyStackViewLayout(TaskStack stack, Rect windowRect) { + private void updateDummyStackViewLayout(TaskStackLayoutAlgorithm stackLayout, + TaskStack stack, Rect windowRect) { SystemServicesProxy ssp = Recents.getSystemServices(); Rect displayRect = ssp.getDisplayRect(); Rect systemInsets = new Rect(); @@ -734,18 +732,14 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener calculateWindowStableInsets(systemInsets, windowRect, displayRect); windowRect.offsetTo(0, 0); - synchronized (mDummyStackView) { - TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm(); - - // Rebind the header bar and draw it for the transition - stackLayout.setSystemInsets(systemInsets); - if (stack != null) { - stackLayout.getTaskStackBounds(displayRect, windowRect, systemInsets.top, - systemInsets.left, systemInsets.right, mTaskStackBounds); - stackLayout.reset(); - stackLayout.initialize(displayRect, windowRect, mTaskStackBounds, - TaskStackLayoutAlgorithm.StackState.getStackStateForStack(stack)); - } + // Rebind the header bar and draw it for the transition + stackLayout.setSystemInsets(systemInsets); + if (stack != null) { + stackLayout.getTaskStackBounds(displayRect, windowRect, systemInsets.top, + systemInsets.left, systemInsets.right, mTmpBounds); + stackLayout.reset(); + stackLayout.initialize(displayRect, windowRect, mTmpBounds, + TaskStackLayoutAlgorithm.StackState.getStackStateForStack(stack)); } } @@ -767,26 +761,23 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener private void updateHeaderBarLayout(TaskStack stack, Rect windowRectOverride) { Rect windowRect = getWindowRect(windowRectOverride); int taskViewWidth = 0; - boolean useGridLayout = false; - synchronized (mDummyStackView) { - useGridLayout = mDummyStackView.useGridLayout(); - updateDummyStackViewLayout(stack, windowRect); - if (stack != null) { - TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm(); - mDummyStackView.getStack().removeAllTasks(false /* notifyStackChanges */); - mDummyStackView.setTasks(stack, false /* allowNotifyStackChanges */); - // Get the width of a task view so that we know how wide to draw the header bar. - if (useGridLayout) { - TaskGridLayoutAlgorithm gridLayout = mDummyStackView.getGridAlgorithm(); - gridLayout.initialize(windowRect); - taskViewWidth = (int) gridLayout.getTransform(0 /* taskIndex */, - stack.getTaskCount(), new TaskViewTransform(), - stackLayout).rect.width(); - } else { - Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds(); - if (!taskViewBounds.isEmpty()) { - taskViewWidth = taskViewBounds.width(); - } + boolean useGridLayout = mDummyStackView.useGridLayout(); + updateDummyStackViewLayout(mDummyStackView.getStackAlgorithm(), stack, windowRect); + if (stack != null) { + TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm(); + mDummyStackView.getStack().removeAllTasks(false /* notifyStackChanges */); + mDummyStackView.setTasks(stack, false /* allowNotifyStackChanges */); + // Get the width of a task view so that we know how wide to draw the header bar. + if (useGridLayout) { + TaskGridLayoutAlgorithm gridLayout = mDummyStackView.getGridAlgorithm(); + gridLayout.initialize(windowRect); + taskViewWidth = (int) gridLayout.getTransform(0 /* taskIndex */, + stack.getTaskCount(), new TaskViewTransform(), + stackLayout).rect.width(); + } else { + Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds(); + if (!taskViewBounds.isEmpty()) { + taskViewWidth = taskViewBounds.width(); } } } @@ -866,20 +857,15 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener private Pair<ActivityOptions, AppTransitionAnimationSpecsFuture> getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo runningTask, Rect windowOverrideRect) { + final boolean isLowRamDevice = Recents.getConfiguration().isLowRamDevice; if (runningTask != null && runningTask.stackId == FREEFORM_WORKSPACE_STACK_ID) { ArrayList<AppTransitionAnimationSpec> specs = new ArrayList<>(); - ArrayList<Task> tasks; - TaskStackLayoutAlgorithm stackLayout; - TaskStackViewScroller stackScroller; - - synchronized (mDummyStackView) { - tasks = mDummyStackView.getStack().getStackTasks(); - stackLayout = mDummyStackView.getStackAlgorithm(); - stackScroller = mDummyStackView.getScroller(); + ArrayList<Task> tasks = mDummyStackView.getStack().getStackTasks(); + TaskStackLayoutAlgorithm stackLayout = mDummyStackView.getStackAlgorithm(); + TaskStackViewScroller stackScroller = mDummyStackView.getScroller(); - mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */); - mDummyStackView.updateToInitialState(); - } + mDummyStackView.updateLayoutAlgorithm(true /* boundScroll */); + mDummyStackView.updateToInitialState(); for (int i = tasks.size() - 1; i >= 0; i--) { Task task = tasks.get(i); @@ -896,8 +882,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener AppTransitionAnimationSpec[] specsArray = new AppTransitionAnimationSpec[specs.size()]; specs.toArray(specsArray); + // For low end ram devices, wait for transition flag is reset when Recents entrance + // animation is complete instead of when the transition animation starts return new Pair<>(ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView, - specsArray, mHandler, mResetToggleFlagListener, this), null); + specsArray, mHandler, isLowRamDevice ? null : mResetToggleFlagListener, this), + null); } else { // Update the destination rect Task toTask = new Task(); @@ -916,9 +905,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener toTask.key.id, thumbnail, rect)); }); + // For low end ram devices, wait for transition flag is reset when Recents entrance + // animation is complete instead of when the transition animation starts return new Pair<>(ActivityOptions.makeMultiThumbFutureAspectScaleAnimation(mContext, - mHandler, future.getFuture(), mResetToggleFlagListener, false /* scaleUp */), - future); + mHandler, future.getFuture(), isLowRamDevice ? null : mResetToggleFlagListener, + false /* scaleUp */), future); } } @@ -1037,10 +1028,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener updateHeaderBarLayout(stack, windowOverrideRect); // Prepare the dummy stack for the transition - TaskStackLayoutAlgorithm.VisibilityReport stackVr; - synchronized (mDummyStackView) { - stackVr = mDummyStackView.computeStackVisibilityReport(); - } + TaskStackLayoutAlgorithm.VisibilityReport stackVr = + mDummyStackView.computeStackVisibilityReport(); // Update the remaining launch state launchState.launchedNumVisibleTasks = stackVr.numVisibleTasks; 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 127822aec6df..b2675d7ac858 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java @@ -140,8 +140,10 @@ public class RecentsTransitionHelper { mHandler.postDelayed(mStartScreenPinningRunnable, 350); } - // Reset the state where we are waiting for the transition to start - EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); + if (!Recents.getConfiguration().isLowRamDevice) { + // Reset the state where we are waiting for the transition to start + EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); + } } }; } else { @@ -163,8 +165,10 @@ public class RecentsTransitionHelper { EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent()); stackView.cancelAllTaskViewAnimations(); - // Reset the state where we are waiting for the transition to start - EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); + if (!Recents.getConfiguration().isLowRamDevice) { + // Reset the state where we are waiting for the transition to start + EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); + } } }; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index ccaf3cd6df52..71f06cbf6e64 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -20,13 +20,17 @@ import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import android.animation.Animator; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.ActivityOptions.OnAnimationStartedListener; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.util.ArraySet; import android.util.AttributeSet; @@ -37,6 +41,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; import android.view.ViewPropertyAnimator; +import android.view.Window; import android.view.WindowInsets; import android.widget.FrameLayout; import android.widget.TextView; @@ -117,7 +122,15 @@ public class RecentsView extends FrameLayout { private float mBusynessFactor; private GradientDrawable mBackgroundScrim; - private Animator mBackgroundScrimAnimator; + private ColorDrawable mMultiWindowBackgroundScrim; + private ValueAnimator mBackgroundScrimAnimator; + private Point mTmpDisplaySize = new Point(); + + private final AnimatorUpdateListener mUpdateBackgroundScrimAlpha = (animation) -> { + int alpha = (Integer) animation.getAnimatedValue(); + mBackgroundScrim.setAlpha(alpha); + mMultiWindowBackgroundScrim.setAlpha(alpha); + }; private RecentsTransitionHelper mTransitionHelper; @ViewDebug.ExportedProperty(deepExport=true, prefix="touch_") @@ -146,10 +159,7 @@ public class RecentsView extends FrameLayout { mTouchHandler = new RecentsViewTouchHandler(this); mFlingAnimationUtils = new FlingAnimationUtils(context, 0.3f); mBackgroundScrim = new GradientDrawable(context); - mBackgroundScrim.setCallback(this); - - boolean usingDarkText = Color.luminance( - Utils.getColorAttr(mContext, R.attr.wallpaperTextColor)) < 0.5f; + mMultiWindowBackgroundScrim = new ColorDrawable(); LayoutInflater inflater = LayoutInflater.from(context); mEmptyView = (TextView) inflater.inflate(R.layout.recents_empty, this, false); @@ -244,6 +254,7 @@ public class RecentsView extends FrameLayout { } else { mBackgroundScrim.setAlpha(0); } + mMultiWindowBackgroundScrim.setAlpha(mBackgroundScrim.getAlpha()); } } @@ -300,8 +311,14 @@ public class RecentsView extends FrameLayout { /** * Returns the window background scrim. */ - public Drawable getBackgroundScrim() { - return mBackgroundScrim; + public void updateBackgroundScrim(Window window, boolean isInMultiWindow) { + if (isInMultiWindow) { + mBackgroundScrim.setCallback(null); + window.setBackgroundDrawable(mMultiWindowBackgroundScrim); + } else { + mMultiWindowBackgroundScrim.setCallback(null); + window.setBackgroundDrawable(mBackgroundScrim); + } } /** @@ -401,6 +418,9 @@ public class RecentsView extends FrameLayout { */ public void setScrimColors(ColorExtractor.GradientColors scrimColors, boolean animated) { mBackgroundScrim.setColors(scrimColors, animated); + int alpha = mMultiWindowBackgroundScrim.getAlpha(); + mMultiWindowBackgroundScrim.setColor(scrimColors.getMainColor()); + mMultiWindowBackgroundScrim.setAlpha(alpha); } @Override @@ -470,8 +490,10 @@ public class RecentsView extends FrameLayout { // Needs to know the screen size since the gradient never scales up or down // even when bounds change. - mBackgroundScrim.setScreenSize(right - left, bottom - top); + mContext.getDisplay().getRealSize(mTmpDisplaySize); + mBackgroundScrim.setScreenSize(mTmpDisplaySize.x, mTmpDisplaySize.y); mBackgroundScrim.setBounds(left, top, right, bottom); + mMultiWindowBackgroundScrim.setBounds(0, 0, mTmpDisplaySize.x, mTmpDisplaySize.y); if (RecentsDebugFlags.Static.EnableStackActionButton) { // Layout the stack action button such that its drawable is start-aligned with the @@ -916,12 +938,12 @@ public class RecentsView extends FrameLayout { // Calculate the absolute alpha to animate from final int fromAlpha = mBackgroundScrim.getAlpha(); final int toAlpha = (int) (alpha * 255); - mBackgroundScrimAnimator = ObjectAnimator.ofInt(mBackgroundScrim, Utilities.DRAWABLE_ALPHA, - fromAlpha, toAlpha); + mBackgroundScrimAnimator = ValueAnimator.ofInt(fromAlpha, toAlpha); mBackgroundScrimAnimator.setDuration(duration); mBackgroundScrimAnimator.setInterpolator(toAlpha > fromAlpha ? Interpolators.ALPHA_IN : Interpolators.ALPHA_OUT); + mBackgroundScrimAnimator.addUpdateListener(mUpdateBackgroundScrimAlpha); mBackgroundScrimAnimator.start(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 6e57044467bb..81bf6affc94a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -34,6 +34,8 @@ import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsActivityLaunchState; import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.RecentsDebugFlags; +import com.android.systemui.recents.events.EventBus; +import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent; import com.android.systemui.recents.misc.ReferenceCountedTrigger; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; @@ -241,6 +243,7 @@ public class TaskStackAnimationHelper { return; } + final boolean isLowRamDevice = Recents.getConfiguration().isLowRamDevice; int taskViewEnterFromAppDuration = res.getInteger( R.integer.recents_task_enter_from_app_duration); int taskViewEnterFromAffiliatedAppDuration = res.getInteger( @@ -248,6 +251,13 @@ public class TaskStackAnimationHelper { int dockGestureAnimDuration = appRes.getInteger( R.integer.long_press_dock_anim_duration); + // Since low ram devices have an animation when entering app -> recents, do not allow + // toggle until the animation is complete + if (launchState.launchedFromApp && !launchState.launchedViaDockGesture && isLowRamDevice) { + postAnimationTrigger.addLastDecrementRunnable(() -> EventBus.getDefault() + .send(new SetWaitingForTransitionStartEvent(false))); + } + // Create enter animations for each of the views from front to back List<TaskView> taskViews = mStackView.getTaskViews(); int taskViewCount = taskViews.size(); @@ -296,7 +306,7 @@ public class TaskStackAnimationHelper { AnimationProps taskAnimation = new AnimationProps() .setInterpolator(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_INTERPOLATOR) .setListener(postAnimationTrigger.decrementOnAnimationEnd()); - if (Recents.getConfiguration().isLowRamDevice) { + if (isLowRamDevice) { taskAnimation.setInterpolator(AnimationProps.BOUNDS, Interpolators.FAST_OUT_SLOW_IN) .setDuration(AnimationProps.BOUNDS, 150) diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java index d810ea4b3b1c..eaa32eefe795 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java @@ -354,7 +354,6 @@ public class TaskStackLayoutAlgorithm { TaskViewTransform mFrontOfStackTransform = new TaskViewTransform(); public TaskStackLayoutAlgorithm(Context context, TaskStackLayoutAlgorithmCallbacks cb) { - Resources res = context.getResources(); mContext = context; mCb = cb; mFreeformLayoutAlgorithm = new FreeformWorkspaceLayoutAlgorithm(context); @@ -519,7 +518,7 @@ public class TaskStackLayoutAlgorithm { * Computes the minimum and maximum scroll progress values and the progress values for each task * in the stack. */ - void update(TaskStack stack, ArraySet<Task.TaskKey> ignoreTasksSet, + public void update(TaskStack stack, ArraySet<Task.TaskKey> ignoreTasksSet, RecentsActivityLaunchState launchState) { SystemServicesProxy ssp = Recents.getSystemServices(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java index 194cdc77c02a..81a99bc1e70c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationBackgroundView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Canvas; +import android.graphics.ColorFilter; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; @@ -34,6 +35,7 @@ public class NotificationBackgroundView extends View { private int mClipTopAmount; private int mActualHeight; private int mClipBottomAmount; + private int mTintColor; public NotificationBackgroundView(Context context, AttributeSet attrs) { super(context, attrs); @@ -87,6 +89,7 @@ public class NotificationBackgroundView extends View { mBackground = background; if (mBackground != null) { mBackground.setCallback(this); + setTint(mTintColor); } if (mBackground instanceof RippleDrawable) { ((RippleDrawable) mBackground).setForceSoftware(true); @@ -105,6 +108,7 @@ public class NotificationBackgroundView extends View { } else { mBackground.clearColorFilter(); } + mTintColor = tintColor; invalidate(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java index 6060134de6da..172c62a99db2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java @@ -53,7 +53,7 @@ public class FullscreenUserSwitcher { mParent = containerStub.inflate(); mContainer = mParent.findViewById(R.id.container); mUserGridView = mContainer.findViewById(R.id.user_grid); - mUserGridView.init(statusBar, mUserSwitcherController); + mUserGridView.init(statusBar, mUserSwitcherController, true /* showInitially */); mUserGridView.setUserSelectionListener(record -> { if (!record.isCurrent) { toggleSwitchInProgress(true); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java index b22a2c1c0f22..e551801ca434 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java @@ -16,19 +16,21 @@ package com.android.systemui.statusbar.car; +import android.animation.Animator; +import android.animation.Animator.AnimatorListener; +import android.animation.ValueAnimator; import android.content.Context; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Align; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; -import android.os.UserHandle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; +import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.util.AttributeSet; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -36,9 +38,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.internal.util.UserIcons; import com.android.systemui.R; -import com.android.systemui.statusbar.UserUtil; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.UserSwitcherController; @@ -47,21 +47,44 @@ import com.android.systemui.statusbar.policy.UserSwitcherController; * One of the uses of this is for the lock screen in auto. */ public class UserGridView extends ViewPager { + private static final int EXPAND_ANIMATION_TIME_MS = 200; + private static final int HIDE_ANIMATION_TIME_MS = 133; + private StatusBar mStatusBar; private UserSwitcherController mUserSwitcherController; private Adapter mAdapter; private UserSelectionListener mUserSelectionListener; + private ValueAnimator mHeightAnimator; + private int mTargetHeight; + private int mHeightChildren; + private boolean mShowing; public UserGridView(Context context, AttributeSet attrs) { super(context, attrs); } - public void init(StatusBar statusBar, UserSwitcherController userSwitcherController) { + public void init(StatusBar statusBar, UserSwitcherController userSwitcherController, + boolean showInitially) { mStatusBar = statusBar; mUserSwitcherController = userSwitcherController; mAdapter = new Adapter(mUserSwitcherController); addOnLayoutChangeListener(mAdapter); setAdapter(mAdapter); + mShowing = showInitially; + } + + public boolean isShowing() { + return mShowing; + } + + public void show() { + mShowing = true; + animateHeightChange(getMeasuredHeight(), mHeightChildren); + } + + public void hide() { + mShowing = false; + animateHeightChange(getMeasuredHeight(), 0); } public void onUserSwitched(int newUserId) { @@ -82,16 +105,85 @@ public class UserGridView extends ViewPager { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Wrap content doesn't work in ViewPagers, so simulate the behavior in code. int height = 0; - for(int i = 0; i < getChildCount(); i++) { - View child = getChildAt(i); - child.measure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - height = Math.max(child.getMeasuredHeight(), height); + if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) { + height = MeasureSpec.getSize(heightMeasureSpec); + } else { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + child.measure(widthMeasureSpec, + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + height = Math.max(child.getMeasuredHeight(), height); + } + + mHeightChildren = height; + + // Override the height if it's not showing. + if (!mShowing) { + height = 0; + } + + // Respect the AT_MOST request from parent. + if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { + height = Math.min(MeasureSpec.getSize(heightMeasureSpec), height); + } } heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + private void animateHeightChange(int oldHeight, int newHeight) { + // If there is no change in height or an animation is already in progress towards the + // desired height, then there's no need to make any changes. + if (oldHeight == newHeight || newHeight == mTargetHeight) { + return; + } + + // Animation in progress is not going towards the new target, so cancel it. + if (mHeightAnimator != null){ + mHeightAnimator.cancel(); + } + + mTargetHeight = newHeight; + mHeightAnimator = ValueAnimator.ofInt(oldHeight, mTargetHeight); + mHeightAnimator.addUpdateListener(valueAnimator -> { + ViewGroup.LayoutParams layoutParams = getLayoutParams(); + layoutParams.height = (Integer) valueAnimator.getAnimatedValue(); + requestLayout(); + }); + mHeightAnimator.addListener(new AnimatorListener() { + @Override + public void onAnimationStart(Animator animator) {} + + @Override + public void onAnimationEnd(Animator animator) { + // ValueAnimator does not guarantee that the update listener will get an update + // to the final value, so here, the final value is set. Though the final calculated + // height (mTargetHeight) could be set, WRAP_CONTENT is more appropriate. + ViewGroup.LayoutParams layoutParams = getLayoutParams(); + layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT; + requestLayout(); + mHeightAnimator = null; + } + + @Override + public void onAnimationCancel(Animator animator) {} + + @Override + public void onAnimationRepeat(Animator animator) {} + }); + + mHeightAnimator.setInterpolator(new FastOutSlowInInterpolator()); + if (oldHeight < newHeight) { + // Expanding + mHeightAnimator.setDuration(EXPAND_ANIMATION_TIME_MS); + } else { + // Hiding + mHeightAnimator.setDuration(HIDE_ANIMATION_TIME_MS); + } + mHeightAnimator.start(); + } + /** * This is a ViewPager.PagerAdapter which deletegates the work to a * UserSwitcherController.BaseUserAdapter. Java doesn't support multiple inheritance so we have @@ -100,7 +192,9 @@ public class UserGridView extends ViewPager { */ private final class Adapter extends PagerAdapter implements View.OnLayoutChangeListener { private final int mPodWidth; - private final int mPodMargin; + private final int mPodMarginBetween; + private final int mPodImageAvatarWidth; + private final int mPodImageAvatarHeight; private final WrappedBaseUserAdapter mUserAdapter; private int mContainerWidth; @@ -108,10 +202,15 @@ public class UserGridView extends ViewPager { public Adapter(UserSwitcherController controller) { super(); mUserAdapter = new WrappedBaseUserAdapter(controller, this); - mPodWidth = getResources().getDimensionPixelSize( + + Resources res = getResources(); + mPodWidth = res.getDimensionPixelSize(R.dimen.car_fullscreen_user_pod_width); + mPodMarginBetween = res.getDimensionPixelSize( + R.dimen.car_fullscreen_user_pod_margin_between); + mPodImageAvatarWidth = res.getDimensionPixelSize( R.dimen.car_fullscreen_user_pod_image_avatar_width); - mPodMargin = getResources().getDimensionPixelSize( - R.dimen.car_fullscreen_user_pod_margin_side); + mPodImageAvatarHeight = res.getDimensionPixelSize( + R.dimen.car_fullscreen_user_pod_image_avatar_height); } @Override @@ -121,9 +220,12 @@ public class UserGridView extends ViewPager { private int getIconsPerPage() { // We need to know how many pods we need in this page. Each pod has its own width and - // margins on both sides. We can then divide the measured width of the parent by the + // a margin between them. We can then divide the measured width of the parent by the // sum of pod width and margin to get the number of pods that will completely fit. - return mContainerWidth / (mPodWidth + mPodMargin * 2); + // There is one less margin than the number of pods (eg. for 5 pods, there are 4 + // margins), so need to add the margin to the measured width to account for that. + return (mContainerWidth + mPodMarginBetween) / + (mPodWidth + mPodMarginBetween); } @Override @@ -137,7 +239,17 @@ public class UserGridView extends ViewPager { int iconsPerPage = getIconsPerPage(); int limit = Math.min(mUserAdapter.getCount(), (position + 1) * iconsPerPage); for (int i = position * iconsPerPage; i < limit; i++) { - pods.addView(makeUserPod(inflater, context, i, pods)); + View v = makeUserPod(inflater, context, i, pods); + pods.addView(v); + // This is hacky, but the dividers on the pod container LinearLayout don't seem + // to work for whatever reason. Instead, set a right margin on the pod if it's not + // the right-most pod and there is more than one pod in the container. + if (i < limit - 1 && limit > 1) { + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + params.setMargins(0, 0, mPodMarginBetween, 0); + v.setLayoutParams(params); + } } container.addView(pods); return pods; @@ -151,7 +263,8 @@ public class UserGridView extends ViewPager { */ private Bitmap getDefaultUserIcon(CharSequence userName) { CharSequence displayText = userName.subSequence(0, 1); - Bitmap out = Bitmap.createBitmap(mPodWidth, mPodWidth, Bitmap.Config.ARGB_8888); + Bitmap out = Bitmap.createBitmap(mPodImageAvatarWidth, mPodImageAvatarHeight, + Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(out); // Draw the circle background. @@ -159,7 +272,7 @@ public class UserGridView extends ViewPager { shape.setShape(GradientDrawable.RADIAL_GRADIENT); shape.setGradientRadius(1.0f); shape.setColor(getContext().getColor(R.color.car_user_switcher_no_user_image_bgcolor)); - shape.setBounds(0, 0, mPodWidth, mPodWidth); + shape.setBounds(0, 0, mPodImageAvatarWidth, mPodImageAvatarHeight); shape.draw(canvas); // Draw the letter in the center. @@ -174,8 +287,8 @@ public class UserGridView extends ViewPager { // correct this, half the difference between the top and bottom distance metrics of the // font gives the offset of the font. Bottom is a positive value, top is negative, so // the different is actually a sum. The "half" operation is then factored out. - canvas.drawText(displayText.toString(), - mPodWidth / 2, (mPodWidth - (metrics.bottom + metrics.top)) / 2, paint); + canvas.drawText(displayText.toString(), mPodImageAvatarWidth / 2, + (mPodImageAvatarHeight - (metrics.bottom + metrics.top)) / 2, paint); return out; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java index bf926c625e4f..f9671182ab8c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java @@ -193,7 +193,7 @@ public class NotificationInflater { int flag = FLAG_REINFLATE_CONTENT_VIEW; if ((reInflateFlags & flag) != 0) { - boolean isNewView = !compareRemoteViews(result.newContentView, entry.cachedContentView); + boolean isNewView = !canReapplyRemoteView(result.newContentView, entry.cachedContentView); ApplyCallback applyCallback = new ApplyCallback() { @Override public void setResultView(View v) { @@ -215,7 +215,7 @@ public class NotificationInflater { flag = FLAG_REINFLATE_EXPANDED_VIEW; if ((reInflateFlags & flag) != 0) { if (result.newExpandedView != null) { - boolean isNewView = !compareRemoteViews(result.newExpandedView, + boolean isNewView = !canReapplyRemoteView(result.newExpandedView, entry.cachedBigContentView); ApplyCallback applyCallback = new ApplyCallback() { @Override @@ -240,7 +240,7 @@ public class NotificationInflater { flag = FLAG_REINFLATE_HEADS_UP_VIEW; if ((reInflateFlags & flag) != 0) { if (result.newHeadsUpView != null) { - boolean isNewView = !compareRemoteViews(result.newHeadsUpView, + boolean isNewView = !canReapplyRemoteView(result.newHeadsUpView, entry.cachedHeadsUpContentView); ApplyCallback applyCallback = new ApplyCallback() { @Override @@ -264,7 +264,7 @@ public class NotificationInflater { flag = FLAG_REINFLATE_PUBLIC_VIEW; if ((reInflateFlags & flag) != 0) { - boolean isNewView = !compareRemoteViews(result.newPublicView, + boolean isNewView = !canReapplyRemoteView(result.newPublicView, entry.cachedPublicContentView); ApplyCallback applyCallback = new ApplyCallback() { @Override @@ -288,7 +288,7 @@ public class NotificationInflater { if ((reInflateFlags & flag) != 0) { NotificationContentView newParent = redactAmbient ? publicLayout : privateLayout; boolean isNewView = !canReapplyAmbient(row, redactAmbient) || - !compareRemoteViews(result.newAmbientView, entry.cachedAmbientContentView); + !canReapplyRemoteView(result.newAmbientView, entry.cachedAmbientContentView); ApplyCallback applyCallback = new ApplyCallback() { @Override public void setResultView(View v) { @@ -486,14 +486,21 @@ public class NotificationInflater { return builder.createContentView(useLarge); } - // Returns true if the RemoteViews are the same. - private static boolean compareRemoteViews(final RemoteViews a, final RemoteViews b) { - return (a == null && b == null) || - (a != null && b != null - && b.getPackage() != null - && a.getPackage() != null - && a.getPackage().equals(b.getPackage()) - && a.getLayoutId() == b.getLayoutId()); + /** + * @param newView The new view that will be applied + * @param oldView The old view that was applied to the existing view before + * @return {@code true} if the RemoteViews are the same and the view can be reused to reapply. + */ + @VisibleForTesting + static boolean canReapplyRemoteView(final RemoteViews newView, + final RemoteViews oldView) { + return (newView == null && oldView == null) || + (newView != null && oldView != null + && oldView.getPackage() != null + && newView.getPackage() != null + && newView.getPackage().equals(oldView.getPackage()) + && newView.getLayoutId() == oldView.getLayoutId() + && !oldView.isReapplyDisallowed()); } public void setInflationCallback(InflationCallback callback) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java index 844a2c495501..3115361c6927 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java @@ -16,7 +16,10 @@ package com.android.systemui.statusbar.notification; +import android.content.Context; import android.graphics.Color; +import android.os.UserHandle; +import android.provider.Settings; import android.view.View; import android.widget.ImageView; @@ -57,4 +60,10 @@ public class NotificationUtils { offsetView.getLocationOnScreen(sLocationOffset); return sLocationOffset[1] - sLocationBase[1]; } + + public static boolean isHapticFeedbackDisabled(Context context) { + return Settings.System.getIntForUser(context.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0; + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 2bc26654fd87..a83e6591c48b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -174,16 +174,6 @@ public class ButtonDispatcher { mCurrentView = currentView.findViewById(mId); } - public void setCarMode(boolean carMode) { - final int N = mViews.size(); - for (int i = 0; i < N; i++) { - final View view = mViews.get(i); - if (view instanceof ButtonInterface) { - ((ButtonInterface) view).setCarMode(carMode); - } - } - } - public void setVertical(boolean vertical) { mVertical = vertical; final int N = mViews.size(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index c45c05e14a22..021b4518efbe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -54,6 +54,7 @@ public class DozeScrimController { private boolean mFullyPulsing; private float mAodFrontScrimOpacity = 0; + private Runnable mSetDozeInFrontAlphaDelayed; public DozeScrimController(ScrimController scrimController, Context context) { mContext = context; @@ -69,8 +70,7 @@ public class DozeScrimController { mDozingAborted = false; abortAnimations(); mScrimController.setDozeBehindAlpha(1f); - mScrimController.setDozeInFrontAlpha( - mDozeParameters.getAlwaysOn() ? mAodFrontScrimOpacity : 1f); + setDozeInFrontAlpha(mDozeParameters.getAlwaysOn() ? mAodFrontScrimOpacity : 1f); } else { cancelPulsing(); if (animate) { @@ -83,7 +83,7 @@ public class DozeScrimController { } else { abortAnimations(); mScrimController.setDozeBehindAlpha(0f); - mScrimController.setDozeInFrontAlpha(0f); + setDozeInFrontAlpha(0f); } } } @@ -97,7 +97,7 @@ public class DozeScrimController { mAodFrontScrimOpacity = scrimOpacity; if (mDozing && !isPulsing() && !mDozingAborted && !mWakeAndUnlocking && mDozeParameters.getAlwaysOn()) { - mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity); + setDozeInFrontAlpha(mAodFrontScrimOpacity); } } @@ -107,7 +107,7 @@ public class DozeScrimController { if (!mWakeAndUnlocking) { mWakeAndUnlocking = true; mScrimController.setDozeBehindAlpha(0f); - mScrimController.setDozeInFrontAlpha(0f); + setDozeInFrontAlpha(0f); } } @@ -127,7 +127,7 @@ public class DozeScrimController { // be invoked when we're done so that the caller can drop the pulse wakelock. mPulseCallback = callback; mPulseReason = reason; - mScrimController.setDozeInFrontAlpha(1f); + setDozeInFrontAlpha(1f); mHandler.post(mPulseIn); } @@ -138,9 +138,8 @@ public class DozeScrimController { cancelPulsing(); if (mDozing && !mWakeAndUnlocking) { mScrimController.setDozeBehindAlpha(1f); - mScrimController.setDozeInFrontAlpha( - mDozeParameters.getAlwaysOn() && !mDozingAborted ? - mAodFrontScrimOpacity : 1f); + setDozeInFrontAlpha(mDozeParameters.getAlwaysOn() && !mDozingAborted + ? mAodFrontScrimOpacity : 1f); } } @@ -295,6 +294,25 @@ public class DozeScrimController { : mScrimController.getDozeBehindAlpha(); } + private void setDozeInFrontAlpha(float opacity) { + setDozeInFrontAlphaDelayed(opacity, 0 /* delay */); + + } + + private void setDozeInFrontAlphaDelayed(float opacity, long delayMs) { + if (mSetDozeInFrontAlphaDelayed != null) { + mHandler.removeCallbacks(mSetDozeInFrontAlphaDelayed); + mSetDozeInFrontAlphaDelayed = null; + } + if (delayMs <= 0) { + mScrimController.setDozeInFrontAlpha(opacity); + } else { + mHandler.postDelayed(mSetDozeInFrontAlphaDelayed = () -> { + setDozeInFrontAlpha(opacity); + }, delayMs); + } + } + private final Runnable mPulseIn = new Runnable() { @Override public void run() { @@ -364,7 +382,9 @@ public class DozeScrimController { // Signal that the pulse is all finished so we can turn the screen off now. DozeScrimController.this.pulseFinished(); if (mDozeParameters.getAlwaysOn()) { - mScrimController.setDozeInFrontAlpha(mAodFrontScrimOpacity); + // Setting power states can happen after we push out the frame. Make sure we + // stay fully opaque until the power state request reaches the lower levels. + setDozeInFrontAlphaDelayed(mAodFrontScrimOpacity, 30); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java index cb96dea08ae0..316d229e4f1a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java @@ -32,6 +32,8 @@ import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; +import java.io.PrintWriter; + /** * Controller which coordinates all the fingerprint unlocking actions with the UI. */ @@ -264,6 +266,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { @Override public void onStartedGoingToSleep(int why) { + resetMode(); mPendingAuthenticatedUserId = -1; } @@ -346,6 +349,10 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { } public void finishKeyguardFadingAway() { + resetMode(); + } + + private void resetMode() { mMode = MODE_NONE; mStatusBarWindowManager.setForceDozeBrightness(false); if (mStatusBar.getNavigationBarView() != null) { @@ -375,4 +382,10 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { public boolean hasScreenTurnedOnSinceAuthenticating() { return mHasScreenTurnedOnSinceAuthenticating; } + + public void dump(PrintWriter pw) { + pw.println(" FingerprintUnlockController:"); + pw.print(" mMode="); pw.println(mMode); + pw.print(" mWakeLock="); pw.println(mWakeLock); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index e65bab6b4032..f7aa818f0abf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -151,7 +151,7 @@ public class KeyguardClockPositionAlgorithm { progress = Math.max(0.0f, Math.min(progress, 1.0f)); progress = mAccelerateInterpolator.getInterpolation(progress); progress *= Math.pow(1 + mEmptyDragAmount / mDensity / 300, 0.3f); - return progress; + return interpolate(progress, 1, mDarkAmount); } private int getClockNotificationsPadding() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index c24129079d4f..5c9446ce8672 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -207,9 +207,9 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange if (mAccessibilityController == null) { return; } - boolean clickToUnlock = mAccessibilityController.isTouchExplorationEnabled(); + boolean clickToUnlock = mAccessibilityController.isAccessibilityEnabled(); boolean clickToForceLock = mUnlockMethodCache.isTrustManaged() - && !mAccessibilityController.isAccessibilityEnabled(); + && !clickToUnlock; boolean longClickToForceLock = mUnlockMethodCache.isTrustManaged() && !clickToForceLock; setClickable(clickToForceLock || clickToUnlock); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 57c88275113c..9a7039a515a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -683,8 +683,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav if (isCarMode != mInCarMode) { mInCarMode = isCarMode; - getHomeButton().setCarMode(isCarMode); - if (ALTERNATE_CAR_MODE_UI) { mUseCarModeUi = isCarMode; uiCarModeChanged = true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index e0d9748c48bf..88a562648a63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -16,14 +16,19 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.statusbar.notification.NotificationUtils.isHapticFeedbackDisabled; + import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.Icon; +import android.os.AsyncTask; +import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; +import android.provider.Settings; import android.support.v4.util.ArrayMap; import android.support.v4.util.ArraySet; import android.util.AttributeSet; @@ -34,6 +39,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.AlphaOptimizedFrameLayout; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.stack.AnimationFilter; import com.android.systemui.statusbar.stack.AnimationProperties; import com.android.systemui.statusbar.stack.StackStateAnimator; @@ -623,9 +629,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { boolean wasInShelf = icon.isInShelf(); boolean inShelf = iconAppearAmount == 1.0f; icon.setIsInShelf(inShelf); - if (mVibrateOnAnimation && !justAdded && mAnimationsEnabled - && wasInShelf != inShelf) { - mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK)); + if (shouldVibrateChange(wasInShelf != inShelf)) { + AsyncTask.execute( + () -> mVibrator.vibrate(VibrationEffect.get( + VibrationEffect.EFFECT_TICK))); } } justAdded = false; @@ -634,6 +641,25 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { justUndarkened = false; } + private boolean shouldVibrateChange(boolean inShelfChanged) { + if (!mVibrateOnAnimation) { + return false; + } + if (justAdded) { + return false; + } + if (!mAnimationsEnabled) { + return false; + } + if (!inShelfChanged) { + return false; + } + if (isHapticFeedbackDisabled(mContext)) { + return false; + } + return true; + } + public boolean hasCustomTransformHeight() { return isLastExpandIcon && customTransformHeight != NO_VALUE; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index d3ee55098474..46f9c04aa42e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.statusbar.notification.NotificationUtils.isHapticFeedbackDisabled; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -23,9 +25,12 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.os.AsyncTask; import android.os.SystemClock; +import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; +import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.InputDevice; @@ -45,6 +50,7 @@ import com.android.systemui.classifier.FalsingManager; import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.policy.HeadsUpManager; import java.io.FileDescriptor; @@ -59,6 +65,7 @@ public abstract class PanelView extends FrameLayout { private float mMinExpandHeight; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; + private boolean mVibrateOnOpening; private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -203,6 +210,8 @@ public abstract class PanelView extends FrameLayout { mNotificationsDragEnabled = getResources().getBoolean(R.bool.config_enableNotificationShadeDrag); mVibrator = mContext.getSystemService(Vibrator.class); + mVibrateOnOpening = mContext.getResources().getBoolean( + R.bool.config_vibrateOnIconAnimation); } protected void loadDimens() { @@ -394,7 +403,10 @@ public abstract class PanelView extends FrameLayout { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK)); + if (mVibrateOnOpening && !isHapticFeedbackDisabled(mContext)) { + AsyncTask.execute( + () -> mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK))); + } } protected abstract float getOpeningHeight(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 1d6448094132..702afa3a38b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -48,6 +48,7 @@ import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.stack.ViewState; +import java.io.PrintWriter; import java.util.function.Consumer; /** @@ -768,4 +769,22 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, scheduleUpdate(); } } + + public void dump(PrintWriter pw) { + pw.println(" ScrimController:"); + + pw.print(" frontScrim:"); pw.print(" viewAlpha="); pw.print(mScrimInFront.getViewAlpha()); + pw.print(" alpha="); pw.print(mCurrentInFrontAlpha); + pw.print(" dozeAlpha="); pw.print(mDozeInFrontAlpha); + pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimInFront.getTint())); + + pw.print(" backScrim:"); pw.print(" viewAlpha="); pw.print(mScrimBehind.getViewAlpha()); + pw.print(" alpha="); pw.print(mCurrentBehindAlpha); + pw.print(" dozeAlpha="); pw.print(mDozeBehindAlpha); + pw.print(" tint=0x"); pw.println(Integer.toHexString(mScrimBehind.getTint())); + + pw.print(" mBouncerShowing="); pw.println(mBouncerShowing); + pw.print(" mTracking="); pw.println(mTracking); + pw.print(" mForceHideScrims="); pw.println(mForceHideScrims); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 2ce561f44455..2e2422df6cd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -429,7 +429,7 @@ public class StatusBar extends SystemUI implements DemoMode, private int mStatusBarWindowState = WINDOW_STATE_SHOWING; protected StatusBarWindowManager mStatusBarWindowManager; protected UnlockMethodCache mUnlockMethodCache; - private DozeServiceHost mDozeServiceHost; + private DozeServiceHost mDozeServiceHost = new DozeServiceHost(); private boolean mWakeUpComingFromTouch; private PointF mWakeUpTouchLocation; @@ -733,7 +733,8 @@ public class StatusBar extends SystemUI implements DemoMode, private KeyguardUserSwitcher mKeyguardUserSwitcher; private UserSwitcherController mUserSwitcherController; private NetworkController mNetworkController; - private KeyguardMonitorImpl mKeyguardMonitor; + private KeyguardMonitorImpl mKeyguardMonitor + = (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); private BatteryController mBatteryController; protected boolean mPanelExpanded; private IOverlayManager mOverlayManager; @@ -741,7 +742,7 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mIsKeyguard; private LogMaker mStatusBarStateLog; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); - private NotificationIconAreaController mNotificationIconAreaController; + protected NotificationIconAreaController mNotificationIconAreaController; private boolean mReinflateNotificationsOnUserSwitched; private HashMap<String, Entry> mPendingNotifications = new HashMap<>(); private boolean mClearAllEnabled; @@ -788,14 +789,12 @@ public class StatusBar extends SystemUI implements DemoMode, public void start() { mNetworkController = Dependency.get(NetworkController.class); mUserSwitcherController = Dependency.get(UserSwitcherController.class); - mKeyguardMonitor = (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); mScreenLifecycle = Dependency.get(ScreenLifecycle.class); mScreenLifecycle.addObserver(mScreenObserver); mWakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class); mWakefulnessLifecycle.addObserver(mWakefulnessObserver); mBatteryController = Dependency.get(BatteryController.class); mAssistManager = Dependency.get(AssistManager.class); - mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); mSystemServicesProxy = SystemServicesProxy.getInstance(mContext); mOverlayManager = IOverlayManager.Stub.asInterface( ServiceManager.getService(Context.OVERLAY_SERVICE)); @@ -981,7 +980,6 @@ public class StatusBar extends SystemUI implements DemoMode, startKeyguard(); KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback); - mDozeServiceHost = new DozeServiceHost(); putComponent(DozeHost.class, mDozeServiceHost); notifyUserAboutHiddenNotifications(); @@ -1328,7 +1326,7 @@ public class StatusBar extends SystemUI implements DemoMode, // Clock and bottom icons mNotificationPanel.onOverlayChanged(); // The status bar on the keyguard is a special layout. - mKeyguardStatusBar.onOverlayChanged(); + if (mKeyguardStatusBar != null) mKeyguardStatusBar.onOverlayChanged(); // Recreate Indication controller because internal references changed mKeyguardIndicationController = SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, @@ -1373,7 +1371,7 @@ public class StatusBar extends SystemUI implements DemoMode, } private void inflateSignalClusters() { - reinflateSignalCluster(mKeyguardStatusBar); + if (mKeyguardStatusBar != null) reinflateSignalCluster(mKeyguardStatusBar); } public static SignalClusterView reinflateSignalCluster(View view) { @@ -3537,6 +3535,14 @@ public class StatusBar extends SystemUI implements DemoMode, DozeLog.dump(pw); + if (mFingerprintUnlockController != null) { + mFingerprintUnlockController.dump(pw); + } + + if (mScrimController != null) { + mScrimController.dump(pw); + } + if (DUMPTRUCK) { synchronized (mNotificationData) { mNotificationData.dump(pw, " "); @@ -4565,7 +4571,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mKeyguardUserSwitcher != null) { mKeyguardUserSwitcher.setKeyguard(true, fromShadeLocked); } - mStatusBarView.removePendingHideExpandedRunnables(); + if (mStatusBarView != null) mStatusBarView.removePendingHideExpandedRunnables(); if (mAmbientIndicationContainer != null) { mAmbientIndicationContainer.setVisibility(View.VISIBLE); } @@ -4603,7 +4609,7 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Switches theme from light to dark and vice-versa. */ - private void updateTheme() { + protected void updateTheme() { final boolean inflated = mStackScroller != null; // The system wallpaper defines if QS should be light or dark. @@ -5160,6 +5166,14 @@ public class StatusBar extends SystemUI implements DemoMode, recomputeDisableFlags(true /* animate */); } + public void cancelCurrentTouch() { + if (mNotificationPanel.isTracking()) { + mStatusBarWindow.cancelCurrentTouch(); + if (mState == StatusBarState.SHADE) { + animateCollapsePanels(); + } + } + } WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() { @Override @@ -5252,8 +5266,7 @@ public class StatusBar extends SystemUI implements DemoMode, private void maybePrepareWakeUpFromAod() { int wakefulness = mWakefulnessLifecycle.getWakefulness(); - if (mDozing && (wakefulness == WAKEFULNESS_WAKING - || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) { + if (mDozing && wakefulness == WAKEFULNESS_WAKING && !isPulsing()) { mScrimController.prepareWakeUpFromAod(); } } @@ -5678,7 +5691,8 @@ public class StatusBar extends SystemUI implements DemoMode, protected KeyguardManager mKeyguardManager; private LockPatternUtils mLockPatternUtils; - private DeviceProvisionedController mDeviceProvisionedController; + private DeviceProvisionedController mDeviceProvisionedController + = Dependency.get(DeviceProvisionedController.class); protected SystemServicesProxy mSystemServicesProxy; // UI-specific methods diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index eaa6a33b05d7..ed96b4115888 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -30,6 +30,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import com.android.keyguard.R; import com.android.systemui.Dumpable; @@ -230,6 +231,7 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D applyModalFlag(state); applyBrightness(state); applyHasTopUi(state); + applySleepToken(state); if (mLp.copyFrom(mLpChanged) != 0) { mWindowManager.updateViewLayout(mStatusBarView, mLp); } @@ -273,6 +275,14 @@ public class StatusBarWindowManager implements RemoteInputController.Callback, D mHasTopUiChanged = isExpanded(state); } + private void applySleepToken(State state) { + if (state.dozing) { + mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN; + } else { + mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN; + } + } + public void setKeyguardShowing(boolean showing) { mCurrentState.keyguardShowing = showing; apply(mCurrentState); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java index fc7495213165..5b24f9cd97bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothControllerImpl.java @@ -296,10 +296,13 @@ public class BluetoothControllerImpl implements BluetoothController, BluetoothCa @Override public void run() { - mBondState = mDevice.get().getBondState(); - mMaxConnectionState = mDevice.get().getMaxConnectionState(); - mUiHandler.removeMessages(H.MSG_PAIRED_DEVICES_CHANGED); - mUiHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); + CachedBluetoothDevice device = mDevice.get(); + if (device != null) { + mBondState = device.getBondState(); + mMaxConnectionState = device.getMaxConnectionState(); + mUiHandler.removeMessages(H.MSG_PAIRED_DEVICES_CHANGED); + mUiHandler.sendEmptyMessage(H.MSG_PAIRED_DEVICES_CHANGED); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index 65bfabd19fbb..05017718d42b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -304,11 +304,6 @@ public class KeyButtonView extends ImageView implements ButtonInterface { public void setVertical(boolean vertical) { //no op } - - @Override - public void setCarMode(boolean carMode) { - // no op - } } 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 188f21600925..c2da72bb666e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -4539,7 +4539,10 @@ public class NotificationStackScrollLayout extends ViewGroup anim.start(); } } else if (mMenuExposedView instanceof ExpandableNotificationRow) { - ((ExpandableNotificationRow) mMenuExposedView).resetTranslation(); + ExpandableNotificationRow row = (ExpandableNotificationRow) mMenuExposedView; + if (!row.isRemoved()) { + row.resetTranslation(); + } } mMenuExposedView = null; } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java index f5447a293503..3ebefbb50fb9 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java @@ -31,8 +31,12 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.util.Log; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; +import android.view.Window; +import android.view.WindowManager; import android.widget.CheckBox; +import android.widget.Toast; import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertController; @@ -48,6 +52,10 @@ public class UsbDebuggingActivity extends AlertActivity @Override public void onCreate(Bundle icicle) { + Window window = getWindow(); + window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); + super.onCreate(icicle); if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0) { @@ -79,6 +87,29 @@ public class UsbDebuggingActivity extends AlertActivity ap.mView = checkbox; setupAlert(); + + // adding touch listener on affirmative button - checks if window is obscured + // if obscured, do not let user give permissions (could be tapjacking involved) + final View.OnTouchListener filterTouchListener = (View v, MotionEvent event) -> { + // Filter obscured touches by consuming them. + if (((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0) + || ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0)) { + if (event.getAction() == MotionEvent.ACTION_UP) { + Toast.makeText(v.getContext(), + R.string.touch_filtered_warning, + Toast.LENGTH_SHORT).show(); + } + return true; + } + return false; + }; + mAlert.getButton(BUTTON_POSITIVE).setOnTouchListener(filterTouchListener); + + } + + @Override + public void onWindowAttributesChanged(WindowManager.LayoutParams params) { + super.onWindowAttributesChanged(params); } private class UsbDisconnectedReceiver extends BroadcastReceiver { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 6e631fa9b926..694c72f2fe15 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -713,6 +713,8 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable { final boolean visible = mState.zenMode != Global.ZEN_MODE_OFF && (mAudioManager.isStreamAffectedByRingerMode(mActiveStream) || mExpanded) && !mZenPanel.isEditing(); + + TransitionManager.endTransitions(mDialogView); TransitionManager.beginDelayedTransition(mDialogView, getTransition()); if (wasVisible != visible && !visible) { prepareForCollapse(); @@ -840,6 +842,11 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable { row.icon.setContentDescription(getStreamLabelH(ss)); } + // ensure tracking is disabled if zenMuted + if (zenMuted) { + row.tracking = false; + } + // update slider final boolean enableSlider = !zenMuted; final int vlevel = row.ss.muted && (!isRingStream && !zenMuted) ? 0 diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenRadioLayout.java b/packages/SystemUI/src/com/android/systemui/volume/ZenRadioLayout.java index 5dbcd8a73aac..360907b0d22b 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenRadioLayout.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenRadioLayout.java @@ -46,9 +46,16 @@ public class ZenRadioLayout extends LinearLayout { throw new IllegalStateException("Expected matching children"); } boolean hasChanges = false; + View lastView = null; for (int i = 0; i < size; i++) { View radio = radioGroup.getChildAt(i); View content = radioContent.getChildAt(i); + if (lastView != null) { + radio.setAccessibilityTraversalAfter(lastView.getId()); + } + View contentClick = findFirstClickable(content); + if (contentClick != null) contentClick.setAccessibilityTraversalAfter(radio.getId()); + lastView = findLastClickable(content); if (radio.getLayoutParams().height != content.getMeasuredHeight()) { hasChanges = true; radio.getLayoutParams().height = content.getMeasuredHeight(); @@ -59,4 +66,28 @@ public class ZenRadioLayout extends LinearLayout { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } + + private View findFirstClickable(View content) { + if (content.isClickable()) return content; + if (content instanceof ViewGroup) { + ViewGroup group = (ViewGroup) content; + for (int i = 0; i < group.getChildCount(); i++) { + View v = findFirstClickable(group.getChildAt(i)); + if (v != null) return v; + } + } + return null; + } + + private View findLastClickable(View content) { + if (content.isClickable()) return content; + if (content instanceof ViewGroup) { + ViewGroup group = (ViewGroup) content; + for (int i = group.getChildCount() - 1; i >= 0; i--) { + View v = findLastClickable(group.getChildAt(i)); + if (v != null) return v; + } + } + return null; + } } diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml index adb3baf40bb3..67fae5bb0dfb 100644 --- a/packages/SystemUI/tests/AndroidManifest.xml +++ b/packages/SystemUI/tests/AndroidManifest.xml @@ -42,6 +42,7 @@ <uses-permission android:name="android.permission.TRUST_LISTENER" /> <uses-permission android:name="android.permission.USE_FINGERPRINT" /> <uses-permission android:name="android.permission.DEVICE_POWER" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> <application> <uses-library android:name="android.test.runner" /> diff --git a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java index d0f0bfd88883..6417eb706f7c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java +++ b/packages/SystemUI/tests/src/com/android/systemui/colorextraction/SysuiColorExtractorTests.java @@ -17,6 +17,7 @@ package com.android.systemui.colorextraction; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import android.app.WallpaperColors; import android.app.WallpaperManager; @@ -25,7 +26,6 @@ import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.internal.colorextraction.ColorExtractor; -import com.android.internal.colorextraction.types.Tonal; import com.android.systemui.SysuiTestCase; import org.junit.Test; @@ -48,18 +48,21 @@ public class SysuiColorExtractorTests extends SysuiTestCase { @Test public void getColors_usesGreyIfWallpaperNotVisible() { - SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), - new Tonal(getContext()), false); + ColorExtractor.GradientColors colors = new ColorExtractor.GradientColors(); + colors.setMainColor(Color.RED); + colors.setSecondaryColor(Color.RED); + + SysuiColorExtractor extractor = getTestableExtractor(colors); simulateEvent(extractor); extractor.setWallpaperVisible(false); ColorExtractor.GradientColors fallbackColors = extractor.getFallbackColors(); - for (int which : sWhich) { - for (int type : sTypes) { - assertEquals("Not using fallback!", extractor.getColors(which, type), - fallbackColors); - } + for (int type : sTypes) { + assertEquals("Not using fallback!", + extractor.getColors(WallpaperManager.FLAG_SYSTEM, type), fallbackColors); + assertNotEquals("Wallpaper visibility event should not affect lock wallpaper.", + extractor.getColors(WallpaperManager.FLAG_LOCK, type), fallbackColors); } } @@ -69,13 +72,7 @@ public class SysuiColorExtractorTests extends SysuiTestCase { colors.setMainColor(Color.RED); colors.setSecondaryColor(Color.RED); - SysuiColorExtractor extractor = new SysuiColorExtractor(getContext(), - (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark, - outGradientColorsExtraDark) -> { - outGradientColorsNormal.set(colors); - outGradientColorsDark.set(colors); - outGradientColorsExtraDark.set(colors); - }, false); + SysuiColorExtractor extractor = getTestableExtractor(colors); simulateEvent(extractor); extractor.setWallpaperVisible(true); @@ -87,6 +84,16 @@ public class SysuiColorExtractorTests extends SysuiTestCase { } } + private SysuiColorExtractor getTestableExtractor(ColorExtractor.GradientColors colors) { + return new SysuiColorExtractor(getContext(), + (inWallpaperColors, outGradientColorsNormal, outGradientColorsDark, + outGradientColorsExtraDark) -> { + outGradientColorsNormal.set(colors); + outGradientColorsDark.set(colors); + outGradientColorsExtraDark.set(colors); + }, false); + } + private void simulateEvent(SysuiColorExtractor extractor) { // Let's fake a color event extractor.onColorsChanged(new WallpaperColors(Color.valueOf(Color.GREEN), null, null, 0), diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java index c787eff8a6ec..521d2e342218 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java @@ -20,23 +20,22 @@ import static com.android.systemui.doze.DozeMachine.State.DOZE; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD; import static com.android.systemui.doze.DozeMachine.State.DOZE_PULSING; import static com.android.systemui.doze.DozeMachine.State.DOZE_REQUEST_PULSE; +import static com.android.systemui.doze.DozeMachine.State.FINISH; import static com.android.systemui.doze.DozeMachine.State.INITIALIZED; import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED; +import static com.android.systemui.utils.os.FakeHandler.Mode.QUEUEING; import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import android.os.Handler; import android.os.Looper; -import android.os.Message; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.Display; import com.android.systemui.SysuiTestCase; +import com.android.systemui.utils.os.FakeHandler; import org.junit.Before; import org.junit.Test; @@ -48,13 +47,13 @@ public class DozeScreenStateTest extends SysuiTestCase { DozeServiceFake mServiceFake; DozeScreenState mScreen; - private ImmediateHandler mHandler; + FakeHandler mHandlerFake; @Before public void setUp() throws Exception { mServiceFake = new DozeServiceFake(); - mHandler = spy(new ImmediateHandler(Looper.getMainLooper())); - mScreen = new DozeScreenState(mServiceFake, mHandler); + mHandlerFake = new FakeHandler(Looper.getMainLooper()); + mScreen = new DozeScreenState(mServiceFake, mHandlerFake); } @Test @@ -105,27 +104,34 @@ public class DozeScreenStateTest extends SysuiTestCase { } @Test - public void test_postedToHandler() { + public void test_initialScreenStatePostedToHandler() { + mHandlerFake.setMode(QUEUEING); + mScreen.transitionTo(UNINITIALIZED, INITIALIZED); + mServiceFake.screenStateSet = false; mScreen.transitionTo(INITIALIZED, DOZE_AOD); - verify(mHandler).sendMessageAtTime(any(), anyLong()); + assertFalse(mServiceFake.screenStateSet); + + mHandlerFake.dispatchQueuedMessages(); + + assertTrue(mServiceFake.screenStateSet); + assertEquals(Display.STATE_DOZE_SUSPEND, mServiceFake.screenState); } - private static class ImmediateHandler extends Handler { - - public ImmediateHandler(Looper looper) { - super(looper); - } - - @Override - public boolean sendMessageAtTime(Message msg, long uptimeMillis) { - Runnable callback = msg.getCallback(); - if (callback != null) { - callback.run(); - return false; - } - return super.sendMessageAtTime(msg, uptimeMillis); - } + @Test + public void test_noScreenStateSetAfterFinish() { + mHandlerFake.setMode(QUEUEING); + + mScreen.transitionTo(UNINITIALIZED, INITIALIZED); + mScreen.transitionTo(INITIALIZED, DOZE_AOD); + mScreen.transitionTo(DOZE_AOD, FINISH); + + mServiceFake.screenStateSet = false; + + mHandlerFake.dispatchQueuedMessages(); + + assertFalse(mServiceFake.screenStateSet); } + }
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java index 34026b0b6145..75f97a2efa8f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeServiceFake.java @@ -19,10 +19,16 @@ package com.android.systemui.doze; import android.os.PowerManager; import android.view.Display; +/** + * Fake implementation of {@link DozeMachine.Service} for tests. + * + * Useful instead of mocking because it allows verifying state instead of interactions. + */ public class DozeServiceFake implements DozeMachine.Service { public boolean finished; public int screenState; + public boolean screenStateSet; public boolean requestedWakeup; public int screenBrightness; @@ -38,6 +44,7 @@ public class DozeServiceFake implements DozeMachine.Service { @Override public void setDozeScreenState(int state) { screenState = state; + screenStateSet = true; } @Override @@ -53,6 +60,8 @@ public class DozeServiceFake implements DozeMachine.Service { public void reset() { finished = false; screenState = Display.STATE_UNKNOWN; + screenStateSet = false; + requestedWakeup = false; screenBrightness = PowerManager.BRIGHTNESS_DEFAULT; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java index bba982c3b060..b8e9fcd29096 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java @@ -26,6 +26,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; +import android.support.test.annotation.UiThreadTest; +import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -34,10 +36,11 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.annotations.ProvidesInterface; +import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.PluginManagerImpl.PluginInstanceManagerFactory; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java index a8487b3eff4e..4f98836eeec7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java @@ -29,6 +29,7 @@ import android.provider.Settings; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; import android.text.SpannableStringBuilder; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -395,6 +396,57 @@ public class QSSecurityFooterTest extends SysuiTestCase { mFooter.getVpnMessage(false, true, VPN_PACKAGE, null)); } + @Test + public void testConfigSubtitleVisibility() { + View view = LayoutInflater.from(mContext) + .inflate(R.layout.quick_settings_footer_dialog, null); + + // Device Management subtitle should be shown when there is Device Management section only + // Other sections visibility will be set somewhere else so it will not be tested here + mFooter.configSubtitleVisibility(true, false, false, false, view); + assertEquals(View.VISIBLE, + view.findViewById(R.id.device_management_subtitle).getVisibility()); + + // If there are multiple sections, all subtitles should be shown + mFooter.configSubtitleVisibility(true, true, false, false, view); + assertEquals(View.VISIBLE, + view.findViewById(R.id.device_management_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.ca_certs_subtitle).getVisibility()); + + // If there are multiple sections, all subtitles should be shown + mFooter.configSubtitleVisibility(true, true, true, true, view); + assertEquals(View.VISIBLE, + view.findViewById(R.id.device_management_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.ca_certs_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.network_logging_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.vpn_subtitle).getVisibility()); + + // If there are multiple sections, all subtitles should be shown, event if there is no + // Device Management section + mFooter.configSubtitleVisibility(false, true, true, true, view); + assertEquals(View.VISIBLE, + view.findViewById(R.id.ca_certs_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.network_logging_subtitle).getVisibility()); + assertEquals(View.VISIBLE, + view.findViewById(R.id.vpn_subtitle).getVisibility()); + + // If there is only 1 section, the title should be hidden + mFooter.configSubtitleVisibility(false, true, false, false, view); + assertEquals(View.GONE, + view.findViewById(R.id.ca_certs_subtitle).getVisibility()); + mFooter.configSubtitleVisibility(false, false, true, false, view); + assertEquals(View.GONE, + view.findViewById(R.id.network_logging_subtitle).getVisibility()); + mFooter.configSubtitleVisibility(false, false, false, true, view); + assertEquals(View.GONE, + view.findViewById(R.id.vpn_subtitle).getVisibility()); + } + private CharSequence addLink(CharSequence description) { final SpannableStringBuilder message = new SpannableStringBuilder(); message.append(description); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java index e7e6829e13cf..12a4399fab2e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java @@ -199,6 +199,18 @@ public class NotificationInflaterTest extends SysuiTestCase { runningTask.abort(); } + @Test + public void doesntReapplyDisallowedRemoteView() throws Exception { + mBuilder.setStyle(new Notification.MediaStyle()); + RemoteViews mediaView = mBuilder.createContentView(); + mBuilder.setStyle(new Notification.DecoratedCustomViewStyle()); + mBuilder.setCustomContentView(new RemoteViews(getContext().getPackageName(), + R.layout.custom_view_dark)); + RemoteViews decoratedMediaView = mBuilder.createContentView(); + Assert.assertFalse("The decorated media style doesn't allow a view to be reapplied!", + NotificationInflater.canReapplyRemoteView(mediaView, decoratedMediaView)); + } + public static void runThenWaitForInflation(Runnable block, NotificationInflater inflater) throws Exception { runThenWaitForInflation(block, false /* expectingException */, inflater); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index a706368a0880..ac367d20b5c8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -26,21 +26,19 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.Notification; import android.app.trust.TrustManager; +import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.metrics.LogMaker; +import android.os.Binder; import android.os.Handler; import android.os.HandlerThread; import android.os.IPowerManager; @@ -51,20 +49,25 @@ import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.support.test.filters.SmallTest; import android.support.test.metricshelper.MetricsAsserts; -import android.support.test.runner.AndroidJUnit4; import android.testing.AndroidTestingRunner; +import android.testing.LayoutInflaterBuilder; import android.testing.TestableLooper; import android.testing.TestableLooper.MessageHandler; import android.testing.TestableLooper.RunWithLooper; import android.util.DisplayMetrics; +import android.view.View; import android.view.ViewGroup.LayoutParams; +import android.widget.FrameLayout; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.keyguard.KeyguardHostView.OnDismissAction; +import com.android.keyguard.KeyguardStatusView; +import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.assist.AssistManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.ActivatableNotificationView; @@ -73,7 +76,11 @@ import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.NotificationData.Entry; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.DateView; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.KeyguardMonitorImpl; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import org.junit.Before; @@ -106,12 +113,20 @@ public class StatusBarTest extends SysuiTestCase { @Before public void setup() throws Exception { + mContext.setTheme(R.style.Theme_SystemUI_Light); + mDependency.injectMockDependency(AssistManager.class); + mDependency.injectMockDependency(DeviceProvisionedController.class); + mDependency.injectTestDependency(KeyguardMonitor.class, mock(KeyguardMonitorImpl.class)); + CommandQueue commandQueue = mock(CommandQueue.class); + when(commandQueue.asBinder()).thenReturn(new Binder()); + mContext.putComponent(CommandQueue.class, commandQueue); mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class)); mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class)); mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class); mUnlockMethodCache = mock(UnlockMethodCache.class); mKeyguardIndicationController = mock(KeyguardIndicationController.class); mStackScroller = mock(NotificationStackScrollLayout.class); + when(mStackScroller.generateLayoutParams(any())).thenReturn(new LayoutParams(0, 0)); mMetricsLogger = new FakeMetricsLogger(); mHeadsUpManager = mock(HeadsUpManager.class); mNotificationData = mock(NotificationData.class); @@ -133,6 +148,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView, mBarService); mStatusBar.mContext = mContext; + mStatusBar.mComponents = mContext.getComponents(); doAnswer(invocation -> { OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0]; onDismissAction.onDismiss(); @@ -484,6 +500,16 @@ public class StatusBarTest extends SysuiTestCase { mStatusBar.dump(null, new PrintWriter(new ByteArrayOutputStream()), null); } + @Test + @RunWithLooper(setAsMainLooper = true) + public void testUpdateKeyguardState_DoesNotCrash() { + mStatusBar.mStatusBarWindow = mock(StatusBarWindowView.class); + mStatusBar.mState = StatusBarState.KEYGUARD; + mStatusBar.mDozeScrimController = mock(DozeScrimController.class); + mStatusBar.mNotificationIconAreaController = mock(NotificationIconAreaController.class); + mStatusBar.updateKeyguardState(false, false); + } + static class TestableStatusBar extends StatusBar { public TestableStatusBar(StatusBarKeyguardViewManager man, UnlockMethodCache unlock, KeyguardIndicationController key, @@ -502,6 +528,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationPanel = panelView; mBarService = barService; mWakefulnessLifecycle = createAwakeWakefulnessLifecycle(); + mScrimController = mock(ScrimController.class); } private WakefulnessLifecycle createAwakeWakefulnessLifecycle() { @@ -511,6 +538,11 @@ public class StatusBarTest extends SysuiTestCase { return wakefulnessLifecycle; } + @Override + protected void updateTheme() { + // Do nothing for now, until we have more mocking and StatusBar is smaller. + } + public void setBarStateForTest(int state) { mState = state; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java index 4cc8bcae541a..4e7550b20659 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java @@ -137,4 +137,26 @@ public class BluetoothControllerImplTest extends SysuiTestCase { verify(callback).onBluetoothDevicesChanged(); mainLooper.destroy(); } + + @Test + public void testNullAsync_DoesNotCrash() throws Exception { + CachedBluetoothDevice device = mock(CachedBluetoothDevice.class); + when(device.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_CONNECTED); + BluetoothController.Callback callback = mock(BluetoothController.Callback.class); + mBluetoothControllerImpl.addCallback(callback); + + // Grab the main looper, we'll need it later. + TestableLooper mainLooper = new TestableLooper(Looper.getMainLooper()); + + try { + // Trigger the state getting. + assertEquals(BluetoothProfile.STATE_DISCONNECTED, + mBluetoothControllerImpl.getMaxConnectionState(null)); + + mTestableLooper.processMessages(1); + mainLooper.processAllMessages(); + } finally { + mainLooper.destroy(); + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java index d1b1c5b9a066..0a83a896dfaf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java @@ -14,6 +14,7 @@ package com.android.systemui.utils.leaks; +import android.content.Context; import android.testing.LeakCheck; import com.android.systemui.plugins.Plugin; diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/os/FakeHandler.java b/packages/SystemUI/tests/src/com/android/systemui/utils/os/FakeHandler.java new file mode 100644 index 000000000000..5a7d4b5e54b3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/os/FakeHandler.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2017 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.utils.os; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import java.util.ArrayList; + +/** + * A handler that allows control over when to dispatch messages and callbacks. + * + * WARNING: Because most Handler methods are final, the only thing this handler can intercept + * are sending messages and posting runnables, but *NOT* removing messages nor runnables. + * It also *CANNOT* intercept messages posted to the front of queue. + */ +public class FakeHandler extends Handler { + + private Mode mMode = Mode.IMMEDIATE; + private ArrayList<Message> mQueuedMessages = new ArrayList<>(); + + public FakeHandler(Looper looper) { + super(looper); + } + + @Override + public boolean sendMessageAtTime(Message msg, long uptimeMillis) { + mQueuedMessages.add(msg); + if (mMode == Mode.IMMEDIATE) { + dispatchQueuedMessages(); + } + return true; + } + + public void setMode(Mode mode) { + mMode = mode; + } + + /** + * Dispatch any messages that have been queued on the calling thread. + */ + public void dispatchQueuedMessages() { + ArrayList<Message> messages = new ArrayList<>(mQueuedMessages); + mQueuedMessages.clear(); + for (Message msg : messages) { + dispatchMessage(msg); + } + } + + public enum Mode { + /** Messages are dispatched immediately on the calling thread. */ + IMMEDIATE, + /** Messages are queued until {@link #dispatchQueuedMessages()} is called. */ + QUEUEING, + } +} diff --git a/packages/VpnDialogs/res/values-en-rCA/strings.xml b/packages/VpnDialogs/res/values-en-rCA/strings.xml new file mode 100644 index 000000000000..2c93c781b1ca --- /dev/null +++ b/packages/VpnDialogs/res/values-en-rCA/strings.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="prompt" msgid="3183836924226407828">"Connection request"</string> + <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> wants to set up a VPN connection that allows it to monitor network traffic. Only accept if you trust the source. <br /> <br /> <img src=vpn_icon /> appears at the top of your screen when VPN is active."</string> + <string name="legacy_title" msgid="192936250066580964">"VPN is connected"</string> + <string name="configure" msgid="4905518375574791375">"Configure"</string> + <string name="disconnect" msgid="971412338304200056">"Disconnect"</string> + <string name="session" msgid="6470628549473641030">"Session:"</string> + <string name="duration" msgid="3584782459928719435">"Duration:"</string> + <string name="data_transmitted" msgid="7988167672982199061">"Sent:"</string> + <string name="data_received" msgid="4062776929376067820">"Received:"</string> + <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> bytes / <xliff:g id="NUMBER_1">%2$s</xliff:g> packets"</string> +</resources> diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 8d7afc23c6a8..0c787dbfc316 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -62,6 +62,14 @@ message MetricsEvent { // The action failed TYPE_FAILURE = 11; + + // Type for APP_TRANSITION_REPORTED_DRAWN event: The activity was started without restoring from + // a bundle. + TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE = 12; + + // Type for APP_TRANSITION_REPORTED_DRAWN event: The activity was started with restoring from + // a bundle. + TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE = 13; } // Types of alerts, as bit field values @@ -4265,6 +4273,14 @@ message MetricsEvent { // FIELD: The numeric preference value (of type int) when it is changed in Settings FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE = 1089; + // ACTION: Logged when the app has notified that it has fully drawn. See + // Activity.reportFullyDrawn(). + APP_TRANSITION_REPORTED_DRAWN = 1090; + + // FIELD: The delay of the activity reporting to be fully drawn measured from the beginning of + // the app transition. + APP_TRANSITION_REPORTED_DRAWN_MS = 1091; + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index a59844d2462b..a97e16be1498 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -19,6 +19,8 @@ package com.android.server.accessibility; import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS; import android.Manifest; import android.accessibilityservice.AccessibilityService; @@ -27,6 +29,7 @@ import android.accessibilityservice.GestureDescription; import android.accessibilityservice.IAccessibilityServiceClient; import android.accessibilityservice.IAccessibilityServiceConnection; import android.annotation.NonNull; +import android.app.ActivityManagerInternal; import android.app.AlertDialog; import android.app.PendingIntent; import android.app.StatusBarManager; @@ -847,7 +850,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (resolvedUserId != mCurrentUserId) { return null; } - if (mSecurityPolicy.findWindowById(windowId) == null) { + if (mSecurityPolicy.findA11yWindowInfoById(windowId) == null) { return null; } IBinder token = mGlobalWindowTokens.get(windowId); @@ -3010,7 +3013,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (!permissionGranted) { return null; } - AccessibilityWindowInfo window = mSecurityPolicy.findWindowById(windowId); + AccessibilityWindowInfo window = mSecurityPolicy.findA11yWindowInfoById(windowId); if (window != null) { AccessibilityWindowInfo windowClone = AccessibilityWindowInfo.obtain(window); windowClone.setConnectionId(mId); @@ -3332,31 +3335,30 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; + IBinder activityToken = null; synchronized (mLock) { if (!isCalledForCurrentUserLocked()) { return false; } resolvedWindowId = resolveAccessibilityWindowIdLocked(accessibilityWindowId); - final boolean permissionGranted = mSecurityPolicy.canGetAccessibilityNodeInfoLocked( - this, resolvedWindowId); - if (!permissionGranted) { + if (!mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, resolvedWindowId)) { return false; - } else { - connection = getConnectionLocked(resolvedWindowId); - if (connection == null) { - return false; - } - AccessibilityWindowInfo windowInfo = - mSecurityPolicy.findWindowById(resolvedWindowId); - if ((windowInfo != null) && windowInfo.inPictureInPicture()) { - boolean isA11yFocusAction = - (action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS) - || (action == - AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS); - if ((mPictureInPictureActionReplacingConnection != null) - && !isA11yFocusAction) { - connection = mPictureInPictureActionReplacingConnection.mConnection; - } + } + connection = getConnectionLocked(resolvedWindowId); + if (connection == null) return false; + final boolean isA11yFocusAction = (action == ACTION_ACCESSIBILITY_FOCUS) + || (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS); + final AccessibilityWindowInfo a11yWindowInfo = + mSecurityPolicy.findA11yWindowInfoById(resolvedWindowId); + if (!isA11yFocusAction) { + final WindowInfo windowInfo = + mSecurityPolicy.findWindowInfoById(resolvedWindowId); + if (windowInfo != null) activityToken = windowInfo.activityToken; + } + if ((a11yWindowInfo != null) && a11yWindowInfo.inPictureInPicture()) { + if ((mPictureInPictureActionReplacingConnection != null) + && !isA11yFocusAction) { + connection = mPictureInPictureActionReplacingConnection.mConnection; } } } @@ -3368,6 +3370,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mPowerManager.userActivity(SystemClock.uptimeMillis(), PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY, 0); + if (activityToken != null) { + LocalServices.getService(ActivityManagerInternal.class) + .setFocusedActivity(activityToken); + } connection.performAccessibilityAction(accessibilityNodeId, action, arguments, interactionId, callback, mFetchFlags, interrogatingPid, interrogatingTid); } catch (RemoteException re) { @@ -4072,7 +4078,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { IAccessibilityInteractionConnectionCallback originalCallback, int resolvedWindowId, int interactionId, int interrogatingPid, long interrogatingTid) { - AccessibilityWindowInfo windowInfo = mSecurityPolicy.findWindowById(resolvedWindowId); + AccessibilityWindowInfo windowInfo = + mSecurityPolicy.findA11yWindowInfoById(resolvedWindowId); if ((windowInfo == null) || !windowInfo.inPictureInPicture() || (mPictureInPictureActionReplacingConnection == null)) { return originalCallback; @@ -4193,24 +4200,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { @Override public void onWindowsForAccessibilityChanged(List<WindowInfo> windows) { synchronized (mLock) { - // Populate the windows to report. - List<AccessibilityWindowInfo> reportedWindows = new ArrayList<>(); - final int receivedWindowCount = windows.size(); - for (int i = 0; i < receivedWindowCount; i++) { - WindowInfo receivedWindow = windows.get(i); - AccessibilityWindowInfo reportedWindow = populateReportedWindow( - receivedWindow); - if (reportedWindow != null) { - reportedWindows.add(reportedWindow); - } - } - if (DEBUG) { - Slog.i(LOG_TAG, "Windows changed: " + reportedWindows); + Slog.i(LOG_TAG, "Windows changed: " + windows); } // Let the policy update the focused and active windows. - mSecurityPolicy.updateWindowsLocked(reportedWindows); + mSecurityPolicy.updateWindowsLocked(windows); // Someone may be waiting for the windows - advertise it. mLock.notifyAll(); @@ -4432,7 +4427,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { // In Z order public List<AccessibilityWindowInfo> mWindows; - public SparseArray<AccessibilityWindowInfo> mWindowsById = new SparseArray<>(); + public SparseArray<AccessibilityWindowInfo> mA11yWindowInfoById = new SparseArray<>(); + public SparseArray<WindowInfo> mWindowInfoById = new SparseArray<>(); public int mActiveWindowId = INVALID_WINDOW_ID; public int mFocusedWindowId = INVALID_WINDOW_ID; @@ -4476,14 +4472,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } public void clearWindowsLocked() { - List<AccessibilityWindowInfo> windows = Collections.emptyList(); + List<WindowInfo> windows = Collections.emptyList(); final int activeWindowId = mActiveWindowId; updateWindowsLocked(windows); mActiveWindowId = activeWindowId; mWindows = null; } - public void updateWindowsLocked(List<AccessibilityWindowInfo> windows) { + public void updateWindowsLocked(List<WindowInfo> windows) { if (mWindows == null) { mWindows = new ArrayList<>(); } @@ -4492,7 +4488,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { for (int i = oldWindowCount - 1; i >= 0; i--) { mWindows.remove(i).recycle(); } - mWindowsById.clear(); + mA11yWindowInfoById.clear(); + + for (int i = 0; i < mWindowInfoById.size(); i++) { + mWindowInfoById.valueAt(i).recycle(); + } + mWindowInfoById.clear(); mFocusedWindowId = INVALID_WINDOW_ID; if (!mTouchInteractionInProgress) { @@ -4509,19 +4510,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { final int windowCount = windows.size(); if (windowCount > 0) { for (int i = 0; i < windowCount; i++) { - AccessibilityWindowInfo window = windows.get(i); - final int windowId = window.getId(); - if (window.isFocused()) { - mFocusedWindowId = windowId; - if (!mTouchInteractionInProgress) { - mActiveWindowId = windowId; - window.setActive(true); - } else if (windowId == mActiveWindowId) { - activeWindowGone = false; + WindowInfo windowInfo = windows.get(i); + AccessibilityWindowInfo window = (mWindowsForAccessibilityCallback != null) + ? mWindowsForAccessibilityCallback.populateReportedWindow(windowInfo) + : null; + if (window != null) { + final int windowId = window.getId(); + if (window.isFocused()) { + mFocusedWindowId = windowId; + if (!mTouchInteractionInProgress) { + mActiveWindowId = windowId; + window.setActive(true); + } else if (windowId == mActiveWindowId) { + activeWindowGone = false; + } } + mWindows.add(window); + mA11yWindowInfoById.put(windowId, window); + mWindowInfoById.put(windowId, WindowInfo.obtain(windowInfo)); } - mWindows.add(window); - mWindowsById.put(windowId, window); } if (mTouchInteractionInProgress && activeWindowGone) { @@ -4530,7 +4537,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { // Focused window may change the active one, so set the // active window once we decided which it is. - for (int i = 0; i < windowCount; i++) { + final int accessibilityWindowCount = mWindows.size(); + for (int i = 0; i < accessibilityWindowCount; i++) { AccessibilityWindowInfo window = mWindows.get(i); if (window.getId() == mActiveWindowId) { window.setActive(true); @@ -4833,11 +4841,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (windowId == mActiveWindowId) { return true; } - return findWindowById(windowId) != null; + return findA11yWindowInfoById(windowId) != null; + } + + private AccessibilityWindowInfo findA11yWindowInfoById(int windowId) { + return mA11yWindowInfoById.get(windowId); } - private AccessibilityWindowInfo findWindowById(int windowId) { - return mWindowsById.get(windowId); + private WindowInfo findWindowInfoById(int windowId) { + return mWindowInfoById.get(windowId); } private AccessibilityWindowInfo getPictureInPictureWindow() { diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java index 5e25dfa49d70..dd980535f628 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java @@ -290,7 +290,7 @@ final class RemoteFillService implements DeathRecipient { } private void dispatchOnFillRequestFailure(PendingRequest pendingRequest, - CharSequence message) { + @Nullable CharSequence message) { mHandler.getHandler().post(() -> { if (handleResponseCallbackCommon(pendingRequest)) { mCallbacks.onFillRequestFailure(message, mComponentName.getPackageName()); @@ -298,6 +298,16 @@ final class RemoteFillService implements DeathRecipient { }); } + private void dispatchOnFillTimeout(@NonNull ICancellationSignal cancellationSignal) { + mHandler.getHandler().post(() -> { + try { + cancellationSignal.cancel(); + } catch (RemoteException e) { + Slog.w(LOG_TAG, "Error calling cancellation signal: " + e); + } + }); + } + private void dispatchOnSaveRequestSuccess(PendingRequest pendingRequest) { mHandler.getHandler().post(() -> { if (handleResponseCallbackCommon(pendingRequest)) { @@ -307,7 +317,7 @@ final class RemoteFillService implements DeathRecipient { } private void dispatchOnSaveRequestFailure(PendingRequest pendingRequest, - CharSequence message) { + @Nullable CharSequence message) { mHandler.getHandler().post(() -> { if (handleResponseCallbackCommon(pendingRequest)) { mCallbacks.onSaveRequestFailure(message, mComponentName.getPackageName()); @@ -432,7 +442,7 @@ final class RemoteFillService implements DeathRecipient { if (remoteService != null) { Slog.w(LOG_TAG, getClass().getSimpleName() + " timed out after " + TIMEOUT_REMOTE_REQUEST_MILLIS + " ms"); - fail(remoteService); + onTimeout(remoteService); } }; mServiceHandler.postAtTime(mTimeoutTrigger, @@ -485,7 +495,7 @@ final class RemoteFillService implements DeathRecipient { * Called by the self-destructure timeout when the AutofilllService didn't reply to the * request on time. */ - abstract void fail(RemoteFillService remoteService); + abstract void onTimeout(RemoteFillService remoteService); /** * @return whether this request leads to a final state where no @@ -549,7 +559,16 @@ final class RemoteFillService implements DeathRecipient { } @Override - void fail(RemoteFillService remoteService) { + void onTimeout(RemoteFillService remoteService) { + // NOTE: Must make these 2 calls asynchronously, because the cancellation signal is + // handled by the service, which could block. + final ICancellationSignal cancellation; + synchronized (mLock) { + cancellation = mCancellation; + } + if (cancellation != null) { + remoteService.dispatchOnFillTimeout(cancellation); + } remoteService.dispatchOnFillRequestFailure(PendingFillRequest.this, null); } @@ -571,7 +590,10 @@ final class RemoteFillService implements DeathRecipient { public boolean cancel() { if (!super.cancel()) return false; - final ICancellationSignal cancellation = mCancellation; + final ICancellationSignal cancellation; + synchronized (mLock) { + cancellation = mCancellation; + } if (cancellation != null) { try { cancellation.cancel(); @@ -617,7 +639,7 @@ final class RemoteFillService implements DeathRecipient { } @Override - void fail(RemoteFillService remoteService) { + void onTimeout(RemoteFillService remoteService) { remoteService.dispatchOnSaveRequestFailure(PendingSaveRequest.this, null); } @@ -630,7 +652,7 @@ final class RemoteFillService implements DeathRecipient { } catch (RemoteException e) { Slog.e(LOG_TAG, "Error calling on save request", e); - remoteService.dispatchOnFillRequestFailure(PendingSaveRequest.this, null); + remoteService.dispatchOnSaveRequestFailure(PendingSaveRequest.this, null); } } } diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java index 035186525ae0..3727c6eb0e6c 100644 --- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java @@ -209,9 +209,6 @@ final class SaveUi { final View yesButton = view.findViewById(R.id.autofill_save_yes); yesButton.setOnClickListener((v) -> mListener.onSave()); - final View closeButton = view.findViewById(R.id.autofill_save_close); - closeButton.setOnClickListener(cancelListener); - mDialog = new Dialog(context, R.style.Theme_DeviceDefault_Light_Panel); mDialog.setContentView(view); diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index cb4beccaa205..29d562b17deb 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -119,6 +119,7 @@ import android.util.StringBuilderPrinter; import com.android.internal.annotations.GuardedBy; import com.android.internal.backup.IBackupTransport; import com.android.internal.backup.IObbBackupService; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.server.AppWidgetBackupBridge; import com.android.server.EventLogTags; @@ -8416,7 +8417,19 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF // ----- Restore handling ----- - // Old style: directly match the stored vs on device signature blocks + /** + * Returns whether the signatures stored {@param storedSigs}, coming from the source apk, match + * the signatures of the apk installed on the device, the target apk. If the target resides in + * the system partition we return true. Otherwise it's considered a match if both conditions + * hold: + * + * <ul> + * <li>Source and target have at least one signature each + * <li>Target contains all signatures in source + * </ul> + * + * Note that if {@param target} is null we return false. + */ static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null) { return false; @@ -8428,26 +8441,24 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF // partition will be signed with the device's platform certificate, so on // different phones the same system app will have different signatures.) if ((target.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - if (MORE_DEBUG) Slog.v(TAG, "System app " + target.packageName + " - skipping sig check"); + if (MORE_DEBUG) { + Slog.v(TAG, "System app " + target.packageName + " - skipping sig check"); + } return true; } - // Allow unsigned apps, but not signed on one device and unsigned on the other - // !!! TODO: is this the right policy? Signature[] deviceSigs = target.signatures; - if (MORE_DEBUG) Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs - + " device=" + deviceSigs); - if ((storedSigs == null || storedSigs.length == 0) - && (deviceSigs == null || deviceSigs.length == 0)) { - return true; + if (MORE_DEBUG) { + Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceSigs); } - if (storedSigs == null || deviceSigs == null) { + + // Don't allow unsigned apps on either end + if (ArrayUtils.isEmpty(storedSigs) || ArrayUtils.isEmpty(deviceSigs)) { return false; } - // !!! TODO: this demands that every stored signature match one - // that is present on device, and does not demand the converse. - // Is this this right policy? + // Signatures can be added over time, so the target-device apk needs to contain all the + // source-device apk signatures, but not necessarily the other way around. int nStored = storedSigs.length; int nDevice = deviceSigs.length; diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java index c033d98e3896..4abf18add469 100644 --- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java @@ -26,6 +26,8 @@ import android.content.pm.Signature; import android.os.Process; import android.util.Slog; +import com.android.internal.util.ArrayUtils; + /** * Utility methods wrapping operations on ApplicationInfo and PackageInfo. */ @@ -91,9 +93,18 @@ public class AppBackupUtils { } /** - * Old style: directly match the stored vs on device signature blocks. + * Returns whether the signatures stored {@param storedSigs}, coming from the source apk, match + * the signatures of the apk installed on the device, the target apk. If the target resides in + * the system partition we return true. Otherwise it's considered a match if both conditions + * hold: + * + * <ul> + * <li>Source and target have at least one signature each + * <li>Target contains all signatures in source + * </ul> + * + * Note that if {@param target} is null we return false. */ - // TODO(b/37977154): Resolve questionable policies. public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null) { return false; @@ -111,24 +122,18 @@ public class AppBackupUtils { return true; } - // Allow unsigned apps, but not signed on one device and unsigned on the other - // TODO(b/37977154): is this the right policy? Signature[] deviceSigs = target.signatures; if (MORE_DEBUG) { Slog.v(TAG, "signaturesMatch(): stored=" + storedSigs + " device=" + deviceSigs); } - if ((storedSigs == null || storedSigs.length == 0) - && (deviceSigs == null || deviceSigs.length == 0)) { - return true; - } - // TODO(b/37977154): This allows empty stored signature, is this right? - if (storedSigs == null || deviceSigs == null) { + + // Don't allow unsigned apps on either end + if (ArrayUtils.isEmpty(storedSigs) || ArrayUtils.isEmpty(deviceSigs)) { return false; } - // TODO(b/37977154): this demands that every stored signature match one - // that is present on device, and does not demand the converse. - // Is this this right policy? + // Signatures can be added over time, so the target-device apk needs to contain all the + // source-device apk signatures, but not necessarily the other way around. int nStored = storedSigs.length; int nDevice = deviceSigs.length; diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index be4d1064ec9c..d1cf0255b18c 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -850,6 +850,7 @@ class AlarmManagerService extends SystemService { static final class InFlight { final PendingIntent mPendingIntent; + final long mWhenElapsed; final IBinder mListener; final WorkSource mWorkSource; final int mUid; @@ -862,6 +863,7 @@ class AlarmManagerService extends SystemService { WorkSource workSource, int uid, String alarmPkg, int alarmType, String tag, long nowELAPSED) { mPendingIntent = pendingIntent; + mWhenElapsed = nowELAPSED; mListener = listener != null ? listener.asBinder() : null; mWorkSource = workSource; mUid = uid; @@ -883,6 +885,7 @@ class AlarmManagerService extends SystemService { public String toString() { return "InFlight{" + "pendingIntent=" + mPendingIntent + + ", when=" + mWhenElapsed + ", workSource=" + mWorkSource + ", uid=" + mUid + ", tag=" + mTag @@ -1567,8 +1570,10 @@ class AlarmManagerService extends SystemService { pw.println(); pw.print(" Broadcast ref count: "); pw.println(mBroadcastRefCount); - pw.print(" PendingIntent send/finish count: "); pw.println(mSendCount); - pw.print(" Listener send/complete count: "); pw.println(mListenerCount); + pw.print(" PendingIntent send count: "); pw.println(mSendCount); + pw.print(" PendingIntent finish count: "); pw.println(mSendFinishCount); + pw.print(" Listener send count: "); pw.println(mListenerCount); + pw.print(" Listener finish count: "); pw.println(mListenerFinishCount); pw.println(); if (mInFlight.size() > 0) { @@ -2949,7 +2954,11 @@ class AlarmManagerService extends SystemService { @GuardedBy("mLock") private int mSendCount = 0; @GuardedBy("mLock") + private int mSendFinishCount = 0; + @GuardedBy("mLock") private int mListenerCount = 0; + @GuardedBy("mLock") + private int mListenerFinishCount = 0; class DeliveryTracker extends IAlarmCompleteListener.Stub implements PendingIntent.OnFinished { @@ -3054,7 +3063,7 @@ class AlarmManagerService extends SystemService { Slog.i(TAG, "alarmComplete() from " + who); } updateTrackingLocked(inflight); - mListenerCount--; + mListenerFinishCount++; } else { // Delivery timed out, and the timeout handling already took care of // updating our tracking here, so we needn't do anything further. @@ -3075,7 +3084,7 @@ class AlarmManagerService extends SystemService { public void onSendFinished(PendingIntent pi, Intent intent, int resultCode, String resultData, Bundle resultExtras) { synchronized (mLock) { - mSendCount--; + mSendFinishCount++; updateTrackingLocked(removeLocked(pi, intent)); } } @@ -3092,7 +3101,7 @@ class AlarmManagerService extends SystemService { Slog.i(TAG, "Alarm listener " + who + " timed out in delivery"); } updateTrackingLocked(inflight); - mListenerCount--; + mListenerFinishCount++; } else { if (DEBUG_LISTENER_CALLBACK) { Slog.i(TAG, "Spurious timeout of listener " + who); @@ -3125,7 +3134,7 @@ class AlarmManagerService extends SystemService { // 'finished' callback won't be invoked. We also don't need // to do any wakelock or stats tracking, so we have nothing // left to do here but go on to the next thing. - mSendCount--; + mSendFinishCount++; return; } } else { @@ -3150,6 +3159,7 @@ class AlarmManagerService extends SystemService { // alarm was not possible, so we have no wakelock or timeout or // stats management to do. It threw before we posted the delayed // timeout message, so we're done here. + mListenerFinishCount++; return; } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index ac41079e5237..ec83a03f8aff 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4582,11 +4582,15 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private void updateCapabilities( int oldScore, NetworkAgentInfo nai, NetworkCapabilities networkCapabilities) { - // Sanity check: a NetworkAgent should not change its static capabilities or parameters. - if (nai.everConnected) { + // Once a NetworkAgent is connected, complain if some immutable capabilities are removed. + if (nai.everConnected && !nai.networkCapabilities.satisfiedByImmutableNetworkCapabilities( + networkCapabilities)) { + // TODO: consider not complaining when a network agent degrade its capabilities if this + // does not cause any request (that is not a listen) currently matching that agent to + // stop being matched by the updated agent. String diff = nai.networkCapabilities.describeImmutableDifferences(networkCapabilities); if (!TextUtils.isEmpty(diff)) { - Slog.wtf(TAG, "BUG: " + nai + " changed immutable capabilities:" + diff); + Slog.wtf(TAG, "BUG: " + nai + " lost immutable capabilities:" + diff); } } diff --git a/services/core/java/com/android/server/DropBoxManagerService.java b/services/core/java/com/android/server/DropBoxManagerService.java index 1bf12c4f86f0..887de74f1cf9 100644 --- a/services/core/java/com/android/server/DropBoxManagerService.java +++ b/services/core/java/com/android/server/DropBoxManagerService.java @@ -16,6 +16,7 @@ package com.android.server; +import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -70,6 +71,7 @@ public final class DropBoxManagerService extends SystemService { private static final String TAG = "DropBoxManagerService"; private static final int DEFAULT_AGE_SECONDS = 3 * 86400; private static final int DEFAULT_MAX_FILES = 1000; + private static final int DEFAULT_MAX_FILES_LOWRAM = 300; private static final int DEFAULT_QUOTA_KB = 5 * 1024; private static final int DEFAULT_QUOTA_PERCENT = 10; private static final int DEFAULT_RESERVE_PERCENT = 10; @@ -106,6 +108,8 @@ public final class DropBoxManagerService extends SystemService { // Provide a way to perform sendBroadcast asynchronously to avoid deadlocks. private final Handler mHandler; + private int mMaxFiles = -1; // -1 means uninitialized. + /** Receives events that might indicate a need to clean up files. */ private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override @@ -394,6 +398,7 @@ public final class DropBoxManagerService extends SystemService { } out.append("Drop box contents: ").append(mAllFiles.contents.size()).append(" entries\n"); + out.append("Max entries: ").append(mMaxFiles).append("\n"); if (!searchArgs.isEmpty()) { out.append("Searching for:"); @@ -819,12 +824,16 @@ public final class DropBoxManagerService extends SystemService { int ageSeconds = Settings.Global.getInt(mContentResolver, Settings.Global.DROPBOX_AGE_SECONDS, DEFAULT_AGE_SECONDS); - int maxFiles = Settings.Global.getInt(mContentResolver, - Settings.Global.DROPBOX_MAX_FILES, DEFAULT_MAX_FILES); + mMaxFiles = Settings.Global.getInt(mContentResolver, + Settings.Global.DROPBOX_MAX_FILES, + (ActivityManager.isLowRamDeviceStatic() + ? DEFAULT_MAX_FILES_LOWRAM : DEFAULT_MAX_FILES)); long cutoffMillis = System.currentTimeMillis() - ageSeconds * 1000; while (!mAllFiles.contents.isEmpty()) { EntryFile entry = mAllFiles.contents.first(); - if (entry.timestampMillis > cutoffMillis && mAllFiles.contents.size() < maxFiles) break; + if (entry.timestampMillis > cutoffMillis && mAllFiles.contents.size() < mMaxFiles) { + break; + } FileList tag = mFilesByTag.get(entry.tag); if (tag != null && tag.contents.remove(entry)) tag.blocks -= entry.blocks; diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index ac4423dbba6b..1854e2b740f4 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -34,6 +34,7 @@ import static android.net.NetworkPolicyManager.FIREWALL_RULE_DENY; import static android.net.NetworkPolicyManager.FIREWALL_TYPE_BLACKLIST; import static android.net.NetworkPolicyManager.FIREWALL_TYPE_WHITELIST; import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_ALL; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; @@ -66,6 +67,7 @@ import android.net.NetworkStats; import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.UidRange; +import android.net.util.NetdService; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.KeyMgmt; import android.os.BatteryStats; @@ -361,7 +363,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub if (DBG) Slog.d(TAG, "Awaiting socket connection"); connectedSignal.await(); if (DBG) Slog.d(TAG, "Connected"); + if (DBG) Slog.d(TAG, "Connecting native netd service"); service.connectNativeNetdService(); + if (DBG) Slog.d(TAG, "Connected"); return service; } @@ -547,6 +551,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + @Override + public void tetherLimitReached(ITetheringStatsProvider provider) { + mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); + synchronized(mTetheringStatsProviders) { + if (!mTetheringStatsProviders.containsKey(provider)) { + return; + } + // No current code examines the interface parameter in a global alert. Just pass null. + notifyLimitReached(LIMIT_GLOBAL_ALERT, null); + } + } + // Sync the state of the given chain with the native daemon. private void syncFirewallChainLocked(int chain, String name) { SparseIntArray rules; @@ -573,14 +589,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub } private void connectNativeNetdService() { - boolean nativeServiceAvailable = false; - try { - mNetdService = INetd.Stub.asInterface(ServiceManager.getService(NETD_SERVICE_NAME)); - nativeServiceAvailable = mNetdService.isAlive(); - } catch (RemoteException e) {} - if (!nativeServiceAvailable) { - Slog.wtf(TAG, "Can't connect to NativeNetdService " + NETD_SERVICE_NAME); - } + mNetdService = NetdService.get(); } /** @@ -593,36 +602,30 @@ public class NetworkManagementService extends INetworkManagementService.Stub // only enable bandwidth control when support exists final boolean hasKernelSupport = new File("/proc/net/xt_qtaguid/ctrl").exists(); - if (hasKernelSupport) { - Slog.d(TAG, "enabling bandwidth control"); - try { - mConnector.execute("bandwidth", "enable"); - mBandwidthControlEnabled = true; - } catch (NativeDaemonConnectorException e) { - Log.wtf(TAG, "problem enabling bandwidth controls", e); - } - } else { - Slog.i(TAG, "not enabling bandwidth control"); - } - SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0"); + // push any existing quota or UID rules + synchronized (mQuotaLock) { - if (mBandwidthControlEnabled) { - try { - getBatteryStats().noteNetworkStatsEnabled(); - } catch (RemoteException e) { + if (hasKernelSupport) { + Slog.d(TAG, "enabling bandwidth control"); + try { + mConnector.execute("bandwidth", "enable"); + mBandwidthControlEnabled = true; + } catch (NativeDaemonConnectorException e) { + Log.wtf(TAG, "problem enabling bandwidth controls", e); + } + } else { + Slog.i(TAG, "not enabling bandwidth control"); } - } - try { - mConnector.execute("strict", "enable"); - mStrictEnabled = true; - } catch (NativeDaemonConnectorException e) { - Log.wtf(TAG, "Failed strict enable", e); - } + SystemProperties.set(PROP_QTAGUID_ENABLED, mBandwidthControlEnabled ? "1" : "0"); - // push any existing quota or UID rules - synchronized (mQuotaLock) { + try { + mConnector.execute("strict", "enable"); + mStrictEnabled = true; + } catch (NativeDaemonConnectorException e) { + Log.wtf(TAG, "Failed strict enable", e); + } setDataSaverModeEnabled(mDataSaverMode); @@ -701,6 +704,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } } + + if (mBandwidthControlEnabled) { + try { + getBatteryStats().noteNetworkStatsEnabled(); + } catch (RemoteException e) { + } + } + } /** @@ -1569,6 +1580,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } + + synchronized (mTetheringStatsProviders) { + for (ITetheringStatsProvider provider : mTetheringStatsProviders.keySet()) { + try { + provider.setInterfaceQuota(iface, quotaBytes); + } catch (RemoteException e) { + Log.e(TAG, "Problem setting tethering data limit on provider " + + mTetheringStatsProviders.get(provider) + ": " + e); + } + } + } } } @@ -1595,6 +1617,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } + + synchronized (mTetheringStatsProviders) { + for (ITetheringStatsProvider provider : mTetheringStatsProviders.keySet()) { + try { + provider.setInterfaceQuota(iface, ITetheringStatsProvider.QUOTA_UNLIMITED); + } catch (RemoteException e) { + Log.e(TAG, "Problem removing tethering data limit on provider " + + mTetheringStatsProviders.get(provider) + ": " + e); + } + } + } } } @@ -1757,6 +1790,30 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + private void applyUidCleartextNetworkPolicy(int uid, int policy) { + final String policyString; + switch (policy) { + case StrictMode.NETWORK_POLICY_ACCEPT: + policyString = "accept"; + break; + case StrictMode.NETWORK_POLICY_LOG: + policyString = "log"; + break; + case StrictMode.NETWORK_POLICY_REJECT: + policyString = "reject"; + break; + default: + throw new IllegalArgumentException("Unknown policy " + policy); + } + + try { + mConnector.execute("strict", "set_uid_cleartext_policy", uid, policyString); + mUidCleartextPolicy.put(uid, policy); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + @Override public void setUidCleartextNetworkPolicy(int uid, int policy) { if (Binder.getCallingUid() != uid) { @@ -1766,6 +1823,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub synchronized (mQuotaLock) { final int oldPolicy = mUidCleartextPolicy.get(uid, StrictMode.NETWORK_POLICY_ACCEPT); if (oldPolicy == policy) { + // This also ensures we won't needlessly apply an ACCEPT policy if we've just + // enabled strict and the underlying iptables rules are empty. return; } @@ -1776,27 +1835,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub return; } - final String policyString; - switch (policy) { - case StrictMode.NETWORK_POLICY_ACCEPT: - policyString = "accept"; - break; - case StrictMode.NETWORK_POLICY_LOG: - policyString = "log"; - break; - case StrictMode.NETWORK_POLICY_REJECT: - policyString = "reject"; - break; - default: - throw new IllegalArgumentException("Unknown policy " + policy); + // netd does not keep state on strict mode policies, and cannot replace a non-accept + // policy without deleting it first. Rather than add state to netd, just always send + // it an accept policy when switching between two non-accept policies. + // TODO: consider keeping state in netd so we can simplify this code. + if (oldPolicy != StrictMode.NETWORK_POLICY_ACCEPT && + policy != StrictMode.NETWORK_POLICY_ACCEPT) { + applyUidCleartextNetworkPolicy(uid, StrictMode.NETWORK_POLICY_ACCEPT); } - try { - mConnector.execute("strict", "set_uid_cleartext_policy", uid, policyString); - mUidCleartextPolicy.put(uid, policy); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); - } + applyUidCleartextNetworkPolicy(uid, policy); } } @@ -1818,7 +1866,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub { @Override - public NetworkStats getTetherStats() { + public NetworkStats getTetherStats(int how) { + // We only need to return per-UID stats. Per-device stats are already counted by + // interface counters. + if (how != STATS_PER_UID) { + return new NetworkStats(SystemClock.elapsedRealtime(), 0); + } + final NativeDaemonEvent[] events; try { events = mConnector.executeForList("bandwidth", "gettetherstats"); @@ -1853,17 +1907,22 @@ public class NetworkManagementService extends INetworkManagementService.Stub } return stats; } + + @Override + public void setInterfaceQuota(String iface, long quotaBytes) { + // Do nothing. netd is already informed of quota changes in setInterfaceQuota. + } } @Override - public NetworkStats getNetworkStatsTethering() { + public NetworkStats getNetworkStatsTethering(int how) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); synchronized (mTetheringStatsProviders) { for (ITetheringStatsProvider provider: mTetheringStatsProviders.keySet()) { try { - stats.combineAllValues(provider.getTetherStats()); + stats.combineAllValues(provider.getTetherStats(how)); } catch (RemoteException e) { Log.e(TAG, "Problem reading tethering stats from " + mTetheringStatsProviders.get(provider) + ": " + e); diff --git a/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java b/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java index 6380da5e2af8..1c77a7f451b4 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java +++ b/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java @@ -23,6 +23,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.Signature; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.UserHandle; @@ -30,6 +31,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.PackageUtils; import android.util.Pair; +import android.util.Slog; import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.content.PackageMonitor; @@ -126,9 +128,18 @@ public final class AccountManagerBackupHelper { } catch (PackageManager.NameNotFoundException e) { return false; } - String currentCertDigest = PackageUtils.computeCertSha256Digest( - packageInfo.signatures[0]); - if (!certDigest.equals(currentCertDigest)) { + + // Before we used only the first signature to compute the SHA 256 but some + // apps could be singed by multiple certs and the cert order is undefined. + // We prefer the modern computation procedure where all certs are taken + // into account but also allow the value from the old computation to allow + // restoring backed up grants on an older platform version. + final String[] signaturesSha256Digests = PackageUtils.computeSignaturesSha256Digests( + packageInfo.signatures); + final String signaturesSha256Digest = PackageUtils.computeSignaturesSha256Digest( + signaturesSha256Digests); + if (!certDigest.equals(signaturesSha256Digest) && (packageInfo.signatures.length <= 1 + || !certDigest.equals(signaturesSha256Digests[0]))) { return false; } final int uid = packageInfo.applicationInfo.uid; @@ -169,8 +180,17 @@ public final class AccountManagerBackupHelper { } for (String packageName : packageNames) { - String digest = PackageUtils.computePackageCertSha256Digest( - packageManager, packageName, userId); + final PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNATURES, userId); + } catch (PackageManager.NameNotFoundException e) { + Slog.i(TAG, "Skipping backup of account access grant for" + + " non-existing package: " + packageName); + continue; + } + final String digest = PackageUtils.computeSignaturesSha256Digest( + packageInfo.signatures); if (digest != null) { serializer.startTag(null, TAG_PERMISSION); serializer.attribute(null, ATTR_ACCOUNT_SHA_256, diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index c6f2fc082bac..7e90c9276ff0 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -5330,25 +5330,25 @@ public class AccountManagerService long identityToken = Binder.clearCallingIdentity(); try { packages = mPackageManager.getPackagesForUid(callingUid); - } finally { - Binder.restoreCallingIdentity(identityToken); - } - if (packages == null) { - Log.d(TAG, "No packages for callingUid " + callingUid); - return false; - } - for (String name : packages) { - try { - PackageInfo packageInfo = mPackageManager.getPackageInfo(name, 0 /* flags */); - if (packageInfo != null + if (packages == null) { + Log.d(TAG, "No packages for callingUid " + callingUid); + return false; + } + for (String name : packages) { + try { + PackageInfo packageInfo = + mPackageManager.getPackageInfo(name, 0 /* flags */); + if (packageInfo != null && (packageInfo.applicationInfo.privateFlags - & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { - return true; + & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { + return true; + } + } catch (PackageManager.NameNotFoundException e) { + Log.d(TAG, "Package not found " + e.getMessage()); } - } catch (PackageManager.NameNotFoundException e) { - Log.d(TAG, "Package not found " + e.getMessage()); - return false; } + } finally { + Binder.restoreCallingIdentity(identityToken); } return false; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1d860d601601..5c5a6b7ac205 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -28,6 +28,7 @@ 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.FREEFORM_WORKSPACE_STACK_ID; +import static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID; import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.ActivityManager.StackId.PINNED_STACK_ID; @@ -1346,7 +1347,7 @@ public class ActivityManagerService extends IActivityManager.Stub * Set while we are running a voice interaction. This overrides * sleeping while it is active. */ - private IVoiceInteractionSession mRunningVoice; + IVoiceInteractionSession mRunningVoice; /** * For some direct access we need to power manager. @@ -1366,13 +1367,6 @@ public class ActivityManagerService extends IActivityManager.Stub private int mWakefulness = PowerManagerInternal.WAKEFULNESS_AWAKE; /** - * A list of tokens that cause the top activity to be put to sleep. - * They are used by components that may hide and block interaction with underlying - * activities. - */ - final ArrayList<SleepToken> mSleepTokens = new ArrayList<SleepToken>(); - - /** * Set if we are shutting down the system, similar to sleeping. */ boolean mShuttingDown = false; @@ -3237,6 +3231,18 @@ public class ActivityManagerService extends IActivityManager.Stub } final void applyUpdateVrModeLocked(ActivityRecord r) { + // VR apps are expected to run in a main display. If an app is turning on VR for + // itself, but lives in a dynamic stack, then make sure that it is moved to the main + // fullscreen stack before enabling VR Mode. + // TODO: The goal of this code is to keep the VR app on the main display. When the + // stack implementation changes in the future, keep in mind that the use of the fullscreen + // stack is a means to move the activity to the main display and a moveActivityToDisplay() + // option would be a better choice here. + if (r.requestedVrComponent != null && r.getStackId() >= FIRST_DYNAMIC_STACK_ID) { + Slog.i(TAG, "Moving " + r.shortComponentName + " from stack " + r.getStackId() + + " to main stack for VR"); + moveTaskToStack(r.getTask().taskId, FULLSCREEN_WORKSPACE_STACK_ID, true /* toTop */); + } mHandler.sendMessage( mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r)); } @@ -4896,13 +4902,13 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public void reportActivityFullyDrawn(IBinder token) { + public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r == null) { return; } - r.reportFullyDrawnLocked(); + r.reportFullyDrawnLocked(restoredFromBundle); } } @@ -5842,26 +5848,53 @@ public class ActivityManagerService extends IActivityManager.Stub enforceNotIsolatedCaller("clearApplicationUserData"); int uid = Binder.getCallingUid(); int pid = Binder.getCallingPid(); - userId = mUserController.handleIncomingUser(pid, uid, userId, false, + final int resolvedUserId = mUserController.handleIncomingUser(pid, uid, userId, false, ALLOW_FULL_ONLY, "clearApplicationUserData", null); + final ApplicationInfo appInfo; + final boolean isInstantApp; long callingId = Binder.clearCallingIdentity(); try { IPackageManager pm = AppGlobals.getPackageManager(); - int pkgUid = -1; synchronized(this) { + // Instant packages are not protected if (getPackageManagerInternalLocked().isPackageDataProtected( - userId, packageName)) { + resolvedUserId, packageName)) { throw new SecurityException( "Cannot clear data for a protected package: " + packageName); } + ApplicationInfo applicationInfo = null; try { - pkgUid = pm.getPackageUid(packageName, MATCH_UNINSTALLED_PACKAGES, userId); + applicationInfo = pm.getApplicationInfo(packageName, + MATCH_UNINSTALLED_PACKAGES, resolvedUserId); } catch (RemoteException e) { + /* ignore */ } - if (pkgUid == -1) { + appInfo = applicationInfo; + + final boolean clearingOwnUidData = appInfo != null && appInfo.uid == uid; + + if (!clearingOwnUidData && checkComponentPermission(permission.CLEAR_APP_USER_DATA, + pid, uid, -1, true) != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("PID " + pid + " does not have permission " + + android.Manifest.permission.CLEAR_APP_USER_DATA + " to clear data" + + " of package " + packageName); + } + + final boolean hasInstantMetadata = getPackageManagerInternalLocked() + .hasInstantApplicationMetadata(packageName, resolvedUserId); + final boolean isUninstalledAppWithoutInstantMetadata = + (appInfo == null && !hasInstantMetadata); + isInstantApp = (appInfo != null && appInfo.isInstantApp()) + || hasInstantMetadata; + final boolean canAccessInstantApps = checkComponentPermission( + permission.ACCESS_INSTANT_APPS, pid, uid, -1, true) + == PackageManager.PERMISSION_GRANTED; + + if (isUninstalledAppWithoutInstantMetadata || (isInstantApp + && !canAccessInstantApps)) { Slog.w(TAG, "Invalid packageName: " + packageName); if (observer != null) { try { @@ -5872,45 +5905,45 @@ public class ActivityManagerService extends IActivityManager.Stub } return false; } - if (uid == pkgUid || checkComponentPermission( - android.Manifest.permission.CLEAR_APP_USER_DATA, - pid, uid, -1, true) - == PackageManager.PERMISSION_GRANTED) { - forceStopPackageLocked(packageName, pkgUid, "clear data"); - } else { - throw new SecurityException("PID " + pid + " does not have permission " - + android.Manifest.permission.CLEAR_APP_USER_DATA + " to clear data" - + " of package " + packageName); - } - // Remove all tasks match the cleared application package and user - for (int i = mRecentTasks.size() - 1; i >= 0; i--) { - final TaskRecord tr = mRecentTasks.get(i); - final String taskPackageName = - tr.getBaseIntent().getComponent().getPackageName(); - if (tr.userId != userId) continue; - if (!taskPackageName.equals(packageName)) continue; - mStackSupervisor.removeTaskByIdLocked(tr.taskId, false, REMOVE_FROM_RECENTS); + if (appInfo != null) { + forceStopPackageLocked(packageName, appInfo.uid, "clear data"); + // Remove all tasks match the cleared application package and user + for (int i = mRecentTasks.size() - 1; i >= 0; i--) { + final TaskRecord tr = mRecentTasks.get(i); + final String taskPackageName = + tr.getBaseIntent().getComponent().getPackageName(); + if (tr.userId != resolvedUserId) continue; + if (!taskPackageName.equals(packageName)) continue; + mStackSupervisor.removeTaskByIdLocked(tr.taskId, false, + REMOVE_FROM_RECENTS); + } } } - final int pkgUidF = pkgUid; - final int userIdF = userId; final IPackageDataObserver localObserver = new IPackageDataObserver.Stub() { @Override public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { - synchronized (ActivityManagerService.this) { - finishForceStopPackageLocked(packageName, pkgUidF); + if (appInfo != null) { + synchronized (ActivityManagerService.this) { + finishForceStopPackageLocked(packageName, appInfo.uid); + } } - final Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED, Uri.fromParts("package", packageName, null)); intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); - intent.putExtra(Intent.EXTRA_UID, pkgUidF); - intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(pkgUidF)); - broadcastIntentInPackage("android", SYSTEM_UID, intent, - null, null, 0, null, null, null, null, false, false, userIdF); + intent.putExtra(Intent.EXTRA_UID, (appInfo != null) ? appInfo.uid : -1); + intent.putExtra(Intent.EXTRA_USER_HANDLE, resolvedUserId); + if (isInstantApp) { + intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); + broadcastIntentInPackage("android", SYSTEM_UID, intent, null, null, 0, + null, null, permission.ACCESS_INSTANT_APPS, null, false, false, + resolvedUserId); + } else { + broadcastIntentInPackage("android", SYSTEM_UID, intent, null, null, 0, + null, null, null, null, false, false, resolvedUserId); + } if (observer != null) { observer.onRemoveCompleted(packageName, succeeded); @@ -5920,16 +5953,18 @@ public class ActivityManagerService extends IActivityManager.Stub try { // Clear application user data - pm.clearApplicationUserData(packageName, localObserver, userId); + pm.clearApplicationUserData(packageName, localObserver, resolvedUserId); - synchronized(this) { - // Remove all permissions granted from/to this package - removeUriPermissionsForPackageLocked(packageName, userId, true); - } + if (appInfo != null) { + synchronized (this) { + // Remove all permissions granted from/to this package + removeUriPermissionsForPackageLocked(packageName, resolvedUserId, true); + } - // Reset notification settings. - INotificationManager inm = NotificationManager.getService(); - inm.clearData(packageName, pkgUidF, uid == pkgUidF); + // Reset notification settings. + INotificationManager inm = NotificationManager.getService(); + inm.clearData(packageName, appInfo.uid, uid == appInfo.uid); + } } catch (RemoteException e) { } } finally { @@ -8010,7 +8045,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Activity supports picture-in-picture, now check that we can enter PiP at this // point, if it is if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode", - false /* noThrow */, false /* beforeStopping */)) { + false /* beforeStopping */)) { return false; } @@ -12390,7 +12425,19 @@ public class ActivityManagerService extends IActivityManager.Stub void onWakefulnessChanged(int wakefulness) { synchronized(this) { mWakefulness = wakefulness; - updateSleepIfNeededLocked(); + + // Also update state in a special way for running foreground services UI. + switch (mWakefulness) { + case PowerManagerInternal.WAKEFULNESS_ASLEEP: + case PowerManagerInternal.WAKEFULNESS_DREAMING: + case PowerManagerInternal.WAKEFULNESS_DOZING: + mServices.updateScreenStateLocked(false /* screenOn */); + break; + case PowerManagerInternal.WAKEFULNESS_AWAKE: + default: + mServices.updateScreenStateLocked(true /* screenOn */); + break; + } } } @@ -12410,14 +12457,24 @@ public class ActivityManagerService extends IActivityManager.Stub } void updateSleepIfNeededLocked() { - final boolean shouldSleep = shouldSleepLocked(); - if (mSleeping && !shouldSleep) { - mSleeping = false; - startTimeTrackingFocusedActivityLocked(); - mTopProcessState = ActivityManager.PROCESS_STATE_TOP; - mStackSupervisor.comeOutOfSleepIfNeededLocked(); - sendNotifyVrManagerOfSleepState(false); - updateOomAdjLocked(); + final boolean shouldSleep = !mStackSupervisor.hasAwakeDisplay(); + final boolean wasSleeping = mSleeping; + + if (!shouldSleep) { + // If wasSleeping is true, we need to wake up activity manager state from when + // we started sleeping. In either case, we need to apply the sleep tokens, which + // will wake up stacks or put them to sleep as appropriate. + if (wasSleeping) { + mSleeping = false; + startTimeTrackingFocusedActivityLocked(); + mTopProcessState = ActivityManager.PROCESS_STATE_TOP; + mStackSupervisor.comeOutOfSleepIfNeededLocked(); + } + mStackSupervisor.applySleepTokensLocked(true /* applyToStacks */); + if (wasSleeping) { + sendNotifyVrManagerOfSleepState(false); + updateOomAdjLocked(); + } } else if (!mSleeping && shouldSleep) { mSleeping = true; if (mCurAppTimeTracker != null) { @@ -12428,40 +12485,6 @@ public class ActivityManagerService extends IActivityManager.Stub sendNotifyVrManagerOfSleepState(true); updateOomAdjLocked(); } - - // Also update state in a special way for running foreground services UI. - switch (mWakefulness) { - case PowerManagerInternal.WAKEFULNESS_ASLEEP: - case PowerManagerInternal.WAKEFULNESS_DREAMING: - case PowerManagerInternal.WAKEFULNESS_DOZING: - mServices.updateScreenStateLocked(false); - break; - case PowerManagerInternal.WAKEFULNESS_AWAKE: - default: - mServices.updateScreenStateLocked(true); - break; - } - } - - private boolean shouldSleepLocked() { - // Resume applications while running a voice interactor. - if (mRunningVoice != null) { - return false; - } - - // TODO: Transform the lock screen state into a sleep token instead. - switch (mWakefulness) { - case PowerManagerInternal.WAKEFULNESS_AWAKE: - case PowerManagerInternal.WAKEFULNESS_DREAMING: - // Pause applications whenever the lock screen is shown or any sleep - // tokens have been acquired. - return mKeyguardController.isKeyguardShowing() || !mSleepTokens.isEmpty(); - case PowerManagerInternal.WAKEFULNESS_DOZING: - case PowerManagerInternal.WAKEFULNESS_ASLEEP: - default: - // If we're asleep then pause applications unconditionally. - return true; - } } /** Pokes the task persister. */ @@ -12502,6 +12525,7 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized(this) { mShuttingDown = true; + mStackSupervisor.prepareForShutdownLocked(); updateEventDispatchingLocked(); timedout = mStackSupervisor.shutdownLocked(timeout); } @@ -13083,6 +13107,10 @@ public class ActivityManagerService extends IActivityManager.Stub + " couldn't be found"); return null; } + if (activity.app == null || activity.app.thread == null) { + Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity); + return null; + } } PendingAssistExtras pae; @@ -14916,6 +14944,14 @@ public class ActivityManagerService extends IActivityManager.Stub this, in, out, err, args, callback, resultReceiver); } + SleepToken acquireSleepToken(String tag, int displayId) { + synchronized (this) { + final SleepToken token = mStackSupervisor.createSleepTokenLocked(tag, displayId); + updateSleepIfNeededLocked(); + return token; + } + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; @@ -15812,7 +15848,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (dumpPackage == null) { pw.println(" mWakefulness=" + PowerManagerInternal.wakefulnessToString(mWakefulness)); - pw.println(" mSleepTokens=" + mSleepTokens); + pw.println(" mSleepTokens=" + mStackSupervisor.mSleepTokens); pw.println(" mSleeping=" + mSleeping); pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + mTestPssMode); if (mRunningVoice != null) { @@ -23772,15 +23808,9 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public SleepToken acquireSleepToken(String tag) { + public SleepToken acquireSleepToken(String tag, int displayId) { Preconditions.checkNotNull(tag); - - synchronized (ActivityManagerService.this) { - SleepTokenImpl token = new SleepTokenImpl(tag); - mSleepTokens.add(token); - updateSleepIfNeededLocked(); - return token; - } + return ActivityManagerService.this.acquireSleepToken(tag, displayId); } @Override @@ -24104,6 +24134,21 @@ public class ActivityManagerService extends IActivityManager.Stub mLastANRState = null; } } + + @Override + public void setFocusedActivity(IBinder token) { + synchronized (ActivityManagerService.this) { + final ActivityRecord r = ActivityRecord.forTokenLocked(token); + if (r == null) { + throw new IllegalArgumentException( + "setFocusedActivity: No activity record matching token=" + token); + } + if (mStackSupervisor.moveFocusableActivityStackToFrontLocked( + r, "setFocusedActivity")) { + mStackSupervisor.resumeFocusedStackTopActivityLocked(); + } + } + } } /** @@ -24217,30 +24262,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } - private final class SleepTokenImpl extends SleepToken { - private final String mTag; - private final long mAcquireTime; - - public SleepTokenImpl(String tag) { - mTag = tag; - mAcquireTime = SystemClock.uptimeMillis(); - } - - @Override - public void release() { - synchronized (ActivityManagerService.this) { - if (mSleepTokens.remove(this)) { - updateSleepIfNeededLocked(); - } - } - } - - @Override - public String toString() { - return "{\"" + mTag + "\", acquire at " + TimeUtils.formatUptime(mAcquireTime) + "}"; - } - } - /** * An implementation of IAppTask, that allows an app to manage its own tasks via * {@link android.app.ActivityManager.AppTask}. We keep track of the callingUid to ensure that diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java index 98815d7e18c7..f396e9ef44a5 100644 --- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java @@ -15,12 +15,17 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TR import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_DEVICE_UPTIME_SECONDS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_IS_EPHEMERAL; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_PROCESS_RUNNING; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_REPORTED_DRAWN; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_REPORTED_DRAWN_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_STARTING_WINDOW_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -67,12 +72,14 @@ class ActivityMetricsLogger { private final MetricsLogger mMetricsLogger = new MetricsLogger(); private long mCurrentTransitionStartTime = INVALID_START_TIME; + private long mLastTransitionStartTime = INVALID_START_TIME; private int mCurrentTransitionDeviceUptime; private int mCurrentTransitionDelayMs; private boolean mLoggedTransitionStarting; private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>(); + private final SparseArray<StackTransitionInfo> mLastStackTransitionInfo = new SparseArray<>(); private final class StackTransitionInfo { private ActivityRecord launchedActivity; @@ -136,6 +143,7 @@ class ActivityMetricsLogger { void notifyActivityLaunching() { if (!isAnyTransitionActive()) { mCurrentTransitionStartTime = SystemClock.uptimeMillis(); + mLastTransitionStartTime = mCurrentTransitionStartTime; } } @@ -223,7 +231,8 @@ class ActivityMetricsLogger { newInfo.launchedActivity = launchedActivity; newInfo.currentTransitionProcessRunning = processRunning; newInfo.startResult = resultCode; - mStackTransitionInfo.append(stackId, newInfo); + mStackTransitionInfo.put(stackId, newInfo); + mLastStackTransitionInfo.put(stackId, newInfo); mCurrentTransitionDeviceUptime = (int) (SystemClock.uptimeMillis() / 1000); } @@ -361,7 +370,7 @@ class ActivityMetricsLogger { builder.setType(type); builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name); final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp(); - if (isInstantApp && info.launchedActivity.launchedFromPackage != null) { + if (info.launchedActivity.launchedFromPackage != null) { builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, info.launchedActivity.launchedFromPackage); } @@ -388,6 +397,24 @@ class ActivityMetricsLogger { } } + void logAppTransitionReportedDrawn(ActivityRecord r, boolean restoredFromBundle) { + final StackTransitionInfo info = mLastStackTransitionInfo.get(r.getStackId()); + if (info == null) { + return; + } + final LogMaker builder = new LogMaker(APP_TRANSITION_REPORTED_DRAWN); + builder.setPackageName(r.packageName); + builder.addTaggedData(FIELD_CLASS_NAME, r.info.name); + builder.addTaggedData(APP_TRANSITION_REPORTED_DRAWN_MS, + SystemClock.uptimeMillis() - mLastTransitionStartTime); + builder.setType(restoredFromBundle + ? TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE + : TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE); + builder.addTaggedData(APP_TRANSITION_PROCESS_RUNNING, + info.currentTransitionProcessRunning ? 1 : 0); + mMetricsLogger.write(builder); + } + private int getTransitionType(StackTransitionInfo info) { if (info.currentTransitionProcessRunning) { if (info.startResult == START_SUCCESS) { diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 4a9b98d7be00..874bd1e7625b 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -74,6 +74,7 @@ import static android.content.res.Configuration.UI_MODE_TYPE_MASK; import static android.content.res.Configuration.UI_MODE_TYPE_VR_HEADSET; import static android.os.Build.VERSION_CODES.HONEYCOMB; import static android.os.Build.VERSION_CODES.O; +import static android.os.Build.VERSION_CODES.O_MR1; import static android.os.Process.SYSTEM_UID; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.view.WindowManagerPolicy.NAV_BAR_LEFT; @@ -145,6 +146,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; +import android.os.storage.StorageManager; import android.service.voice.IVoiceInteractionSession; import android.util.EventLog; import android.util.Log; @@ -946,8 +948,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // the user leaves that mode. mLastReportedMultiWindowMode = !task.mFullscreen; mLastReportedPictureInPictureMode = (task.getStackId() == PINNED_STACK_ID); - - onOverrideConfigurationSent(); } void removeWindowContainer() { @@ -1186,10 +1186,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo * @param beforeStopping Whether this check is for an auto-enter-pip operation, that is to say * the activity has requested to enter PiP when it would otherwise be stopped. * - * @return whether this activity is currently allowed to enter PIP, throwing an exception if - * the activity is not currently visible and {@param noThrow} is not set. + * @return whether this activity is currently allowed to enter PIP. */ - boolean checkEnterPictureInPictureState(String caller, boolean noThrow, boolean beforeStopping) { + boolean checkEnterPictureInPictureState(String caller, boolean beforeStopping) { if (!supportsPictureInPicture()) { return false; } @@ -1237,13 +1236,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return isNotLockedOrOnKeyguard && !hasPinnedStack; } default: - if (noThrow) { - return false; - } else { - throw new IllegalStateException(caller - + ": Current activity is not visible (state=" + state.name() + ") " - + "r=" + this); - } + return false; } } @@ -1340,7 +1333,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo intent, getUriPermissionsLocked(), userId); final ReferrerIntent rintent = new ReferrerIntent(intent, referrer); boolean unsent = true; - final boolean isTopActivityWhileSleeping = service.isSleepingLocked() && isTopRunningActivity(); + final ActivityStack stack = getStack(); + final boolean isTopActivityWhileSleeping = isTopRunningActivity() + && (stack != null ? stack.shouldSleepActivities() : service.isSleepingLocked()); // We want to immediately deliver the intent to the activity if: // - It is currently resumed or paused. i.e. it is currently visible to the user and we want @@ -1682,7 +1677,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo */ void completeResumeLocked() { final boolean wasVisible = visible; - visible = true; + setVisible(true); if (!wasVisible) { // Visibility has changed, so take a note of it so we call the TaskStackChangedListener mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true; @@ -1730,7 +1725,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // If the screen is going to turn on because the caller explicitly requested it and // the keyguard is not showing don't attempt to sleep. Otherwise the Activity will // pause and then resume again later, which will result in a double life-cycle event. - mStackSupervisor.checkReadyForSleepLocked(); + stack.checkReadyForSleep(); } } @@ -1834,7 +1829,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } } - public void reportFullyDrawnLocked() { + public void reportFullyDrawnLocked(boolean restoredFromBundle) { final long curTime = SystemClock.uptimeMillis(); if (displayStartTime != 0) { reportLaunchTimeLocked(curTime); @@ -1867,6 +1862,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } stack.mFullyDrawnStartTime = 0; } + mStackSupervisor.mActivityMetricsLogger.logAppTransitionReportedDrawn(this, + restoredFromBundle); fullyDrawnStartTime = 0; } @@ -2010,6 +2007,13 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo /** Checks whether the activity should be shown for current user. */ public boolean okToShowLocked() { + // We cannot show activities when the device is locked and the application is not + // encryption aware. + if (!StorageManager.isUserKeyUnlocked(userId) + && !info.applicationInfo.isEncryptionAware()) { + return false; + } + return (info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0 || (mStackSupervisor.isCurrentProfileLocked(userId) && service.mUserController.isUserRunningLocked(userId, 0 /* flags */)); @@ -2171,7 +2175,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo void setRequestedOrientation(int requestedOrientation) { if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen - && appInfo.targetSdkVersion > O) { + && appInfo.targetSdkVersion >= O_MR1) { throw new IllegalStateException("Only fullscreen activities can request orientation"); } @@ -2209,15 +2213,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo * a new merged configuration is sent to the client for this activity. */ void setLastReportedConfiguration(@NonNull MergedConfiguration config) { - mLastReportedConfiguration.setTo(config); + setLastReportedConfiguration(config.getGlobalConfiguration(), + config.getOverrideConfiguration()); } - /** Call when override config was sent to the Window Manager to update internal records. */ - // TODO(b/36505427): Why do we set last reported based on sending the config to WM? Seems like - // we should only set this when we actually report to the activity which is what the method - // setLastReportedMergedOverrideConfiguration() does. Investigate if this is really needed. - void onOverrideConfigurationSent() { - mLastReportedConfiguration.setOverrideConfiguration(getMergedOverrideConfiguration()); + void setLastReportedConfiguration(Configuration global, Configuration override) { + mLastReportedConfiguration.setConfiguration(global, override); } @Override @@ -2231,9 +2232,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return; } mWindowContainerController.onOverrideConfigurationChanged(newConfig, mBounds); - // TODO(b/36505427): Can we consolidate the call points of onOverrideConfigurationSent() - // to just use this method instead? - onOverrideConfigurationSent(); } // TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer. @@ -2420,8 +2418,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // Update last reported values. final Configuration newMergedOverrideConfig = getMergedOverrideConfiguration(); - mLastReportedConfiguration.setConfiguration(service.getGlobalConfiguration(), - newMergedOverrideConfig); + + setLastReportedConfiguration(service.getGlobalConfiguration(), newMergedOverrideConfig); if (changes == 0 && !forceNewConfig) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 896f846feec0..eb3177a6e1c9 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1170,10 +1170,26 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } } + void checkReadyForSleep() { + if (shouldSleepActivities() && goToSleepIfPossible(false /* shuttingDown */)) { + mStackSupervisor.checkReadyForSleepLocked(true /* allowDelay */); + } + } + /** - * @return true if something must be done before going to sleep. + * Tries to put the activities in the stack to sleep. + * + * If the stack is not in a state where its activities can be put to sleep, this function will + * start any necessary actions to move the stack into such a state. It is expected that this + * function get called again when those actions complete. + * + * @param shuttingDown true when the called because the device is shutting down. + * @return true if the stack finished going to sleep, false if the stack only started the + * process of going to sleep (checkReadyForSleep will be called when that process finishes). */ - boolean checkReadyForSleepLocked() { + boolean goToSleepIfPossible(boolean shuttingDown) { + boolean shouldSleep = true; + if (mResumedActivity != null) { // Still have something resumed; can't sleep until it is paused. if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep needs to pause " + mResumedActivity); @@ -1183,23 +1199,44 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // If we are in the middle of resuming the top activity in // {@link #resumeTopActivityUncheckedLocked}, mResumedActivity will be set but not // resumed yet. We must not proceed pausing the activity here. This method will be - // called again if necessary as part of + // called again if necessary as part of {@link #checkReadyForSleep} or // {@link ActivityStackSupervisor#checkReadyForSleepLocked}. if (mStackSupervisor.inResumeTopActivity) { if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "In the middle of resuming top activity " + mResumedActivity); - return true; + } else { + startPausingLocked(false, true, null, false); } - - startPausingLocked(false, true, null, false); - return true; - } - if (mPausingActivity != null) { + shouldSleep = false ; + } else if (mPausingActivity != null) { // Still waiting for something to pause; can't sleep yet. if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still waiting to pause " + mPausingActivity); - return true; + shouldSleep = false; } - return false; + + if (!shuttingDown) { + if (containsActivityFromStack(mStackSupervisor.mStoppingActivities)) { + // Still need to tell some activities to stop; can't sleep yet. + if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to stop " + + mStackSupervisor.mStoppingActivities.size() + " activities"); + + mStackSupervisor.scheduleIdleLocked(); + shouldSleep = false; + } + + if (containsActivityFromStack(mStackSupervisor.mGoingToSleepActivities)) { + // Still need to tell some activities to sleep; can't sleep yet. + if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to sleep " + + mStackSupervisor.mGoingToSleepActivities.size() + " activities"); + shouldSleep = false; + } + } + + if (shouldSleep) { + goToSleep(); + } + + return shouldSleep; } void goToSleep() { @@ -1219,6 +1256,15 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } } + private boolean containsActivityFromStack(List<ActivityRecord> rs) { + for (ActivityRecord r : rs) { + if (r.getStack() == this) { + return true; + } + } + return false; + } + /** * Schedule a pause timeout in case the app doesn't respond. We don't give it much time because * this directly impacts the responsiveness seen by the user. @@ -1251,7 +1297,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (mPausingActivity != null) { Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity + " state=" + mPausingActivity.state); - if (!mService.isSleepingLocked()) { + if (!shouldSleepActivities()) { // Avoid recursion among check for sleep and complete pause during sleeping. // Because activity will be paused immediately after resume, just let pause // be completed by the order of activity paused from clients. @@ -1411,7 +1457,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // We can't clobber it, because the stop confirmation will not be handled. // We don't need to schedule another stop, we only need to let it happen. prev.state = STOPPING; - } else if (!prev.visible || mService.isSleepingOrShuttingDownLocked()) { + } else if (!prev.visible || shouldSleepOrShutDownActivities()) { // Clear out any deferred client hide we might currently have. prev.setDeferHidingClient(false); // If we were visible then resumeTopActivities will release resources before @@ -1433,10 +1479,10 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (resumeNext) { final ActivityStack topStack = mStackSupervisor.getFocusedStack(); - if (!mService.isSleepingOrShuttingDownLocked()) { + if (!topStack.shouldSleepOrShutDownActivities()) { mStackSupervisor.resumeFocusedStackTopActivityLocked(topStack, prev, null); } else { - mStackSupervisor.checkReadyForSleepLocked(); + checkReadyForSleep(); ActivityRecord top = topStack.topRunningActivityLocked(); if (top == null || (prev != null && top != prev)) { // If there are no more activities available to run, do resume anyway to start @@ -1502,7 +1548,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai mStackSupervisor.scheduleIdleTimeoutLocked(r); } } else { - mStackSupervisor.checkReadyForSleepLocked(); + checkReadyForSleep(); } } @@ -2030,7 +2076,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r + " " + r.state); try { final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState( - "makeInvisible", true /* noThrow */, true /* beforeStopping */); + "makeInvisible", true /* beforeStopping */); // Defer telling the client it is hidden if it can enter Pip and isn't current stopped // or stopping. This gives it a chance to enter Pip in onPause(). final boolean deferHidingClient = canEnterPictureInPicture @@ -2211,7 +2257,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // is skipped. final ActivityRecord next = topRunningActivityLocked(true /* focusableOnly */); if (next == null || !next.canTurnScreenOn()) { - mStackSupervisor.checkReadyForSleepLocked(); + checkReadyForSleep(); } return result; @@ -2296,7 +2342,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // If we are sleeping, and there is no resumed activity, and the top // activity is paused, well that is the state we want. - if (mService.isSleepingOrShuttingDownLocked() + if (shouldSleepOrShutDownActivities() && mLastPausedActivity == next && mStackSupervisor.allPausedActivitiesComplete()) { // Make sure we have executed any pending transitions, since there @@ -2344,7 +2390,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // represent the last resumed activity. However, the last focus stack does if it isn't null. final ActivityRecord lastResumed = lastFocusedStack.mResumedActivity; lastResumedCanPip = lastResumed != null && lastResumed.checkEnterPictureInPictureState( - "resumeTopActivity", true /* noThrow */, userLeaving /* beforeStopping */); + "resumeTopActivity", userLeaving /* beforeStopping */); } // If the flag RESUME_WHILE_PAUSING is set, then continue to schedule the previous activity // to be paused, while at the same time resuming the new resume activity only if the @@ -2388,7 +2434,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // If the most recent activity was noHistory but was only stopped rather // than stopped+finished because the device went to sleep, we need to make // sure to finish it as we're making a new activity topmost. - if (mService.isSleepingLocked() && mLastNoHistoryActivity != null && + if (shouldSleepActivities() && mLastNoHistoryActivity != null && !mLastNoHistoryActivity.finishing) { if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + mLastNoHistoryActivity + " on new resume"); @@ -3400,7 +3446,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if ((r.intent.getFlags()&Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 || (r.info.flags&ActivityInfo.FLAG_NO_HISTORY) != 0) { if (!r.finishing) { - if (!mService.isSleepingLocked()) { + if (!shouldSleepActivities()) { if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + r); if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, "stop-no-history", false)) { @@ -3432,7 +3478,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai EventLogTags.writeAmStopActivity( r.userId, System.identityHashCode(r), r.shortComponentName); r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags); - if (mService.isSleepingOrShuttingDownLocked()) { + if (shouldSleepOrShutDownActivities()) { r.setSleeping(true); } Message msg = mHandler.obtainMessage(STOP_TIMEOUT_MSG, r); @@ -5278,4 +5324,13 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai mNoAnimActivities.clear(); ActivityOptions.abort(options); } + + boolean shouldSleepActivities() { + final ActivityStackSupervisor.ActivityDisplay display = getDisplay(); + return display != null ? display.isSleeping() : mService.isSleepingLocked(); + } + + boolean shouldSleepOrShutDownActivities() { + return shouldSleepActivities() || mService.isShuttingDownLocked(); + } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e8bc68f21981..68a4ad964ab8 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -105,6 +105,7 @@ import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityManager.StackId; import android.app.ActivityManager.StackInfo; +import android.app.ActivityManagerInternal.SleepToken; import android.app.ActivityOptions; import android.app.AppOpsManager; import android.app.ProfilerInfo; @@ -156,6 +157,7 @@ import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; +import android.util.TimeUtils; import android.view.Display; import com.android.internal.annotations.VisibleForTesting; @@ -177,6 +179,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.Set; @@ -375,9 +378,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D * is being brought in front of us. */ boolean mUserLeaving = false; - /** Set when we have taken too long waiting to go to sleep. */ - boolean mSleepTimeout = false; - /** * We don't want to allow the device to go to sleep while in the process * of launching an activity. This is primarily to allow alarm intent @@ -393,6 +393,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D */ PowerManager.WakeLock mGoingToSleep; + /** + * A list of tokens that cause the top activity to be put to sleep. + * They are used by components that may hide and block interaction with underlying + * activities. + */ + final ArrayList<SleepToken> mSleepTokens = new ArrayList<SleepToken>(); + /** Stack id of the front stack when user switched, indexed by userId. */ SparseIntArray mUserStackInFront = new SparseIntArray(2); @@ -3126,6 +3133,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return null; } + boolean hasAwakeDisplay() { + for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + if (!display.shouldSleep()) { + return true; + } + } + return false; + } + void goingToSleepLocked() { scheduleSleepTimeout(); if (!mGoingToSleep.isHeld()) { @@ -3138,7 +3155,16 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); } } - checkReadyForSleepLocked(); + + applySleepTokensLocked(false /* applyToStacks */); + + checkReadyForSleepLocked(true /* allowDelay */); + } + + void prepareForShutdownLocked() { + for (int i = 0; i < mActivityDisplays.size(); i++) { + createSleepTokenLocked("shutdown", mActivityDisplays.keyAt(i)); + } } boolean shutdownLocked(int timeout) { @@ -3147,14 +3173,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean timedout = false; final long endTime = System.currentTimeMillis() + timeout; while (true) { - boolean cantShutdown = false; - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked(); - } - } - if (cantShutdown) { + if (!putStacksToSleepLocked(true /* allowDelay */, true /* shuttingDown */)) { long timeRemaining = endTime - System.currentTimeMillis(); if (timeRemaining > 0) { try { @@ -3172,8 +3191,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } // Force checkReadyForSleep to complete. - mSleepTimeout = true; - checkReadyForSleepLocked(); + checkReadyForSleepLocked(false /* allowDelay */); return timedout; } @@ -3183,69 +3201,72 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D if (mGoingToSleep.isHeld()) { mGoingToSleep.release(); } + } + + void applySleepTokensLocked(boolean applyToStacks) { for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; + // Set the sleeping state of the display. + final ActivityDisplay display = mActivityDisplays.valueAt(displayNdx); + final boolean displayShouldSleep = display.shouldSleep(); + if (displayShouldSleep == display.isSleeping()) { + continue; + } + display.setIsSleeping(displayShouldSleep); + + if (!applyToStacks) { + continue; + } + + // Set the sleeping state of the stacks on the display. + final ArrayList<ActivityStack> stacks = display.mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = stacks.get(stackNdx); - stack.awakeFromSleepingLocked(); - if (isFocusedStack(stack)) { - resumeFocusedStackTopActivityLocked(); + if (displayShouldSleep) { + stack.goToSleepIfPossible(false /* shuttingDown */); + } else { + stack.awakeFromSleepingLocked(); + if (isFocusedStack(stack)) { + resumeFocusedStackTopActivityLocked(); + } + } + } + + if (displayShouldSleep || mGoingToSleepActivities.isEmpty()) { + continue; + } + // The display is awake now, so clean up the going to sleep list. + for (Iterator<ActivityRecord> it = mGoingToSleepActivities.iterator(); it.hasNext(); ) { + final ActivityRecord r = it.next(); + if (r.getDisplayId() == display.mDisplayId) { + it.remove(); } } } - mGoingToSleepActivities.clear(); } void activitySleptLocked(ActivityRecord r) { mGoingToSleepActivities.remove(r); - checkReadyForSleepLocked(); + final ActivityStack s = r.getStack(); + if (s != null) { + s.checkReadyForSleep(); + } else { + checkReadyForSleepLocked(true); + } } - void checkReadyForSleepLocked() { + void checkReadyForSleepLocked(boolean allowDelay) { if (!mService.isSleepingOrShuttingDownLocked()) { // Do not care. return; } - if (!mSleepTimeout) { - boolean dontSleep = false; - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked(); - } - } - - if (mStoppingActivities.size() > 0) { - // Still need to tell some activities to stop; can't sleep yet. - if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to stop " - + mStoppingActivities.size() + " activities"); - scheduleIdleLocked(); - dontSleep = true; - } - - if (mGoingToSleepActivities.size() > 0) { - // Still need to tell some activities to sleep; can't sleep yet. - if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to sleep " - + mGoingToSleepActivities.size() + " activities"); - dontSleep = true; - } - - if (dontSleep) { - return; - } + if (!putStacksToSleepLocked(allowDelay, false /* shuttingDown */)) { + return; } // Send launch end powerhint before going sleep mService.mActivityStarter.sendPowerHintForLaunchEndIfNeeded(); - for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { - final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; - for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - stacks.get(stackNdx).goToSleep(); - } - } - removeSleepTimeouts(); if (mGoingToSleep.isHeld()) { @@ -3256,6 +3277,23 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } } + // Tries to put all activity stacks to sleep. Returns true if all stacks were + // successfully put to sleep. + private boolean putStacksToSleepLocked(boolean allowDelay, boolean shuttingDown) { + boolean allSleep = true; + for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { + final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; + for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { + if (allowDelay) { + allSleep &= stacks.get(stackNdx).goToSleepIfPossible(shuttingDown); + } else { + stacks.get(stackNdx).goToSleep(); + } + } + } + return allSleep; + } + boolean reportResumedActivityLocked(ActivityRecord r) { final ActivityStack stack = r.getStack(); if (isFocusedStack(stack)) { @@ -3516,21 +3554,27 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D s.setVisibility(false); } } - if ((!waitingVisible || mService.isSleepingOrShuttingDownLocked()) && remove) { - if (!processPausingActivities && s.state == PAUSING) { - // Defer processing pausing activities in this iteration and reschedule - // a delayed idle to reprocess it again - removeTimeoutsForActivityLocked(idleActivity); - scheduleIdleTimeoutLocked(idleActivity); - continue; - } + if (remove) { + final ActivityStack stack = s.getStack(); + final boolean shouldSleepOrShutDown = stack != null + ? stack.shouldSleepOrShutDownActivities() + : mService.isSleepingOrShuttingDownLocked(); + if (!waitingVisible || shouldSleepOrShutDown) { + if (!processPausingActivities && s.state == PAUSING) { + // Defer processing pausing activities in this iteration and reschedule + // a delayed idle to reprocess it again + removeTimeoutsForActivityLocked(idleActivity); + scheduleIdleTimeoutLocked(idleActivity); + continue; + } - if (DEBUG_STATES) Slog.v(TAG, "Ready to stop: " + s); - if (stops == null) { - stops = new ArrayList<>(); + if (DEBUG_STATES) Slog.v(TAG, "Ready to stop: " + s); + if (stops == null) { + stops = new ArrayList<>(); + } + stops.add(s); + mStoppingActivities.remove(activityNdx); } - stops.add(s); - mStoppingActivities.remove(activityNdx); } } @@ -3583,7 +3627,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D public void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack); - pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); pw.print(prefix); pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser); pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); @@ -3680,6 +3723,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D stackHeader.append("\n"); stackHeader.append(" mFullscreen=" + stack.mFullscreen); stackHeader.append("\n"); + stackHeader.append(" isSleeping=" + stack.shouldSleepActivities()); + stackHeader.append("\n"); stackHeader.append(" mBounds=" + stack.mBounds); final boolean printedStackHeader = stack.dumpActivitiesLocked(fd, pw, dumpAll, @@ -3731,8 +3776,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D " Activities waiting for another to become visible:", null); printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, false, dumpPackage, true, " Activities waiting to sleep:", null); - printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, - false, dumpPackage, true, " Activities waiting to sleep:", null); return printed; } @@ -3843,7 +3886,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } void removeSleepTimeouts() { - mSleepTimeout = false; mHandler.removeMessages(SLEEP_TIMEOUT_MSG); } @@ -3945,6 +3987,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D moveTasksToFullscreenStackLocked(stack.getStackId(), true /* onTop */); } } + + releaseSleepTokens(activityDisplay); + mActivityDisplays.remove(displayId); mWindowManager.onDisplayRemoved(displayId); } @@ -3955,12 +4000,60 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D synchronized (mService) { ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); if (activityDisplay != null) { + // The window policy is responsible for stopping activities on the default display + if (displayId != Display.DEFAULT_DISPLAY) { + int displayState = activityDisplay.mDisplay.getState(); + if (displayState == Display.STATE_OFF && activityDisplay.mOffToken == null) { + activityDisplay.mOffToken = + mService.acquireSleepToken("Display-off", displayId); + } else if (displayState == Display.STATE_ON + && activityDisplay.mOffToken != null) { + activityDisplay.mOffToken.release(); + activityDisplay.mOffToken = null; + } + } // TODO: Update the bounds. } mWindowManager.onDisplayChanged(displayId); } } + SleepToken createSleepTokenLocked(String tag, int displayId) { + ActivityDisplay display = mActivityDisplays.get(displayId); + if (display == null) { + throw new IllegalArgumentException("Invalid display: " + displayId); + } + + final SleepTokenImpl token = new SleepTokenImpl(tag, displayId); + mSleepTokens.add(token); + display.mAllSleepTokens.add(token); + return token; + } + + private void removeSleepTokenLocked(SleepTokenImpl token) { + mSleepTokens.remove(token); + + ActivityDisplay display = mActivityDisplays.get(token.mDisplayId); + if (display != null) { + display.mAllSleepTokens.remove(token); + if (display.mAllSleepTokens.isEmpty()) { + mService.updateSleepIfNeededLocked(); + } + } + } + + private void releaseSleepTokens(ActivityDisplay display) { + if (display.mAllSleepTokens.isEmpty()) { + return; + } + for (SleepTokenImpl token : display.mAllSleepTokens) { + mSleepTokens.remove(token); + } + display.mAllSleepTokens.clear(); + + mService.updateSleepIfNeededLocked(); + } + private StackInfo getStackInfoLocked(ActivityStack stack) { final int displayId = stack.mDisplayId; final ActivityDisplay display = mActivityDisplays.get(displayId); @@ -4266,9 +4359,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D void activityRelaunchedLocked(IBinder token) { mWindowManager.notifyAppRelaunchingFinished(token); - if (mService.isSleepingOrShuttingDownLocked()) { - final ActivityRecord r = ActivityRecord.isInStackLocked(token); - if (r != null) { + final ActivityRecord r = ActivityRecord.isInStackLocked(token); + if (r != null) { + if (r.getStack().shouldSleepOrShutDownActivities()) { r.setSleeping(true, true); } } @@ -4420,8 +4513,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D synchronized (mService) { if (mService.isSleepingOrShuttingDownLocked()) { Slog.w(TAG, "Sleep timeout! Sleeping now."); - mSleepTimeout = true; - checkReadyForSleepLocked(); + checkReadyForSleepLocked(false /* allowDelay */); } } } break; @@ -4546,6 +4638,13 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D /** Array of all UIDs that are present on the display. */ private IntArray mDisplayAccessUIDs = new IntArray(); + /** All tokens used to put activities on this stack to sleep (including mOffToken) */ + final ArrayList<SleepTokenImpl> mAllSleepTokens = new ArrayList<>(); + /** The token acquired by ActivityStackSupervisor to put stacks on the display to sleep */ + SleepToken mOffToken; + + private boolean mSleeping; + @VisibleForTesting ActivityDisplay() { mActivityDisplays.put(mDisplayId, this); @@ -4570,12 +4669,14 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D if (DEBUG_STACK) Slog.v(TAG_STACK, "attachStack: attaching " + stack + " to displayId=" + mDisplayId + " position=" + position); mStacks.add(position, stack); + mService.updateSleepIfNeededLocked(); } void detachStack(ActivityStack stack) { if (DEBUG_STACK) Slog.v(TAG_STACK, "detachStack: detaching " + stack + " from displayId=" + mDisplayId); mStacks.remove(stack); + mService.updateSleepIfNeededLocked(); } @Override @@ -4623,6 +4724,19 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D boolean shouldDestroyContentOnRemove() { return mDisplay.getRemoveMode() == REMOVE_MODE_DESTROY_CONTENT; } + + boolean shouldSleep() { + return (mStacks.isEmpty() || !mAllSleepTokens.isEmpty()) + && (mService.mRunningVoice == null); + } + + boolean isSleeping() { + return mSleeping; + } + + void setIsSleeping(boolean asleep) { + mSleeping = asleep; + } } ActivityStack findStackBehind(ActivityStack stack) { @@ -4804,4 +4918,30 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mResult.dump(pw, prefix); } } + + private final class SleepTokenImpl extends SleepToken { + private final String mTag; + private final long mAcquireTime; + private final int mDisplayId; + + public SleepTokenImpl(String tag, int displayId) { + mTag = tag; + mDisplayId = displayId; + mAcquireTime = SystemClock.uptimeMillis(); + } + + @Override + public void release() { + synchronized (mService) { + removeSleepTokenLocked(this); + } + } + + @Override + public String toString() { + return "{\"" + mTag + "\", display " + mDisplayId + + ", acquire at " + TimeUtils.formatUptime(mAcquireTime) + "}"; + } + } + } diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index 58e71df3ba57..cea80c8d0e9d 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -18,6 +18,7 @@ package com.android.server.am; import static android.app.ActivityManager.StackId.DOCKED_STACK_ID; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; +import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; import static android.view.WindowManagerPolicy.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; @@ -32,6 +33,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_OCCLUDE; import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_UNOCCLUDE; import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import android.app.ActivityManagerInternal.SleepToken; import android.os.IBinder; import android.os.RemoteException; import android.os.Trace; @@ -63,6 +65,7 @@ class KeyguardController { private ActivityRecord mDismissingKeyguardActivity; private int mBeforeUnoccludeTransit; private int mVisibilityTransactionDepth; + private SleepToken mSleepToken; KeyguardController(ActivityManagerService service, ActivityStackSupervisor stackSupervisor) { @@ -102,7 +105,7 @@ class KeyguardController { mDismissalRequested = false; } mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); - mService.updateSleepIfNeededLocked(); + updateKeyguardSleepToken(); } /** @@ -122,7 +125,7 @@ class KeyguardController { mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY, false /* alwaysKeepCurrent */, convertTransitFlags(flags), false /* forceOverride */); - mService.updateSleepIfNeededLocked(); + updateKeyguardSleepToken(); // Some stack visibility might change (e.g. docked stack) mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); @@ -263,7 +266,7 @@ class KeyguardController { try { mWindowManager.prepareAppTransition(resolveOccludeTransit(), false /* alwaysKeepCurrent */, 0 /* flags */, true /* forceOverride */); - mService.updateSleepIfNeededLocked(); + updateKeyguardSleepToken(); mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); mWindowManager.executeAppTransition(); } finally { @@ -333,6 +336,15 @@ class KeyguardController { } } + private void updateKeyguardSleepToken() { + if (mSleepToken == null && isKeyguardShowing()) { + mSleepToken = mService.acquireSleepToken("Keyguard", DEFAULT_DISPLAY); + } else if (mSleepToken != null && !isKeyguardShowing()) { + mSleepToken.release(); + mSleepToken = null; + } + } + void dump(PrintWriter pw, String prefix) { pw.println(prefix + "KeyguardController:"); pw.println(prefix + " mKeyguardShowing=" + mKeyguardShowing); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 88d894449185..261797e3113c 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -96,6 +96,7 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_AND_PIPABLE import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION; import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_PRIVILEGED; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; +import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES; import static android.provider.Settings.Secure.USER_SETUP_COMPLETE; import static android.view.Display.DEFAULT_DISPLAY; @@ -1293,7 +1294,6 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // created controller for the activity we are starting yet. mWindowContainerController.positionChildAt(appController, index); } - r.onOverrideConfigurationSent(); // Make sure the list of display UID whitelists is updated // now that this record is in a new task. @@ -1580,8 +1580,9 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta // A task can not be docked even if it is considered resizeable because it only supports // picture-in-picture mode but has a non-resizeable resizeMode return mService.mSupportsSplitScreenMultiWindow - && isResizeable(false /* checkSupportsPip */) - && !ActivityInfo.isPreserveOrientationMode(mResizeMode); + && (mService.mForceResizableActivities + || (isResizeable(false /* checkSupportsPip */) + && !ActivityInfo.isPreserveOrientationMode(mResizeMode))); } /** diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 7a0c70652869..8de13bb53b70 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -5470,6 +5470,10 @@ public class AudioService extends IAudioService.Stub configureHdmiPlugIntent(intent, state); } + if (intent.getAction() == null) { + return; + } + intent.putExtra(CONNECT_INTENT_KEY_STATE, state); intent.putExtra(CONNECT_INTENT_KEY_ADDRESS, address); intent.putExtra(CONNECT_INTENT_KEY_PORT_NAME, deviceName); @@ -5543,9 +5547,7 @@ public class AudioService extends IAudioService.Stub } } } - if (device != AudioSystem.DEVICE_IN_WIRED_HEADSET) { - sendDeviceConnectionIntent(device, state, address, deviceName); - } + sendDeviceConnectionIntent(device, state, address, deviceName); updateAudioRoutes(device, state); } } diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 2b4f4e6a75f7..a985b4fb10b8 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -49,6 +49,7 @@ import android.net.ConnectivityManager; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.IpPrefix; +import android.net.LinkAddress; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; @@ -1196,6 +1197,7 @@ public class Tethering extends BaseNetworkObserver { // to tear itself down. private final ArrayList<TetherInterfaceStateMachine> mNotifyList; private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; + private final OffloadWrapper mOffload; private static final int UPSTREAM_SETTLE_TIME_MS = 10000; @@ -1220,33 +1222,11 @@ public class Tethering extends BaseNetworkObserver { mNotifyList = new ArrayList<>(); mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mLog); + mOffload = new OffloadWrapper(); setInitialState(mInitialState); } - private void startOffloadController() { - mOffloadController.start(); - sendOffloadExemptPrefixes(); - } - - private void sendOffloadExemptPrefixes() { - sendOffloadExemptPrefixes(mUpstreamNetworkMonitor.getLocalPrefixes()); - } - - private void sendOffloadExemptPrefixes(Set<IpPrefix> localPrefixes) { - // Add in well-known minimum set. - PrefixUtils.addNonForwardablePrefixes(localPrefixes); - // Add tragically hardcoded prefixes. - localPrefixes.add(PrefixUtils.DEFAULT_WIFI_P2P_PREFIX); - - // Add prefixes for all downstreams, regardless of IP serving mode. - for (TetherInterfaceStateMachine tism : mNotifyList) { - localPrefixes.addAll(PrefixUtils.localPrefixesFrom(tism.linkProperties())); - } - - mOffloadController.setLocalPrefixes(localPrefixes); - } - class InitialState extends State { @Override public boolean processMessage(Message message) { @@ -1404,7 +1384,7 @@ public class Tethering extends BaseNetworkObserver { protected void handleNewUpstreamNetworkState(NetworkState ns) { mIPv6TetheringCoordinator.updateUpstreamNetworkState(ns); - mOffloadController.setUpstreamLinkProperties((ns != null) ? ns.linkProperties : null); + mOffload.updateUpstreamNetworkState(ns); } private void handleInterfaceServingStateActive(int mode, TetherInterfaceStateMachine who) { @@ -1414,9 +1394,12 @@ public class Tethering extends BaseNetworkObserver { } if (mode == IControlsTethering.STATE_TETHERED) { + // No need to notify OffloadController just yet as there are no + // "offload-able" prefixes to pass along. This will handled + // when the TISM informs Tethering of its LinkProperties. mForwardedDownstreams.add(who); } else { - mOffloadController.removeDownstreamInterface(who.interfaceName()); + mOffload.excludeDownstreamInterface(who.interfaceName()); mForwardedDownstreams.remove(who); } @@ -1441,7 +1424,7 @@ public class Tethering extends BaseNetworkObserver { private void handleInterfaceServingStateInactive(TetherInterfaceStateMachine who) { mNotifyList.remove(who); mIPv6TetheringCoordinator.removeActiveDownstream(who); - mOffloadController.removeDownstreamInterface(who.interfaceName()); + mOffload.excludeDownstreamInterface(who.interfaceName()); mForwardedDownstreams.remove(who); // If this is a Wi-Fi interface, tell WifiManager of any errors. @@ -1455,7 +1438,7 @@ public class Tethering extends BaseNetworkObserver { private void handleUpstreamNetworkMonitorCallback(int arg1, Object o) { if (arg1 == UpstreamNetworkMonitor.NOTIFY_LOCAL_PREFIXES) { - sendOffloadExemptPrefixes((Set<IpPrefix>) o); + mOffload.sendOffloadExemptPrefixes((Set<IpPrefix>) o); return; } @@ -1525,7 +1508,7 @@ public class Tethering extends BaseNetworkObserver { // TODO: De-duplicate with updateUpstreamWanted() below. if (upstreamWanted()) { mUpstreamWanted = true; - startOffloadController(); + mOffload.start(); chooseUpstreamType(true); mTryCell = false; } @@ -1533,7 +1516,7 @@ public class Tethering extends BaseNetworkObserver { @Override public void exit() { - mOffloadController.stop(); + mOffload.stop(); mUpstreamNetworkMonitor.stop(); mSimChange.stopListening(); notifyDownstreamsOfNewUpstreamIface(null); @@ -1545,9 +1528,9 @@ public class Tethering extends BaseNetworkObserver { mUpstreamWanted = upstreamWanted(); if (mUpstreamWanted != previousUpstreamWanted) { if (mUpstreamWanted) { - startOffloadController(); + mOffload.start(); } else { - mOffloadController.stop(); + mOffload.stop(); } } return previousUpstreamWanted; @@ -1602,12 +1585,9 @@ public class Tethering extends BaseNetworkObserver { case EVENT_IFACE_UPDATE_LINKPROPERTIES: { final LinkProperties newLp = (LinkProperties) message.obj; if (message.arg1 == IControlsTethering.STATE_TETHERED) { - mOffloadController.notifyDownstreamLinkProperties(newLp); + mOffload.updateDownstreamLinkProperties(newLp); } else { - mOffloadController.removeDownstreamInterface(newLp.getInterfaceName()); - // Another interface might be in local-only hotspot mode; - // resend all local prefixes to the OffloadController. - sendOffloadExemptPrefixes(); + mOffload.excludeDownstreamInterface(newLp.getInterfaceName()); } break; } @@ -1722,6 +1702,82 @@ public class Tethering extends BaseNetworkObserver { } catch (Exception e) {} } } + + // A wrapper class to handle multiple situations where several calls to + // the OffloadController need to happen together. + // + // TODO: This suggests that the interface between OffloadController and + // Tethering is in need of improvement. Refactor these calls into the + // OffloadController implementation. + class OffloadWrapper { + public void start() { + mOffloadController.start(); + sendOffloadExemptPrefixes(); + } + + public void stop() { + mOffloadController.stop(); + } + + public void updateUpstreamNetworkState(NetworkState ns) { + mOffloadController.setUpstreamLinkProperties( + (ns != null) ? ns.linkProperties : null); + } + + public void updateDownstreamLinkProperties(LinkProperties newLp) { + // Update the list of offload-exempt prefixes before adding + // new prefixes on downstream interfaces to the offload HAL. + sendOffloadExemptPrefixes(); + mOffloadController.notifyDownstreamLinkProperties(newLp); + } + + public void excludeDownstreamInterface(String ifname) { + // This and other interfaces may be in local-only hotspot mode; + // resend all local prefixes to the OffloadController. + sendOffloadExemptPrefixes(); + mOffloadController.removeDownstreamInterface(ifname); + } + + public void sendOffloadExemptPrefixes() { + sendOffloadExemptPrefixes(mUpstreamNetworkMonitor.getLocalPrefixes()); + } + + public void sendOffloadExemptPrefixes(final Set<IpPrefix> localPrefixes) { + // Add in well-known minimum set. + PrefixUtils.addNonForwardablePrefixes(localPrefixes); + // Add tragically hardcoded prefixes. + localPrefixes.add(PrefixUtils.DEFAULT_WIFI_P2P_PREFIX); + + // Maybe add prefixes or addresses for downstreams, depending on + // the IP serving mode of each. + for (TetherInterfaceStateMachine tism : mNotifyList) { + final LinkProperties lp = tism.linkProperties(); + + switch (tism.servingMode()) { + case IControlsTethering.STATE_UNAVAILABLE: + case IControlsTethering.STATE_AVAILABLE: + // No usable LinkProperties in these states. + continue; + case IControlsTethering.STATE_TETHERED: + // Only add IPv4 /32 and IPv6 /128 prefixes. The + // directly-connected prefixes will be sent as + // downstream "offload-able" prefixes. + for (LinkAddress addr : lp.getAllLinkAddresses()) { + final InetAddress ip = addr.getAddress(); + if (ip.isLinkLocalAddress()) continue; + localPrefixes.add(PrefixUtils.ipAddressAsPrefix(ip)); + } + break; + case IControlsTethering.STATE_LOCAL_ONLY: + // Add prefixes covering all local IPs. + localPrefixes.addAll(PrefixUtils.localPrefixesFrom(lp)); + break; + } + } + + mOffloadController.setLocalPrefixes(localPrefixes); + } + } } @Override diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e82eabfe5ad9..56cff7c715d6 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -305,8 +305,8 @@ public class Vpn { * In order to support the always-on feature, an app has to * <ul> * <li>target {@link VERSION_CODES#N API 24} or above, and - * <li>not opt out through the {@link VpnService#METADATA_SUPPORTS_ALWAYS_ON} meta-data - * field. + * <li>not opt out through the {@link VpnService#SERVICE_META_DATA_SUPPORTS_ALWAYS_ON} + * meta-data field. * </ul> * * @param packageName the canonical package name of the VPN app @@ -340,8 +340,8 @@ public class Vpn { for (ResolveInfo rInfo : services) { final Bundle metaData = rInfo.serviceInfo.metaData; - if (metaData != null - && !metaData.getBoolean(VpnService.METADATA_SUPPORTS_ALWAYS_ON, true)) { + if (metaData != null && + !metaData.getBoolean(VpnService.SERVICE_META_DATA_SUPPORTS_ALWAYS_ON, true)) { return false; } } diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java index 1a5ff778010c..6d5c428e58f8 100644 --- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java +++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java @@ -17,7 +17,9 @@ package com.android.server.connectivity.tethering; import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_NONE; +import static android.net.NetworkStats.UID_ALL; import static android.net.TrafficStats.UID_TETHERING; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; @@ -30,11 +32,13 @@ import android.net.NetworkStats; import android.net.RouteInfo; import android.net.util.SharedLog; import android.os.Handler; +import android.os.Looper; import android.os.INetworkManagementService; import android.os.RemoteException; import android.os.SystemClock; import android.provider.Settings; import android.text.TextUtils; +import com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats; import com.android.internal.util.IndentingPrintWriter; @@ -44,9 +48,11 @@ import java.net.InetAddress; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; /** @@ -58,12 +64,13 @@ import java.util.concurrent.TimeUnit; public class OffloadController { private static final String TAG = OffloadController.class.getSimpleName(); - private static final int STATS_FETCH_TIMEOUT_MS = 1000; - private final Handler mHandler; private final OffloadHardwareInterface mHwInterface; private final ContentResolver mContentResolver; + private final INetworkManagementService mNms; + private final ITetheringStatsProvider mStatsProvider; private final SharedLog mLog; + private final HashMap<String, LinkProperties> mDownstreams; private boolean mConfigInitialized; private boolean mControlInitialized; private LinkProperties mUpstreamLinkProperties; @@ -76,21 +83,31 @@ public class OffloadController { private Set<String> mLastLocalPrefixStrs; // Maps upstream interface names to offloaded traffic statistics. - private HashMap<String, OffloadHardwareInterface.ForwardedStats> - mForwardedStats = new HashMap<>(); + // Always contains the latest value received from the hardware for each interface, regardless of + // whether offload is currently running on that interface. + private ConcurrentHashMap<String, ForwardedStats> mForwardedStats = + new ConcurrentHashMap<>(16, 0.75F, 1); + + // Maps upstream interface names to interface quotas. + // Always contains the latest value received from the framework for each interface, regardless + // of whether offload is currently running (or is even supported) on that interface. Only + // includes upstream interfaces that have a quota set. + private HashMap<String, Long> mInterfaceQuotas = new HashMap<>(); public OffloadController(Handler h, OffloadHardwareInterface hwi, ContentResolver contentResolver, INetworkManagementService nms, SharedLog log) { mHandler = h; mHwInterface = hwi; mContentResolver = contentResolver; + mNms = nms; + mStatsProvider = new OffloadTetheringStatsProvider(); mLog = log.forSubComponent(TAG); + mDownstreams = new HashMap<>(); mExemptPrefixes = new HashSet<>(); mLastLocalPrefixStrs = new HashSet<>(); try { - nms.registerTetheringStatsProvider( - new OffloadTetheringStatsProvider(), getClass().getSimpleName()); + mNms.registerTetheringStatsProvider(mStatsProvider, getClass().getSimpleName()); } catch (RemoteException e) { mLog.e("Cannot register offload stats provider: " + e); } @@ -117,21 +134,25 @@ public class OffloadController { new OffloadHardwareInterface.ControlCallback() { @Override public void onStarted() { + if (!started()) return; mLog.log("onStarted"); } @Override public void onStoppedError() { + if (!started()) return; mLog.log("onStoppedError"); } @Override public void onStoppedUnsupported() { + if (!started()) return; mLog.log("onStoppedUnsupported"); } @Override public void onSupportAvailable() { + if (!started()) return; mLog.log("onSupportAvailable"); // [1] Poll for statistics and notify NetworkStats @@ -139,19 +160,40 @@ public class OffloadController { // [a] push local prefixes // [b] push downstreams // [c] push upstream parameters - pushUpstreamParameters(); + pushUpstreamParameters(null); } @Override public void onStoppedLimitReached() { + if (!started()) return; mLog.log("onStoppedLimitReached"); - // Poll for statistics and notify NetworkStats + + // We cannot reliably determine on which interface the limit was reached, + // because the HAL interface does not specify it. We cannot just use the + // current upstream, because that might have changed since the time that + // the HAL queued the callback. + // TODO: rev the HAL so that it provides an interface name. + + // Fetch current stats, so that when our notification reaches + // NetworkStatsService and triggers a poll, we will respond with + // current data (which will be above the limit that was reached). + // Note that if we just changed upstream, this is unnecessary but harmless. + // The stats for the previous upstream were already updated on this thread + // just after the upstream was changed, so they are also up-to-date. + updateStatsForCurrentUpstream(); + + try { + mNms.tetherLimitReached(mStatsProvider); + } catch (RemoteException e) { + mLog.e("Cannot report data limit reached: " + e); + } } @Override public void onNatTimeoutUpdate(int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { + if (!started()) return; mLog.log(String.format("NAT timeout update: %s (%s,%s) -> (%s,%s)", proto, srcAddr, srcPort, dstAddr, dstPort)); } @@ -164,6 +206,9 @@ public class OffloadController { } public void stop() { + // Completely stops tethering offload. After this method is called, it is no longer safe to + // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight + // callbacks must be ignored. Offload may be started again by calling start(). final boolean wasStarted = started(); updateStatsForCurrentUpstream(); mUpstreamLinkProperties = null; @@ -175,55 +220,89 @@ public class OffloadController { private class OffloadTetheringStatsProvider extends ITetheringStatsProvider.Stub { @Override - public NetworkStats getTetherStats() { + public NetworkStats getTetherStats(int how) { + // getTetherStats() is the only function in OffloadController that can be called from + // a different thread. Do not attempt to update stats by querying the offload HAL + // synchronously from a different thread than our Handler thread. http://b/64771555. + Runnable updateStats = () -> { updateStatsForCurrentUpstream(); }; + if (Looper.myLooper() == mHandler.getLooper()) { + updateStats.run(); + } else { + mHandler.post(updateStats); + } + NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); - CountDownLatch latch = new CountDownLatch(1); + NetworkStats.Entry entry = new NetworkStats.Entry(); + entry.set = SET_DEFAULT; + entry.tag = TAG_NONE; + entry.uid = (how == STATS_PER_UID) ? UID_TETHERING : UID_ALL; + + for (Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) { + ForwardedStats value = kv.getValue(); + entry.iface = kv.getKey(); + entry.rxBytes = value.rxBytes; + entry.txBytes = value.txBytes; + stats.addValues(entry); + } + return stats; + } + + public void setInterfaceQuota(String iface, long quotaBytes) { mHandler.post(() -> { - try { - NetworkStats.Entry entry = new NetworkStats.Entry(); - entry.set = SET_DEFAULT; - entry.tag = TAG_NONE; - entry.uid = UID_TETHERING; - - updateStatsForCurrentUpstream(); - - for (String iface : mForwardedStats.keySet()) { - entry.iface = iface; - entry.rxBytes = mForwardedStats.get(iface).rxBytes; - entry.txBytes = mForwardedStats.get(iface).txBytes; - stats.addValues(entry); - } - } finally { - latch.countDown(); + if (quotaBytes == ITetheringStatsProvider.QUOTA_UNLIMITED) { + mInterfaceQuotas.remove(iface); + } else { + mInterfaceQuotas.put(iface, quotaBytes); } + maybeUpdateDataLimit(iface); }); - - try { - latch.await(STATS_FETCH_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - mLog.e("Tethering stats fetch timed out after " + STATS_FETCH_TIMEOUT_MS + "ms"); - } - - return stats; } } + private String currentUpstreamInterface() { + return (mUpstreamLinkProperties != null) + ? mUpstreamLinkProperties.getInterfaceName() : null; + } + private void maybeUpdateStats(String iface) { if (TextUtils.isEmpty(iface)) { return; } - if (!mForwardedStats.containsKey(iface)) { - mForwardedStats.put(iface, new OffloadHardwareInterface.ForwardedStats()); + // Always called on the handler thread. + // + // Use get()/put() instead of updating ForwardedStats in place because we can be called + // concurrently with getTetherStats. In combination with the guarantees provided by + // ConcurrentHashMap, this ensures that getTetherStats always gets the most recent copy of + // the stats for each interface, and does not observe partial writes where rxBytes is + // updated and txBytes is not. + ForwardedStats diff = mHwInterface.getForwardedStats(iface); + ForwardedStats base = mForwardedStats.get(iface); + if (base != null) { + diff.add(base); } - mForwardedStats.get(iface).add(mHwInterface.getForwardedStats(iface)); + mForwardedStats.put(iface, diff); + // diff is a new object, just created by getForwardedStats(). Therefore, anyone reading from + // mForwardedStats (i.e., any caller of getTetherStats) will see the new stats immediately. } - private void updateStatsForCurrentUpstream() { - if (mUpstreamLinkProperties != null) { - maybeUpdateStats(mUpstreamLinkProperties.getInterfaceName()); + private boolean maybeUpdateDataLimit(String iface) { + // setDataLimit may only be called while offload is occuring on this upstream. + if (!started() || !TextUtils.equals(iface, currentUpstreamInterface())) { + return true; } + + Long limit = mInterfaceQuotas.get(iface); + if (limit == null) { + limit = Long.MAX_VALUE; + } + + return mHwInterface.setDataLimit(iface, limit); + } + + private void updateStatsForCurrentUpstream() { + maybeUpdateStats(currentUpstreamInterface()); } public void setUpstreamLinkProperties(LinkProperties lp) { @@ -239,10 +318,7 @@ public class OffloadController { // onOffloadEvent() callback to tell us offload is available again and // then reapply all state). computeAndPushLocalPrefixes(); - pushUpstreamParameters(); - - // Update stats after we've told the hardware to change routing so we don't miss packets. - maybeUpdateStats(prevUpstream); + pushUpstreamParameters(prevUpstream); } public void setLocalPrefixes(Set<IpPrefix> localPrefixes) { @@ -253,17 +329,42 @@ public class OffloadController { } public void notifyDownstreamLinkProperties(LinkProperties lp) { + final String ifname = lp.getInterfaceName(); + final LinkProperties oldLp = mDownstreams.put(ifname, new LinkProperties(lp)); + if (Objects.equals(oldLp, lp)) return; + if (!started()) return; - // TODO: Cache LinkProperties on a per-ifname basis and compute the - // deltas, calling addDownstream()/removeDownstream() accordingly. + final List<RouteInfo> oldRoutes = (oldLp != null) ? oldLp.getRoutes() : new ArrayList<>(); + final List<RouteInfo> newRoutes = lp.getRoutes(); + + // For each old route, if not in new routes: remove. + for (RouteInfo oldRoute : oldRoutes) { + if (shouldIgnoreDownstreamRoute(oldRoute)) continue; + if (!newRoutes.contains(oldRoute)) { + mHwInterface.removeDownstreamPrefix(ifname, oldRoute.getDestination().toString()); + } + } + + // For each new route, if not in old routes: add. + for (RouteInfo newRoute : newRoutes) { + if (shouldIgnoreDownstreamRoute(newRoute)) continue; + if (!oldRoutes.contains(newRoute)) { + mHwInterface.addDownstreamPrefix(ifname, newRoute.getDestination().toString()); + } + } } public void removeDownstreamInterface(String ifname) { + final LinkProperties lp = mDownstreams.remove(ifname); + if (lp == null) return; + if (!started()) return; - // TODO: Check cache for LinkProperties of ifname and, if present, - // call removeDownstream() accordingly. + for (RouteInfo route : lp.getRoutes()) { + if (shouldIgnoreDownstreamRoute(route)) continue; + mHwInterface.removeDownstreamPrefix(ifname, route.getDestination().toString()); + } } private boolean isOffloadDisabled() { @@ -276,8 +377,9 @@ public class OffloadController { return mConfigInitialized && mControlInitialized; } - private boolean pushUpstreamParameters() { + private boolean pushUpstreamParameters(String prevUpstream) { if (mUpstreamLinkProperties == null) { + maybeUpdateStats(prevUpstream); return mHwInterface.setUpstreamParameters(null, null, null, null); } @@ -309,8 +411,26 @@ public class OffloadController { } } - return mHwInterface.setUpstreamParameters( + boolean success = mHwInterface.setUpstreamParameters( iface, v4addr, v4gateway, (v6gateways.isEmpty() ? null : v6gateways)); + + if (!success) { + return success; + } + + // Update stats after we've told the hardware to change routing so we don't miss packets. + maybeUpdateStats(prevUpstream); + + // Data limits can only be set once offload is running on the upstream. + success = maybeUpdateDataLimit(iface); + if (!success) { + // If we failed to set a data limit, don't use this upstream, because we don't want to + // blow through the data limit that we were told to apply. + mLog.log("Setting data limit for " + iface + " failed, disabling offload."); + stop(); + } + + return success; } private boolean computeAndPushLocalPrefixes() { @@ -351,6 +471,13 @@ public class OffloadController { return localPrefixStrs; } + private static boolean shouldIgnoreDownstreamRoute(RouteInfo route) { + // Ignore any link-local routes. + if (!route.getDestinationLinkAddress().isGlobalPreferred()) return true; + + return false; + } + public void dump(IndentingPrintWriter pw) { if (isOffloadDisabled()) { pw.println("Offload disabled"); diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java index 25fab9e403a1..865a98902d0b 100644 --- a/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java +++ b/services/core/java/com/android/server/connectivity/tethering/OffloadHardwareInterface.java @@ -40,7 +40,7 @@ public class OffloadHardwareInterface { // Change this value to control whether tether offload is enabled or // disabled by default in the absence of an explicit Settings value. // See accompanying unittest to distinguish 0 from non-0 values. - private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 1; + private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 0; private static final String NO_INTERFACE_NAME = ""; private static final String NO_IPV4_ADDRESS = ""; private static final String NO_IPV4_GATEWAY = ""; @@ -188,6 +188,27 @@ public class OffloadHardwareInterface { return results.success; } + public boolean setDataLimit(String iface, long limit) { + + final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit); + + final CbResults results = new CbResults(); + try { + mOffloadControl.setDataLimit( + iface, limit, + (boolean success, String errMsg) -> { + results.success = success; + results.errMsg = errMsg; + }); + } catch (RemoteException e) { + record(logmsg, e); + return false; + } + + record(logmsg, results); + return results.success; + } + public boolean setUpstreamParameters( String iface, String v4addr, String v4gateway, ArrayList<String> v6gws) { iface = (iface != null) ? iface : NO_INTERFACE_NAME; @@ -215,6 +236,44 @@ public class OffloadHardwareInterface { return results.success; } + public boolean addDownstreamPrefix(String ifname, String prefix) { + final String logmsg = String.format("addDownstreamPrefix(%s, %s)", ifname, prefix); + + final CbResults results = new CbResults(); + try { + mOffloadControl.addDownstream(ifname, prefix, + (boolean success, String errMsg) -> { + results.success = success; + results.errMsg = errMsg; + }); + } catch (RemoteException e) { + record(logmsg, e); + return false; + } + + record(logmsg, results); + return results.success; + } + + public boolean removeDownstreamPrefix(String ifname, String prefix) { + final String logmsg = String.format("removeDownstreamPrefix(%s, %s)", ifname, prefix); + + final CbResults results = new CbResults(); + try { + mOffloadControl.removeDownstream(ifname, prefix, + (boolean success, String errMsg) -> { + results.success = success; + results.errMsg = errMsg; + }); + } catch (RemoteException e) { + record(logmsg, e); + return false; + } + + record(logmsg, results); + return results.success; + } + private void record(String msg, Throwable t) { mLog.e(msg + YIELDS + "exception: " + t); } diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java index 69678df4543d..57d2502c6dc7 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java @@ -115,6 +115,7 @@ public class TetherInterfaceStateMachine extends StateMachine { private final LinkProperties mLinkProperties; private int mLastError; + private int mServingMode; private String mMyUpstreamIfaceName; // may change over time private NetworkInterface mNetworkInterface; private byte[] mHwAddr; @@ -142,6 +143,7 @@ public class TetherInterfaceStateMachine extends StateMachine { mLinkProperties = new LinkProperties(); resetLinkProperties(); mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR; + mServingMode = IControlsTethering.STATE_AVAILABLE; mInitialState = new InitialState(); mLocalHotspotState = new LocalHotspotState(); @@ -161,6 +163,8 @@ public class TetherInterfaceStateMachine extends StateMachine { public int lastError() { return mLastError; } + public int servingMode() { return mServingMode; } + public LinkProperties linkProperties() { return new LinkProperties(mLinkProperties); } public void stop() { sendMessage(CMD_INTERFACE_DOWN); } @@ -448,6 +452,7 @@ public class TetherInterfaceStateMachine extends StateMachine { } private void sendInterfaceState(int newInterfaceState) { + mServingMode = newInterfaceState; mTetherController.updateInterfaceState( TetherInterfaceStateMachine.this, newInterfaceState, mLastError); sendLinkProperties(); diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index ad74ff88e80f..6e1c21eea15a 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -646,6 +646,7 @@ public final class ContentService extends IContentService.Stub { SyncManager syncManager = getSyncManager(); if (syncManager == null) return; int userId = UserHandle.getCallingUserId(); + final int callingUid = Binder.getCallingUid(); long identityToken = clearCallingIdentity(); try { @@ -658,7 +659,8 @@ public final class ContentService extends IContentService.Stub { // Remove periodic sync. mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); - getSyncManager().removePeriodicSync(info, extras); + getSyncManager().removePeriodicSync(info, extras, + "cancelRequest() by uid=" + callingUid); } // Cancel active syncs and clear pending syncs from the queue. syncManager.cancelScheduledSyncOperation(info, extras); @@ -814,13 +816,15 @@ public final class ContentService extends IContentService.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); + final int callingUid = Binder.getCallingUid(); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { getSyncManager() .removePeriodicSync( new SyncStorageEngine.EndPoint(account, authority, userId), - extras); + extras, "removePeriodicSync() by uid=" + callingUid); } finally { restoreCallingIdentity(identityToken); } diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index f41aa5f7993c..845561f09145 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -59,6 +59,7 @@ import android.net.NetworkInfo; import android.net.TrafficStats; import android.os.BatteryStats; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -141,6 +142,8 @@ public class SyncManager { private static final boolean DEBUG_ACCOUNT_ACCESS = false; + private static final boolean ENABLE_SUSPICIOUS_CHECK = Build.IS_DEBUGGABLE; + /** Delay a sync due to local changes this long. In milliseconds */ private static final long LOCAL_SYNC_DELAY; @@ -463,7 +466,7 @@ public class SyncManager { } if (opx.key.equals(opy.key)) { mLogger.log("Removing duplicate sync: ", opy); - mJobScheduler.cancel(opy.jobId); + cancelJob(opy, "cleanupJobs() x=" + opx + " y=" + opy); } } } @@ -501,15 +504,21 @@ public class SyncManager { } } } - if (mLogger.enabled()) { - mLogger.log("Connected to JobScheduler: " - + numPersistedPeriodicSyncs + " periodic syncs " - + numPersistedOneshotSyncs + " oneshot syncs."); - } + final int totalJobs = (mJobSchedulerInternal == null) + ? -1 : mJobSchedulerInternal.countJobs(); + final String summary = "Loaded persisted syncs: " + + numPersistedPeriodicSyncs + " periodic syncs, " + + numPersistedOneshotSyncs + " oneshot syncs, " + + (pendingJobs.size()) + " total system server jobs, " + + totalJobs + " total jobs."; + Slog.i(TAG, summary); + mLogger.log(summary); + cleanupJobs(); - if ((numPersistedPeriodicSyncs == 0) && likelyHasPeriodicSyncs()) { - Slog.wtf(TAG, "Device booted with no persisted periodic syncs."); + if (ENABLE_SUSPICIOUS_CHECK && + (numPersistedPeriodicSyncs == 0) && likelyHasPeriodicSyncs()) { + Slog.wtf(TAG, "Device booted with no persisted periodic syncs: " + summary); } } finally { Binder.restoreCallingIdentity(token); @@ -520,6 +529,7 @@ public class SyncManager { * @return whether the device most likely has some periodic syncs. */ private boolean likelyHasPeriodicSyncs() { + // STOPSHIP Remove the google specific string. try { return AccountManager.get(mContext).getAccountsByType("com.google").length > 0; } catch (Throwable th) { @@ -566,7 +576,7 @@ public class SyncManager { mSyncStorageEngine.setOnAuthorityRemovedListener(new SyncStorageEngine.OnAuthorityRemovedListener() { @Override public void onAuthorityRemoved(EndPoint removedAuthority) { - removeSyncsForAuthority(removedAuthority); + removeSyncsForAuthority(removedAuthority, "onAuthorityRemoved"); } }); @@ -1118,14 +1128,14 @@ public class SyncManager { } } - private void removeSyncsForAuthority(EndPoint info) { + private void removeSyncsForAuthority(EndPoint info, String why) { mLogger.log("removeSyncsForAuthority: ", info); verifyJobScheduler(); List<SyncOperation> ops = getAllPendingSyncs(); for (SyncOperation op: ops) { if (op.target.matchesSpec(info)) { mLogger.log("canceling: ", op); - getJobScheduler().cancel(op.jobId); + cancelJob(op, why); } } } @@ -1133,8 +1143,9 @@ public class SyncManager { /** * Remove a specific periodic sync identified by its target and extras. */ - public void removePeriodicSync(EndPoint target, Bundle extras) { - Message m = mSyncHandler.obtainMessage(mSyncHandler.MESSAGE_REMOVE_PERIODIC_SYNC, target); + public void removePeriodicSync(EndPoint target, Bundle extras, String why) { + Message m = mSyncHandler.obtainMessage(mSyncHandler.MESSAGE_REMOVE_PERIODIC_SYNC, + Pair.create(target, why)); m.setData(extras); m.sendToTarget(); } @@ -1359,7 +1370,7 @@ public class SyncManager { for (SyncOperation op: ops) { if (!op.isPeriodic && op.target.matchesSpec(target)) { count++; - getJobScheduler().cancel(op.jobId); + cancelJob(op, why); postScheduleSyncMessage(op, 0 /* min delay */); } } @@ -1484,7 +1495,7 @@ public class SyncManager { if (isLoggable) { Slog.v(TAG, "Cancelling duplicate sync " + op); } - getJobScheduler().cancel(op.jobId); + cancelJob(op, "scheduleSyncOperationH-duplicate"); } } } @@ -1544,7 +1555,7 @@ public class SyncManager { List<SyncOperation> ops = getAllPendingSyncs(); for (SyncOperation op: ops) { if (!op.isPeriodic && op.target.matchesSpec(info)) { - getJobScheduler().cancel(op.jobId); + cancelJob(op, "clearScheduledSyncOperations"); getSyncStorageEngine().markPending(op.target, false); } } @@ -1562,7 +1573,7 @@ public class SyncManager { for (SyncOperation op: ops) { if (!op.isPeriodic && op.target.matchesSpec(info) && syncExtrasEquals(extras, op.extras, false)) { - getJobScheduler().cancel(op.jobId); + cancelJob(op, "cancelScheduledSyncOperation"); } } setAuthorityPendingState(info); @@ -1678,7 +1689,7 @@ public class SyncManager { List<SyncOperation> ops = getAllPendingSyncs(); for (SyncOperation op: ops) { if (op.target.userId == userId) { - getJobScheduler().cancel(op.jobId); + cancelJob(op, "user removed u" + userId); } } } @@ -2710,7 +2721,8 @@ public class SyncManager { data.flex, data.extras); break; case MESSAGE_REMOVE_PERIODIC_SYNC: - removePeriodicSyncH((EndPoint)msg.obj, msg.getData()); + Pair<EndPoint, String> args = (Pair<EndPoint, String>) (msg.obj); + removePeriodicSyncH(args.first, msg.getData(), args.second); break; case SyncHandler.MESSAGE_CANCEL: @@ -2848,7 +2860,7 @@ public class SyncManager { // mSyncJobService.callJobFinished is async, so cancel the job to ensure we don't // find the this job in the pending jobs list while looking for duplicates // before scheduling it at a later time. - getJobScheduler().cancel(op.jobId); + cancelJob(op, "deferSyncH()"); scheduleSyncOperationH(op, delay); } } @@ -2998,7 +3010,7 @@ public class SyncManager { for (SyncOperation op: ops) { if (!containsAccountAndUser(allAccounts, op.target.account, op.target.userId)) { mLogger.log("canceling: ", op); - getJobScheduler().cancel(op.jobId); + cancelJob(op, "updateRunningAccountsH()"); } } @@ -3105,7 +3117,7 @@ public class SyncManager { /** * Remove this periodic sync operation and all one-off operations initiated by it. */ - private void removePeriodicSyncInternalH(SyncOperation syncOperation) { + private void removePeriodicSyncInternalH(SyncOperation syncOperation, String why) { // Remove this periodic sync and all one-off syncs initiated by it. List<SyncOperation> ops = getAllPendingSyncs(); for (SyncOperation op: ops) { @@ -3117,18 +3129,18 @@ public class SyncManager { runSyncFinishedOrCanceledH(null, asc); } mLogger.log("removePeriodicSyncInternalH-canceling: ", op); - getJobScheduler().cancel(op.jobId); + cancelJob(op, why); } } } - private void removePeriodicSyncH(EndPoint target, Bundle extras) { + private void removePeriodicSyncH(EndPoint target, Bundle extras, String why) { verifyJobScheduler(); List<SyncOperation> ops = getAllPendingSyncs(); for (SyncOperation op: ops) { if (op.isPeriodic && op.target.matchesSpec(target) && syncExtrasEquals(op.extras, extras, true /* includeSyncSettings */)) { - removePeriodicSyncInternalH(op); + removePeriodicSyncInternalH(op, why); } } } @@ -3354,12 +3366,6 @@ public class SyncManager { int downstreamActivity; int upstreamActivity; - if (!syncOperation.isPeriodic) { - // mSyncJobService.jobFinidhed is async, we need to ensure that this job is - // removed from JobScheduler's pending jobs list before moving forward and - // potentially rescheduling all pending jobs to respect new backoff values. - getJobScheduler().cancel(syncOperation.jobId); - } mLogger.log("runSyncFinishedOrCanceledH() op=", syncOperation, " result=", syncResult); if (syncResult != null) { @@ -3368,6 +3374,16 @@ public class SyncManager { + syncOperation + ", result " + syncResult); } + // In the non-canceled case, close the active sync context before doing the rest + // of the stuff. + closeActiveSyncContext(activeSyncContext); + + // Note this part is probably okay to do before closeActiveSyncContext()... + // But moved here to restore OC-dev's behavior. See b/64597061. + if (!syncOperation.isPeriodic) { + cancelJob(syncOperation, "runSyncFinishedOrCanceledH()-finished"); + } + if (!syncResult.hasError()) { historyMessage = SyncStorageEngine.MESG_SUCCESS; // TODO: set these correctly when the SyncResult is extended to include it @@ -3404,6 +3420,11 @@ public class SyncManager { if (isLoggable) { Slog.v(TAG, "runSyncFinishedOrCanceled [canceled]: " + syncOperation); } + + if (!syncOperation.isPeriodic) { + cancelJob(syncOperation, "runSyncFinishedOrCanceledH()-canceled"); + } + if (activeSyncContext.mSyncAdapter != null) { try { mLogger.log("Calling cancelSync for runSyncFinishedOrCanceled ", @@ -3418,10 +3439,10 @@ public class SyncManager { historyMessage = SyncStorageEngine.MESG_CANCELED; downstreamActivity = 0; upstreamActivity = 0; - } - // Close and unbind the service. Don't use activeSyncContext.mSyncAdapter after this. - closeActiveSyncContext(activeSyncContext); + // In the cancel sync case, close it after calling cancelSync(). + closeActiveSyncContext(activeSyncContext); + } stopSyncEvent(activeSyncContext.mHistoryRowId, syncOperation, historyMessage, upstreamActivity, downstreamActivity, elapsedTime); @@ -3457,6 +3478,8 @@ public class SyncManager { + activeSyncContext.toString()); } mSyncHandler.removeMessages(SyncHandler.MESSAGE_MONITOR_SYNC, activeSyncContext); + + mLogger.log("closeActiveSyncContext: ", activeSyncContext); } /** @@ -3736,4 +3759,48 @@ public class SyncManager { return mContext; } } + + private void cancelJob(SyncOperation op, String why) { + if (op == null) { + Slog.wtf(TAG, "Null sync operation detected."); + return; + } + if (op.isPeriodic) { + mLogger.log("Removing periodic sync ", op, " for ", why); + + if (ENABLE_SUSPICIOUS_CHECK && isSuspiciousPeriodicSyncRemoval(op)) { + wtfWithLog("Suspicious removal of " + op + " for " + why); + } + } + getJobScheduler().cancel(op.jobId); + } + + private boolean isSuspiciousPeriodicSyncRemoval(SyncOperation op) { + // STOPSHIP Remove the google specific string. + if (!op.isPeriodic){ + return false; + } + switch (op.target.provider) { + case "gmail-ls": + case "com.android.contacts.metadata": + break; + default: + return false; + } + final Account account = op.target.account; + final Account[] accounts = AccountManager.get(mContext) + .getAccountsByTypeAsUser(account.type, UserHandle.of(op.target.userId)); + for (Account a : accounts) { + if (a.equals(account)) { + return true; // Account still exists. Suspicious! + } + } + // Account no longer exists. Makes sense... + return false; + } + + private void wtfWithLog(String message) { + Slog.wtf(TAG, message); + mLogger.log("WTF: ", message); + } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 3d24fed60069..9aabdab7daa8 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -59,6 +59,13 @@ class AutomaticBrightnessController { private static final int MSG_UPDATE_AMBIENT_LUX = 1; private static final int MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE = 2; + // Length of the ambient light horizon used to calculate the long term estimate of ambient + // light. + private static final int AMBIENT_LIGHT_LONG_HORIZON_MILLIS = 10000; + + // Length of the ambient light horizon used to calculate short-term estimate of ambient light. + private static final int AMBIENT_LIGHT_SHORT_HORIZON_MILLIS = 2000; + // Callbacks for requesting updates to the display's power state private final Callbacks mCallbacks; @@ -345,22 +352,51 @@ class AutomaticBrightnessController { } private void setAmbientLux(float lux) { + if (DEBUG) { + Slog.d(TAG, "setAmbientLux(" + lux + ")"); + } mAmbientLux = lux; mBrighteningLuxThreshold = mDynamicHysteresis.getBrighteningThreshold(lux); mDarkeningLuxThreshold = mDynamicHysteresis.getDarkeningThreshold(lux); } - private float calculateAmbientLux(long now) { + private float calculateAmbientLux(long now, long horizon) { + if (DEBUG) { + Slog.d(TAG, "calculateAmbientLux(" + now + ", " + horizon + ")"); + } final int N = mAmbientLightRingBuffer.size(); if (N == 0) { Slog.e(TAG, "calculateAmbientLux: No ambient light readings available"); return -1; } + + // Find the first measurement that is just outside of the horizon. + int endIndex = 0; + final long horizonStartTime = now - horizon; + for (int i = 0; i < N-1; i++) { + if (mAmbientLightRingBuffer.getTime(i + 1) <= horizonStartTime) { + endIndex++; + } else { + break; + } + } + if (DEBUG) { + Slog.d(TAG, "calculateAmbientLux: selected endIndex=" + endIndex + ", point=(" + + mAmbientLightRingBuffer.getTime(endIndex) + ", " + + mAmbientLightRingBuffer.getLux(endIndex) + + ")"); + } float sum = 0; float totalWeight = 0; long endTime = AMBIENT_LIGHT_PREDICTION_TIME_MILLIS; - for (int i = N - 1; i >= 0; i--) { - long startTime = (mAmbientLightRingBuffer.getTime(i) - now); + for (int i = N - 1; i >= endIndex; i--) { + long eventTime = mAmbientLightRingBuffer.getTime(i); + if (i == endIndex && eventTime < horizonStartTime) { + // If we're at the final value, make sure we only consider the part of the sample + // within our desired horizon. + eventTime = horizonStartTime; + } + final long startTime = eventTime - now; float weight = calculateWeight(startTime, endTime); float lux = mAmbientLightRingBuffer.getLux(i); if (DEBUG) { @@ -435,7 +471,7 @@ class AutomaticBrightnessController { timeWhenSensorWarmedUp); return; } - setAmbientLux(calculateAmbientLux(time)); + setAmbientLux(calculateAmbientLux(time, AMBIENT_LIGHT_SHORT_HORIZON_MILLIS)); mAmbientLuxValid = true; if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Initializing: " @@ -447,14 +483,25 @@ class AutomaticBrightnessController { long nextBrightenTransition = nextAmbientLightBrighteningTransition(time); long nextDarkenTransition = nextAmbientLightDarkeningTransition(time); - float ambientLux = calculateAmbientLux(time); - - if (ambientLux >= mBrighteningLuxThreshold && nextBrightenTransition <= time - || ambientLux <= mDarkeningLuxThreshold && nextDarkenTransition <= time) { - setAmbientLux(ambientLux); + // Essentially, we calculate both a slow ambient lux, to ensure there's a true long-term + // change in lighting conditions, and a fast ambient lux to determine what the new + // brightness situation is since the slow lux can be quite slow to converge. + // + // Note that both values need to be checked for sufficient change before updating the + // proposed ambient light value since the slow value might be sufficiently far enough away + // from the fast value to cause a recalculation while its actually just converging on + // the fast value still. + float slowAmbientLux = calculateAmbientLux(time, AMBIENT_LIGHT_LONG_HORIZON_MILLIS); + float fastAmbientLux = calculateAmbientLux(time, AMBIENT_LIGHT_SHORT_HORIZON_MILLIS); + + if (slowAmbientLux >= mBrighteningLuxThreshold && + fastAmbientLux >= mBrighteningLuxThreshold && nextBrightenTransition <= time + || slowAmbientLux <= mDarkeningLuxThreshold + && fastAmbientLux <= mDarkeningLuxThreshold && nextDarkenTransition <= time) { + setAmbientLux(fastAmbientLux); if (DEBUG) { Slog.d(TAG, "updateAmbientLux: " - + ((ambientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": " + + ((fastAmbientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": " + "mBrighteningLuxThreshold=" + mBrighteningLuxThreshold + ", mAmbientLightRingBuffer=" + mAmbientLightRingBuffer + ", mAmbientLux=" + mAmbientLux); @@ -616,6 +663,12 @@ class AutomaticBrightnessController { void updateBrightness(); } + /** + * A ring buffer of ambient light measurements sorted by time. + * + * Each entry consists of a timestamp and a lux measurement, and the overall buffer is sorted + * from oldest to newest. + */ private static final class AmbientLightRingBuffer { // Proportional extra capacity of the buffer beyond the expected number of light samples // in the horizon diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index fb8ae1247796..f8e58362e7ae 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -984,6 +984,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call Slog.d(TAG, "Animating brightness: target=" + target +", rate=" + rate); } if (mScreenBrightnessRampAnimator.animateTo(target, rate)) { + Trace.traceCounter(Trace.TRACE_TAG_POWER, "TargetScreenBrightness", target); try { mBatteryStats.noteScreenBrightness(target); } catch (RemoteException ex) { @@ -1010,7 +1011,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // contents of the screen. mPowerState.prepareColorFade(mContext, mColorFadeFadesConfig ? ColorFade.MODE_FADE : ColorFade.MODE_WARM_UP); - mColorFadeOffAnimator.end(); + if (mColorFadeOffAnimator != null) { + mColorFadeOffAnimator.end(); + } // Some display hardware will blank itself on the transition between doze and non-doze // but still on display states. In this case we want to report to policy that the // display has turned off so it can prepare the appropriate power on animation, but we diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index ce5f430c148f..87564846df3b 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -532,7 +532,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { try { mBacklight.setBrightness(brightness); Trace.traceCounter(Trace.TRACE_TAG_POWER, - "DisplayBrightness", brightness); + "ScreenBrightness", brightness); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } diff --git a/services/core/java/com/android/server/job/JobSchedulerInternal.java b/services/core/java/com/android/server/job/JobSchedulerInternal.java index bc6bd501176c..d52b3b760c11 100644 --- a/services/core/java/com/android/server/job/JobSchedulerInternal.java +++ b/services/core/java/com/android/server/job/JobSchedulerInternal.java @@ -37,4 +37,9 @@ public interface JobSchedulerInternal { void addBackingUpUid(int uid); void removeBackingUpUid(int uid); void clearAllBackingUpUids(); + + /** + * @return the total number of jobs across all UIDs. + */ + int countJobs(); } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index e25f3e65d3d8..12087b07444e 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -1835,6 +1835,13 @@ public final class JobSchedulerService extends com.android.server.SystemService } } } + + @Override + public int countJobs() { + synchronized (mLock) { + return mJobs.size(); + } + } } /** @@ -2015,6 +2022,12 @@ public final class JobSchedulerService extends com.android.server.SystemService @Override public void cancelAll() throws RemoteException { final int uid = Binder.getCallingUid(); + switch (uid) { + case Process.SYSTEM_UID: + // This really shouldn't happen. + Slog.wtf(TAG, "JobScheduler.cancelAll() called for uid=" + uid); + return; + } long ident = Binder.clearCallingIdentity(); try { diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index 62b06d6242ea..5317616ad13a 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -544,6 +544,7 @@ public final class JobStore { @Override public void run() { + int numJobs = 0; try { List<JobStatus> jobs; FileInputStream fis = mJobsFile.openRead(); @@ -557,6 +558,7 @@ public final class JobStore { js.prepareLocked(am); js.enqueueTime = now; this.jobSet.add(js); + numJobs++; } } } @@ -565,15 +567,10 @@ public final class JobStore { if (DEBUG) { Slog.d(TAG, "Could not find jobs file, probably there was nothing to load."); } - } catch (XmlPullParserException e) { - if (DEBUG) { - Slog.d(TAG, "Error parsing xml.", e); - } - } catch (IOException e) { - if (DEBUG) { - Slog.d(TAG, "Error parsing xml.", e); - } + } catch (XmlPullParserException | IOException e) { + Slog.wtf(TAG, "Error jobstore xml.", e); } + Slog.i(TAG, "Read " + numJobs + " jobs"); } private List<JobStatus> readJobMapImpl(FileInputStream fis, boolean rtcIsGood) diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 83bacc2350be..5927b2f050fc 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -19,6 +19,7 @@ package com.android.server.locksettings; import static android.Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE; import static android.Manifest.permission.READ_CONTACTS; import static android.content.Context.KEYGUARD_SERVICE; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; import static com.android.internal.widget.LockPatternUtils.SYNTHETIC_PASSWORD_ENABLED_KEY; @@ -77,6 +78,7 @@ import android.service.gatekeeper.GateKeeperResponse; import android.service.gatekeeper.IGateKeeperService; import android.text.TextUtils; import android.util.ArrayMap; +import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -559,6 +561,10 @@ public class LockSettingsService extends ILockSettings.Stub { @Override // binder interface public void systemReady() { + if (mContext.checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) { + EventLog.writeEvent(0x534e4554, "28251513", getCallingUid(), ""); // SafetyNet + } + checkWritePermission(UserHandle.USER_SYSTEM); migrateOldData(); try { getGateKeeperService(); @@ -805,6 +811,13 @@ public class LockSettingsService extends ILockSettings.Stub { mContext.enforceCallingOrSelfPermission(PERMISSION, "LockSettingsRead"); } + private final void checkPasswordHavePermission(int userId) { + if (mContext.checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) { + EventLog.writeEvent(0x534e4554, "28251513", getCallingUid(), ""); // SafetyNet + } + mContext.enforceCallingOrSelfPermission(PERMISSION, "LockSettingsHave"); + } + private final void checkReadPermission(String requestedKey, int userId) { final int callingUid = Binder.getCallingUid(); @@ -934,6 +947,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public boolean havePassword(int userId) throws RemoteException { + checkPasswordHavePermission(userId); synchronized (mSpManager) { if (isSyntheticPasswordBasedCredentialLocked(userId)) { long handle = getSyntheticPasswordHandleLocked(userId); @@ -947,6 +961,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public boolean havePattern(int userId) throws RemoteException { + checkPasswordHavePermission(userId); synchronized (mSpManager) { if (isSyntheticPasswordBasedCredentialLocked(userId)) { long handle = getSyntheticPasswordHandleLocked(userId); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 0072ba4f2631..f88a074ad132 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -3046,9 +3046,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState, uidState); if (isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState) != isProcStateAllowedWhileIdleOrPowerSaveMode(uidState) ) { - if (isUidIdle(uid)) { - updateRuleForAppIdleUL(uid); - } + updateRuleForAppIdleUL(uid); if (mDeviceIdleMode) { updateRuleForDeviceIdleUL(uid); } diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 8209adeb8947..b14aa13bfb28 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -29,6 +29,8 @@ import static android.net.NetworkStats.IFACE_ALL; import static android.net.NetworkStats.SET_ALL; import static android.net.NetworkStats.SET_DEFAULT; import static android.net.NetworkStats.SET_FOREGROUND; +import static android.net.NetworkStats.STATS_PER_IFACE; +import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; import static android.net.NetworkTemplate.buildTemplateMobileWildcard; @@ -1041,6 +1043,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final NetworkStats xtSnapshot = getNetworkStatsXt(); final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev(); + // Tethering snapshot for dev and xt stats. Counts per-interface data from tethering stats + // providers that isn't already counted by dev and XT stats. + final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_IFACE); + xtSnapshot.combineAllValues(tetherSnapshot); + devSnapshot.combineAllValues(tetherSnapshot); // For xt/dev, we pass a null VPN array because usage is aggregated by UID, so VPN traffic // can't be reattributed to responsible apps. @@ -1371,14 +1378,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL); // fold tethering stats and operations into uid snapshot - final NetworkStats tetherSnapshot = getNetworkStatsTethering(); + final NetworkStats tetherSnapshot = getNetworkStatsTethering(STATS_PER_UID); uidSnapshot.combineAllValues(tetherSnapshot); final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService( Context.TELEPHONY_SERVICE); // fold video calling data usage stats into uid snapshot - final NetworkStats vtStats = telephonyManager.getVtDataUsage(true); + final NetworkStats vtStats = telephonyManager.getVtDataUsage(STATS_PER_UID); if (vtStats != null) { uidSnapshot.combineAllValues(vtStats); } @@ -1397,7 +1404,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { Context.TELEPHONY_SERVICE); // Merge video calling data usage into XT - final NetworkStats vtSnapshot = telephonyManager.getVtDataUsage(false); + final NetworkStats vtSnapshot = telephonyManager.getVtDataUsage(STATS_PER_IFACE); if (vtSnapshot != null) { xtSnapshot.combineAllValues(vtSnapshot); } @@ -1409,9 +1416,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { * Return snapshot of current tethering statistics. Will return empty * {@link NetworkStats} if any problems are encountered. */ - private NetworkStats getNetworkStatsTethering() throws RemoteException { + private NetworkStats getNetworkStatsTethering(int how) throws RemoteException { try { - return mNetworkManager.getNetworkStatsTethering(); + return mNetworkManager.getNetworkStatsTethering(how); } catch (IllegalStateException e) { Log.wtf(TAG, "problem reading network stats", e); return new NetworkStats(0L, 10); diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 80878131ae44..d5d0250f82af 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -212,12 +212,25 @@ abstract public class ManagedServices { } } - protected void onSettingRestored(String element, String value, int userId) { + protected void onSettingRestored(String element, String value, int backupSdkInt, int userId) { if (!mUseXml) { Slog.d(TAG, "Restored managed service setting: " + element); if (mConfig.secureSettingName.equals(element) || (mConfig.secondarySettingName != null && mConfig.secondarySettingName.equals(element))) { + if (backupSdkInt < Build.VERSION_CODES.O) { + // automatic system grants were added in O, so append the approved apps + // rather than wiping out the setting + String currentSetting = + getApproved(userId, mConfig.secureSettingName.equals(element)); + if (!TextUtils.isEmpty(currentSetting)) { + if (!TextUtils.isEmpty(value)) { + value = value + ENABLED_SERVICES_SEPARATOR + currentSetting; + } else { + value = currentSetting; + } + } + } Settings.Secure.putStringForUser( mContext.getContentResolver(), element, value, userId); loadAllowedComponentsFromSettings(); @@ -370,6 +383,13 @@ abstract public class ManagedServices { } } + protected String getApproved(int userId, boolean primary) { + final ArrayMap<Boolean, ArraySet<String>> allowedByType = + mApproved.getOrDefault(userId, new ArrayMap<>()); + ArraySet<String> approved = allowedByType.getOrDefault(primary, new ArraySet<>()); + return String.join(ENABLED_SERVICES_SEPARATOR, approved); + } + protected List<ComponentName> getAllowedComponents(int userId) { final List<ComponentName> allowedComponents = new ArrayList<>(); final ArrayMap<Boolean, ArraySet<String>> allowedByType = @@ -857,6 +877,7 @@ abstract public class ManagedServices { @Override public void onServiceDisconnected(ComponentName name) { + mServicesBinding.remove(servicesBindingTag); Slog.v(TAG, getCaption() + " connection lost: " + name); } }; @@ -869,6 +890,7 @@ abstract public class ManagedServices { return; } } catch (SecurityException ex) { + mServicesBinding.remove(servicesBindingTag); Slog.e(TAG, "Unable to bind " + getCaption() + " service: " + intent, ex); } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 6aa83b38da71..f60d92340492 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -804,6 +804,7 @@ public class NotificationManagerService extends SystemService { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_LOCALE_CHANGED.equals(intent.getAction())) { mZenModeHelper.updateDefaultZenRules(); + mRankingHelper.onLocaleChanged(context, ActivityManager.getCurrentUser()); } } }; @@ -817,8 +818,10 @@ public class NotificationManagerService extends SystemService { String newValue = intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE); int restoredFromSdkInt = intent.getIntExtra( Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, 0); - mListeners.onSettingRestored(element, newValue, getSendingUserId()); - mConditionProviders.onSettingRestored(element, newValue, getSendingUserId()); + mListeners.onSettingRestored( + element, newValue, restoredFromSdkInt, getSendingUserId()); + mConditionProviders.onSettingRestored( + element, newValue, restoredFromSdkInt, getSendingUserId()); } catch (Exception e) { Slog.wtf(TAG, "Cannot restore managed services from settings", e); } @@ -3102,7 +3105,7 @@ public class NotificationManagerService extends SystemService { } } if (summaryRecord != null && checkDisqualifyingFeatures(userId, MY_UID, - summaryRecord.sbn.getId(), summaryRecord.sbn.getTag(), summaryRecord)) { + summaryRecord.sbn.getId(), summaryRecord.sbn.getTag(), summaryRecord, true)) { mHandler.post(new EnqueueNotificationRunnable(userId, summaryRecord)); } } @@ -3447,7 +3450,8 @@ public class NotificationManagerService extends SystemService { user, null, System.currentTimeMillis()); final NotificationRecord r = new NotificationRecord(getContext(), n, channel); - if (!checkDisqualifyingFeatures(userId, notificationUid, id, tag, r)) { + if (!checkDisqualifyingFeatures(userId, notificationUid, id, tag, r, + r.sbn.getOverrideGroupKey() != null)) { return; } @@ -3502,7 +3506,7 @@ public class NotificationManagerService extends SystemService { * Has side effects. */ private boolean checkDisqualifyingFeatures(int userId, int callingUid, int id, String tag, - NotificationRecord r) { + NotificationRecord r, boolean isAutogroup) { final String pkg = r.sbn.getPackageName(); final String dialerPackage = getContext().getSystemService(TelecomManager.class).getSystemDialerPackage(); @@ -3526,7 +3530,8 @@ public class NotificationManagerService extends SystemService { // rate limit updates that aren't completed progress notifications if (mNotificationsByKey.get(r.sbn.getKey()) != null - && !r.getNotification().hasCompletedProgress()) { + && !r.getNotification().hasCompletedProgress() + && !isAutogroup) { final float appEnqueueRate = mUsageStats.getAppEnqueueRate(pkg); if (appEnqueueRate > mMaxPackageEnqueueRate) { @@ -3534,7 +3539,7 @@ public class NotificationManagerService extends SystemService { final long now = SystemClock.elapsedRealtime(); if ((now - mLastOverRateLogTime) > MIN_PACKAGE_OVERRATE_LOG_INTERVAL) { Slog.e(TAG, "Package enqueue rate is " + appEnqueueRate - + ". Shedding events. package=" + pkg); + + ". Shedding " + r.sbn.getKey() + ". package=" + pkg); mLastOverRateLogTime = now; } return false; diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 9622a24a2d4d..3386fe832e0f 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -1073,6 +1073,22 @@ public class RankingHelper implements RankingConfig { } } + protected void onLocaleChanged(Context context, int userId) { + synchronized (mRecords) { + int N = mRecords.size(); + for (int i = 0; i < N; i++) { + Record record = mRecords.valueAt(i); + if (UserHandle.getUserId(record.uid) == userId) { + if (record.channels.containsKey(NotificationChannel.DEFAULT_CHANNEL_ID)) { + record.channels.get(NotificationChannel.DEFAULT_CHANNEL_ID).setName( + context.getResources().getString( + R.string.default_notification_channel_label)); + } + } + } + } + } + public void onPackagesChanged(boolean removingPackage, int changeUserId, String[] pkgList, int[] uidList) { if (pkgList == null || pkgList.length == 0) { diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java index 211a1c9f3edf..e1e5b3555335 100644 --- a/services/core/java/com/android/server/pm/InstantAppRegistry.java +++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java @@ -293,14 +293,35 @@ class InstantAppRegistry { if (currentCookieFile == null) { continue; } - File expectedCookeFile = computeInstantCookieFile(pkg, userId); - if (!currentCookieFile.equals(expectedCookeFile)) { - Slog.i(LOG_TAG, "Signature for package " + pkg.packageName - + " changed - dropping cookie"); - // Make sure a pending write for the old signed app is cancelled - mCookiePersistence.cancelPendingPersistLPw(pkg, userId); - currentCookieFile.delete(); + + // Before we used only the first signature to compute the SHA 256 but some + // apps could be singed by multiple certs and the cert order is undefined. + // We prefer the modern computation procedure where all certs are taken + // into account but also allow the value from the old computation to avoid + // data loss. + final String[] signaturesSha256Digests = PackageUtils.computeSignaturesSha256Digests( + pkg.mSignatures); + final String signaturesSha256Digest = PackageUtils.computeSignaturesSha256Digest( + signaturesSha256Digests); + + // We prefer a match based on all signatures + if (currentCookieFile.equals(computeInstantCookieFile(pkg.packageName, + signaturesSha256Digest, userId))) { + return; } + + // For backwards compatibility we accept match based on first signature + if (pkg.mSignatures.length > 1 && currentCookieFile.equals(computeInstantCookieFile( + pkg.packageName, signaturesSha256Digests[0], userId))) { + return; + } + + // Sorry, you are out of luck - different signatures - nuke data + Slog.i(LOG_TAG, "Signature for package " + pkg.packageName + + " changed - dropping cookie"); + // Make sure a pending write for the old signed app is cancelled + mCookiePersistence.cancelPendingPersistLPw(pkg, userId); + currentCookieFile.delete(); } } @@ -504,6 +525,11 @@ class InstantAppRegistry { } } + boolean hasInstantApplicationMetadataLPr(String packageName, int userId) { + return hasUninstalledInstantAppStateLPr(packageName, userId) + || hasInstantAppMetadataLPr(packageName, userId); + } + public void deleteInstantApplicationMetadataLPw(@NonNull String packageName, @UserIdInt int userId) { removeUninstalledInstantAppStateLPw((UninstalledInstantAppState state) -> @@ -547,6 +573,33 @@ class InstantAppRegistry { } } + private boolean hasUninstalledInstantAppStateLPr(String packageName, @UserIdInt int userId) { + if (mUninstalledInstantApps == null) { + return false; + } + final List<UninstalledInstantAppState> uninstalledAppStates = + mUninstalledInstantApps.get(userId); + if (uninstalledAppStates == null) { + return false; + } + final int appCount = uninstalledAppStates.size(); + for (int i = 0; i < appCount; i++) { + final UninstalledInstantAppState uninstalledAppState = uninstalledAppStates.get(i); + if (packageName.equals(uninstalledAppState.mInstantAppInfo.getPackageName())) { + return true; + } + } + return false; + } + + private boolean hasInstantAppMetadataLPr(String packageName, @UserIdInt int userId) { + final File instantAppDir = getInstantApplicationDir(packageName, userId); + return new File(instantAppDir, INSTANT_APP_METADATA_FILE).exists() + || new File(instantAppDir, INSTANT_APP_ICON_FILE).exists() + || new File(instantAppDir, INSTANT_APP_ANDROID_ID_FILE).exists() + || peekInstantCookieFile(packageName, userId) != null; + } + void pruneInstantApps() { final long maxInstalledCacheDuration = Settings.Global.getLong( mService.mContext.getContentResolver(), @@ -936,11 +989,11 @@ class InstantAppRegistry { } } - private static @NonNull File computeInstantCookieFile(@NonNull PackageParser.Package pkg, - @UserIdInt int userId) { - File appDir = getInstantApplicationDir(pkg.packageName, userId); - String cookieFile = INSTANT_APP_COOKIE_FILE_PREFIX + PackageUtils.computeSha256Digest( - pkg.mSignatures[0].toByteArray()) + INSTANT_APP_COOKIE_FILE_SIFFIX; + private static @NonNull File computeInstantCookieFile(@NonNull String packageName, + @NonNull String sha256Digest, @UserIdInt int userId) { + final File appDir = getInstantApplicationDir(packageName, userId); + final String cookieFile = INSTANT_APP_COOKIE_FILE_PREFIX + + sha256Digest + INSTANT_APP_COOKIE_FILE_SIFFIX; return new File(appDir, cookieFile); } @@ -1071,7 +1124,7 @@ class InstantAppRegistry { } private static @NonNull File getInstantApplicationDir(String packageName, int userId) { - return new File (getInstantApplicationsDir(userId), packageName); + return new File(getInstantApplicationsDir(userId), packageName); } private static void deleteDir(@NonNull File dir) { @@ -1115,9 +1168,20 @@ class InstantAppRegistry { public void schedulePersistLPw(@UserIdInt int userId, @NonNull PackageParser.Package pkg, @NonNull byte[] cookie) { - File cookieFile = computeInstantCookieFile(pkg, userId); + // Before we used only the first signature to compute the SHA 256 but some + // apps could be singed by multiple certs and the cert order is undefined. + // We prefer the modern computation procedure where all certs are taken + // into account and delete the file derived via the legacy hash computation. + File newCookieFile = computeInstantCookieFile(pkg.packageName, + PackageUtils.computeSignaturesSha256Digest(pkg.mSignatures), userId); + if (pkg.mSignatures.length > 0) { + File oldCookieFile = peekInstantCookieFile(pkg.packageName, userId); + if (oldCookieFile != null && !newCookieFile.equals(oldCookieFile)) { + oldCookieFile.delete(); + } + } cancelPendingPersistLPw(pkg, userId); - addPendingPersistCookieLPw(userId, pkg, cookie, cookieFile); + addPendingPersistCookieLPw(userId, pkg, cookie, newCookieFile); sendMessageDelayed(obtainMessage(userId, pkg), PERSIST_COOKIE_DELAY_MILLIS); } diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java index f50d0d7564a1..5f54c67a35a1 100644 --- a/services/core/java/com/android/server/pm/InstantAppResolver.java +++ b/services/core/java/com/android/server/pm/InstantAppResolver.java @@ -122,7 +122,7 @@ public abstract class InstantAppResolver { } } // Only log successful instant application resolution - if (resolutionStatus == RESOLUTION_SUCCESS) { + if (requestObj.resolveForStart && resolutionStatus == RESOLUTION_SUCCESS) { logMetrics(ACTION_INSTANT_APP_RESOLUTION_PHASE_ONE, startTime, token, resolutionStatus); } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 0ecb4e1e80bd..871ed5c7dbad 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -41,6 +41,7 @@ import static com.android.server.pm.PackageInstallerService.prepareStageDir; import android.Manifest; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.Intent; @@ -731,7 +732,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { * * @param pkgInfo The package info for {@link #params}.packagename */ - private void sealAndValidateLocked(PackageInfo pkgInfo) + private void sealAndValidateLocked(@Nullable PackageInfo pkgInfo) throws PackageManagerException { assertNoWriteFileTransfersOpenLocked(); @@ -923,7 +924,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { * Note that upgrade compatibility is still performed by * {@link PackageManagerService}. */ - private void validateInstallLocked(PackageInfo pkgInfo) throws PackageManagerException { + private void validateInstallLocked(@Nullable PackageInfo pkgInfo) + throws PackageManagerException { mPackageName = null; mVersionCode = -1; mSignatures = null; @@ -1004,6 +1006,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } if (removeSplitList.size() > 0) { + if (pkgInfo == null) { + throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, + "Missing existing base package for " + mPackageName); + } + // validate split names marked for removal for (String splitName : removeSplitList) { if (!ArrayUtils.contains(pkgInfo.splitNames, splitName)) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index bac7fc850592..23d36988228f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -85,6 +85,8 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageParser.PARSE_IS_PRIVILEGED; import static android.content.pm.PackageParser.isApkFile; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; +import static android.os.storage.StorageManager.FLAG_STORAGE_CE; +import static android.os.storage.StorageManager.FLAG_STORAGE_DE; import static android.system.OsConstants.O_CREAT; import static android.system.OsConstants.O_RDWR; @@ -456,6 +458,8 @@ public class PackageManagerService extends IPackageManager.Stub private static final String STATIC_SHARED_LIB_DELIMITER = "_"; /** Extension of the compressed packages */ private final static String COMPRESSED_EXTENSION = ".gz"; + /** Suffix of stub packages on the system partition */ + private final static String STUB_SUFFIX = "-Stub"; private static final int[] EMPTY_INT_ARRAY = new int[0]; @@ -1926,8 +1930,12 @@ public class PackageManagerService extends IPackageManager.Stub final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; - final String origInstallerPackageName = res.removedInfo != null - ? res.removedInfo.installerPackageName : null; + final String installerPackageName = + res.installerPackageName != null + ? res.installerPackageName + : res.removedInfo != null + ? res.removedInfo.installerPackageName + : null; // If this is the first time we have child packages for a disabled privileged // app that had no children, we grant requested runtime permissions to the new @@ -1992,10 +2000,10 @@ public class PackageManagerService extends IPackageManager.Stub sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, extras, 0 /*flags*/, null /*targetPackage*/, null /*finishedReceiver*/, updateUsers); - if (origInstallerPackageName != null) { + if (installerPackageName != null) { sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, extras, 0 /*flags*/, - origInstallerPackageName, null /*finishedReceiver*/, updateUsers); + installerPackageName, null /*finishedReceiver*/, updateUsers); } // Send replaced for users that don't see the package for the first time @@ -2004,10 +2012,10 @@ public class PackageManagerService extends IPackageManager.Stub packageName, extras, 0 /*flags*/, null /*targetPackage*/, null /*finishedReceiver*/, updateUsers); - if (origInstallerPackageName != null) { + if (installerPackageName != null) { sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, extras, 0 /*flags*/, - origInstallerPackageName, null /*finishedReceiver*/, updateUsers); + installerPackageName, null /*finishedReceiver*/, updateUsers); } sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null /*package*/, null /*extras*/, 0 /*flags*/, @@ -3191,12 +3199,46 @@ public class PackageManagerService extends IPackageManager.Stub } private File[] getCompressedFiles(String codePath) { - return new File(codePath).listFiles(new FilenameFilter() { + final File stubCodePath = new File(codePath); + final String stubName = stubCodePath.getName(); + + // The layout of a compressed package on a given partition is as follows : + // + // Compressed artifacts: + // + // /partition/ModuleName/foo.gz + // /partation/ModuleName/bar.gz + // + // Stub artifact: + // + // /partition/ModuleName-Stub/ModuleName-Stub.apk + // + // In other words, stub is on the same partition as the compressed artifacts + // and in a directory that's suffixed with "-Stub". + int idx = stubName.lastIndexOf(STUB_SUFFIX); + if (idx < 0 || (stubName.length() != (idx + STUB_SUFFIX.length()))) { + return null; + } + + final File stubParentDir = stubCodePath.getParentFile(); + if (stubParentDir == null) { + Slog.e(TAG, "Unable to determine stub parent dir for codePath: " + codePath); + return null; + } + + final File compressedPath = new File(stubParentDir, stubName.substring(0, idx)); + final File[] files = compressedPath.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(COMPRESSED_EXTENSION); } }); + + if (DEBUG_COMPRESSION && files != null && files.length > 0) { + Slog.i(TAG, "getCompressedFiles[" + codePath + "]: " + Arrays.toString(files)); + } + + return files; } private boolean compressedFileExists(String codePath) { @@ -3213,7 +3255,7 @@ public class PackageManagerService extends IPackageManager.Stub final File[] compressedFiles = getCompressedFiles(pkg.codePath); if (compressedFiles == null || compressedFiles.length == 0) { if (DEBUG_COMPRESSION) { - Slog.i(TAG, "No files to decompress"); + Slog.i(TAG, "No files to decompress: " + pkg.baseCodePath); } return null; } @@ -3848,8 +3890,7 @@ public class PackageManagerService extends IPackageManager.Stub throw new SecurityException("Package " + packageName + " is currently frozen!"); } - if (!userKeyUnlocked && !(ps.pkg.applicationInfo.isDirectBootAware() - || ps.pkg.applicationInfo.isPartiallyDirectBootAware())) { + if (!userKeyUnlocked && !ps.pkg.applicationInfo.isEncryptionAware()) { throw new SecurityException("Package " + packageName + " is not encryption aware!"); } } @@ -6737,7 +6778,7 @@ public class PackageManagerService extends IPackageManager.Stub Bundle verificationBundle, int userId) { final Message msg = mHandler.obtainMessage(INSTANT_APP_RESOLUTION_PHASE_TWO, new InstantAppRequest(responseObj, origIntent, resolvedType, - callingPackage, userId, verificationBundle)); + callingPackage, userId, verificationBundle, false /*resolveForStart*/)); mHandler.sendMessage(msg); } @@ -7321,7 +7362,8 @@ public class PackageManagerService extends IPackageManager.Stub } } if (addEphemeral) { - result = maybeAddInstantAppInstaller(result, intent, resolvedType, flags, userId); + result = maybeAddInstantAppInstaller( + result, intent, resolvedType, flags, userId, resolveForStart); } if (sortResult) { Collections.sort(result, mResolvePrioritySorter); @@ -7331,7 +7373,7 @@ public class PackageManagerService extends IPackageManager.Stub } private List<ResolveInfo> maybeAddInstantAppInstaller(List<ResolveInfo> result, Intent intent, - String resolvedType, int flags, int userId) { + String resolvedType, int flags, int userId, boolean resolveForStart) { // first, check to see if we've got an instant app already installed final boolean alreadyResolvedLocally = (flags & PackageManager.MATCH_INSTANT) != 0; ResolveInfo localInstantApp = null; @@ -7380,7 +7422,8 @@ public class PackageManagerService extends IPackageManager.Stub Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral"); final InstantAppRequest requestObject = new InstantAppRequest( null /*responseObj*/, intent /*origIntent*/, resolvedType, - null /*callingPackage*/, userId, null /*verificationBundle*/); + null /*callingPackage*/, userId, null /*verificationBundle*/, + resolveForStart); auxiliaryResponse = InstantAppResolver.doInstantAppResolutionPhaseOne( mContext, mInstantAppResolverConnection, requestObject); @@ -10342,16 +10385,19 @@ public class PackageManagerService extends IPackageManager.Stub ArraySet<String> usesLibraryFiles = null; if (pkg.usesLibraries != null) { usesLibraryFiles = addSharedLibrariesLPw(pkg.usesLibraries, - null, null, pkg.packageName, changingLib, true, null); + null, null, pkg.packageName, changingLib, true, + pkg.applicationInfo.targetSdkVersion, null); } if (pkg.usesStaticLibraries != null) { usesLibraryFiles = addSharedLibrariesLPw(pkg.usesStaticLibraries, pkg.usesStaticLibrariesVersions, pkg.usesStaticLibrariesCertDigests, - pkg.packageName, changingLib, true, usesLibraryFiles); + pkg.packageName, changingLib, true, + pkg.applicationInfo.targetSdkVersion, usesLibraryFiles); } if (pkg.usesOptionalLibraries != null) { usesLibraryFiles = addSharedLibrariesLPw(pkg.usesOptionalLibraries, - null, null, pkg.packageName, changingLib, false, usesLibraryFiles); + null, null, pkg.packageName, changingLib, false, + pkg.applicationInfo.targetSdkVersion, usesLibraryFiles); } if (!ArrayUtils.isEmpty(usesLibraryFiles)) { pkg.usesLibraryFiles = usesLibraryFiles.toArray(new String[usesLibraryFiles.size()]); @@ -10361,9 +10407,9 @@ public class PackageManagerService extends IPackageManager.Stub } private ArraySet<String> addSharedLibrariesLPw(@NonNull List<String> requestedLibraries, - @Nullable int[] requiredVersions, @Nullable String[] requiredCertDigests, + @Nullable int[] requiredVersions, @Nullable String[][] requiredCertDigests, @NonNull String packageName, @Nullable PackageParser.Package changingLib, - boolean required, @Nullable ArraySet<String> outUsedLibraries) + boolean required, int targetSdk, @Nullable ArraySet<String> outUsedLibraries) throws PackageManagerException { final int libCount = requestedLibraries.size(); for (int i = 0; i < libCount; i++) { @@ -10397,13 +10443,34 @@ public class PackageManagerService extends IPackageManager.Stub + " library; failing!"); } - String expectedCertDigest = requiredCertDigests[i]; - String libCertDigest = PackageUtils.computeCertSha256Digest( - libPkg.mSignatures[0]); - if (!libCertDigest.equalsIgnoreCase(expectedCertDigest)) { + final String[] expectedCertDigests = requiredCertDigests[i]; + // For apps targeting O MR1 we require explicit enumeration of all certs. + final String[] libCertDigests = (targetSdk > Build.VERSION_CODES.O) + ? PackageUtils.computeSignaturesSha256Digests(libPkg.mSignatures) + : PackageUtils.computeSignaturesSha256Digests( + new Signature[]{libPkg.mSignatures[0]}); + + // Take a shortcut if sizes don't match. Note that if an app doesn't + // target O we don't parse the "additional-certificate" tags similarly + // how we only consider all certs only for apps targeting O (see above). + // Therefore, the size check is safe to make. + if (expectedCertDigests.length != libCertDigests.length) { throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY, "Package " + packageName + " requires differently signed" + - " static shared library; failing!"); + " static sDexLoadReporter.java:45.19hared library; failing!"); + } + + // Use a predictable order as signature order may vary + Arrays.sort(libCertDigests); + Arrays.sort(expectedCertDigests); + + final int certCount = libCertDigests.length; + for (int j = 0; j < certCount; j++) { + if (!libCertDigests[j].equalsIgnoreCase(expectedCertDigests[j])) { + throw new PackageManagerException(INSTALL_FAILED_MISSING_SHARED_LIBRARY, + "Package " + packageName + " requires differently signed" + + " static shared library; failing!"); + } } } @@ -11079,7 +11146,7 @@ public class PackageManagerService extends IPackageManager.Stub r.info.encryptionAware = r.info.directBootAware = true; } } - if (compressedFileExists(pkg.baseCodePath)) { + if (compressedFileExists(pkg.codePath)) { pkg.isStub = true; } } else { @@ -13155,18 +13222,28 @@ public class PackageManagerService extends IPackageManager.Stub boolean platformPackage = PLATFORM_PACKAGE_NAME.equals(pkg.packageName); if (!privappPermissionsDisable && privilegedPermission && pkg.isPrivilegedApp() && !platformPackage && platformPermission) { - ArraySet<String> wlPermissions = SystemConfig.getInstance() + final ArraySet<String> allowedPermissions = SystemConfig.getInstance() .getPrivAppPermissions(pkg.packageName); - boolean whitelisted = wlPermissions != null && wlPermissions.contains(perm); + final boolean whitelisted = + allowedPermissions != null && allowedPermissions.contains(perm); if (!whitelisted) { Slog.w(TAG, "Privileged permission " + perm + " for package " + pkg.packageName + " - not in privapp-permissions whitelist"); // Only report violations for apps on system image if (!mSystemReady && !pkg.isUpdatedSystemApp()) { - if (mPrivappPermissionsViolations == null) { - mPrivappPermissionsViolations = new ArraySet<>(); + // it's only a reportable violation if the permission isn't explicitly denied + final ArraySet<String> deniedPermissions = SystemConfig.getInstance() + .getPrivAppDenyPermissions(pkg.packageName); + final boolean permissionViolation = + deniedPermissions == null || !deniedPermissions.contains(perm); + if (permissionViolation) { + if (mPrivappPermissionsViolations == null) { + mPrivappPermissionsViolations = new ArraySet<>(); + } + mPrivappPermissionsViolations.add(pkg.packageName + ": " + perm); + } else { + return false; } - mPrivappPermissionsViolations.add(pkg.packageName + ": " + perm); } if (RoSystemProperties.CONTROL_PRIVAPP_PERMISSIONS_ENFORCE) { return false; @@ -17359,6 +17436,7 @@ public class PackageManagerService extends IPackageManager.Stub PackageParser.Package pkg; int returnCode; String returnMsg; + String installerPackageName; PackageRemovedInfo removedInfo; ArrayMap<String, PackageInstalledInfo> addedChildPackages; @@ -18279,6 +18357,7 @@ public class PackageManagerService extends IPackageManager.Stub // Result object to be returned res.setReturnCode(PackageManager.INSTALL_SUCCEEDED); + res.installerPackageName = installerPackageName; if (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile); @@ -19712,6 +19791,10 @@ public class PackageManagerService extends IPackageManager.Stub // writer synchronized (mPackages) { + // NOTE: The system package always needs to be enabled; even if it's for + // a compressed stub. If we don't, installing the system package fails + // during scan [scanning checks the disabled packages]. We will reverse + // this later, after we've "installed" the stub. // Reinstate the old system package enableSystemPackageLPw(disabledPs.pkg); // Remove any native libraries from the upgraded package. @@ -19720,23 +19803,38 @@ public class PackageManagerService extends IPackageManager.Stub // Install the system package if (DEBUG_REMOVE) Slog.d(TAG, "Re-installing system package: " + disabledPs); + try { + installPackageFromSystemLIF(disabledPs.codePath, false /*isPrivileged*/, allUserHandles, + outInfo.origUsers, deletedPs.getPermissionsState(), writeSettings); + } catch (PackageManagerException e) { + Slog.w(TAG, "Failed to restore system package:" + deletedPkg.packageName + ": " + + e.getMessage()); + return false; + } finally { + if (disabledPs.pkg.isStub) { + mSettings.disableSystemPackageLPw(disabledPs.name, true /*replaced*/); + } + } + return true; + } + + /** + * Installs a package that's already on the system partition. + */ + private PackageParser.Package installPackageFromSystemLIF(@NonNull File codePath, + boolean isPrivileged, @Nullable int[] allUserHandles, @Nullable int[] origUserHandles, + @Nullable PermissionsState origPermissionState, boolean writeSettings) + throws PackageManagerException { int parseFlags = mDefParseFlags | PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR; - if (locationIsPrivileged(disabledPs.codePath)) { + if (isPrivileged || locationIsPrivileged(codePath)) { parseFlags |= PackageParser.PARSE_IS_PRIVILEGED; } - final PackageParser.Package newPkg; - try { - newPkg = scanPackageTracedLI(disabledPs.codePath, parseFlags, 0 /* scanFlags */, - 0 /* currentTime */, null); - } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to restore system package:" + deletedPkg.packageName + ": " - + e.getMessage()); - return false; - } + final PackageParser.Package newPkg = + scanPackageTracedLI(codePath, parseFlags, 0 /*scanFlags*/, 0 /*currentTime*/, null); try { // update shared libraries for the newly re-installed system package @@ -19754,17 +19852,21 @@ public class PackageManagerService extends IPackageManager.Stub // Propagate the permissions state as we do not want to drop on the floor // runtime permissions. The update permissions method below will take // care of removing obsolete permissions and grant install permissions. - ps.getPermissionsState().copyFrom(deletedPs.getPermissionsState()); + if (origPermissionState != null) { + ps.getPermissionsState().copyFrom(origPermissionState); + } updatePermissionsLPw(newPkg.packageName, newPkg, UPDATE_PERMISSIONS_ALL | UPDATE_PERMISSIONS_REPLACE_PKG); + final boolean applyUserRestrictions + = (allUserHandles != null) && (origUserHandles != null); if (applyUserRestrictions) { boolean installedStateChanged = false; if (DEBUG_REMOVE) { Slog.d(TAG, "Propagating install state across reinstall"); } for (int userId : allUserHandles) { - final boolean installed = ArrayUtils.contains(outInfo.origUsers, userId); + final boolean installed = ArrayUtils.contains(origUserHandles, userId); if (DEBUG_REMOVE) { Slog.d(TAG, " user " + userId + " => " + installed); } @@ -19787,7 +19889,7 @@ public class PackageManagerService extends IPackageManager.Stub mSettings.writeLPr(); } } - return true; + return newPkg; } private boolean deleteInstalledPackageLIF(PackageSetting ps, @@ -21720,77 +21822,183 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } - synchronized (mPackages) { - if (callingUid == Process.SHELL_UID - && (pkgSetting.pkgFlags & ApplicationInfo.FLAG_TEST_ONLY) == 0) { - // Shell can only change whole packages between ENABLED and DISABLED_USER states - // unless it is a test package. - int oldState = pkgSetting.getEnabled(userId); - if (className == null - && - (oldState == COMPONENT_ENABLED_STATE_DISABLED_USER - || oldState == COMPONENT_ENABLED_STATE_DEFAULT - || oldState == COMPONENT_ENABLED_STATE_ENABLED) - && - (newState == COMPONENT_ENABLED_STATE_DISABLED_USER - || newState == COMPONENT_ENABLED_STATE_DEFAULT - || newState == COMPONENT_ENABLED_STATE_ENABLED)) { - // ok - } else { - throw new SecurityException( - "Shell cannot change component state for " + packageName + "/" - + className + " to " + newState); - } + if (callingUid == Process.SHELL_UID + && (pkgSetting.pkgFlags & ApplicationInfo.FLAG_TEST_ONLY) == 0) { + // Shell can only change whole packages between ENABLED and DISABLED_USER states + // unless it is a test package. + int oldState = pkgSetting.getEnabled(userId); + if (className == null + && + (oldState == COMPONENT_ENABLED_STATE_DISABLED_USER + || oldState == COMPONENT_ENABLED_STATE_DEFAULT + || oldState == COMPONENT_ENABLED_STATE_ENABLED) + && + (newState == COMPONENT_ENABLED_STATE_DISABLED_USER + || newState == COMPONENT_ENABLED_STATE_DEFAULT + || newState == COMPONENT_ENABLED_STATE_ENABLED)) { + // ok + } else { + throw new SecurityException( + "Shell cannot change component state for " + packageName + "/" + + className + " to " + newState); } - if (className == null) { - // We're dealing with an application/package level state change - if (pkgSetting.getEnabled(userId) == newState) { - // Nothing to do + } + if (className == null) { + // We're dealing with an application/package level state change + if (pkgSetting.getEnabled(userId) == newState) { + // Nothing to do + return; + } + // If we're enabling a system stub, there's a little more work to do. + // Prior to enabling the package, we need to decompress the APK(s) to the + // data partition and then replace the version on the system partition. + final PackageParser.Package deletedPkg = pkgSetting.pkg; + final boolean isSystemStub = deletedPkg.isStub + && deletedPkg.isSystemApp(); + if (isSystemStub + && (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + || newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED)) { + final File codePath = decompressPackage(deletedPkg); + if (codePath == null) { + Slog.e(TAG, "couldn't decompress pkg: " + pkgSetting.name); return; } - if (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT - || newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { - // Don't care about who enables an app. - callingPackage = null; - } - pkgSetting.setEnabled(newState, userId, callingPackage); - // pkgSetting.pkg.mSetEnabled = newState; - } else { - // We're dealing with a component level state change - // First, verify that this is a valid class name. - PackageParser.Package pkg = pkgSetting.pkg; - if (pkg == null || !pkg.hasComponentClassName(className)) { - if (pkg != null && - pkg.applicationInfo.targetSdkVersion >= - Build.VERSION_CODES.JELLY_BEAN) { - throw new IllegalArgumentException("Component class " + className - + " does not exist in " + packageName); - } else { - Slog.w(TAG, "Failed setComponentEnabledSetting: component class " - + className + " does not exist in " + packageName); - } + // TODO remove direct parsing of the package object during internal cleanup + // of scan package + // We need to call parse directly here for no other reason than we need + // the new package in order to disable the old one [we use the information + // for some internal optimization to optionally create a new package setting + // object on replace]. However, we can't get the package from the scan + // because the scan modifies live structures and we need to remove the + // old [system] package from the system before a scan can be attempted. + // Once scan is indempotent we can remove this parse and use the package + // object we scanned, prior to adding it to package settings. + final PackageParser pp = new PackageParser(); + pp.setSeparateProcesses(mSeparateProcesses); + pp.setDisplayMetrics(mMetrics); + pp.setCallback(mPackageParserCallback); + final PackageParser.Package tmpPkg; + try { + final int parseFlags = mDefParseFlags + | PackageParser.PARSE_MUST_BE_APK + | PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR; + tmpPkg = pp.parsePackage(codePath, parseFlags); + } catch (PackageParserException e) { + Slog.w(TAG, "Failed to parse compressed system package:" + pkgSetting.name, e); + return; } - switch (newState) { - case COMPONENT_ENABLED_STATE_ENABLED: - if (!pkgSetting.enableComponentLPw(className, userId)) { - return; - } - break; - case COMPONENT_ENABLED_STATE_DISABLED: - if (!pkgSetting.disableComponentLPw(className, userId)) { - return; - } - break; - case COMPONENT_ENABLED_STATE_DEFAULT: - if (!pkgSetting.restoreComponentLPw(className, userId)) { + synchronized (mInstallLock) { + // Disable the stub and remove any package entries + removePackageLI(deletedPkg, true); + synchronized (mPackages) { + disableSystemPackageLPw(deletedPkg, tmpPkg); + } + final PackageParser.Package newPkg; + try (PackageFreezer freezer = + freezePackage(deletedPkg.packageName, "setEnabledSetting")) { + final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY + | PackageParser.PARSE_ENFORCE_CODE; + newPkg = scanPackageTracedLI(codePath, parseFlags, 0 /*scanFlags*/, + 0 /*currentTime*/, null /*user*/); + prepareAppDataAfterInstallLIF(newPkg); + synchronized (mPackages) { + try { + updateSharedLibrariesLPr(newPkg, null); + } catch (PackageManagerException e) { + Slog.e(TAG, "updateAllSharedLibrariesLPw failed: ", e); + } + updatePermissionsLPw(newPkg.packageName, newPkg, + UPDATE_PERMISSIONS_ALL | UPDATE_PERMISSIONS_REPLACE_PKG); + mSettings.writeLPr(); + } + } catch (PackageManagerException e) { + // Whoops! Something went wrong; try to roll back to the stub + Slog.w(TAG, "Failed to install compressed system package:" + + pkgSetting.name, e); + // Remove the failed install + removeCodePathLI(codePath); + + // Install the system package + try (PackageFreezer freezer = + freezePackage(deletedPkg.packageName, "setEnabledSetting")) { + synchronized (mPackages) { + // NOTE: The system package always needs to be enabled; even + // if it's for a compressed stub. If we don't, installing the + // system package fails during scan [scanning checks the disabled + // packages]. We will reverse this later, after we've "installed" + // the stub. + // This leaves us in a fragile state; the stub should never be + // enabled, so, cross your fingers and hope nothing goes wrong + // until we can disable the package later. + enableSystemPackageLPw(deletedPkg); + } + installPackageFromSystemLIF(new File(deletedPkg.codePath), + false /*isPrivileged*/, null /*allUserHandles*/, + null /*origUserHandles*/, null /*origPermissionsState*/, + true /*writeSettings*/); + } catch (PackageManagerException pme) { + Slog.w(TAG, "Failed to restore system package:" + + deletedPkg.packageName, pme); + } finally { + synchronized (mPackages) { + mSettings.disableSystemPackageLPw( + deletedPkg.packageName, true /*replaced*/); + mSettings.writeLPr(); + } + } return; } - break; - default: - Slog.e(TAG, "Invalid new component state: " + newState); + clearAppDataLIF(newPkg, UserHandle.USER_ALL, FLAG_STORAGE_DE + | FLAG_STORAGE_CE | Installer.FLAG_CLEAR_CODE_CACHE_ONLY); + clearAppProfilesLIF(newPkg, UserHandle.USER_ALL); + mDexManager.notifyPackageUpdated(newPkg.packageName, + newPkg.baseCodePath, newPkg.splitCodePaths); + } + } + if (newState == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + || newState == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { + // Don't care about who enables an app. + callingPackage = null; + } + pkgSetting.setEnabled(newState, userId, callingPackage); + } else { + // We're dealing with a component level state change + // First, verify that this is a valid class name. + PackageParser.Package pkg = pkgSetting.pkg; + if (pkg == null || !pkg.hasComponentClassName(className)) { + if (pkg != null && + pkg.applicationInfo.targetSdkVersion >= + Build.VERSION_CODES.JELLY_BEAN) { + throw new IllegalArgumentException("Component class " + className + + " does not exist in " + packageName); + } else { + Slog.w(TAG, "Failed setComponentEnabledSetting: component class " + + className + " does not exist in " + packageName); + } + } + switch (newState) { + case COMPONENT_ENABLED_STATE_ENABLED: + if (!pkgSetting.enableComponentLPw(className, userId)) { + return; + } + break; + case COMPONENT_ENABLED_STATE_DISABLED: + if (!pkgSetting.disableComponentLPw(className, userId)) { return; } + break; + case COMPONENT_ENABLED_STATE_DEFAULT: + if (!pkgSetting.restoreComponentLPw(className, userId)) { + return; + } + break; + default: + Slog.e(TAG, "Invalid new component state: " + newState); + return; } + } + synchronized (mPackages) { scheduleWritePackageRestrictionsLocked(userId); updateSequenceNumberLP(pkgSetting, new int[] { userId }); final long callingId = Binder.clearCallingIdentity(); @@ -25270,6 +25478,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public boolean canAccessInstantApps(int callingUid, int userId) { return PackageManagerService.this.canViewInstantApps(callingUid, userId); } + + @Override + public boolean hasInstantApplicationMetadata(String packageName, int userId) { + synchronized (mPackages) { + return mInstantAppRegistry.hasInstantApplicationMetadataLPr(packageName, userId); + } + } } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 46e21dbc98bd..909ffabfd2db 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -148,6 +148,8 @@ class PackageManagerShellCommand extends ShellCommand { return runSetHomeActivity(); case "get-privapp-permissions": return runGetPrivappPermissions(); + case "get-privapp-deny-permissions": + return runGetPrivappDenyPermissions(); case "get-instantapp-resolver": return runGetInstantAppResolver(); case "has-feature": @@ -1293,6 +1295,19 @@ class PackageManagerShellCommand extends ShellCommand { return 0; } + private int runGetPrivappDenyPermissions() { + final String pkg = getNextArg(); + if (pkg == null) { + System.err.println("Error: no package specified."); + return 1; + } + ArraySet<String> privAppDenyPermissions = + SystemConfig.getInstance().getPrivAppDenyPermissions(pkg); + getOutPrintWriter().println(privAppDenyPermissions == null + ? "{}" : privAppDenyPermissions.toString()); + return 0; + } + private int runGetInstantAppResolver() { final PrintWriter pw = getOutPrintWriter(); try { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index d99408f592d1..56835f69a3c7 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4867,7 +4867,7 @@ final class Settings { pw.print(" enabled="); pw.print(ps.getEnabled(user.id)); pw.print(" instant="); - pw.println(ps.getInstantApp(user.id)); + pw.print(ps.getInstantApp(user.id)); pw.print(" virtual="); pw.println(ps.getVirtulalPreload(user.id)); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ae78d7c551c1..ae305658cad2 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -26,8 +26,8 @@ import static android.app.AppOpsManager.OP_TOAST_WINDOW; import static android.content.Context.CONTEXT_RESTRICTED; import static android.content.Context.DISPLAY_SERVICE; import static android.content.Context.WINDOW_SERVICE; -import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import static android.content.pm.PackageManager.FEATURE_LEANBACK; +import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.res.Configuration.EMPTY; @@ -35,6 +35,8 @@ import static android.content.res.Configuration.UI_MODE_TYPE_CAR; import static android.content.res.Configuration.UI_MODE_TYPE_MASK; import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.O; +import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.Display.STATE_OFF; import static android.view.WindowManager.DOCKED_LEFT; import static android.view.WindowManager.DOCKED_RIGHT; import static android.view.WindowManager.DOCKED_TOP; @@ -57,6 +59,7 @@ import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SYSTEM_WINDOW; import static android.view.WindowManager.LayoutParams.MATCH_PARENT; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; @@ -70,8 +73,8 @@ import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; -import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS; import static android.view.WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; @@ -120,6 +123,7 @@ import android.app.ActivityManager; import android.app.ActivityManager.StackId; import android.app.ActivityManagerInternal; import android.app.ActivityManagerInternal.SleepToken; +import android.app.ActivityThread; import android.app.AppOpsManager; import android.app.IUiModeManager; import android.app.ProgressDialog; @@ -177,8 +181,8 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UEventObserver; import android.os.UserHandle; -import android.os.Vibrator; import android.os.VibrationEffect; +import android.os.Vibrator; import android.provider.MediaStore; import android.provider.Settings; import android.service.dreams.DreamManagerInternal; @@ -226,6 +230,7 @@ import android.view.autofill.AutofillManagerInternal; import android.view.inputmethod.InputMethodManagerInternal; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.internal.policy.IShortcutService; @@ -240,8 +245,8 @@ import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener; import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback; import com.android.server.statusbar.StatusBarManagerInternal; -import com.android.server.wm.AppTransition; import com.android.server.vr.VrManagerInternal; +import com.android.server.wm.AppTransition; import java.io.File; import java.io.FileReader; @@ -676,6 +681,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean mLastShowingDream; boolean mDreamingLockscreen; boolean mDreamingSleepTokenNeeded; + private boolean mWindowSleepTokenNeeded; + private boolean mLastWindowSleepTokenNeeded; + + @GuardedBy("mHandler") + private SleepToken mWindowSleepToken; + SleepToken mDreamingSleepToken; SleepToken mScreenOffSleepToken; volatile boolean mKeyguardOccluded; @@ -1036,6 +1047,22 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }; + private final Runnable mAcquireSleepTokenRunnable = () -> { + if (mWindowSleepToken != null) { + return; + } + mWindowSleepToken = mActivityManagerInternal.acquireSleepToken("WindowSleepToken", + DEFAULT_DISPLAY); + }; + + private final Runnable mReleaseSleepTokenRunnable = () -> { + if (mWindowSleepToken == null) { + return; + } + mWindowSleepToken.release(); + mWindowSleepToken = null; + }; + private ImmersiveModeConfirmation mImmersiveModeConfirmation; private SystemGesturesPointerEventListener mSystemGestures; @@ -2148,7 +2175,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // This method might be called before the policy has been fully initialized // or for other displays we don't care about. // TODO(multi-display): Define policy for secondary displays. - if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY) { + if (mContext == null || display.getDisplayId() != DEFAULT_DISPLAY) { return; } mDisplay = display; @@ -2244,7 +2271,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void setDisplayOverscan(Display display, int left, int top, int right, int bottom) { // TODO(multi-display): Define policy for secondary displays. - if (display.getDisplayId() == Display.DEFAULT_DISPLAY) { + if (display.getDisplayId() == DEFAULT_DISPLAY) { mOverscanLeft = left; mOverscanTop = top; mOverscanRight = right; @@ -2642,7 +2669,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void onConfigurationChanged() { // TODO(multi-display): Define policy for secondary displays. - final Resources res = mContext.getResources(); + Context uiContext = ActivityThread.currentActivityThread().getSystemUiContext(); + final Resources res = uiContext.getResources(); mStatusBarHeight = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_height); @@ -2699,7 +2727,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode, int displayId) { // TODO(multi-display): Support navigation bar on secondary displays. - if (displayId == Display.DEFAULT_DISPLAY && mHasNavigationBar) { + if (displayId == DEFAULT_DISPLAY && mHasNavigationBar) { // For a basic navigation bar, when we are in landscape mode we place // the navigation bar to the side. if (mNavigationBarCanMove && fullWidth > fullHeight) { @@ -2721,7 +2749,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode, int displayId) { // TODO(multi-display): Support navigation bar on secondary displays. - if (displayId == Display.DEFAULT_DISPLAY && mHasNavigationBar) { + if (displayId == DEFAULT_DISPLAY && mHasNavigationBar) { // For a basic navigation bar, when we are in portrait mode we place // the navigation bar to the bottom. if (!mNavigationBarCanMove || fullWidth < fullHeight) { @@ -2745,7 +2773,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // we do want to exclude it since applications can't generally use that part // of the screen. // TODO(multi-display): Support status bars on secondary displays. - if (displayId == Display.DEFAULT_DISPLAY) { + if (displayId == DEFAULT_DISPLAY) { return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation, uiMode, displayId) - mStatusBarHeight; } @@ -2797,7 +2825,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean keyguardLocked = isKeyguardLocked(); boolean hideDockDivider = attrs.type == TYPE_DOCK_DIVIDER && !mWindowManagerInternal.isStackVisible(DOCKED_STACK_ID); - return (keyguardLocked && !allowWhenLocked && win.getDisplayId() == Display.DEFAULT_DISPLAY) + return (keyguardLocked && !allowWhenLocked && win.getDisplayId() == DEFAULT_DISPLAY) || hideDockDivider; } @@ -2967,7 +2995,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** Obtain proper context for showing splash screen on the provided display. */ private Context getDisplayContext(Context context, int displayId) { - if (displayId == Display.DEFAULT_DISPLAY) { + if (displayId == DEFAULT_DISPLAY) { // The default context fits. return context; } @@ -5365,6 +5393,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mAllowLockscreenWhenOn = false; mShowingDream = false; + mWindowSleepTokenNeeded = false; } /** {@inheritDoc} */ @@ -5462,6 +5491,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { && stackId == DOCKED_STACK_ID) { mTopDockedOpaqueOrDimmingWindowState = win; } + + // Take note if a window wants to acquire a sleep token. + if (win.isVisibleLw() && (attrs.privateFlags & PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN) != 0 + && win.canAcquireSleepToken()) { + mWindowSleepTokenNeeded = true; + } } private void applyKeyguardPolicyLw(WindowState win, WindowState imeTarget) { @@ -5592,11 +5627,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs.notifyShowingDreamChanged(); } + updateWindowSleepToken(); + // update since mAllowLockscreenWhenOn might have changed updateLockScreenTimeout(); return changes; } + private void updateWindowSleepToken() { + if (mWindowSleepTokenNeeded && !mLastWindowSleepTokenNeeded) { + mHandler.removeCallbacks(mReleaseSleepTokenRunnable); + mHandler.post(mAcquireSleepTokenRunnable); + } else if (!mWindowSleepTokenNeeded && mLastWindowSleepTokenNeeded) { + mHandler.removeCallbacks(mAcquireSleepTokenRunnable); + mHandler.post(mReleaseSleepTokenRunnable); + } + mLastWindowSleepTokenNeeded = mWindowSleepTokenNeeded; + } + /** * Updates the occluded state of the Keyguard. * @@ -6330,7 +6378,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private boolean shouldDispatchInputWhenNonInteractive(KeyEvent event) { - final boolean displayOff = (mDisplay == null || mDisplay.getState() == Display.STATE_OFF); + final boolean displayOff = (mDisplay == null || mDisplay.getState() == STATE_OFF); if (displayOff && !mHasFeatureWatch) { return false; @@ -7466,10 +7514,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // TODO (multidisplay): Support multiple displays in WindowManagerPolicy. private void updateDreamingSleepToken(boolean acquire) { if (acquire) { if (mDreamingSleepToken == null) { - mDreamingSleepToken = mActivityManagerInternal.acquireSleepToken("Dream"); + mDreamingSleepToken = mActivityManagerInternal.acquireSleepToken( + "Dream", DEFAULT_DISPLAY); } } else { if (mDreamingSleepToken != null) { @@ -7479,10 +7529,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // TODO (multidisplay): Support multiple displays in WindowManagerPolicy. private void updateScreenOffSleepToken(boolean acquire) { if (acquire) { if (mScreenOffSleepToken == null) { - mScreenOffSleepToken = mActivityManagerInternal.acquireSleepToken("ScreenOff"); + mScreenOffSleepToken = mActivityManagerInternal.acquireSleepToken( + "ScreenOff", DEFAULT_DISPLAY); } } else { if (mScreenOffSleepToken != null) { diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index d1a5953ee763..63900e0eb067 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -715,6 +715,7 @@ public final class ShutdownThread extends Thread { * @param reason reason for reboot/shutdown */ public static void rebootOrShutdown(final Context context, boolean reboot, String reason) { + SHUTDOWN_TIMINGS_LOG.traceEnd(); // SystemServerShutdown if (reboot) { Log.i(TAG, "Rebooting, reason: " + reason); PowerManagerService.lowLevelReboot(reason); @@ -736,7 +737,6 @@ public final class ShutdownThread extends Thread { } catch (InterruptedException unused) { } } - SHUTDOWN_TIMINGS_LOG.traceEnd(); // SystemServerShutdown // Shutdown power Log.i(TAG, "Performing low-level shutdown..."); PowerManagerService.lowLevelShutdown(reason); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 2fad7b1a4a72..f6f5341ff0a9 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1606,8 +1606,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { @Override public ParcelFileDescriptor getWallpaper(String callingPkg, IWallpaperManagerCallback cb, final int which, Bundle outParams, int wallpaperUserId) { - enforceCallingOrSelfPermissionAndAppOp(android.Manifest.permission.READ_EXTERNAL_STORAGE, - callingPkg, Binder.getCallingUid(), "read wallpaper"); + final int hasPrivilege = mContext.checkCallingOrSelfPermission( + android.Manifest.permission.READ_WALLPAPER_INTERNAL); + if (hasPrivilege != PackageManager.PERMISSION_GRANTED) { + enforceCallingOrSelfPermissionAndAppOp(android.Manifest.permission.READ_EXTERNAL_STORAGE, + callingPkg, Binder.getCallingUid(), "read wallpaper"); + } wallpaperUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), wallpaperUserId, false, true, "getWallpaper", null); diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index ddbbde1eb421..c2edc04db2e1 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -16,8 +16,8 @@ package com.android.server.wm; +import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; - import static com.android.server.wm.AppTransition.TRANSIT_UNSET; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; @@ -148,7 +148,7 @@ public class AppWindowAnimator { } // Start out animation gone if window is gone, or visible if window is visible. transformation.clear(); - transformation.setAlpha(mAppToken.hasContentToDisplay() ? 1 : 0); + transformation.setAlpha(mAppToken.isVisible() ? 1 : 0); hasTransformation = true; mStackClip = stackClip; @@ -172,7 +172,7 @@ public class AppWindowAnimator { animation = sDummyAnimation; hasTransformation = true; transformation.clear(); - transformation.setAlpha(mAppToken.hasContentToDisplay() ? 1 : 0); + transformation.setAlpha(mAppToken.isVisible() ? 1 : 0); } void setNullAnimation() { @@ -358,7 +358,7 @@ public class AppWindowAnimator { // This must be called while inside a transaction. boolean stepAnimationLocked(long currentTime) { - if (mService.okToAnimate()) { + if (mAppToken.okToAnimate()) { // We will run animations as long as the display isn't frozen. if (animation == sDummyAnimation) { @@ -423,8 +423,8 @@ public class AppWindowAnimator { if (DEBUG_ANIM) Slog.v(TAG, "Animation done in " + mAppToken + ": reportedVisible=" + mAppToken.reportedVisible - + " okToDisplay=" + mService.okToDisplay() - + " okToAnimate=" + mService.okToAnimate() + + " okToDisplay=" + mAppToken.okToDisplay() + + " okToAnimate=" + mAppToken.okToAnimate() + " startingDisplayed=" + mAppToken.startingDisplayed); transformation.clear(); diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index e9696d2ab46f..f142ff619884 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; +import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS; @@ -401,7 +402,7 @@ public class AppWindowContainerController // If we are preparing an app transition, then delay changing // the visibility of this token until we execute that transition. - if (mService.okToAnimate() && mService.mAppTransition.isTransitionSet()) { + if (wtoken.okToAnimate() && mService.mAppTransition.isTransitionSet()) { // A dummy animation is a placeholder animation which informs others that an // animation is going on (in this case an application transition). If the animation // was transferred from another application/animator, no dummy animator should be @@ -478,7 +479,7 @@ public class AppWindowContainerController // If the display is frozen, we won't do anything until the actual window is // displayed so there is no reason to put in the starting window. - if (!mService.okToDisplay()) { + if (!mContainer.okToDisplay()) { return false; } @@ -631,9 +632,12 @@ public class AppWindowContainerController mContainer.startingSurface = null; mContainer.startingWindow = null; mContainer.startingDisplayed = false; - if (surface == null && DEBUG_STARTING_WINDOW) { - Slog.v(TAG_WM, "startingWindow was set but startingSurface==null, couldn't " - + "remove"); + if (surface == null) { + if (DEBUG_STARTING_WINDOW) { + Slog.v(TAG_WM, "startingWindow was set but startingSurface==null, couldn't " + + "remove"); + } + return; } } else { if (DEBUG_STARTING_WINDOW) { @@ -699,16 +703,17 @@ public class AppWindowContainerController public void startFreezingScreen(int configChanges) { synchronized(mWindowMap) { - if (configChanges == 0 && mService.okToDisplay()) { - if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Skipping set freeze of " + mToken); - return; - } - if (mContainer == null) { Slog.w(TAG_WM, "Attempted to freeze screen with non-existing app token: " + mContainer); return; } + + if (configChanges == 0 && mContainer.okToDisplay()) { + if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Skipping set freeze of " + mToken); + return; + } + mContainer.startFreezingScreen(); } } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 2e4de8c58650..f4ac961af373 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -22,6 +22,7 @@ import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; +import static android.os.Build.VERSION_CODES.O_MR1; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; @@ -62,6 +63,7 @@ import android.util.Slog; import android.view.IApplicationToken; import android.view.SurfaceControl; import android.view.WindowManager; +import android.view.WindowManager.LayoutParams; import android.view.WindowManagerPolicy.StartingSurface; import com.android.internal.util.ToBooleanFunction; @@ -470,6 +472,20 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return delayed; } + /** + * @return The to top most child window for which {@link LayoutParams#isFullscreen()} returns + * true. + */ + WindowState getTopFullscreenWindow() { + for (int i = mChildren.size() - 1; i >= 0; i--) { + final WindowState win = mChildren.get(i); + if (win != null && win.mAttrs.isFullscreen()) { + return win; + } + } + return null; + } + WindowState findMainWindow() { WindowState candidate = null; int j = mChildren.size(); @@ -1293,11 +1309,11 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree */ @Override int getOrientation(int candidate) { - // We do not allow non-fullscreen apps to influence orientation beyond O. While we do - // throw an exception in {@link Activity#onCreate} and + // We do not allow non-fullscreen apps to influence orientation starting in O-MR1. While we + // do throw an exception in {@link Activity#onCreate} and // {@link Activity#setRequestedOrientation}, we also ignore the orientation here so that // other calculations aren't affected. - if (!fillsParent() && mTargetSdk > O) { + if (!fillsParent() && mTargetSdk >= O_MR1) { // Can't specify orientation if app doesn't fill parent. return SCREEN_ORIENTATION_UNSET; } diff --git a/services/core/java/com/android/server/wm/DimLayerController.java b/services/core/java/com/android/server/wm/DimLayerController.java index 741492815bd7..6f9e45a66909 100644 --- a/services/core/java/com/android/server/wm/DimLayerController.java +++ b/services/core/java/com/android/server/wm/DimLayerController.java @@ -290,7 +290,7 @@ class DimLayerController { state.dimLayer.setLayer(dimLayer); } if (state.dimLayer.isAnimating()) { - if (!mDisplayContent.mService.okToAnimate()) { + if (!mDisplayContent.okToAnimate()) { // Jump to the end of the animation. state.dimLayer.show(); } else { diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 5bc4a6b23392..f0a375bf29f4 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3204,6 +3204,19 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mService.requestTraversal(); } + boolean okToDisplay() { + if (mDisplayId == DEFAULT_DISPLAY) { + return !mService.mDisplayFrozen + && mService.mDisplayEnabled && mService.mPolicy.isScreenOn(); + } + return mDisplayInfo.state == Display.STATE_ON; + } + + boolean okToAnimate() { + return okToDisplay() && + (mDisplayId != DEFAULT_DISPLAY || mService.mPolicy.okToAnimate()); + } + static final class TaskForResizePointSearchResult { boolean searchDone; Task taskForResize; diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 83337ca98e35..08a9caa80d1e 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -280,7 +280,7 @@ class ScreenRotationAnimation { // capture a screenshot into the surface we just created Surface sur = new Surface(); sur.copyFrom(mSurfaceControl); - // FIXME: we should use the proper display + // TODO(multidisplay): we should use the proper display SurfaceControl.screenshot(SurfaceControl.getBuiltInDisplay( SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN), sur); mSurfaceControl.setLayerStack(display.getLayerStack()); diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 7a8c2f91b4e9..178124776823 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.Manifest.permission.DEVICE_POWER; import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -84,6 +85,7 @@ public class Session extends IWindowSession.Stub private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>(); final boolean mCanAddInternalSystemWindow; final boolean mCanHideNonSystemOverlayWindows; + final boolean mCanAcquireSleepToken; private AlertWindowNotification mAlertWindowNotification; private boolean mShowingAlertWindowNotificationAllowed; private boolean mClientDead = false; @@ -103,6 +105,8 @@ public class Session extends IWindowSession.Stub INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED; mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission( HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED; + mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER) + == PERMISSION_GRANTED; mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications; StringBuilder sb = new StringBuilder(); sb.append("Session{"); diff --git a/services/core/java/com/android/server/wm/SurfaceControlWithBackground.java b/services/core/java/com/android/server/wm/SurfaceControlWithBackground.java index ac06c6db4c5c..b0eaf1488f21 100644 --- a/services/core/java/com/android/server/wm/SurfaceControlWithBackground.java +++ b/services/core/java/com/android/server/wm/SurfaceControlWithBackground.java @@ -26,15 +26,18 @@ import android.view.Surface.OutOfResourcesException; import android.view.SurfaceControl; import android.view.SurfaceSession; -import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; -import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; +import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManagerPolicy.NAV_BAR_BOTTOM; +import static android.view.WindowManagerPolicy.NAV_BAR_LEFT; +import static android.view.WindowManagerPolicy.NAV_BAR_RIGHT; /** - * SurfaceControl extension that has background sized to match its container. + * SurfaceControl extension that has black background behind navigation bar area for fullscreen + * letterboxed apps. */ class SurfaceControlWithBackground extends SurfaceControl { - // SurfaceControl that holds the background behind opaque letterboxed app windows. + // SurfaceControl that holds the background. private SurfaceControl mBackgroundControl; // Flag that defines whether the background should be shown. @@ -51,8 +54,10 @@ class SurfaceControlWithBackground extends SurfaceControl { private float mLastDsDx = 1, mLastDsDy = 1; private float mLastX, mLastY; - // Will skip alpha animation for background of starting window. - private boolean mIsStartingWindow; + // SurfaceFlinger doesn't support crop rectangles where width or height is non-positive. + // If we just set an empty crop it will behave as if there is no crop at all. + // To fix this we explicitly hide the surface and won't let it to be shown. + private boolean mHiddenForCrop = false; public SurfaceControlWithBackground(SurfaceControlWithBackground other) { super(other); @@ -67,16 +72,14 @@ class SurfaceControlWithBackground extends SurfaceControl { super(s, name, w, h, format, flags, windowType, ownerUid); // We should only show background behind app windows that are letterboxed in a task. - if (!windowSurfaceController.mAnimator.mWin.isLetterboxedAppWindow() - || windowType < FIRST_APPLICATION_WINDOW - || windowType > LAST_APPLICATION_WINDOW) { + if ((windowType != TYPE_BASE_APPLICATION && windowType != TYPE_APPLICATION_STARTING) + || !windowSurfaceController.mAnimator.mWin.isLetterboxedAppWindow()) { return; } mWindowSurfaceController = windowSurfaceController; mLastWidth = w; mLastHeight = h; mWindowSurfaceController.getContainerRect(mTmpContainerRect); - mIsStartingWindow = windowType == TYPE_APPLICATION_STARTING; mBackgroundControl = new SurfaceControl(s, "Background for - " + name, mTmpContainerRect.width(), mTmpContainerRect.height(), PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM); @@ -89,10 +92,7 @@ class SurfaceControlWithBackground extends SurfaceControl { if (mBackgroundControl == null) { return; } - // We won't animate alpha for starting window because it will be visible as a flash for user - // when fading out to reveal real app window. - final float backgroundAlpha = mIsStartingWindow && alpha < 1.f ? 0 : alpha; - mBackgroundControl.setAlpha(backgroundAlpha); + mBackgroundControl.setAlpha(alpha); } @Override @@ -146,15 +146,10 @@ class SurfaceControlWithBackground extends SurfaceControl { if (mBackgroundControl == null) { return; } - if (crop.width() < mLastWidth || crop.height() < mLastHeight) { - // We're animating and cropping window, compute the appropriate crop for background. - calculateBgCrop(crop); - mBackgroundControl.setWindowCrop(mTmpContainerRect); - } else { - // When not animating just set crop to container rect. - mWindowSurfaceController.getContainerRect(mTmpContainerRect); - mBackgroundControl.setWindowCrop(mTmpContainerRect); - } + calculateBgCrop(crop); + mBackgroundControl.setWindowCrop(mTmpContainerRect); + mHiddenForCrop = mTmpContainerRect.isEmpty(); + updateBackgroundVisibility(); } @Override @@ -164,34 +159,24 @@ class SurfaceControlWithBackground extends SurfaceControl { if (mBackgroundControl == null) { return; } - if (crop.width() < mLastWidth || crop.height() < mLastHeight) { - // We're animating and cropping window, compute the appropriate crop for background. - calculateBgCrop(crop); - mBackgroundControl.setFinalCrop(mTmpContainerRect); - } else { - // When not animating just set crop to container rect. - mWindowSurfaceController.getContainerRect(mTmpContainerRect); - mBackgroundControl.setFinalCrop(mTmpContainerRect); - } + mWindowSurfaceController.getContainerRect(mTmpContainerRect); + mBackgroundControl.setFinalCrop(mTmpContainerRect); } - /** Compute background crop based on current animation progress for main surface control. */ + /** + * Compute background crop based on current animation progress for main surface control and + * update {@link #mTmpContainerRect} with new values. + */ private void calculateBgCrop(Rect crop) { // Track overall progress of animation by computing cropped portion of status bar. final Rect contentInsets = mWindowSurfaceController.mAnimator.mWin.mContentInsets; float d = contentInsets.top == 0 ? 0 : (float) crop.top / contentInsets.top; if (d > 1.f) { // We're running expand animation from launcher, won't compute custom bg crop here. - mTmpContainerRect.set(crop); + mTmpContainerRect.setEmpty(); return; } - // Compute additional offset for the background when app window is positioned not at (0,0). - // E.g. landscape with navigation bar on the left. - final Rect winFrame = mWindowSurfaceController.mAnimator.mWin.mFrame; - final int offsetX = (int) (winFrame.left * mLastDsDx * d + 0.5); - final int offsetY = (int) (winFrame.top * mLastDsDy * d + 0.5); - // Compute new scaled width and height for background that will depend on current animation // progress. Those consist of current crop rect for the main surface + scaled areas outside // of letterboxed area. @@ -201,17 +186,39 @@ class SurfaceControlWithBackground extends SurfaceControl { // computing correct frames for letterboxed windows in WindowState. d = d < 0.025f ? 0 : d; mWindowSurfaceController.getContainerRect(mTmpContainerRect); - final int backgroundWidth = - (int) (crop.width() + (mTmpContainerRect.width() - mLastWidth) * (1 - d) + 0.5); - final int backgroundHeight = - (int) (crop.height() + (mTmpContainerRect.height() - mLastHeight) * (1 - d) + 0.5); - - mTmpContainerRect.set(crop); - // Make sure that part of background to left/top is visible and scaled. - mTmpContainerRect.offset(offsetX, offsetY); - // Set correct width/height, so that area to right/bottom is cropped properly. - mTmpContainerRect.right = mTmpContainerRect.left + backgroundWidth; - mTmpContainerRect.bottom = mTmpContainerRect.top + backgroundHeight; + int backgroundWidth = 0, backgroundHeight = 0; + // Compute additional offset for the background when app window is positioned not at (0,0). + // E.g. landscape with navigation bar on the left. + final Rect winFrame = mWindowSurfaceController.mAnimator.mWin.mFrame; + int offsetX = (int)((winFrame.left - mTmpContainerRect.left) * mLastDsDx), + offsetY = (int) ((winFrame.top - mTmpContainerRect.top) * mLastDsDy); + + // Position and size background. + final int bgPosition = mWindowSurfaceController.mAnimator.mService.getNavBarPosition(); + + switch (bgPosition) { + case NAV_BAR_LEFT: + backgroundWidth = (int) ((mTmpContainerRect.width() - mLastWidth) * (1 - d) + 0.5); + backgroundHeight = crop.height(); + offsetX += crop.left - backgroundWidth; + offsetY += crop.top; + break; + case NAV_BAR_RIGHT: + backgroundWidth = (int) ((mTmpContainerRect.width() - mLastWidth) * (1 - d) + 0.5); + backgroundHeight = crop.height(); + offsetX += crop.right; + offsetY += crop.top; + break; + case NAV_BAR_BOTTOM: + backgroundWidth = crop.width(); + backgroundHeight = (int) ((mTmpContainerRect.height() - mLastHeight) * (1 - d) + + 0.5); + offsetX += crop.left; + offsetY += crop.bottom; + break; + } + mTmpContainerRect.set(offsetX, offsetY, offsetX + backgroundWidth, + offsetY + backgroundHeight); } @Override @@ -317,7 +324,7 @@ class SurfaceControlWithBackground extends SurfaceControl { return; } final AppWindowToken appWindowToken = mWindowSurfaceController.mAnimator.mWin.mAppToken; - if (appWindowToken != null && appWindowToken.fillsParent() && mVisible) { + if (!mHiddenForCrop && mVisible && appWindowToken != null && appWindowToken.fillsParent()) { mBackgroundControl.show(); } else { mBackgroundControl.hide(); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 940ad33268db..ecf9067b55c9 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -18,6 +18,8 @@ package com.android.server.wm; import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS; +import static com.android.server.wm.TaskSnapshotPersister.DISABLE_FULL_SIZED_BITMAPS; +import static com.android.server.wm.TaskSnapshotPersister.REDUCED_SCALE; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -102,6 +104,11 @@ class TaskSnapshotController { */ private final boolean mIsRunningOnIoT; + /** + * Flag indicating whether we are running on an Android Wear device. + */ + private final boolean mIsRunningOnWear; + TaskSnapshotController(WindowManagerService service) { mService = service; mCache = new TaskSnapshotCache(mService, mLoader); @@ -109,6 +116,8 @@ class TaskSnapshotController { PackageManager.FEATURE_LEANBACK); mIsRunningOnIoT = mService.mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_EMBEDDED); + mIsRunningOnWear = mService.mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WATCH); } void systemReady() { @@ -181,7 +190,8 @@ class TaskSnapshotController { */ @Nullable TaskSnapshot getSnapshot(int taskId, int userId, boolean restoreFromDisk, boolean reducedResolution) { - return mCache.getSnapshot(taskId, userId, restoreFromDisk, reducedResolution); + return mCache.getSnapshot(taskId, userId, restoreFromDisk, reducedResolution + || DISABLE_FULL_SIZED_BITMAPS); } /** @@ -202,19 +212,20 @@ class TaskSnapshotController { if (mainWindow == null) { return null; } + final boolean isLowRamDevice = ActivityManager.isLowRamDeviceStatic(); + final float scaleFraction = isLowRamDevice ? REDUCED_SCALE : 1f; final GraphicBuffer buffer = top.mDisplayContent.screenshotApplicationsToBuffer(top.token, - -1, -1, false, 1.0f, false, true); - if (buffer == null) { + -1, -1, false, scaleFraction, false, true); + if (buffer == null || buffer.getWidth() <= 1 || buffer.getHeight() <= 1) { return null; } return new TaskSnapshot(buffer, top.getConfiguration().orientation, - minRect(mainWindow.mContentInsets, mainWindow.mStableInsets), false /* reduced */, - 1f /* scale */); + minRect(mainWindow.mContentInsets, mainWindow.mStableInsets), + isLowRamDevice /* reduced */, scaleFraction /* scale */); } private boolean shouldDisableSnapshots() { - return !ENABLE_TASK_SNAPSHOTS || ActivityManager.isLowRamDeviceStatic() - || mIsRunningOnTv || mIsRunningOnIoT; + return !ENABLE_TASK_SNAPSHOTS || mIsRunningOnWear || mIsRunningOnTv || mIsRunningOnIoT; } private Rect minRect(Rect rect1, Rect rect2) { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java index f90b3fb6c1de..1252aee14964 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java @@ -21,6 +21,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.TestApi; +import android.app.ActivityManager; import android.app.ActivityManager.TaskSnapshot; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; @@ -53,6 +54,7 @@ class TaskSnapshotPersister { private static final String SNAPSHOTS_DIRNAME = "snapshots"; private static final String REDUCED_POSTFIX = "_reduced"; static final float REDUCED_SCALE = 0.5f; + static final boolean DISABLE_FULL_SIZED_BITMAPS = ActivityManager.isLowRamDeviceStatic(); private static final long DELAY_MS = 100; private static final int QUALITY = 95; private static final String PROTO_EXTENSION = ".proto"; @@ -183,6 +185,11 @@ class TaskSnapshotPersister { } File getBitmapFile(int taskId, int userId) { + // Full sized bitmaps are disabled on low ram devices + if (DISABLE_FULL_SIZED_BITMAPS) { + Slog.wtf(TAG, "This device does not support full sized resolution bitmaps."); + return null; + } return new File(getDirectory(userId), taskId + BITMAP_EXTENSION); } @@ -197,11 +204,15 @@ class TaskSnapshotPersister { private void deleteSnapshot(int taskId, int userId) { final File protoFile = getProtoFile(taskId, userId); - final File bitmapFile = getBitmapFile(taskId, userId); final File bitmapReducedFile = getReducedResolutionBitmapFile(taskId, userId); protoFile.delete(); - bitmapFile.delete(); bitmapReducedFile.delete(); + + // Low ram devices do not have a full sized file to delete + if (!DISABLE_FULL_SIZED_BITMAPS) { + final File bitmapFile = getBitmapFile(taskId, userId); + bitmapFile.delete(); + } } interface DirectoryResolver { @@ -323,7 +334,6 @@ class TaskSnapshotPersister { boolean writeBuffer() { final File file = getBitmapFile(mTaskId, mUserId); - final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId); final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot()); if (bitmap == null) { Slog.e(TAG, "Invalid task snapshot hw bitmap"); @@ -331,18 +341,32 @@ class TaskSnapshotPersister { } final Bitmap swBitmap = bitmap.copy(Config.ARGB_8888, false /* isMutable */); - final Bitmap reduced = Bitmap.createScaledBitmap(swBitmap, - (int) (bitmap.getWidth() * REDUCED_SCALE), - (int) (bitmap.getHeight() * REDUCED_SCALE), true /* filter */); + final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId); + final Bitmap reduced = mSnapshot.isReducedResolution() + ? swBitmap + : Bitmap.createScaledBitmap(swBitmap, + (int) (bitmap.getWidth() * REDUCED_SCALE), + (int) (bitmap.getHeight() * REDUCED_SCALE), true /* filter */); try { - FileOutputStream fos = new FileOutputStream(file); - swBitmap.compress(JPEG, QUALITY, fos); - fos.close(); FileOutputStream reducedFos = new FileOutputStream(reducedFile); reduced.compress(JPEG, QUALITY, reducedFos); reducedFos.close(); } catch (IOException e) { - Slog.e(TAG, "Unable to open " + file + " or " + reducedFile +" for persisting.", e); + Slog.e(TAG, "Unable to open " + reducedFile +" for persisting.", e); + return false; + } + + // For snapshots with reduced resolution, do not create or save full sized bitmaps + if (mSnapshot.isReducedResolution()) { + return true; + } + + try { + FileOutputStream fos = new FileOutputStream(file); + swBitmap.compress(JPEG, QUALITY, fos); + fos.close(); + } catch (IOException e) { + Slog.e(TAG, "Unable to open " + file + " for persisting.", e); return false; } return true; diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 1bece6903eac..4698d72567c4 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -162,7 +162,7 @@ class TaskSnapshotSurface implements StartingSurface { + task); return null; } - final WindowState topFullscreenWindow = topFullscreenToken.findMainWindow(); + final WindowState topFullscreenWindow = topFullscreenToken.getTopFullscreenWindow(); if (mainWindow == null || topFullscreenWindow == null) { Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find main window for token=" + token); @@ -320,6 +320,10 @@ class TaskSnapshotSurface implements StartingSurface { mChildSurfaceControl.show(); mChildSurfaceControl.setWindowCrop(crop); mChildSurfaceControl.setPosition(frame.left, frame.top); + + // Scale the mismatch dimensions to fill the task bounds + final float scale = 1 / mSnapshot.getScale(); + mChildSurfaceControl.setMatrix(scale, 0, 0, scale); } finally { SurfaceControl.closeTransaction(); } @@ -332,6 +336,11 @@ class TaskSnapshotSurface implements StartingSurface { mSurface.release(); } + /** + * Calculates the snapshot crop in snapshot coordinate space. + * + * @return crop rect in snapshot coordinate space. + */ @VisibleForTesting Rect calculateSnapshotCrop() { final Rect rect = new Rect(); @@ -340,16 +349,28 @@ class TaskSnapshotSurface implements StartingSurface { // Let's remove all system decorations except the status bar, but only if the task is at the // very top of the screen. - rect.inset(insets.left, mTaskBounds.top != 0 ? insets.top : 0, insets.right, insets.bottom); + rect.inset((int) (insets.left * mSnapshot.getScale()), + mTaskBounds.top != 0 ? (int) (insets.top * mSnapshot.getScale()) : 0, + (int) (insets.right * mSnapshot.getScale()), + (int) (insets.bottom * mSnapshot.getScale())); return rect; } + /** + * Calculates the snapshot frame in window coordinate space from crop. + * + * @param crop rect that is in snapshot coordinate space. + */ @VisibleForTesting Rect calculateSnapshotFrame(Rect crop) { final Rect frame = new Rect(crop); + final float scale = mSnapshot.getScale(); + + // Rescale the frame from snapshot to window coordinate space + frame.scale(1 / scale); // By default, offset it to to top/left corner - frame.offsetTo(-crop.left, -crop.top); + frame.offsetTo((int) (-crop.left / scale), (int) (-crop.top / scale)); // However, we also need to make space for the navigation bar on the left side. final int colorViewLeftInset = getColorViewLeftInset(mStableInsets.left, diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5c664c2d16ce..a65f690d8e1d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2347,7 +2347,7 @@ public class WindowManagerService extends IWindowManager.Stub // artifacts when we unfreeze the display if some different animation // is running. Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "WM#applyAnimationLocked"); - if (okToAnimate()) { + if (atoken.okToAnimate()) { final DisplayContent displayContent = atoken.getTask().getDisplayContent(); final DisplayInfo displayInfo = displayContent.getDisplayInfo(); final int width = displayInfo.appWidth; @@ -2425,14 +2425,6 @@ public class WindowManagerService extends IWindowManager.Stub return false; } - boolean okToDisplay() { - return !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOn(); - } - - boolean okToAnimate() { - return okToDisplay() && mPolicy.okToAnimate(); - } - @Override public void addWindowToken(IBinder binder, int type, int displayId) { if (!checkCallingPermission(MANAGE_APP_TOKENS, "addWindowToken()")) { @@ -2699,7 +2691,9 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { boolean prepared = mAppTransition.prepareAppTransitionLocked(transit, alwaysKeepCurrent, flags, forceOverride); - if (prepared && okToAnimate()) { + // TODO (multidisplay): associate app transitions with displays + final DisplayContent dc = mRoot.getDisplayContent(DEFAULT_DISPLAY); + if (prepared && dc != null && dc.okToAnimate()) { mSkipAppTransitionAnimation = false; } } @@ -5817,7 +5811,10 @@ public class WindowManagerService extends IWindowManager.Stub // If the screen is currently frozen or off, then keep // it frozen/off until this window draws at its new // orientation. - if (!okToDisplay() && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { + // TODO (multidisplay): Support screen freezing on secondary displays. + final DisplayContent dc = mRoot.getDisplayContent(DEFAULT_DISPLAY); + if ((dc == null || !dc.okToDisplay()) + && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Changing surface while display frozen: " + w); w.setOrientationChanging(true); w.mLastFreezeDuration = 0; @@ -6033,7 +6030,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } - if (!displayContent.isReady() || !mPolicy.isScreenOn() || !okToAnimate()) { + if (!displayContent.isReady() || !mPolicy.isScreenOn() || !displayContent.okToAnimate()) { // No need to freeze the screen before the display is ready, if the screen is off, // or we can't currently animate. return; @@ -6069,7 +6066,8 @@ public class WindowManagerService extends IWindowManager.Stub Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024); } - if (CUSTOM_SCREEN_ROTATION) { + // TODO(multidisplay): rotation on non-default displays + if (CUSTOM_SCREEN_ROTATION && displayContent.isDefaultDisplay) { mExitAnimId = exitAnim; mEnterAnimId = enterAnim; ScreenRotationAnimation screenRotationAnimation = @@ -6081,7 +6079,6 @@ public class WindowManagerService extends IWindowManager.Stub // Check whether the current screen contains any secure content. boolean isSecure = displayContent.hasSecureWindowOnScreen(); - // TODO(multidisplay): rotation on main screen only. displayContent.updateDisplayInfo(); screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent, mFxSession, inTransaction, mPolicy.isDefaultOrientationForced(), isSecure, diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 12abe39b082b..df0dfcb053a3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -734,6 +734,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mOwnerCanAddInternalSystemWindow; } + @Override + public boolean canAcquireSleepToken() { + return mSession.mCanAcquireSleepToken; + } + /** * Subtracts the insets calculated by intersecting {@param layoutFrame} with {@param insetFrame} * from {@param frame}. In other words, it applies the insets that would result if @@ -1479,7 +1484,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // TODO: Another visibility method that was added late in the release to minimize risk. @Override public boolean canAffectSystemUiFlags() { - final boolean shown = mWinAnimator.getShown(); + final boolean shown = mWinAnimator.getShown() && mWinAnimator.mShownAlpha > 0f; // We only consider the app to be exiting when the animation has started. After the app // transition is executed the windows are marked exiting before the new windows have been @@ -1711,7 +1716,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final boolean adjustedForMinimizedDockOrIme = task != null && (task.mStack.isAdjustedForMinimizedDockedStack() || task.mStack.isAdjustedForIme()); - if (mService.okToAnimate() + if (mToken.okToAnimate() && (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 && !isDragResizing() && !adjustedForMinimizedDockOrIme && (task == null || getTask().mStack.hasMovementAnimations()) @@ -1880,7 +1885,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // First, see if we need to run an animation. If we do, we have to hold off on removing the // window until the animation is done. If the display is frozen, just remove immediately, // since the animation wouldn't be seen. - if (mHasSurface && mService.okToAnimate()) { + if (mHasSurface && mToken.okToAnimate()) { if (mWillReplaceWindow) { // This window is going to be replaced. We need to keep it around until the new one // gets added, then we will get rid of this one. @@ -2315,7 +2320,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mLayoutNeeded = true; } - if (isDrawnLw() && mService.okToAnimate()) { + if (isDrawnLw() && mToken.okToAnimate()) { mWinAnimator.applyEnterAnimationLocked(); } } @@ -2471,7 +2476,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (doAnimation) { if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility=" + mPolicyVisibility + " mAnimation=" + mWinAnimator.mAnimation); - if (!mService.okToAnimate()) { + if (!mToken.okToAnimate()) { doAnimation = false; } else if (mPolicyVisibility && mWinAnimator.mAnimation == null) { // Check for the case where we are currently visible and @@ -2501,7 +2506,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean hideLw(boolean doAnimation, boolean requestAnim) { if (doAnimation) { - if (!mService.okToAnimate()) { + if (!mToken.okToAnimate()) { doAnimation = false; } } @@ -3972,6 +3977,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP windowInfo.type = mAttrs.type; windowInfo.layer = mLayer; windowInfo.token = mClient.asBinder(); + if (mAppToken != null) { + windowInfo.activityToken = mAppToken.appToken.asBinder(); + } windowInfo.title = mAttrs.accessibilityTitle; windowInfo.accessibilityIdOfAnchor = mAttrs.accessibilityIdOfAnchor; windowInfo.focused = isFocused(); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 86265c297b1b..053ee970f9ae 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -369,7 +369,7 @@ class WindowStateAnimator { // we just started or just stopped animating by comparing mWasAnimating with isAnimationSet(). mWasAnimating = mAnimating; final DisplayContent displayContent = mWin.getDisplayContent(); - if (displayContent != null && mService.okToAnimate()) { + if (mWin.mToken.okToAnimate()) { // We will run animations as long as the display isn't frozen. if (mWin.isDrawnLw() && mAnimation != null) { @@ -1812,7 +1812,7 @@ class WindowStateAnimator { // artifacts when we unfreeze the display if some different animation // is running. Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "WSA#applyAnimationLocked"); - if (mService.okToAnimate()) { + if (mWin.mToken.okToAnimate()) { int anim = mPolicy.selectAnimationLw(mWin, transit); int attr = -1; Animation a = null; diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index e3033c9c01a8..48d1618c1c91 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -288,4 +288,12 @@ class WindowToken extends WindowContainer<WindowState> { String getName() { return toString(); } + + boolean okToDisplay() { + return mDisplayContent != null && mDisplayContent.okToDisplay(); + } + + boolean okToAnimate() { + return mDisplayContent != null && mDisplayContent.okToAnimate(); + } } diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 46c1292e4f95..facdb8510759 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -36,6 +36,7 @@ import android.net.dhcp.DhcpClient; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpManagerEvent; import android.net.util.MultinetworkPolicyTracker; +import android.net.util.NetdService; import android.net.util.NetworkConstants; import android.net.util.SharedLog; import android.os.INetworkManagementService; @@ -66,9 +67,11 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Objects; +import java.util.List; import java.util.Set; import java.util.StringJoiner; import java.util.function.Predicate; @@ -423,6 +426,10 @@ public class IpManager extends StateMachine { } public boolean isValid() { + if (ipAddresses.isEmpty()) { + return false; + } + // For every IP address, there must be at least one prefix containing that address. for (LinkAddress addr : ipAddresses) { if (!any(directlyConnectedRoutes, (p) -> p.contains(addr.getAddress()))) { @@ -459,14 +466,47 @@ public class IpManager extends StateMachine { return true; } + /** + * @return true if the given list of addressess and routes satisfies provisioning for this + * InitialConfiguration. LinkAddresses and RouteInfo objects are not compared with equality + * because addresses and routes seen by Netlink will contain additional fields like flags, + * interfaces, and so on. If this InitialConfiguration has no IP address specified, the + * provisioning check always fails. + * + * If the given list of routes is null, only addresses are taken into considerations. + */ + public boolean isProvisionedBy(List<LinkAddress> addresses, List<RouteInfo> routes) { + if (ipAddresses.isEmpty()) { + return false; + } + + for (LinkAddress addr : ipAddresses) { + if (!any(addresses, (addrSeen) -> addr.isSameAddressAs(addrSeen))) { + return false; + } + } + + if (routes != null) { + for (IpPrefix prefix : directlyConnectedRoutes) { + if (!any(routes, (routeSeen) -> isDirectlyConnectedRoute(routeSeen, prefix))) { + return false; + } + } + } + + return true; + } + + private static boolean isDirectlyConnectedRoute(RouteInfo route, IpPrefix prefix) { + return !route.hasGateway() && prefix.equals(route.getDestination()); + } + private static boolean isPrefixLengthCompliant(LinkAddress addr) { - return (addr.getAddress() instanceof Inet4Address) - || isCompliantIPv6PrefixLength(addr.getPrefixLength()); + return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength()); } private static boolean isPrefixLengthCompliant(IpPrefix prefix) { - return (prefix.getAddress() instanceof Inet4Address) - || isCompliantIPv6PrefixLength(prefix.getPrefixLength()); + return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength()); } private static boolean isCompliantIPv6PrefixLength(int prefixLength) { @@ -479,28 +519,7 @@ public class IpManager extends StateMachine { } private static boolean isIPv6GUA(LinkAddress addr) { - return (addr.getAddress() instanceof Inet6Address) && addr.isGlobalPreferred(); - } - - private static <T> boolean any(Iterable<T> coll, Predicate<T> fn) { - for (T t : coll) { - if (fn.test(t)) { - return true; - } - } - return false; - } - - private static <T> boolean all(Iterable<T> coll, Predicate<T> fn) { - return !any(coll, not(fn)); - } - - private static <T> Predicate<T> not(Predicate<T> fn) { - return (t) -> !fn.test(t); - } - - private static <T> String join(String delimiter, Collection<T> coll) { - return coll.stream().map(Object::toString).collect(Collectors.joining(delimiter)); + return addr.isIPv6() && addr.isGlobalPreferred(); } } @@ -549,6 +568,7 @@ public class IpManager extends StateMachine { private final LocalLog mConnectivityPacketLog; private final MessageHandlingLogger mMsgStateLogger; private final IpConnectivityLog mMetricsLog = new IpConnectivityLog(); + private final INetd mNetd; private NetworkInterface mNetworkInterface; @@ -568,14 +588,22 @@ public class IpManager extends StateMachine { public IpManager(Context context, String ifName, Callback callback) { this(context, ifName, callback, INetworkManagementService.Stub.asInterface( - ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE))); + ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)), + NetdService.getInstance()); } /** * An expanded constructor, useful for dependency injection. + * TODO: migrate all test users to mock IpManager directly and remove this ctor. */ public IpManager(Context context, String ifName, Callback callback, INetworkManagementService nwService) { + this(context, ifName, callback, nwService, NetdService.getInstance()); + } + + @VisibleForTesting + IpManager(Context context, String ifName, Callback callback, + INetworkManagementService nwService, INetd netd) { super(IpManager.class.getSimpleName() + "." + ifName); mTag = getName(); @@ -584,6 +612,7 @@ public class IpManager extends StateMachine { mClatInterfaceName = CLAT_PREFIX + ifName; mCallback = new LoggingCallbackWrapper(callback); mNwService = nwService; + mNetd = netd; mLog = new SharedLog(MAX_LOG_RECORDS, mTag); mConnectivityPacketLog = new LocalLog(MAX_PACKET_RECORDS); @@ -886,10 +915,20 @@ public class IpManager extends StateMachine { } // For now: use WifiStateMachine's historical notion of provisioned. - private static boolean isProvisioned(LinkProperties lp) { + @VisibleForTesting + static boolean isProvisioned(LinkProperties lp, InitialConfiguration config) { // For historical reasons, we should connect even if all we have is // an IPv4 address and nothing else. - return lp.isProvisioned() || lp.hasIPv4Address(); + if (lp.hasIPv4Address() || lp.isProvisioned()) { + return true; + } + if (config == null) { + return false; + } + + // When an InitialConfiguration is specified, ignore any difference with previous + // properties and instead check if properties observed match the desired properties. + return config.isProvisionedBy(lp.getLinkAddresses(), lp.getRoutes()); } // TODO: Investigate folding all this into the existing static function @@ -898,12 +937,11 @@ public class IpManager extends StateMachine { // object that is a correct and complete assessment of what changed, taking // account of the asymmetries described in the comments in this function. // Then switch to using it everywhere (IpReachabilityMonitor, etc.). - private ProvisioningChange compareProvisioning( - LinkProperties oldLp, LinkProperties newLp) { + private ProvisioningChange compareProvisioning(LinkProperties oldLp, LinkProperties newLp) { ProvisioningChange delta; - - final boolean wasProvisioned = isProvisioned(oldLp); - final boolean isProvisioned = isProvisioned(newLp); + InitialConfiguration config = mConfiguration != null ? mConfiguration.mInitialConfig : null; + final boolean wasProvisioned = isProvisioned(oldLp, config); + final boolean isProvisioned = isProvisioned(newLp, config); if (!wasProvisioned && isProvisioned) { delta = ProvisioningChange.GAINED_PROVISIONING; @@ -1016,10 +1054,6 @@ public class IpManager extends StateMachine { return delta; } - private boolean linkPropertiesUnchanged(LinkProperties newLp) { - return Objects.equals(newLp, mLinkProperties); - } - private LinkProperties assembleLinkProperties() { // [1] Create a new LinkProperties object to populate. LinkProperties newLp = new LinkProperties(); @@ -1066,9 +1100,26 @@ public class IpManager extends StateMachine { newLp.setHttpProxy(mHttpProxy); } + // [5] Add data from InitialConfiguration + if (mConfiguration != null && mConfiguration.mInitialConfig != null) { + InitialConfiguration config = mConfiguration.mInitialConfig; + // Add InitialConfiguration routes and dns server addresses once all addresses + // specified in the InitialConfiguration have been observed with Netlink. + if (config.isProvisionedBy(newLp.getLinkAddresses(), null)) { + for (IpPrefix prefix : config.directlyConnectedRoutes) { + newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName)); + } + } + addAllReachableDnsServers(newLp, config.dnsServers); + } + final LinkProperties oldLp = mLinkProperties; if (VDBG) { - Log.d(mTag, "newLp{" + newLp + "}"); + Log.d(mTag, String.format("Netlink-seen LPs: %s, new LPs: %s; old LPs: %s", + netlinkLinkProperties, newLp, oldLp)); } + + // TODO: also learn via netlink routes specified by an InitialConfiguration and specified + // from a static IP v4 config instead of manually patching them in in steps [3] and [5]. return newLp; } @@ -1087,7 +1138,7 @@ public class IpManager extends StateMachine { // Returns false if we have lost provisioning, true otherwise. private boolean handleLinkPropertiesUpdate(boolean sendCallbacks) { final LinkProperties newLp = assembleLinkProperties(); - if (linkPropertiesUnchanged(newLp)) { + if (Objects.equals(newLp, mLinkProperties)) { return true; } final ProvisioningChange delta = setLinkProperties(newLp); @@ -1218,6 +1269,26 @@ public class IpManager extends StateMachine { return true; } + private boolean applyInitialConfig(InitialConfiguration config) { + if (mNetd == null) { + logError("tried to add %s to %s but INetd was null", config, mInterfaceName); + return false; + } + + // TODO: also support specifying a static IPv4 configuration in InitialConfiguration. + for (LinkAddress addr : findAll(config.ipAddresses, LinkAddress::isIPv6)) { + try { + mNetd.interfaceAddAddress( + mInterfaceName, addr.getAddress().getHostAddress(), addr.getPrefixLength()); + } catch (ServiceSpecificException | RemoteException e) { + logError("failed to add %s to %s: %s", addr, mInterfaceName, e); + return false; + } + } + + return true; + } + private boolean startIpReachabilityMonitor() { try { mIpReachabilityMonitor = new IpReachabilityMonitor( @@ -1446,6 +1517,14 @@ public class IpManager extends StateMachine { return; } + InitialConfiguration config = mConfiguration.mInitialConfig; + if ((config != null) && !applyInitialConfig(config)) { + // TODO introduce a new IpManagerEvent constant to distinguish this error case. + doImmediateProvisioningFailure(IpManagerEvent.ERROR_INVALID_PROVISIONING); + transitionTo(mStoppingState); + return; + } + if (mConfiguration.mUsingIpReachabilityMonitor && !startIpReachabilityMonitor()) { doImmediateProvisioningFailure( IpManagerEvent.ERROR_STARTING_IPREACHABILITYMONITOR); @@ -1652,4 +1731,39 @@ public class IpManager extends StateMachine { receivedInState, processedInState); } } + + // TODO: extract out into CollectionUtils. + static <T> boolean any(Iterable<T> coll, Predicate<T> fn) { + for (T t : coll) { + if (fn.test(t)) { + return true; + } + } + return false; + } + + static <T> boolean all(Iterable<T> coll, Predicate<T> fn) { + return !any(coll, not(fn)); + } + + static <T> Predicate<T> not(Predicate<T> fn) { + return (t) -> !fn.test(t); + } + + static <T> String join(String delimiter, Collection<T> coll) { + return coll.stream().map(Object::toString).collect(Collectors.joining(delimiter)); + } + + static <T> T find(Iterable<T> coll, Predicate<T> fn) { + for (T t: coll) { + if (fn.test(t)) { + return t; + } + } + return null; + } + + static <T> List<T> findAll(Collection<T> coll, Predicate<T> fn) { + return coll.stream().filter(fn).collect(Collectors.toList()); + } } diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java index 9b3bc3f0301a..606526816368 100644 --- a/services/net/java/android/net/util/NetworkConstants.java +++ b/services/net/java/android/net/util/NetworkConstants.java @@ -87,6 +87,7 @@ public final class NetworkConstants { public static final int IPV4_PROTOCOL_OFFSET = 9; public static final int IPV4_SRC_ADDR_OFFSET = 12; public static final int IPV4_DST_ADDR_OFFSET = 16; + public static final int IPV4_ADDR_BITS = 32; public static final int IPV4_ADDR_LEN = 4; /** @@ -99,6 +100,7 @@ public final class NetworkConstants { public static final int IPV6_PROTOCOL_OFFSET = 6; public static final int IPV6_SRC_ADDR_OFFSET = 8; public static final int IPV6_DST_ADDR_OFFSET = 24; + public static final int IPV6_ADDR_BITS = 128; public static final int IPV6_ADDR_LEN = 16; public static final int IPV6_MIN_MTU = 1280; public static final int RFC7421_PREFIX_LENGTH = 64; diff --git a/services/net/java/android/net/util/PrefixUtils.java b/services/net/java/android/net/util/PrefixUtils.java index 962aab459a19..f60694aaedc9 100644 --- a/services/net/java/android/net/util/PrefixUtils.java +++ b/services/net/java/android/net/util/PrefixUtils.java @@ -20,6 +20,8 @@ import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; +import java.net.Inet4Address; +import java.net.InetAddress; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -68,6 +70,13 @@ public class PrefixUtils { return new IpPrefix(addr.getAddress(), addr.getPrefixLength()); } + public static IpPrefix ipAddressAsPrefix(InetAddress ip) { + final int bitLength = (ip instanceof Inet4Address) + ? NetworkConstants.IPV4_ADDR_BITS + : NetworkConstants.IPV6_ADDR_BITS; + return new IpPrefix(ip, bitLength); + } + private static IpPrefix pfx(String prefixStr) { return new IpPrefix(prefixStr); } diff --git a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java index bd65f571d20b..8242149d61be 100644 --- a/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java +++ b/services/tests/notification/src/com/android/server/notification/ManagedServicesTest.java @@ -38,6 +38,7 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; +import android.os.Build; import android.os.IBinder; import android.os.IInterface; import android.os.UserHandle; @@ -146,15 +147,82 @@ public class ManagedServicesTest extends NotificationTestCase { service.onSettingRestored( service.getConfig().secureSettingName, mExpectedPrimary.get(approvalLevel).get(userId), - userId); + Build.VERSION_CODES.O, userId); } verifyExpectedApprovedEntries(service, true); for (int userId : mExpectedSecondary.get(approvalLevel).keySet()) { service.onSettingRestored(service.getConfig().secondarySettingName, - mExpectedSecondary.get(approvalLevel).get(userId), userId); + mExpectedSecondary.get(approvalLevel).get(userId), Build.VERSION_CODES.O, + userId); + } + verifyExpectedApprovedEntries(service); + } + } + + @Test + public void testBackupAndRestore_migration_preO() throws Exception { + ArrayMap backupPrimaryPackages = new ArrayMap<>(); + backupPrimaryPackages.put(0, "backup.0:backup:0a"); + backupPrimaryPackages.put(10, "10.backup"); + backupPrimaryPackages.put(11, "eleven"); + backupPrimaryPackages.put(12, ""); + ArrayMap backupPrimaryComponentNames = new ArrayMap<>(); + backupPrimaryComponentNames.put(0, "backup.first/whatever:a/b"); + backupPrimaryComponentNames.put(10, "again/M1"); + backupPrimaryComponentNames.put(11, "orange/youglad:itisnot/banana"); + backupPrimaryComponentNames.put(12, ""); + ArrayMap<Integer, ArrayMap<Integer, String>> backupPrimary = new ArrayMap<>(); + backupPrimary.put(APPROVAL_BY_PACKAGE, backupPrimaryPackages); + backupPrimary.put(APPROVAL_BY_COMPONENT, backupPrimaryComponentNames); + + ArrayMap backupSecondaryComponentNames = new ArrayMap<>(); + backupSecondaryComponentNames.put(0, "secondary.1/component.Name"); + backupSecondaryComponentNames.put(10, + "this.is.another.package.backup/with.Component:component.backup/2"); + ArrayMap backupSecondaryPackages = new ArrayMap<>(); + backupSecondaryPackages.put(0, ""); + backupSecondaryPackages.put(10, + "this.is.another.package.backup:package.backup"); + ArrayMap<Integer, ArrayMap<Integer, String>> backupSecondary = new ArrayMap<>(); + backupSecondary.put(APPROVAL_BY_PACKAGE, backupSecondaryPackages); + backupSecondary.put(APPROVAL_BY_COMPONENT, backupSecondaryComponentNames); + + for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) { + ManagedServices service = new TestManagedServices(getContext(), mLock, mUserProfiles, + mIpm, approvalLevel); + + // not an expected flow but a way to get data into the settings + for (int userId : mExpectedPrimary.get(approvalLevel).keySet()) { + service.onSettingRestored( + service.getConfig().secureSettingName, + mExpectedPrimary.get(approvalLevel).get(userId), + Build.VERSION_CODES.O, userId); + } + + for (int userId : mExpectedSecondary.get(approvalLevel).keySet()) { + service.onSettingRestored(service.getConfig().secondarySettingName, + mExpectedSecondary.get(approvalLevel).get(userId), Build.VERSION_CODES.O, + userId); + } + + // actual test + for (int userId : backupPrimary.get(approvalLevel).keySet()) { + service.onSettingRestored( + service.getConfig().secureSettingName, + backupPrimary.get(approvalLevel).get(userId), + Build.VERSION_CODES.N_MR1, userId); + } + verifyExpectedApprovedEntries(service, true); + + for (int userId : backupSecondary.get(approvalLevel).keySet()) { + service.onSettingRestored(service.getConfig().secondarySettingName, + backupSecondary.get(approvalLevel).get(userId), + Build.VERSION_CODES.N_MR1, userId); } verifyExpectedApprovedEntries(service); + verifyExpectedApprovedEntries(service, backupPrimary.get(approvalLevel)); + verifyExpectedApprovedEntries(service, backupSecondary.get(approvalLevel)); } } @@ -619,25 +687,22 @@ public class ManagedServicesTest extends NotificationTestCase { ArrayMap<Integer, String> verifyMap = primary ? mExpectedPrimary.get(service.mApprovalLevel) : mExpectedSecondary.get(service.mApprovalLevel); + verifyExpectedApprovedEntries(service, verifyMap); + } + + private void verifyExpectedApprovedEntries(ManagedServices service, + ArrayMap<Integer, String> verifyMap) { for (int userId : verifyMap.keySet()) { for (String verifyValue : verifyMap.get(userId).split(":")) { if (!TextUtils.isEmpty(verifyValue)) { assertTrue("service type " + service.mApprovalLevel + ":" - + verifyValue + " is not allowed for user " + userId, + + verifyValue + " is not allowed for user " + userId, service.isPackageOrComponentAllowed(verifyValue, userId)); } } } } - private boolean isPackage(String packageOrComponent) { - final ComponentName component = ComponentName.unflattenFromString(packageOrComponent); - if (component != null) { - return false; - } - return true; - } - private void writeExpectedValuesToSettings(int approvalLevel) { for (int userId : mExpectedPrimary.get(approvalLevel).keySet()) { Settings.Secure.putStringForUser(getContext().getContentResolver(), SETTING, diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java index 801479b33ce5..65bf33084bb4 100644 --- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java +++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java @@ -46,6 +46,7 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.graphics.Color; import android.media.AudioAttributes; import android.net.Uri; @@ -78,6 +79,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -127,6 +129,8 @@ public class RankingHelperTest extends NotificationTestCase { when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2); when(mContext.getResources()).thenReturn( InstrumentationRegistry.getContext().getResources()); + when(mContext.getContentResolver()).thenReturn( + InstrumentationRegistry.getContext().getContentResolver()); when(mContext.getPackageManager()).thenReturn(mPm); when(mContext.getApplicationInfo()).thenReturn(legacy); // most tests assume badging is enabled @@ -1366,4 +1370,22 @@ public class RankingHelperTest extends NotificationTestCase { assertFalse(mHelper.badgingEnabled(USER)); assertTrue(mHelper.badgingEnabled(USER2)); } + + @Test + public void testOnLocaleChanged_updatesDefaultChannels() throws Exception { + String newLabel = "bananas!"; + final NotificationChannel defaultChannel = mHelper.getNotificationChannel(PKG, UID, + NotificationChannel.DEFAULT_CHANNEL_ID, false); + assertFalse(newLabel.equals(defaultChannel.getName())); + + Resources res = mock(Resources.class); + when(mContext.getResources()).thenReturn(res); + when(res.getString(com.android.internal.R.string.default_notification_channel_label)) + .thenReturn(newLabel); + + mHelper.onLocaleChanged(mContext, USER.getIdentifier()); + + assertEquals(newLabel, mHelper.getNotificationChannel(PKG, UID, + NotificationChannel.DEFAULT_CHANNEL_ID, false).getName()); + } } diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index 507b4830e455..19396d43e15e 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -29,7 +29,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl -LOCAL_SRC_FILES += aidl/com/android/servicestests/aidl/INetworkStateObserver.aidl +LOCAL_SRC_FILES += aidl/com/android/servicestests/aidl/INetworkStateObserver.aidl \ + aidl/com/android/servicestests/aidl/ICmdReceiverService.aidl LOCAL_JAVA_LIBRARIES := android.test.mock legacy-android-test @@ -61,3 +62,5 @@ LOCAL_DX_FLAGS := --multi-dex LOCAL_STATIC_JAVA_LIBRARIES += ub-uiautomator include $(BUILD_PACKAGE) + +include $(call all-makefiles-under, $(LOCAL_PATH))
\ No newline at end of file diff --git a/services/tests/servicestests/AndroidTest.xml b/services/tests/servicestests/AndroidTest.xml index 63f3b7560467..6a9983e87d90 100644 --- a/services/tests/servicestests/AndroidTest.xml +++ b/services/tests/servicestests/AndroidTest.xml @@ -16,6 +16,7 @@ <configuration description="Runs Frameworks Services Tests."> <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> <option name="test-file-name" value="FrameworksServicesTests.apk" /> + <option name="test-file-name" value="ConnTestApp.apk" /> </target_preparer> <option name="test-suite-tag" value="apct" /> diff --git a/services/tests/servicestests/aidl/Android.mk b/services/tests/servicestests/aidl/Android.mk index 0c9b83962833..166da1dea7e3 100644 --- a/services/tests/servicestests/aidl/Android.mk +++ b/services/tests/servicestests/aidl/Android.mk @@ -18,6 +18,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_SDK_VERSION := current LOCAL_SRC_FILES := \ - com/android/servicestests/aidl/INetworkStateObserver.aidl + com/android/servicestests/aidl/INetworkStateObserver.aidl \ + com/android/servicestests/aidl/ICmdReceiverService.aidl LOCAL_MODULE := servicestests-aidl include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file diff --git a/services/tests/servicestests/aidl/com/android/servicestests/aidl/ICmdReceiverService.aidl b/services/tests/servicestests/aidl/com/android/servicestests/aidl/ICmdReceiverService.aidl new file mode 100644 index 000000000000..d96450478f90 --- /dev/null +++ b/services/tests/servicestests/aidl/com/android/servicestests/aidl/ICmdReceiverService.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2017 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.servicestests.aidl; + +interface ICmdReceiverService { + void finishActivity(); +}
\ No newline at end of file diff --git a/services/tests/servicestests/res/raw/conntestapp b/services/tests/servicestests/res/raw/conntestapp Binary files differdeleted file mode 100644 index e99316446f7e..000000000000 --- a/services/tests/servicestests/res/raw/conntestapp +++ /dev/null diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java index 48464e5e0248..80e241c0581f 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java @@ -17,9 +17,9 @@ package com.android.server.am; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; import android.app.ActivityManager; import android.content.ComponentName; @@ -78,10 +78,10 @@ public class ActivityStackTests extends ActivityTestsBase { service.mStackSupervisor.inResumeTopActivity = true; testStack.mResumedActivity = activityRecord; - final boolean waiting = testStack.checkReadyForSleepLocked(); + final boolean waiting = testStack.goToSleepIfPossible(false); // Ensure we report not being ready for sleep. - assertTrue(waiting); + assertFalse(waiting); // Make sure the resumed activity is untouched. assertEquals(testStack.mResumedActivity, activityRecord); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 04b5bdebdca1..4ad92c7ec14e 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -218,6 +218,12 @@ public class ActivityTestsBase { return createTestStack(stackId, createOnTop); } + + // Always keep things awake + @Override + boolean hasAwakeDisplay() { + return true; + } } private static WindowManagerService prepareMockWindowManager() { diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java index 650681e2755b..db0ec0702b9f 100644 --- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java @@ -31,8 +31,6 @@ import com.android.server.backup.RefactoredBackupManagerService; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.Random; - @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) @@ -40,7 +38,10 @@ public class AppBackupUtilsTest { private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent"; private static final String TEST_PACKAGE_NAME = "test_package"; - private final Random mRandom = new Random(1000000009); + private static final Signature SIGNATURE_1 = generateSignature((byte) 1); + private static final Signature SIGNATURE_2 = generateSignature((byte) 2); + private static final Signature SIGNATURE_3 = generateSignature((byte) 3); + private static final Signature SIGNATURE_4 = generateSignature((byte) 4); @Test public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() throws Exception { @@ -220,7 +221,7 @@ public class AppBackupUtilsTest { @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], null); + boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null); assertThat(result).isFalse(); } @@ -237,61 +238,63 @@ public class AppBackupUtilsTest { } @Test - public void signaturesMatch_allowsUnsignedApps_bothSignaturesNull_returnsTrue() + public void signaturesMatch_disallowsUnsignedApps_storedSignatureNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = null; + packageInfo.signatures = new Signature[] {SIGNATURE_1}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); - assertThat(result).isTrue(); + assertThat(result).isFalse(); } @Test - public void signaturesMatch_allowsUnsignedApps_bothSignaturesEmpty_returnsTrue() + public void signaturesMatch_disallowsUnsignedApps_storedSignatureEmpty_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[0]; + packageInfo.signatures = new Signature[] {SIGNATURE_1}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); - assertThat(result).isTrue(); + assertThat(result).isFalse(); } + @Test public void - signaturesMatch_allowsUnsignedApps_storedSignatureNullTargetSignatureEmpty_returnsTrue() + signaturesMatch_disallowsUnsignedApps_targetSignatureEmpty_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); + boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); - assertThat(result).isTrue(); + assertThat(result).isFalse(); } @Test public void - signaturesMatch_allowsUnsignedApps_storedSignatureEmptyTargetSignatureNull_returnsTrue() + signaturesMatch_disallowsUnsignedApps_targetSignatureNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); + boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); - assertThat(result).isTrue(); + assertThat(result).isFalse(); } @Test - public void - signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_storedSignatureIsNull_returnsFalse() + public void signaturesMatch_disallowsUnsignedApps_bothSignaturesNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[]{generateRandomSignature()}; + packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); @@ -300,37 +303,25 @@ public class AppBackupUtilsTest { } @Test - public void - signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_targetSignatureIsNull_returnsFalse() + public void signaturesMatch_disallowsUnsignedApps_bothSignaturesEmpty_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = null; + packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[]{generateRandomSignature()}, - packageInfo); + boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isFalse(); } @Test - public void signaturesMatch_signaturesMatch_returnsTrue() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - - Signature signature1Copy = new Signature(signature1.toByteArray()); - Signature signature2Copy = new Signature(signature2.toByteArray()); - Signature signature3Copy = new Signature(signature3.toByteArray()); - assertThat(signature1Copy).isEqualTo(signature1); - assertThat(signature2Copy).isEqualTo(signature2); - assertThat(signature3Copy).isEqualTo(signature3); + public void signaturesMatch_equalSignatures_returnsTrue() throws Exception { + Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray()); + Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray()); + Signature signature3Copy = new Signature(SIGNATURE_3.toByteArray()); PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; + packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( @@ -341,20 +332,11 @@ public class AppBackupUtilsTest { @Test public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - - Signature signature1Copy = new Signature(signature1.toByteArray()); - Signature signature2Copy = new Signature(signature2.toByteArray()); - assertThat(signature1Copy).isEqualTo(signature1); - assertThat(signature2Copy).isEqualTo(signature2); + Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray()); + Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray()); PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; + packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( @@ -365,96 +347,37 @@ public class AppBackupUtilsTest { @Test public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - - Signature signature1Copy = new Signature(signature1.toByteArray()); - Signature signature2Copy = new Signature(signature2.toByteArray()); - assertThat(signature1Copy).isEqualTo(signature1); - assertThat(signature2Copy).isEqualTo(signature2); + Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray()); + Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray()); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1Copy, signature2Copy}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature1, signature2, signature3}, packageInfo); - - assertThat(result).isFalse(); - } - - @Test - public void signaturesMatch_emptyStoredSignatures_returnsTrue() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - - PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; - packageInfo.applicationInfo = new ApplicationInfo(); - - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); - - assertThat(result).isTrue(); - } - - @Test - public void signaturesMatch_emptyTargetSignatures_returnsFalse() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - - PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[0]; - packageInfo.applicationInfo = new ApplicationInfo(); - - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature1, signature2, signature3}, packageInfo); + new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception { - Signature signature1 = generateRandomSignature(); - Signature signature2 = generateRandomSignature(); - Signature signature3 = generateRandomSignature(); - Signature signature4 = generateRandomSignature(); - assertThat(signature1).isNotEqualTo(signature2); - assertThat(signature2).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature3); - assertThat(signature1).isNotEqualTo(signature4); - assertThat(signature2).isNotEqualTo(signature4); - assertThat(signature3).isNotEqualTo(signature4); - - Signature signature1Copy = new Signature(signature1.toByteArray()); - Signature signature2Copy = new Signature(signature2.toByteArray()); - assertThat(signature1Copy).isEqualTo(signature1); - assertThat(signature2Copy).isEqualTo(signature2); + Signature signature1Copy = new Signature(SIGNATURE_1.toByteArray()); + Signature signature2Copy = new Signature(SIGNATURE_2.toByteArray()); PackageInfo packageInfo = new PackageInfo(); - packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; + packageInfo.signatures = new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature1Copy, signature2Copy, signature4}, packageInfo); + new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo); assertThat(result).isFalse(); } - private Signature generateRandomSignature() { + private static Signature generateSignature(byte i) { byte[] signatureBytes = new byte[256]; - mRandom.nextBytes(signatureBytes); + signatureBytes[0] = i; return new Signature(signatureBytes); } } diff --git a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java index 5b4c10f11af8..7f48b8e1759a 100644 --- a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java +++ b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java @@ -16,48 +16,37 @@ package com.android.server.net; -import static android.util.DebugUtils.valueToString; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.android.frameworks.servicestests.R; +import com.android.servicestests.aidl.ICmdReceiverService; import com.android.servicestests.aidl.INetworkStateObserver; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; -import android.content.IntentSender; -import android.content.pm.IPackageDeleteObserver; -import android.content.pm.PackageInstaller; +import android.content.ServiceConnection; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.BatteryManager; import android.os.Bundle; -import android.os.RemoteException; +import android.os.IBinder; import android.os.SystemClock; +import android.provider.Settings; import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import android.util.Log; -import libcore.io.IoUtils; - import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -76,62 +65,118 @@ import java.util.concurrent.TimeUnit; * Run: adb shell am instrument -e class com.android.server.net.ConnOnActivityStartTest -w \ * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner */ -@Ignore @LargeTest @RunWith(AndroidJUnit4.class) public class ConnOnActivityStartTest { private static final String TAG = ConnOnActivityStartTest.class.getSimpleName(); - private static final String ACTION_INSTALL_COMPLETE = "com.android.server.net.INSTALL_COMPLETE"; - - private static final String TEST_APP_URI = - "android.resource://com.android.frameworks.servicestests/raw/conntestapp"; private static final String TEST_PKG = "com.android.servicestests.apps.conntestapp"; private static final String TEST_ACTIVITY_CLASS = TEST_PKG + ".ConnTestActivity"; - - private static final String ACTION_FINISH_ACTIVITY = TEST_PKG + ".FINISH"; + private static final String TEST_SERVICE_CLASS = TEST_PKG + ".CmdReceiverService"; private static final String EXTRA_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer"; private static final long BATTERY_OFF_TIMEOUT_MS = 2000; // 2 sec private static final long BATTERY_OFF_CHECK_INTERVAL_MS = 200; // 0.2 sec - private static final long WAIT_FOR_INSTALL_TIMEOUT_MS = 2000; // 2 sec - private static final long NETWORK_CHECK_TIMEOUT_MS = 4000; // 4 sec private static final long SCREEN_ON_DELAY_MS = 500; // 0.5 sec + private static final long BIND_SERVICE_TIMEOUT_SEC = 4; + private static final int REPEAT_TEST_COUNT = 5; + private static final String KEY_PAROLE_DURATION = "parole_duration"; + private static final String DESIRED_PAROLE_DURATION = "0"; + private static Context mContext; private static UiDevice mUiDevice; private static int mTestPkgUid; private static BatteryManager mBatteryManager; + private static boolean mAppIdleConstsUpdated; + private static String mOriginalAppIdleConsts; + + private static ServiceConnection mServiceConnection; + private static ICmdReceiverService mCmdReceiverService; + @BeforeClass public static void setUpOnce() throws Exception { mContext = InstrumentationRegistry.getContext(); mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); - installAppAndAssertInstalled(); + setDesiredParoleDuration(); mContext.getPackageManager().setApplicationEnabledSetting(TEST_PKG, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); mTestPkgUid = mContext.getPackageManager().getPackageUid(TEST_PKG, 0); mBatteryManager = (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE); + bindService(); } @AfterClass public static void tearDownOnce() { - mContext.getPackageManager().deletePackage(TEST_PKG, - new IPackageDeleteObserver.Stub() { - @Override - public void packageDeleted(String packageName, int returnCode) - throws RemoteException { - Log.e(TAG, packageName + " deleted, returnCode: " + returnCode); - } - }, 0); + if (mAppIdleConstsUpdated) { + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.APP_IDLE_CONSTANTS, mOriginalAppIdleConsts); + } + unbindService(); + } + + private static void bindService() throws Exception { + final CountDownLatch bindLatch = new CountDownLatch(1); + mServiceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + Log.i(TAG, "Service connected"); + mCmdReceiverService = ICmdReceiverService.Stub.asInterface(service); + bindLatch.countDown(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + Log.i(TAG, "Service disconnected"); + } + }; + final Intent intent = new Intent() + .setComponent(new ComponentName(TEST_PKG, TEST_SERVICE_CLASS)); + // Needs to use BIND_ALLOW_OOM_MANAGEMENT and BIND_NOT_FOREGROUND so that the test app + // does not run in the same process state as this app. + mContext.bindService(intent, mServiceConnection, + Context.BIND_AUTO_CREATE + | Context.BIND_ALLOW_OOM_MANAGEMENT + | Context.BIND_NOT_FOREGROUND); + if (!bindLatch.await(BIND_SERVICE_TIMEOUT_SEC, TimeUnit.SECONDS)) { + fail("Timed out waiting for the service to bind in " + mTestPkgUid); + } + } + + private static void unbindService() { + if (mCmdReceiverService != null) { + mContext.unbindService(mServiceConnection); + } + } + + private static void setDesiredParoleDuration() { + mOriginalAppIdleConsts = Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.APP_IDLE_CONSTANTS); + String newAppIdleConstants; + final String newConstant = KEY_PAROLE_DURATION + "=" + DESIRED_PAROLE_DURATION; + if (mOriginalAppIdleConsts == null || "null".equals(mOriginalAppIdleConsts)) { + // app_idle_constants is initially empty, so just assign the desired value. + newAppIdleConstants = newConstant; + } else if (mOriginalAppIdleConsts.contains(KEY_PAROLE_DURATION)) { + // app_idle_constants contains parole_duration, so replace it with the desired value. + newAppIdleConstants = mOriginalAppIdleConsts.replaceAll( + KEY_PAROLE_DURATION + "=\\d+", newConstant); + } else { + // app_idle_constants didn't have parole_duration, so append the desired value. + newAppIdleConstants = mOriginalAppIdleConsts + "," + newConstant; + } + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.APP_IDLE_CONSTANTS, newAppIdleConstants); + mAppIdleConstsUpdated = true; } @Test @@ -174,6 +219,7 @@ public class ConnOnActivityStartTest { startActivityAndCheckNetworkAccess(); } finally { turnBatteryOn(); + finishActivity(); setAppIdle(false); } } @@ -195,9 +241,9 @@ public class ConnOnActivityStartTest { turnScreenOn(); SystemClock.sleep(SCREEN_ON_DELAY_MS); startActivityAndCheckNetworkAccess(); - Log.d(TAG, testName + " end #" + i); } finally { finishActivity(); + Log.d(TAG, testName + " end #" + i); } } } @@ -348,74 +394,7 @@ public class ConnOnActivityStartTest { } } - private void finishActivity() { - final Intent finishIntent = new Intent(ACTION_FINISH_ACTIVITY) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - mContext.sendBroadcast(finishIntent); - } - private static void installAppAndAssertInstalled() throws Exception { - final CountDownLatch latch = new CountDownLatch(1); - final int[] result = {PackageInstaller.STATUS_SUCCESS}; - final BroadcastReceiver installStatusReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String pkgName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME); - if (!TEST_PKG.equals(pkgName)) { - return; - } - result[0] = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, - PackageInstaller.STATUS_FAILURE); - latch.countDown(); - } - }; - mContext.registerReceiver(installStatusReceiver, new IntentFilter(ACTION_INSTALL_COMPLETE)); - try { - installApp(); - if (latch.await(WAIT_FOR_INSTALL_TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - if (result[0] != PackageInstaller.STATUS_SUCCESS) { - fail("Couldn't install test app, result: " - + valueToString(PackageInstaller.class, "STATUS_", result[0])); - } - } else { - fail("Timed out waiting for the test app to install"); - } - } finally { - mContext.unregisterReceiver(installStatusReceiver); - } - } - - private static void installApp() throws Exception { - final Uri packageUri = Uri.parse(TEST_APP_URI); - final InputStream in = mContext.getContentResolver().openInputStream(packageUri); - - final PackageInstaller packageInstaller - = mContext.getPackageManager().getPackageInstaller(); - final PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( - PackageInstaller.SessionParams.MODE_FULL_INSTALL); - params.setAppPackageName(TEST_PKG); - - final int sessionId = packageInstaller.createSession(params); - final PackageInstaller.Session session = packageInstaller.openSession(sessionId); - - OutputStream out = null; - try { - out = session.openWrite(TAG, 0, -1); - final byte[] buffer = new byte[65536]; - int c; - while ((c = in.read(buffer)) != -1) { - out.write(buffer, 0, c); - } - session.fsync(out); - } finally { - IoUtils.closeQuietly(in); - IoUtils.closeQuietly(out); - } - session.commit(createIntentSender(mContext, sessionId)); - } - - private static IntentSender createIntentSender(Context context, int sessionId) { - PendingIntent pendingIntent = PendingIntent.getBroadcast( - context, sessionId, new Intent(ACTION_INSTALL_COMPLETE), 0); - return pendingIntent.getIntentSender(); + private void finishActivity() throws Exception { + mCmdReceiverService.finishActivity(); } }
\ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 0e8960e94c56..fa8feb048fd6 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -467,7 +467,8 @@ public class PackageParserTest { pkg.staticSharedLibVersion = 100; pkg.usesStaticLibraries = new ArrayList<>(); pkg.usesStaticLibraries.add("foo23"); - pkg.usesStaticLibrariesCertDigests = new String[] { "digest" }; + pkg.usesStaticLibrariesCertDigests = new String[1][]; + pkg.usesStaticLibrariesCertDigests[0] = new String[] { "digest" }; pkg.usesStaticLibrariesVersions = new int[] { 100 }; pkg.libraryNames = new ArrayList<>(); diff --git a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java index 0d29e8963728..9c010a07135d 100644 --- a/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/wallpaper/WallpaperServiceTests.java @@ -17,10 +17,14 @@ package com.android.server.wallpaper; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import android.app.WallpaperColors; +import android.os.Handler; +import android.os.Message; import android.os.SystemClock; import android.service.wallpaper.WallpaperService; +import android.support.test.annotation.UiThreadTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -28,18 +32,31 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.concurrent.CountDownLatch; +import java.util.function.Supplier; @SmallTest @RunWith(AndroidJUnit4.class) public class WallpaperServiceTests { + @UiThreadTest @Test public void testNotifyColorsChanged_rateLimit() throws Exception { + long[] clockOffset = {0}; + boolean[] postDelayed = {false}; + Supplier<Long> clockFunction = () -> SystemClock.elapsedRealtime() + clockOffset[0]; + Handler handler = new Handler() { + @Override + public boolean sendMessageAtTime(Message msg, long uptimeMillis) { + postDelayed[0] = true; + return super.sendMessageAtTime(msg, uptimeMillis); + } + }; + CountDownLatch eventCountdown = new CountDownLatch(2); WallpaperService service = new WallpaperService() { @Override public Engine onCreateEngine() { - return new WallpaperService.Engine() { + return new WallpaperService.Engine(clockFunction, handler) { @Override public WallpaperColors onComputeColors() { eventCountdown.countDown(); @@ -59,8 +76,11 @@ public class WallpaperServiceTests { engine.notifyColorsChanged(); assertEquals("OnComputeColors should have been throttled.", 1, eventCountdown.getCount()); - // Called after being deferred. - engine.setClockFunction(() -> SystemClock.elapsedRealtime() + 1500); + // Should have been posted to the handler. + assertTrue("Event should have been delayed", postDelayed[0]); + + // Called again after being deferred. + clockOffset[0] = 1500; engine.notifyColorsChanged(); assertEquals("OnComputeColors should have been deferred.", 0, eventCountdown.getCount()); diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java index b09601e698f9..9ad7addab858 100644 --- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java @@ -97,6 +97,24 @@ public class AppWindowTokenTests extends WindowTestsBase { } @Test + public void testGetTopFullscreenWindow() throws Exception { + final WindowTestUtils.TestAppWindowToken token = + new WindowTestUtils.TestAppWindowToken(mDisplayContent); + + assertNull(token.getTopFullscreenWindow()); + + final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, token, "window1"); + final WindowState window11 = createWindow(null, TYPE_APPLICATION, token, "window11"); + final WindowState window12 = createWindow(null, TYPE_APPLICATION, token, "window12"); + assertEquals(window12, token.getTopFullscreenWindow()); + window12.mAttrs.width = 500; + assertEquals(window11, token.getTopFullscreenWindow()); + window11.mAttrs.width = 500; + assertEquals(window1, token.getTopFullscreenWindow()); + token.removeImmediately(); + } + + @Test public void testLandscapeSeascapeRotationByApp() throws Exception { // Some plumbing to get the service ready for rotation updates. sWm.mDisplayReady = true; diff --git a/services/tests/servicestests/test-apps/Android.mk b/services/tests/servicestests/test-apps/Android.mk new file mode 100644 index 000000000000..5053e7d64389 --- /dev/null +++ b/services/tests/servicestests/test-apps/Android.mk @@ -0,0 +1 @@ +include $(call all-subdir-makefiles) diff --git a/services/tests/servicestests/test-apps/ConnTestApp/Android.mk b/services/tests/servicestests/test-apps/ConnTestApp/Android.mk index 030a709b0215..fbfa28a9e93b 100644 --- a/services/tests/servicestests/test-apps/ConnTestApp/Android.mk +++ b/services/tests/servicestests/test-apps/ConnTestApp/Android.mk @@ -18,6 +18,8 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests +LOCAL_COMPATIBILITY_SUITE := device-tests + LOCAL_STATIC_JAVA_LIBRARIES := servicestests-aidl LOCAL_SRC_FILES := $(call all-subdir-java-files) diff --git a/services/tests/servicestests/test-apps/ConnTestApp/AndroidManifest.xml b/services/tests/servicestests/test-apps/ConnTestApp/AndroidManifest.xml index 66714109a761..909e9bb7bcd9 100644 --- a/services/tests/servicestests/test-apps/ConnTestApp/AndroidManifest.xml +++ b/services/tests/servicestests/test-apps/ConnTestApp/AndroidManifest.xml @@ -24,6 +24,8 @@ <application> <activity android:name=".ConnTestActivity" android:exported="true" /> + <service android:name=".CmdReceiverService" + android:exported="true" /> </application> </manifest>
\ No newline at end of file diff --git a/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/CmdReceiverService.java b/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/CmdReceiverService.java new file mode 100644 index 000000000000..6130f3a3fc76 --- /dev/null +++ b/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/CmdReceiverService.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2017 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.servicestests.apps.conntestapp; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import com.android.servicestests.aidl.ICmdReceiverService; + +public class CmdReceiverService extends Service { + private ICmdReceiverService.Stub mBinder = new ICmdReceiverService.Stub() { + @Override + public void finishActivity() { + ConnTestActivity.finishSelf(); + } + }; + + @Override + public IBinder onBind(Intent intent) { + return mBinder; + } +}
\ No newline at end of file diff --git a/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/ConnTestActivity.java b/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/ConnTestActivity.java index c5c7add29f93..b26cc7fd0130 100644 --- a/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/ConnTestActivity.java +++ b/services/tests/servicestests/test-apps/ConnTestApp/src/com/android/servicestests/apps/conntestapp/ConnTestActivity.java @@ -30,6 +30,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.servicestests.aidl.INetworkStateObserver; public class ConnTestActivity extends Activity { @@ -39,17 +40,26 @@ public class ConnTestActivity extends Activity { private static final String ACTION_FINISH_ACTIVITY = TEST_PKG + ".FINISH"; private static final String EXTRA_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer"; + private static final Object INSTANCE_LOCK = new Object(); + @GuardedBy("instanceLock") + private static Activity sInstance; + private BroadcastReceiver finishCommandReceiver = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + synchronized (INSTANCE_LOCK) { + sInstance = this; + } + Log.i(TAG, "onCreate called"); notifyNetworkStateObserver(); finishCommandReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + Log.i(TAG, "finish command received"); ConnTestActivity.this.finish(); } }; @@ -57,13 +67,37 @@ public class ConnTestActivity extends Activity { } @Override + public void onResume() { + super.onResume(); + Log.i(TAG, "onResume called"); + } + + @Override public void onStop() { + Log.i(TAG, "onStop called"); if (finishCommandReceiver != null) { unregisterReceiver(finishCommandReceiver); } super.onStop(); } + @Override + public void finish() { + synchronized (INSTANCE_LOCK) { + sInstance = null; + } + Log.i(TAG, "finish called"); + super.finish(); + } + + public static void finishSelf() { + synchronized (INSTANCE_LOCK) { + if (sInstance != null) { + sInstance.finish(); + } + } + } + private void notifyNetworkStateObserver() { if (getIntent() == null) { return; diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index c1289d3f1401..e13bd6193719 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -1089,12 +1089,17 @@ public final class Call { * @return A string containing text sent by the remote user, or {@code null} if the * conversation has been terminated or if there was an error while reading. */ - public String read() throws IOException { - int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE); - if (numRead < 0) { + public String read() { + try { + int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE); + if (numRead < 0) { + return null; + } + return new String(mReadBuffer, 0, numRead); + } catch (IOException e) { + Log.w(this, "Exception encountered when reading from InputStreamReader: %s", e); return null; } - return new String(mReadBuffer, 0, numRead); } /** @@ -1105,7 +1110,11 @@ public final class Call { */ public String readImmediately() throws IOException { if (mReceiveStream.ready()) { - return read(); + int numRead = mReceiveStream.read(mReadBuffer, 0, READ_BUFFER_SIZE); + if (numRead < 0) { + return null; + } + return new String(mReadBuffer, 0, numRead); } else { return null; } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 23db6ace2f73..735f09b57efb 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -567,20 +567,27 @@ public class CarrierConfigManager { "carrier_data_call_retry_config_strings"; /** - * Delay between trying APN from the pool + * Delay in milliseconds between trying APN from the pool * @hide */ public static final String KEY_CARRIER_DATA_CALL_APN_DELAY_DEFAULT_LONG = "carrier_data_call_apn_delay_default_long"; /** - * Faster delay between trying APN from the pool + * Faster delay in milliseconds between trying APN from the pool * @hide */ public static final String KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG = "carrier_data_call_apn_delay_faster_long"; /** + * Delay in milliseconds for retrying APN after disconnect + * @hide + */ + public static final String KEY_CARRIER_DATA_CALL_APN_RETRY_AFTER_DISCONNECT_LONG = + "carrier_data_call_apn_retry_after_disconnect_long"; + + /** * Data call setup permanent failure causes by the carrier */ public static final String KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS = @@ -768,7 +775,6 @@ public class CarrierConfigManager { * Determines whether High Definition audio property is displayed in the dialer UI. * If {@code false}, remove the HD audio property from the connection so that HD audio related * UI is not displayed. If {@code true}, keep HD audio property as it is configured. - * @hide */ public static final String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = "display_hd_audio_property_bool"; @@ -1167,8 +1173,6 @@ public class CarrierConfigManager { /** @hide */ public static final int CDMA_ROAMING_MODE_AFFILIATED = 1; /** @hide */ - public static final int IMSI_ENCRYPTION_DAYS_TIME_DISABLED = -1; - /** @hide */ public static final int CDMA_ROAMING_MODE_ANY = 2; /** * Boolean indicating if support is provided for directly dialing FDN number from FDN list. @@ -1363,6 +1367,16 @@ public class CarrierConfigManager { "network_notification_delay_int"; /** + * Time delay (in ms) after which we show the notification for emergency calls, + * while the device is registered over WFC. Default value is -1, which indicates + * that this notification is not pertinent for a particular carrier. We've added a delay + * to prevent false positives. + * @hide + */ + public static final String KEY_EMERGENCY_NOTIFICATION_DELAY_INT = + "emergency_notification_delay_int"; + + /** * When {@code true}, the carrier allows the user of the * {@link TelephonyManager#sendUssdRequest(String, TelephonyManager.UssdResponseCallback, * Handler)} API to perform USSD requests. {@code True} by default. @@ -1517,14 +1531,15 @@ public class CarrierConfigManager { public static final String IMSI_KEY_DOWNLOAD_URL_STRING = "imsi_key_download_url_string"; /** - * Time in days, after which the key will expire, and a new key will need to be downloaded. - * default value is {@link IMSI_ENCRYPTION_DAYS_TIME_DISABLED}, and indicates that IMSI - * encryption is not enabled by default for a carrier. Value of 0 indicates that the key - * does not expire. + * Identifies if the key is available for WLAN or EPDG or both. The value is a bitmask. + * 0 indicates that neither EPDG or WLAN is enabled. + * 1 indicates that key type {@link TelephonyManager#KEY_TYPE_EPDG} is enabled. + * 2 indicates that key type {@link TelephonyManager#KEY_TYPE_WLAN} is enabled. + * 3 indicates that both are enabled. * @hide */ - public static final String IMSI_KEY_EXPIRATION_DAYS_TIME_INT = - "imsi_key_expiration_days_time_int"; + public static final String IMSI_KEY_AVAILABILITY_INT = "imsi_key_availability_int"; + /** * Key identifying if the CDMA Caller ID presentation and suppression MMI codes @@ -1636,6 +1651,7 @@ public class CarrierConfigManager { "others:max_retries=3, 5000, 5000, 5000"}); sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_DEFAULT_LONG, 20000); sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG, 3000); + sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_RETRY_AFTER_DISCONNECT_LONG, 10000); sDefaults.putString(KEY_CARRIER_ERI_FILE_NAME_STRING, "eri.xml"); sDefaults.putInt(KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT, 7200); sDefaults.putStringArray(KEY_CARRIER_METERED_APN_TYPES_STRINGS, @@ -1788,6 +1804,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_PERSIST_LPP_MODE_BOOL, false); sDefaults.putStringArray(KEY_CARRIER_WIFI_STRING_ARRAY, null); sDefaults.putInt(KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT, -1); + sDefaults.putInt(KEY_EMERGENCY_NOTIFICATION_DELAY_INT, -1); sDefaults.putBoolean(KEY_ALLOW_USSD_REQUESTS_VIA_TELEPHONY_MANAGER_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL, true); sDefaults.putBoolean(KEY_NOTIFY_INTERNATIONAL_CALL_ON_WFC_BOOL, false); @@ -1796,7 +1813,7 @@ public class CarrierConfigManager { sDefaults.putInt(KEY_LTE_EARFCNS_RSRP_BOOST_INT, 0); sDefaults.putStringArray(KEY_BOOSTED_LTE_EARFCNS_STRING_ARRAY, null); sDefaults.putBoolean(KEY_DISABLE_VOICE_BARRING_NOTIFICATION_BOOL, false); - sDefaults.putInt(IMSI_KEY_EXPIRATION_DAYS_TIME_INT, IMSI_ENCRYPTION_DAYS_TIME_DISABLED); + sDefaults.putInt(IMSI_KEY_AVAILABILITY_INT, 0); sDefaults.putString(IMSI_KEY_DOWNLOAD_URL_STRING, null); sDefaults.putBoolean(KEY_CONVERT_CDMA_CALLER_ID_MMI_CODES_WHILE_ROAMING_ON_3GPP_BOOL, false); diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index 9513517947f4..3f0acde43d30 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -258,6 +258,16 @@ public class DisconnectCause { */ public static final int IMS_ACCESS_BLOCKED = 60; + /** + * The call has ended (mid-call) because the device's battery is too low. + */ + public static final int LOW_BATTERY = 61; + + /** + * A call was not dialed because the device's battery is too low. + */ + public static final int DIAL_LOW_BATTERY = 62; + //********************************************************************************************* // When adding a disconnect type: // 1) Update toString() with the newly added disconnect type. @@ -392,6 +402,10 @@ public class DisconnectCause { return "WIFI_LOST"; case IMS_ACCESS_BLOCKED: return "IMS_ACCESS_BLOCKED"; + case LOW_BATTERY: + return "LOW_BATTERY"; + case DIAL_LOW_BATTERY: + return "DIAL_LOW_BATTERY"; default: return "INVALID: " + cause; } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 5fb83ab42866..e448fb2a532e 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -795,34 +795,57 @@ public class ServiceState implements Parcelable { return rtString; } + /** + * Convert RIL Service State to String + * + * @param serviceState + * @return String representation of the ServiceState + * + * @hide + */ + public static String rilServiceStateToString(int serviceState) { + switch(serviceState) { + case STATE_IN_SERVICE: + return "IN_SERVICE"; + case STATE_OUT_OF_SERVICE: + return "OUT_OF_SERVICE"; + case STATE_EMERGENCY_ONLY: + return "EMERGENCY_ONLY"; + case STATE_POWER_OFF: + return "POWER_OFF"; + default: + return "UNKNOWN"; + } + } + @Override public String toString() { - String radioTechnology = rilRadioTechnologyToString(mRilVoiceRadioTechnology); - String dataRadioTechnology = rilRadioTechnologyToString(mRilDataRadioTechnology); - - return (mVoiceRegState + " " + mDataRegState - + " " - + "voice " + getRoamingLogString(mVoiceRoamingType) - + " " - + "data " + getRoamingLogString(mDataRoamingType) - + " " + mVoiceOperatorAlphaLong - + " " + mVoiceOperatorAlphaShort - + " " + mVoiceOperatorNumeric - + " " + mDataOperatorAlphaLong - + " " + mDataOperatorAlphaShort - + " " + mDataOperatorNumeric - + " " + (mIsManualNetworkSelection ? "(manual)" : "") - + " " + radioTechnology - + " " + dataRadioTechnology - + " " + (mCssIndicator ? "CSS supported" : "CSS not supported") - + " " + mNetworkId - + " " + mSystemId - + " RoamInd=" + mCdmaRoamingIndicator - + " DefRoamInd=" + mCdmaDefaultRoamingIndicator - + " EmergOnly=" + mIsEmergencyOnly - + " IsDataRoamingFromRegistration=" + mIsDataRoamingFromRegistration - + " IsUsingCarrierAggregation=" + mIsUsingCarrierAggregation - + " mLteEarfcnRsrpBoost=" + mLteEarfcnRsrpBoost); + return new StringBuilder().append("{mVoiceRegState=").append(mVoiceRegState) + .append("(" + rilServiceStateToString(mVoiceRegState) + ")") + .append(", mDataRegState=").append(mDataRegState) + .append("(" + rilServiceStateToString(mDataRegState) + ")") + .append(", mVoiceRoamingType=").append(getRoamingLogString(mVoiceRoamingType)) + .append(", mDataRoamingType=").append(getRoamingLogString(mDataRoamingType)) + .append(", mVoiceOperatorAlphaLong=").append(mVoiceOperatorAlphaLong) + .append(", mVoiceOperatorAlphaShort=").append(mVoiceOperatorAlphaShort) + .append(", mDataOperatorAlphaLong=").append(mDataOperatorAlphaLong) + .append(", mDataOperatorAlphaShort=").append(mDataOperatorAlphaShort) + .append(", isManualNetworkSelection=").append(mIsManualNetworkSelection) + .append(mIsManualNetworkSelection ? "(manual)" : "(automatic)") + .append(", mRilVoiceRadioTechnology=").append(mRilVoiceRadioTechnology) + .append("(" + rilRadioTechnologyToString(mRilVoiceRadioTechnology) + ")") + .append(", mRilDataRadioTechnology=").append(mRilDataRadioTechnology) + .append("(" + rilRadioTechnologyToString(mRilDataRadioTechnology) + ")") + .append(", mCssIndicator=").append(mCssIndicator ? "supported" : "unsupported") + .append(", mNetworkId=").append(mNetworkId) + .append(", mSystemId=").append(mSystemId) + .append(", mCdmaRoamingIndicator=").append(mCdmaRoamingIndicator) + .append(", mCdmaDefaultRoamingIndicator=").append(mCdmaDefaultRoamingIndicator) + .append(", mIsEmergencyOnly=").append(mIsEmergencyOnly) + .append(", mIsDataRoamingFromRegistration=").append(mIsDataRoamingFromRegistration) + .append(", mIsUsingCarrierAggregation=").append(mIsUsingCarrierAggregation) + .append(", mLteEarfcnRsrpBoost=").append(mLteEarfcnRsrpBoost) + .append("}").toString(); } private void setNullState(int state) { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 6a9d00e66d02..2c02869ed763 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -137,7 +137,7 @@ public class TelephonyManager { /** @hide */ - static public final int KEY_TYPE_EPDDG = 1; + static public final int KEY_TYPE_EPDG = 1; /** @hide */ static public final int KEY_TYPE_WLAN = 2; @@ -2373,31 +2373,73 @@ public class TelephonyManager { * Requires Permission: * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} * @param keyType whether the key is being used for wlan or epdg. Valid key types are - * {@link TelephonyManager#KEY_TYPE_EPDDG} or + * {@link TelephonyManager#KEY_TYPE_EPDG} or * {@link TelephonyManager#KEY_TYPE_WLAN}. * @return ImsiEncryptionInfo Carrier specific information that will be used to encrypt the * IMSI and IMPI. This includes the public key and the key identifier. This information - * will be stored in the device keystore. + * will be stored in the device keystore. The system will return a null when no key was + * found, and the carrier does not require a key. The system will throw the following + * exceptions: + * 1. IllegalArgumentException when an invalid key is sent. + * 2. RuntimeException if the key is required but not found; and also if there was an + * internal exception. * @hide */ public ImsiEncryptionInfo getCarrierInfoForImsiEncryption(int keyType) { try { IPhoneSubInfo info = getSubscriberInfo(); - if (info == null) return null; + if (info == null) { + throw new RuntimeException("IMSI error: Subscriber Info is null"); + } int subId = getSubId(SubscriptionManager.getDefaultDataSubscriptionId()); - if (keyType != KEY_TYPE_EPDDG && keyType != KEY_TYPE_WLAN) { - throw new IllegalArgumentException("Invalid key type"); + if (keyType != KEY_TYPE_EPDG && keyType != KEY_TYPE_WLAN) { + throw new IllegalArgumentException("IMSI error: Invalid key type"); + } + ImsiEncryptionInfo imsiEncryptionInfo = info.getCarrierInfoForImsiEncryption( + subId, keyType, mContext.getOpPackageName()); + if (imsiEncryptionInfo == null + && isImsiEncryptionRequired(subId, keyType)) { + Rlog.e(TAG, "IMSI error: key is required but not found"); + throw new RuntimeException("IMSI error: key is required but not found"); } - return info.getCarrierInfoForImsiEncryption(subId, keyType, - mContext.getOpPackageName()); + return imsiEncryptionInfo; } catch (RemoteException ex) { - Rlog.e(TAG, "getCarrierInfoForImsiEncryption RemoteException", ex); - return null; + Rlog.e(TAG, "getCarrierInfoForImsiEncryption RemoteException" + ex); + throw new RuntimeException("IMSI error: Remote Exception"); } catch (NullPointerException ex) { // This could happen before phone restarts due to crashing - Rlog.e(TAG, "getCarrierInfoForImsiEncryption NullPointerException", ex); - return null; + Rlog.e(TAG, "getCarrierInfoForImsiEncryption NullPointerException" + ex); + throw new RuntimeException("IMSI error: Null Pointer exception"); + } + } + + /** + * @param keyAvailability bitmask that defines the availabilty of keys for a type. + * @param keyType the key type which is being checked. (WLAN, EPDG) + * @return true if the digit at position keyType is 1, else false. + * @hide + */ + private static boolean isKeyEnabled(int keyAvailability, int keyType) { + int returnValue = (keyAvailability >> (keyType - 1)) & 1; + return (returnValue == 1) ? true : false; + } + + /** + * If Carrier requires Imsi to be encrypted. + * @hide + */ + private boolean isImsiEncryptionRequired(int subId, int keyType) { + CarrierConfigManager configManager = + (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); + if (configManager == null) { + return false; + } + PersistableBundle pb = configManager.getConfigForSubId(subId); + if (pb == null) { + return false; } + int keyAvailability = pb.getInt(CarrierConfigManager.IMSI_KEY_AVAILABILITY_INT); + return isKeyEnabled(keyAvailability, keyType); } /** @@ -6695,11 +6737,13 @@ public class TelephonyManager { * Get aggregated video call data usage since boot. * Permissions android.Manifest.permission.READ_NETWORK_USAGE_HISTORY is required. * - * @param perUidStats True if requesting data usage per uid, otherwise overall usage. + * @param how one of the NetworkStats.STATS_PER_* constants depending on whether the request is + * for data usage per uid or overall usage. * @return Snapshot of video call data usage * @hide */ - public NetworkStats getVtDataUsage(boolean perUidStats) { + public NetworkStats getVtDataUsage(int how) { + boolean perUidStats = (how == NetworkStats.STATS_PER_UID); try { ITelephony service = getITelephony(); if (service != null) { diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index 8304d84d8a2b..a13af5f4b90b 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -154,6 +154,14 @@ public class EuiccManager { "android.telephony.euicc.extra.EMBEDDED_SUBSCRIPTION_RESOLUTION_CALLBACK_INTENT"; /** + * Key for an extra set on the {@link #ACTION_PROVISION_EMBEDDED_SUBSCRIPTION} intent for + * whether the user choses to use eUICC to set up network in SUW. + * @hide + */ + public static final String EXTRA_FORCE_PROVISION = + "android.telephony.euicc.extra.FORCE_PROVISION"; + + /** * Optional meta-data attribute for a carrier app providing an icon to use to represent the * carrier. If not provided, the app's launcher icon will be used as a fallback. */ diff --git a/tests/Internal/src/android/app/WallpaperColorsTest.java b/tests/Internal/src/android/app/WallpaperColorsTest.java index fb529b936e5c..881f6284413f 100644 --- a/tests/Internal/src/android/app/WallpaperColorsTest.java +++ b/tests/Internal/src/android/app/WallpaperColorsTest.java @@ -36,12 +36,12 @@ public class WallpaperColorsTest { final Color color = Color.valueOf(Color.WHITE); // Default should not support dark text! WallpaperColors colors = new WallpaperColors(color, null, null, 0); - Assert.assertTrue("Default behavior is not to support dark text", + Assert.assertTrue("Default behavior is not to support dark text.", (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0); // Override it colors = new WallpaperColors(color, null, null, WallpaperColors.HINT_SUPPORTS_DARK_TEXT); - Assert.assertFalse("Forcing dark text support doesn't work", + Assert.assertFalse("Forcing dark text support doesn't work.", (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) == 0); } @@ -57,15 +57,18 @@ public class WallpaperColorsTest { int hints = WallpaperColors.fromBitmap(image).getColorHints(); boolean supportsDarkText = (hints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; boolean supportsDarkTheme = (hints & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0; - Assert.assertTrue("White surface should support dark text", supportsDarkText); - Assert.assertFalse("White surface shouldn't support dark theme", supportsDarkTheme); + boolean fromBitmap = (hints & WallpaperColors.HINT_FROM_BITMAP) != 0; + Assert.assertTrue("White surface should support dark text.", supportsDarkText); + Assert.assertFalse("White surface shouldn't support dark theme.", supportsDarkTheme); + Assert.assertTrue("From bitmap should be true if object was created " + + "using WallpaperColors#fromBitmap.", fromBitmap); canvas.drawColor(Color.BLACK); hints = WallpaperColors.fromBitmap(image).getColorHints(); supportsDarkText = (hints & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; supportsDarkTheme = (hints & WallpaperColors.HINT_SUPPORTS_DARK_THEME) != 0; - Assert.assertFalse("Black surface shouldn't support dark text", supportsDarkText); - Assert.assertTrue("Black surface should support dark theme", supportsDarkTheme); + Assert.assertFalse("Black surface shouldn't support dark text.", supportsDarkText); + Assert.assertTrue("Black surface should support dark theme.", supportsDarkTheme); Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); @@ -75,7 +78,12 @@ public class WallpaperColorsTest { supportsDarkText = (WallpaperColors.fromBitmap(image) .getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0; Assert.assertFalse("Light surface shouldn't support dark text " - + "when it contains dark pixels", supportsDarkText); + + "when it contains dark pixels.", supportsDarkText); + + WallpaperColors colors = new WallpaperColors(Color.valueOf(Color.GREEN), null, null); + fromBitmap = (colors.getColorHints() & WallpaperColors.HINT_FROM_BITMAP) != 0; + Assert.assertFalse("Object created from public constructor should not contain " + + "HINT_FROM_BITMAP.", fromBitmap); } /** diff --git a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java index 6dc9ba7b621f..d46fff4db65a 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/types/TonalTest.java @@ -99,20 +99,39 @@ public class TonalTest { } @Test - public void tonal_excludeBlacklistedColor() { + public void tonal_blacklistTest() { // Make sure that palette generation will fail. - Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); + final Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); // Creating a WallpaperColors object that contains *only* blacklisted colors. - float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); - WallpaperColors colors = new WallpaperColors(Color.valueOf(ColorUtils.HSLToColor(hsl)), - null, null, 0); + final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); + final int blacklistedColor = ColorUtils.HSLToColor(hsl); + WallpaperColors colorsFromBitmap = new WallpaperColors(Color.valueOf(blacklistedColor), + null, null, WallpaperColors.HINT_FROM_BITMAP); // Make sure that palette generation will fail - GradientColors normal = new GradientColors(); - tonal.extractInto(colors, normal, new GradientColors(), + final GradientColors normal = new GradientColors(); + tonal.extractInto(colorsFromBitmap, normal, new GradientColors(), new GradientColors()); assertTrue("Cannot generate a tonal palette from blacklisted colors.", normal.getMainColor() == Tonal.MAIN_COLOR_DARK); } + + @Test + public void tonal_ignoreBlacklistTest() { + final Tonal tonal = new Tonal(InstrumentationRegistry.getContext()); + + // Creating a WallpaperColors object that contains *only* blacklisted colors. + final float[] hsl = tonal.getBlacklistedColors().get(0).getCenter(); + final int blacklistedColor = ColorUtils.HSLToColor(hsl); + WallpaperColors colors = new WallpaperColors(Color.valueOf(blacklistedColor), + null, null); + + // Blacklist should be ignored when HINT_FROM_BITMAP isn't present. + final GradientColors normal = new GradientColors(); + tonal.extractInto(colors, normal, new GradientColors(), + new GradientColors()); + assertTrue("Blacklist should never be used on WallpaperColors generated using " + + "default constructor.", normal.getMainColor() == blacklistedColor); + } } diff --git a/core/tests/coretests/src/android/net/IpPrefixTest.java b/tests/net/java/android/net/IpPrefixTest.java index 4f2387dcf5c1..b5b2c07cbc4e 100644 --- a/core/tests/coretests/src/android/net/IpPrefixTest.java +++ b/tests/net/java/android/net/IpPrefixTest.java @@ -16,18 +16,27 @@ package android.net; -import android.net.IpPrefix; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import android.os.Parcel; -import android.test.suitebuilder.annotation.SmallTest; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + import java.net.InetAddress; import java.util.Random; -import junit.framework.TestCase; -import static android.test.MoreAsserts.assertNotEqual; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; +import org.junit.runner.RunWith; +import org.junit.Test; -public class IpPrefixTest extends TestCase { +@RunWith(AndroidJUnit4.class) +@SmallTest +public class IpPrefixTest { private static InetAddress Address(String addr) { return InetAddress.parseNumericAddress(addr); @@ -42,7 +51,7 @@ public class IpPrefixTest extends TestCase { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xa0 }; - @SmallTest + @Test public void testConstructor() { IpPrefix p; try { @@ -103,6 +112,7 @@ public class IpPrefixTest extends TestCase { } catch(IllegalArgumentException expected) {} } + @Test public void testTruncation() { IpPrefix p; @@ -170,7 +180,7 @@ public class IpPrefixTest extends TestCase { assertFalse(o2.equals(o1)); } - @SmallTest + @Test public void testEquals() { IpPrefix p1, p2; @@ -212,7 +222,7 @@ public class IpPrefixTest extends TestCase { assertAreNotEqual(p1, p2); } - @SmallTest + @Test public void testContains() { IpPrefix p = new IpPrefix("2001:db8:f00::ace:d00d/127"); assertTrue(p.contains(Address("2001:db8:f00::ace:d00c"))); @@ -240,7 +250,7 @@ public class IpPrefixTest extends TestCase { assertFalse(ipv4Default.contains(Address("2001:db8::f00"))); } - @SmallTest + @Test public void testHashCode() { IpPrefix p = new IpPrefix(new byte[4], 0); Random random = new Random(); @@ -261,12 +271,12 @@ public class IpPrefixTest extends TestCase { assertEquals(p.hashCode(), oldP.hashCode()); } if (p.hashCode() != oldP.hashCode()) { - assertNotEqual(p, oldP); + assertNotEquals(p, oldP); } } } - @SmallTest + @Test public void testHashCodeIsNotConstant() { IpPrefix[] prefixes = { new IpPrefix("2001:db8:f00::ace:d00d/127"), @@ -276,12 +286,12 @@ public class IpPrefixTest extends TestCase { }; for (int i = 0; i < prefixes.length; i++) { for (int j = i + 1; j < prefixes.length; j++) { - assertNotEqual(prefixes[i].hashCode(), prefixes[j].hashCode()); + assertNotEquals(prefixes[i].hashCode(), prefixes[j].hashCode()); } } } - @SmallTest + @Test public void testMappedAddressesAreBroken() { // 192.0.2.0/24 != ::ffff:c000:0204/120, but because we use InetAddress, // we are unable to comprehend that. @@ -318,13 +328,16 @@ public class IpPrefixTest extends TestCase { assertEquals(p, p2); } + @Test public void testParceling() { IpPrefix p; p = new IpPrefix("2001:4860:db8::/64"); assertParcelingIsLossless(p); + assertTrue(p.isIPv6()); p = new IpPrefix("192.0.2.0/25"); assertParcelingIsLossless(p); + assertTrue(p.isIPv4()); } } diff --git a/core/tests/coretests/src/android/net/LinkAddressTest.java b/tests/net/java/android/net/LinkAddressTest.java index adf8d95c0b66..c1ad94669508 100644 --- a/core/tests/coretests/src/android/net/LinkAddressTest.java +++ b/tests/net/java/android/net/LinkAddressTest.java @@ -16,6 +16,23 @@ package android.net; +import static android.system.OsConstants.IFA_F_DADFAILED; +import static android.system.OsConstants.IFA_F_DEPRECATED; +import static android.system.OsConstants.IFA_F_OPTIMISTIC; +import static android.system.OsConstants.IFA_F_PERMANENT; +import static android.system.OsConstants.IFA_F_TEMPORARY; +import static android.system.OsConstants.IFA_F_TENTATIVE; +import static android.system.OsConstants.RT_SCOPE_HOST; +import static android.system.OsConstants.RT_SCOPE_LINK; +import static android.system.OsConstants.RT_SCOPE_SITE; +import static android.system.OsConstants.RT_SCOPE_UNIVERSE; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -27,44 +44,35 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import android.net.LinkAddress; import android.os.Parcel; -import android.test.AndroidTestCase; -import static android.test.MoreAsserts.assertNotEqual; -import android.test.suitebuilder.annotation.SmallTest; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; -import static android.system.OsConstants.IFA_F_DADFAILED; -import static android.system.OsConstants.IFA_F_DEPRECATED; -import static android.system.OsConstants.IFA_F_OPTIMISTIC; -import static android.system.OsConstants.IFA_F_PERMANENT; -import static android.system.OsConstants.IFA_F_TEMPORARY; -import static android.system.OsConstants.IFA_F_TENTATIVE; -import static android.system.OsConstants.RT_SCOPE_HOST; -import static android.system.OsConstants.RT_SCOPE_LINK; -import static android.system.OsConstants.RT_SCOPE_SITE; -import static android.system.OsConstants.RT_SCOPE_UNIVERSE; +import org.junit.runner.RunWith; +import org.junit.Test; -/** - * Tests for {@link LinkAddress}. - */ -public class LinkAddressTest extends AndroidTestCase { +@RunWith(AndroidJUnit4.class) +@SmallTest +public class LinkAddressTest { private static final String V4 = "192.0.2.1"; private static final String V6 = "2001:db8::1"; private static final InetAddress V4_ADDRESS = NetworkUtils.numericToInetAddress(V4); private static final InetAddress V6_ADDRESS = NetworkUtils.numericToInetAddress(V6); + @Test public void testConstants() { // RT_SCOPE_UNIVERSE = 0, but all the other constants should be nonzero. - assertNotEqual(0, RT_SCOPE_HOST); - assertNotEqual(0, RT_SCOPE_LINK); - assertNotEqual(0, RT_SCOPE_SITE); + assertNotEquals(0, RT_SCOPE_HOST); + assertNotEquals(0, RT_SCOPE_LINK); + assertNotEquals(0, RT_SCOPE_SITE); - assertNotEqual(0, IFA_F_DEPRECATED); - assertNotEqual(0, IFA_F_PERMANENT); - assertNotEqual(0, IFA_F_TENTATIVE); + assertNotEquals(0, IFA_F_DEPRECATED); + assertNotEquals(0, IFA_F_PERMANENT); + assertNotEquals(0, IFA_F_TENTATIVE); } + @Test public void testConstructors() throws SocketException { LinkAddress address; @@ -74,12 +82,14 @@ public class LinkAddressTest extends AndroidTestCase { assertEquals(25, address.getPrefixLength()); assertEquals(0, address.getFlags()); assertEquals(RT_SCOPE_UNIVERSE, address.getScope()); + assertTrue(address.isIPv4()); address = new LinkAddress(V6_ADDRESS, 127); assertEquals(V6_ADDRESS, address.getAddress()); assertEquals(127, address.getPrefixLength()); assertEquals(0, address.getFlags()); assertEquals(RT_SCOPE_UNIVERSE, address.getScope()); + assertTrue(address.isIPv6()); // Nonsensical flags/scopes or combinations thereof are acceptable. address = new LinkAddress(V6 + "/64", IFA_F_DEPRECATED | IFA_F_PERMANENT, RT_SCOPE_LINK); @@ -87,12 +97,14 @@ public class LinkAddressTest extends AndroidTestCase { assertEquals(64, address.getPrefixLength()); assertEquals(IFA_F_DEPRECATED | IFA_F_PERMANENT, address.getFlags()); assertEquals(RT_SCOPE_LINK, address.getScope()); + assertTrue(address.isIPv6()); address = new LinkAddress(V4 + "/23", 123, 456); assertEquals(V4_ADDRESS, address.getAddress()); assertEquals(23, address.getPrefixLength()); assertEquals(123, address.getFlags()); assertEquals(456, address.getScope()); + assertTrue(address.isIPv4()); // InterfaceAddress doesn't have a constructor. Fetch some from an interface. List<InterfaceAddress> addrs = NetworkInterface.getByName("lo").getInterfaceAddresses(); @@ -174,6 +186,7 @@ public class LinkAddressTest extends AndroidTestCase { } catch(IllegalArgumentException expected) {} } + @Test public void testAddressScopes() { assertEquals(RT_SCOPE_HOST, new LinkAddress("::/128").getScope()); assertEquals(RT_SCOPE_HOST, new LinkAddress("0.0.0.0/32").getScope()); @@ -216,6 +229,7 @@ public class LinkAddressTest extends AndroidTestCase { assertFalse(l2 + " unexpectedly equal to " + l1, l2.equals(l1)); } + @Test public void testEqualsAndSameAddressAs() { LinkAddress l1, l2, l3; @@ -293,26 +307,17 @@ public class LinkAddressTest extends AndroidTestCase { assertIsSameAddressAs(l1, l2); } + @Test public void testHashCode() { - LinkAddress l; - - l = new LinkAddress(V4_ADDRESS, 23); - assertEquals(-982787, l.hashCode()); - - l = new LinkAddress(V4_ADDRESS, 23, 0, RT_SCOPE_HOST); - assertEquals(-971865, l.hashCode()); - - l = new LinkAddress(V4_ADDRESS, 27); - assertEquals(-982743, l.hashCode()); - - l = new LinkAddress(V6_ADDRESS, 64); - assertEquals(1076522926, l.hashCode()); + LinkAddress l1, l2; - l = new LinkAddress(V6_ADDRESS, 128); - assertEquals(1076523630, l.hashCode()); + l1 = new LinkAddress(V4_ADDRESS, 23); + l2 = new LinkAddress(V4_ADDRESS, 23, 0, RT_SCOPE_HOST); + assertNotEquals(l1.hashCode(), l2.hashCode()); - l = new LinkAddress(V6_ADDRESS, 128, IFA_F_TENTATIVE, RT_SCOPE_UNIVERSE); - assertEquals(1076524846, l.hashCode()); + l1 = new LinkAddress(V6_ADDRESS, 128); + l2 = new LinkAddress(V6_ADDRESS, 128, IFA_F_TENTATIVE, RT_SCOPE_UNIVERSE); + assertNotEquals(l1.hashCode(), l2.hashCode()); } private LinkAddress passThroughParcel(LinkAddress l) { @@ -334,6 +339,7 @@ public class LinkAddressTest extends AndroidTestCase { assertEquals(l, l2); } + @Test public void testParceling() { LinkAddress l; @@ -352,6 +358,7 @@ public class LinkAddressTest extends AndroidTestCase { assertFalse(msg, l.isGlobalPreferred()); } + @Test public void testIsGlobalPreferred() { LinkAddress l; diff --git a/tests/net/java/android/net/ip/IpManagerTest.java b/tests/net/java/android/net/ip/IpManagerTest.java index 867324d99920..541f91adf747 100644 --- a/tests/net/java/android/net/ip/IpManagerTest.java +++ b/tests/net/java/android/net/ip/IpManagerTest.java @@ -17,11 +17,14 @@ package android.net.ip; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.any; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -31,8 +34,11 @@ import android.app.AlarmManager; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; +import android.net.INetd; import android.net.IpPrefix; import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.RouteInfo; import android.net.ip.IpManager.Callback; import android.net.ip.IpManager.InitialConfiguration; import android.net.ip.IpManager.ProvisioningConfiguration; @@ -44,16 +50,20 @@ import android.test.mock.MockContentResolver; import com.android.internal.util.test.FakeSettingsProvider; import com.android.internal.R; +import com.android.server.net.BaseNetworkObserver; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; +import java.util.Arrays; +import java.util.List; import java.util.HashSet; import java.util.Set; @@ -70,11 +80,14 @@ public class IpManagerTest { @Mock private Context mContext; @Mock private INetworkManagementService mNMService; + @Mock private INetd mNetd; @Mock private Resources mResources; @Mock private Callback mCb; @Mock private AlarmManager mAlarm; private MockContentResolver mContentResolver; + BaseNetworkObserver mObserver; + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -90,9 +103,14 @@ public class IpManagerTest { } private IpManager makeIpManager(String ifname) throws Exception { - final IpManager ipm = new IpManager(mContext, ifname, mCb, mNMService); + final IpManager ipm = new IpManager(mContext, ifname, mCb, mNMService, mNetd); verify(mNMService, timeout(100).times(1)).disableIpv6(ifname); verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(ifname); + ArgumentCaptor<BaseNetworkObserver> arg = + ArgumentCaptor.forClass(BaseNetworkObserver.class); + verify(mNMService, times(1)).registerObserver(arg.capture()); + mObserver = arg.getValue(); + reset(mNMService); return ipm; } @@ -129,6 +147,134 @@ public class IpManagerTest { } @Test + public void testProvisioningWithInitialConfiguration() throws Exception { + final String iface = "test_wlan0"; + final IpManager ipm = makeIpManager(iface); + + String[] addresses = { + "fe80::a4be:f92:e1f7:22d1/64", + "fe80::f04a:8f6:6a32:d756/64", + "fd2c:4e57:8e3c:0:548d:2db2:4fcf:ef75/64" + }; + String[] prefixes = { "fe80::/64", "fd2c:4e57:8e3c::/64" }; + + ProvisioningConfiguration config = new ProvisioningConfiguration.Builder() + .withoutIPv4() + .withoutIpReachabilityMonitor() + .withInitialConfiguration(conf(links(addresses), prefixes(prefixes), ips())) + .build(); + + ipm.startProvisioning(config); + verify(mCb, times(1)).setNeighborDiscoveryOffload(true); + verify(mCb, timeout(100).times(1)).setFallbackMulticastFilter(false); + verify(mCb, never()).onProvisioningFailure(any()); + + for (String addr : addresses) { + String[] parts = addr.split("/"); + verify(mNetd, timeout(100).times(1)) + .interfaceAddAddress(iface, parts[0], Integer.parseInt(parts[1])); + } + + final int lastAddr = addresses.length - 1; + + // Add N - 1 addresses + for (int i = 0; i < lastAddr; i++) { + mObserver.addressUpdated(iface, new LinkAddress(addresses[i])); + verify(mCb, timeout(100).times(1)).onLinkPropertiesChange(any()); + } + + // Add Nth address + mObserver.addressUpdated(iface, new LinkAddress(addresses[lastAddr])); + LinkProperties want = linkproperties(links(addresses), routes(prefixes)); + want.setInterfaceName(iface); + verify(mCb, timeout(100).times(1)).onProvisioningSuccess(eq(want)); + + ipm.stop(); + verify(mNMService, timeout(100).times(1)).disableIpv6(iface); + verify(mNMService, timeout(100).times(1)).clearInterfaceAddresses(iface); + } + + @Test + public void testIsProvisioned() throws Exception { + InitialConfiguration empty = conf(links(), prefixes()); + IsProvisionedTestCase[] testcases = { + // nothing + notProvisionedCase(links(), routes(), dns(), null), + notProvisionedCase(links(), routes(), dns(), empty), + + // IPv4 + provisionedCase(links("192.0.2.12/24"), routes(), dns(), empty), + + // IPv6 + notProvisionedCase( + links("fe80::a4be:f92:e1f7:22d1/64", "fd2c:4e57:8e3c:0:548d:2db2:4fcf:ef75/64"), + routes(), dns(), empty), + notProvisionedCase( + links("fe80::a4be:f92:e1f7:22d1/64", "fd2c:4e57:8e3c:0:548d:2db2:4fcf:ef75/64"), + routes("fe80::/64", "fd2c:4e57:8e3c::/64"), dns("fd00:1234:5678::1000"), empty), + provisionedCase( + links("2001:db8:dead:beef:f00::a0/64", "fe80::1/64"), + routes("::/0"), + dns("2001:db8:dead:beef:f00::02"), empty), + + // Initial configuration + provisionedCase( + links("fe80::e1f7:22d1/64", "fd2c:4e57:8e3c:0:548d:2db2:4fcf:ef75/64"), + routes("fe80::/64", "fd2c:4e57:8e3c::/64"), + dns(), + conf(links("fe80::e1f7:22d1/64", "fd2c:4e57:8e3c:0:548d:2db2:4fcf:ef75/64"), + prefixes( "fe80::/64", "fd2c:4e57:8e3c::/64"), ips())) + }; + + for (IsProvisionedTestCase testcase : testcases) { + if (IpManager.isProvisioned(testcase.lp, testcase.config) != testcase.isProvisioned) { + fail(testcase.errorMessage()); + } + } + } + + static class IsProvisionedTestCase { + boolean isProvisioned; + LinkProperties lp; + InitialConfiguration config; + + String errorMessage() { + return String.format("expected %s with config %s to be %s, but was %s", + lp, config, provisioned(isProvisioned), provisioned(!isProvisioned)); + } + + static String provisioned(boolean isProvisioned) { + return isProvisioned ? "provisioned" : "not provisioned"; + } + } + + static IsProvisionedTestCase provisionedCase(Set<LinkAddress> lpAddrs, Set<RouteInfo> lpRoutes, + Set<InetAddress> lpDns, InitialConfiguration config) { + return provisioningTest(true, lpAddrs, lpRoutes, lpDns, config); + } + + static IsProvisionedTestCase notProvisionedCase(Set<LinkAddress> lpAddrs, + Set<RouteInfo> lpRoutes, Set<InetAddress> lpDns, InitialConfiguration config) { + return provisioningTest(false, lpAddrs, lpRoutes, lpDns, config); + } + + static IsProvisionedTestCase provisioningTest(boolean isProvisioned, Set<LinkAddress> lpAddrs, + Set<RouteInfo> lpRoutes, Set<InetAddress> lpDns, InitialConfiguration config) { + IsProvisionedTestCase testcase = new IsProvisionedTestCase(); + testcase.isProvisioned = isProvisioned; + testcase.lp = new LinkProperties(); + testcase.lp.setLinkAddresses(lpAddrs); + for (RouteInfo route : lpRoutes) { + testcase.lp.addRoute(route); + } + for (InetAddress dns : lpDns) { + testcase.lp.addDnsServer(dns); + } + testcase.config = config; + return testcase; + } + + @Test public void testInitialConfigurations() throws Exception { InitialConfigurationTestCase[] testcases = { validConf("valid IPv4 configuration", @@ -150,6 +296,7 @@ public class IpManagerTest { prefixes("fd00:1234:5678::/48"), dns("fd00:1234:5678::1000")), + invalidConf("empty configuration", links(), prefixes(), dns()), invalidConf("v4 addr and dns not in any prefix", links("192.0.2.12/24"), prefixes("198.51.100.0/24"), dns("192.0.2.2")), invalidConf("v4 addr not in any prefix", @@ -187,10 +334,9 @@ public class IpManagerTest { return String.format("%s: expected configuration %s to be %s, but was %s", descr, config, validString(isValid), validString(!isValid)); } - } - - static String validString(boolean isValid) { - return isValid ? VALID : INVALID; + static String validString(boolean isValid) { + return isValid ? VALID : INVALID; + } } static InitialConfigurationTestCase validConf(String descr, Set<LinkAddress> links, @@ -212,6 +358,19 @@ public class IpManagerTest { return testcase; } + static LinkProperties linkproperties(Set<LinkAddress> addresses, Set<RouteInfo> routes) { + LinkProperties lp = new LinkProperties(); + lp.setLinkAddresses(addresses); + for (RouteInfo route : routes) { + lp.addRoute(route); + } + return lp; + } + + static InitialConfiguration conf(Set<LinkAddress> links, Set<IpPrefix> prefixes) { + return conf(links, prefixes, new HashSet<>()); + } + static InitialConfiguration conf( Set<LinkAddress> links, Set<IpPrefix> prefixes, Set<InetAddress> dns) { InitialConfiguration conf = new InitialConfiguration(); @@ -221,6 +380,10 @@ public class IpManagerTest { return conf; } + static Set<RouteInfo> routes(String... routes) { + return mapIntoSet(routes, (r) -> new RouteInfo(new IpPrefix(r))); + } + static Set<IpPrefix> prefixes(String... prefixes) { return mapIntoSet(prefixes, IpPrefix::new); } @@ -252,4 +415,44 @@ public class IpManagerTest { interface Fn<A,B> { B call(A a) throws Exception; } + + @Test + public void testAll() { + List<String> list1 = Arrays.asList(); + List<String> list2 = Arrays.asList("foo"); + List<String> list3 = Arrays.asList("bar", "baz"); + List<String> list4 = Arrays.asList("foo", "bar", "baz"); + + assertTrue(IpManager.all(list1, (x) -> false)); + assertFalse(IpManager.all(list2, (x) -> false)); + assertTrue(IpManager.all(list3, (x) -> true)); + assertTrue(IpManager.all(list2, (x) -> x.charAt(0) == 'f')); + assertFalse(IpManager.all(list4, (x) -> x.charAt(0) == 'f')); + } + + @Test + public void testAny() { + List<String> list1 = Arrays.asList(); + List<String> list2 = Arrays.asList("foo"); + List<String> list3 = Arrays.asList("bar", "baz"); + List<String> list4 = Arrays.asList("foo", "bar", "baz"); + + assertFalse(IpManager.any(list1, (x) -> true)); + assertTrue(IpManager.any(list2, (x) -> true)); + assertTrue(IpManager.any(list2, (x) -> x.charAt(0) == 'f')); + assertFalse(IpManager.any(list3, (x) -> x.charAt(0) == 'f')); + assertTrue(IpManager.any(list4, (x) -> x.charAt(0) == 'f')); + } + + @Test + public void testFindAll() { + List<String> list1 = Arrays.asList(); + List<String> list2 = Arrays.asList("foo"); + List<String> list3 = Arrays.asList("foo", "bar", "baz"); + + assertEquals(list1, IpManager.findAll(list1, (x) -> true)); + assertEquals(list1, IpManager.findAll(list3, (x) -> false)); + assertEquals(list3, IpManager.findAll(list3, (x) -> true)); + assertEquals(list2, IpManager.findAll(list3, (x) -> x.charAt(0) == 'f')); + } } diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index f0b3724955aa..296cb76560af 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -346,7 +346,7 @@ public class VpnTest extends AndroidTestCase { // Apps that opt out explicitly are not supported appInfo.targetSdkVersion = VERSION_CODES.CUR_DEVELOPMENT; Bundle metaData = new Bundle(); - metaData.putBoolean(VpnService.METADATA_SUPPORTS_ALWAYS_ON, false); + metaData.putBoolean(VpnService.SERVICE_META_DATA_SUPPORTS_ALWAYS_ON, false); svcInfo.metaData = metaData; assertFalse(vpn.isAlwaysOnPackageSupported(PKGS[0])); } diff --git a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java index dcb9723fa5e2..dfe3f982e5bf 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java +++ b/tests/net/java/com/android/server/connectivity/tethering/OffloadControllerTest.java @@ -17,7 +17,10 @@ package com.android.server.connectivity.tethering; import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.STATS_PER_IFACE; +import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_NONE; +import static android.net.NetworkStats.UID_ALL; import static android.net.TrafficStats.UID_TETHERING; import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; import static com.android.server.connectivity.tethering.OffloadHardwareInterface.ForwardedStats; @@ -25,6 +28,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; @@ -45,6 +49,7 @@ import android.net.LinkProperties; import android.net.NetworkStats; import android.net.RouteInfo; import android.net.util.SharedLog; +import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.INetworkManagementService; @@ -74,6 +79,15 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @SmallTest public class OffloadControllerTest { + private static final String RNDIS0 = "test_rndis0"; + private static final String RMNET0 = "test_rmnet_data0"; + private static final String WLAN0 = "test_wlan0"; + + private static final String IPV6_LINKLOCAL = "fe80::/64"; + private static final String IPV6_DOC_PREFIX = "2001:db8::/64"; + private static final String IPV6_DISCARD_PREFIX = "100::/64"; + private static final String USB_PREFIX = "192.168.42.0/24"; + private static final String WIFI_PREFIX = "192.168.43.0/24"; @Mock private OffloadHardwareInterface mHardware; @Mock private ApplicationInfo mApplicationInfo; @@ -83,6 +97,8 @@ public class OffloadControllerTest { ArgumentCaptor.forClass(ArrayList.class); private final ArgumentCaptor<ITetheringStatsProvider.Stub> mTetherStatsProviderCaptor = ArgumentCaptor.forClass(ITetheringStatsProvider.Stub.class); + private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor = + ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class); private MockContentResolver mContentResolver; @Before public void setUp() { @@ -101,15 +117,23 @@ public class OffloadControllerTest { private void setupFunctioningHardwareInterface() { when(mHardware.initOffloadConfig()).thenReturn(true); - when(mHardware.initOffloadControl(any(OffloadHardwareInterface.ControlCallback.class))) + when(mHardware.initOffloadControl(mControlCallbackCaptor.capture())) .thenReturn(true); + when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true); when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats()); + when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); } private void enableOffload() { Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); } + private void waitForIdle() { + ConditionVariable cv = new ConditionVariable(); + new Handler(Looper.getMainLooper()).post(() -> { cv.open(); }); + cv.block(); + } + private OffloadController makeOffloadController() throws Exception { OffloadController offload = new OffloadController(new Handler(Looper.getMainLooper()), mHardware, mContentResolver, mNMService, new SharedLog("test")); @@ -219,10 +243,8 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture()); ArrayList<String> localPrefixes = mStringArrayCaptor.getValue(); assertEquals(4, localPrefixes.size()); - assertTrue(localPrefixes.contains("127.0.0.0/8")); - assertTrue(localPrefixes.contains("192.0.2.0/24")); - assertTrue(localPrefixes.contains("fe80::/64")); - assertTrue(localPrefixes.contains("2001:db8::/64")); + assertArrayListContains(localPrefixes, + "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"); inOrder.verifyNoMoreInteractions(); offload.setUpstreamLinkProperties(null); @@ -243,6 +265,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(null), eq(null), eq(null)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Addr = "192.0.2.5"; @@ -260,6 +283,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(null), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv4Gateway = "192.0.2.1"; @@ -270,6 +294,7 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setUpstreamParameters( eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw1 = "fe80::cafe"; @@ -283,6 +308,7 @@ public class OffloadControllerTest { ArrayList<String> v6gws = mStringArrayCaptor.getValue(); assertEquals(1, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final String ipv6Gw2 = "fe80::d00d"; @@ -297,6 +323,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); final LinkProperties stacked = new LinkProperties(); @@ -315,6 +342,7 @@ public class OffloadControllerTest { assertEquals(2, v6gws.size()); assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Add in some IPv6 upstream info. When there is a tethered downstream @@ -331,12 +359,9 @@ public class OffloadControllerTest { inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture()); localPrefixes = mStringArrayCaptor.getValue(); assertEquals(6, localPrefixes.size()); - assertTrue(localPrefixes.contains("127.0.0.0/8")); - assertTrue(localPrefixes.contains("192.0.2.0/24")); - assertTrue(localPrefixes.contains("fe80::/64")); - assertTrue(localPrefixes.contains("2001:db8::/64")); - assertTrue(localPrefixes.contains("2001:db8::6173:7369:676e:6564/128")); - assertTrue(localPrefixes.contains("2001:db8::7261:6e64:6f6d/128")); + assertArrayListContains(localPrefixes, + "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64", + "2001:db8::6173:7369:676e:6564/128", "2001:db8::7261:6e64:6f6d/128"); // The relevant parts of the LinkProperties have not changed, but at the // moment we do not de-dup upstream LinkProperties this carefully. inOrder.verify(mHardware, times(1)).setUpstreamParameters( @@ -346,6 +371,7 @@ public class OffloadControllerTest { assertTrue(v6gws.contains(ipv6Gw1)); assertTrue(v6gws.contains(ipv6Gw2)); inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); + inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); inOrder.verifyNoMoreInteractions(); // Completely identical LinkProperties updates are de-duped. @@ -363,7 +389,6 @@ public class OffloadControllerTest { assertEquals(stats.txBytes, entry.txBytes); assertEquals(SET_DEFAULT, entry.set); assertEquals(TAG_NONE, entry.tag); - assertEquals(UID_TETHERING, entry.uid); } @Test @@ -388,33 +413,217 @@ public class OffloadControllerTest { when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(ethernetStats); when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn(mobileStats); + InOrder inOrder = inOrder(mHardware); + final LinkProperties lp = new LinkProperties(); lp.setInterfaceName(ethernetIface); offload.setUpstreamLinkProperties(lp); + // Previous upstream was null, so no stats are fetched. + inOrder.verify(mHardware, never()).getForwardedStats(any()); lp.setInterfaceName(mobileIface); offload.setUpstreamLinkProperties(lp); + // Expect that we fetch stats from the previous upstream. + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface)); lp.setInterfaceName(ethernetIface); offload.setUpstreamLinkProperties(lp); + // Expect that we fetch stats from the previous upstream. + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface)); + ethernetStats = new ForwardedStats(); ethernetStats.rxBytes = 100000; ethernetStats.txBytes = 100000; + when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn(ethernetStats); offload.setUpstreamLinkProperties(null); + // Expect that we fetch stats from the previous upstream. + inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface)); + + ITetheringStatsProvider provider = mTetherStatsProviderCaptor.getValue(); + NetworkStats stats = provider.getTetherStats(STATS_PER_IFACE); + NetworkStats perUidStats = provider.getTetherStats(STATS_PER_UID); + waitForIdle(); + // There is no current upstream, so no stats are fetched. + inOrder.verify(mHardware, never()).getForwardedStats(any()); + inOrder.verify(mHardware, times(1)).setUpstreamParameters( + eq(null), eq(null), eq(null), eq(null)); + inOrder.verifyNoMoreInteractions(); - NetworkStats stats = mTetherStatsProviderCaptor.getValue().getTetherStats(); assertEquals(2, stats.size()); + assertEquals(2, perUidStats.size()); NetworkStats.Entry entry = null; + for (int i = 0; i < stats.size(); i++) { + assertEquals(UID_ALL, stats.getValues(i, entry).uid); + assertEquals(UID_TETHERING, perUidStats.getValues(i, entry).uid); + } + int ethernetPosition = ethernetIface.equals(stats.getValues(0, entry).iface) ? 0 : 1; int mobilePosition = 1 - ethernetPosition; entry = stats.getValues(mobilePosition, entry); assertNetworkStats(mobileIface, mobileStats, entry); + entry = perUidStats.getValues(mobilePosition, entry); + assertNetworkStats(mobileIface, mobileStats, entry); ethernetStats.rxBytes = 12345 + 100000; ethernetStats.txBytes = 54321 + 100000; entry = stats.getValues(ethernetPosition, entry); assertNetworkStats(ethernetIface, ethernetStats, entry); + entry = perUidStats.getValues(ethernetPosition, entry); + assertNetworkStats(ethernetIface, ethernetStats, entry); + } + + @Test + public void testSetInterfaceQuota() throws Exception { + setupFunctioningHardwareInterface(); + enableOffload(); + + final OffloadController offload = makeOffloadController(); + offload.start(); + + final String ethernetIface = "eth1"; + final String mobileIface = "rmnet_data0"; + final long ethernetLimit = 12345; + final long mobileLimit = 12345678; + + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(ethernetIface); + offload.setUpstreamLinkProperties(lp); + + ITetheringStatsProvider provider = mTetherStatsProviderCaptor.getValue(); + final InOrder inOrder = inOrder(mHardware); + when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true); + when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); + + // Applying an interface quota to the current upstream immediately sends it to the hardware. + provider.setInterfaceQuota(ethernetIface, ethernetLimit); + waitForIdle(); + inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit); + inOrder.verifyNoMoreInteractions(); + + // Applying an interface quota to another upstream does not take any immediate action. + provider.setInterfaceQuota(mobileIface, mobileLimit); + waitForIdle(); + inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); + + // Switching to that upstream causes the quota to be applied if the parameters were applied + // correctly. + lp.setInterfaceName(mobileIface); + offload.setUpstreamLinkProperties(lp); + waitForIdle(); + inOrder.verify(mHardware).setDataLimit(mobileIface, mobileLimit); + + // Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set + // to Long.MAX_VALUE. + provider.setInterfaceQuota(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED); + waitForIdle(); + inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE); + + // If setting upstream parameters fails, then the data limit is not set. + when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false); + lp.setInterfaceName(ethernetIface); + offload.setUpstreamLinkProperties(lp); + provider.setInterfaceQuota(mobileIface, mobileLimit); + waitForIdle(); + inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); + + // If setting the data limit fails while changing upstreams, offload is stopped. + when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true); + when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false); + lp.setInterfaceName(mobileIface); + offload.setUpstreamLinkProperties(lp); + provider.setInterfaceQuota(mobileIface, mobileLimit); + waitForIdle(); + inOrder.verify(mHardware).getForwardedStats(ethernetIface); + inOrder.verify(mHardware).stopOffloadControl(); + } + + @Test + public void testDataLimitCallback() throws Exception { + setupFunctioningHardwareInterface(); + enableOffload(); + + final OffloadController offload = makeOffloadController(); + offload.start(); + + OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue(); + callback.onStoppedLimitReached(); + verify(mNMService, times(1)).tetherLimitReached(mTetherStatsProviderCaptor.getValue()); + } + + @Test + public void testAddRemoveDownstreams() throws Exception { + setupFunctioningHardwareInterface(); + enableOffload(); + + final OffloadController offload = makeOffloadController(); + offload.start(); + + final InOrder inOrder = inOrder(mHardware); + inOrder.verify(mHardware, times(1)).initOffloadConfig(); + inOrder.verify(mHardware, times(1)).initOffloadControl( + any(OffloadHardwareInterface.ControlCallback.class)); + inOrder.verifyNoMoreInteractions(); + + // Tethering makes several calls to setLocalPrefixes() before add/remove + // downstream calls are made. This is not tested here; only the behavior + // of notifyDownstreamLinkProperties() and removeDownstreamInterface() + // are tested. + + // [1] USB tethering is started. + final LinkProperties usbLinkProperties = new LinkProperties(); + usbLinkProperties.setInterfaceName(RNDIS0); + usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24")); + usbLinkProperties.addRoute(new RouteInfo(new IpPrefix(USB_PREFIX))); + offload.notifyDownstreamLinkProperties(usbLinkProperties); + inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, USB_PREFIX); + inOrder.verifyNoMoreInteractions(); + + // [2] Routes for IPv6 link-local prefixes should never be added. + usbLinkProperties.addRoute(new RouteInfo(new IpPrefix(IPV6_LINKLOCAL))); + offload.notifyDownstreamLinkProperties(usbLinkProperties); + inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString()); + inOrder.verifyNoMoreInteractions(); + + // [3] Add an IPv6 prefix for good measure. Only new offload-able + // prefixes should be passed to the HAL. + usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64")); + usbLinkProperties.addRoute(new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX))); + offload.notifyDownstreamLinkProperties(usbLinkProperties); + inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX); + inOrder.verifyNoMoreInteractions(); + + // [4] Adding addresses doesn't affect notifyDownstreamLinkProperties(). + // The address is passed in by a separate setLocalPrefixes() invocation. + usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::2/64")); + offload.notifyDownstreamLinkProperties(usbLinkProperties); + inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString()); + + // [5] Differences in local routes are converted into addDownstream() + // and removeDownstream() invocations accordingly. + usbLinkProperties.removeRoute(new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, RNDIS0)); + usbLinkProperties.addRoute(new RouteInfo(new IpPrefix(IPV6_DISCARD_PREFIX))); + offload.notifyDownstreamLinkProperties(usbLinkProperties); + inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX); + inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX); + inOrder.verifyNoMoreInteractions(); + + // [6] Removing a downstream interface which was never added causes no + // interactions with the HAL. + offload.removeDownstreamInterface(WLAN0); + inOrder.verifyNoMoreInteractions(); + + // [7] Removing an active downstream removes all remaining prefixes. + offload.removeDownstreamInterface(RNDIS0); + inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, USB_PREFIX); + inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX); + inOrder.verifyNoMoreInteractions(); + } + + private static void assertArrayListContains(ArrayList<String> list, String... elems) { + for (String element : elems) { + assertTrue(list.contains(element)); + } } } diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index feb46d39b563..fa997958ba6d 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -31,6 +31,8 @@ import static android.net.NetworkStats.ROAMING_YES; import static android.net.NetworkStats.SET_ALL; import static android.net.NetworkStats.SET_DEFAULT; import static android.net.NetworkStats.SET_FOREGROUND; +import static android.net.NetworkStats.STATS_PER_IFACE; +import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; import static android.net.NetworkStatsHistory.FIELD_ALL; @@ -823,17 +825,24 @@ public class NetworkStatsServiceTest { incrementCurrentTime(HOUR_IN_MILLIS); expectCurrentTime(); expectDefaultSettings(); - expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1) - .addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L)); + // Traffic seen by kernel counters (includes software tethering). + final NetworkStats ifaceStats = new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 1536L, 12L, 384L, 3L); + // Hardware tethering traffic, not seen by kernel counters. + final NetworkStats tetherStatsHardware = new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 512L, 4L, 128L, 1L); + + // Traffic for UID_RED. final NetworkStats uidStats = new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 128L, 2L, 128L, 2L, 0L); - final String[] tetherIfacePairs = new String[] { TEST_IFACE, "wlan0" }; + // All tethering traffic, both hardware and software. final NetworkStats tetherStats = new NetworkStats(getElapsedRealtime(), 1) .addValues(TEST_IFACE, UID_TETHERING, SET_DEFAULT, TAG_NONE, 1920L, 14L, 384L, 2L, 0L); - expectNetworkStatsUidDetail(uidStats, tetherIfacePairs, tetherStats); + expectNetworkStatsSummary(ifaceStats, tetherStatsHardware); + expectNetworkStatsUidDetail(uidStats, tetherStats); forcePollAndWaitForIdle(); // verify service recorded history @@ -1013,10 +1022,16 @@ public class NetworkStatsServiceTest { } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { + expectNetworkStatsSummary(summary, new NetworkStats(0L, 0)); + } + + private void expectNetworkStatsSummary(NetworkStats summary, NetworkStats tetherStats) + throws Exception { when(mConnManager.getAllVpnInfo()).thenReturn(new VpnInfo[0]); - expectNetworkStatsSummaryDev(summary); - expectNetworkStatsSummaryXt(summary); + expectNetworkStatsTethering(STATS_PER_IFACE, tetherStats); + expectNetworkStatsSummaryDev(summary.clone()); + expectNetworkStatsSummaryXt(summary.clone()); } private void expectNetworkStatsSummaryDev(NetworkStats summary) throws Exception { @@ -1027,17 +1042,21 @@ public class NetworkStatsServiceTest { when(mNetManager.getNetworkStatsSummaryXt()).thenReturn(summary); } + private void expectNetworkStatsTethering(int how, NetworkStats stats) + throws Exception { + when(mNetManager.getNetworkStatsTethering(how)).thenReturn(stats); + } + private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception { - expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0)); + expectNetworkStatsUidDetail(detail, new NetworkStats(0L, 0)); } - private void expectNetworkStatsUidDetail( - NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats) + private void expectNetworkStatsUidDetail(NetworkStats detail, NetworkStats tetherStats) throws Exception { when(mNetManager.getNetworkStatsUidDetail(UID_ALL)).thenReturn(detail); // also include tethering details, since they are folded into UID - when(mNetManager.getNetworkStatsTethering()).thenReturn(tetherStats); + when(mNetManager.getNetworkStatsTethering(STATS_PER_UID)).thenReturn(tetherStats); } private void expectDefaultSettings() throws Exception { diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index ac5df05373c1..dc5ba0cc83b5 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -1,5 +1,6 @@ package android.net.wifi; +import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; @@ -313,6 +314,7 @@ public class RttManager { }; } + @RequiresPermission(Manifest.permission.LOCATION_HARDWARE) public RttCapabilities getRttCapabilities() { synchronized (mCapabilitiesLock) { if (mRttCapabilities == null) { @@ -925,6 +927,51 @@ public class RttManager { public void onAborted(); } + /** + * A parcelable that contains rtt client information. + * + * @hide + */ + public static class RttClient implements Parcelable { + // Package name of RttClient. + private final String mPackageName; + + public RttClient(String packageName) { + mPackageName = packageName; + } + + protected RttClient(Parcel in) { + mPackageName = in.readString(); + } + + public static final Creator<RttManager.RttClient> CREATOR = + new Creator<RttManager.RttClient>() { + @Override + public RttManager.RttClient createFromParcel(Parcel in) { + return new RttManager.RttClient(in); + } + + @Override + public RttManager.RttClient[] newArray(int size) { + return new RttManager.RttClient[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(mPackageName); + } + + public String getPackageName() { + return mPackageName; + } + } + private boolean rttParamSanity(RttParams params, int index) { if (mRttCapabilities == null) { if(getRttCapabilities() == null) { @@ -1236,7 +1283,8 @@ public class RttManager { mAsyncChannel.connectSync(mContext, handler, messenger); // We cannot use fullyConnectSync because it sends the FULL_CONNECTION message // synchronously, which causes RttService to receive the wrong replyTo value. - mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); + mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION, + new RttClient(context.getPackageName())); mAsyncChannel.sendMessage(CMD_OP_REG_BINDER, key[0]); } diff --git a/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java new file mode 100644 index 000000000000..7c99c497c54b --- /dev/null +++ b/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.wifi.aware; + +import android.net.NetworkSpecifier; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.Log; + +import libcore.util.HexEncoding; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.StringJoiner; + +/** + * A network specifier object used to represent the capabilities of an network agent. A collection + * of multiple WifiAwareNetworkSpecifier objects whose matching critiera (satisfiedBy) is an OR: + * a match on any of the network specifiers in the collection is a match. + * + * This class is not intended for use in network requests. + * + * @hide + */ +public class WifiAwareAgentNetworkSpecifier extends NetworkSpecifier implements Parcelable { + private static final String TAG = "WifiAwareAgentNs"; + + private static final boolean VDBG = false; // STOPSHIP if true + + private Set<ByteArrayWrapper> mNetworkSpecifiers = new HashSet<>(); + private MessageDigest mDigester; + + public WifiAwareAgentNetworkSpecifier() { + // do nothing, already initialized to empty + } + + public WifiAwareAgentNetworkSpecifier(WifiAwareNetworkSpecifier ns) { + initialize(); + mNetworkSpecifiers.add(convert(ns)); + } + + public WifiAwareAgentNetworkSpecifier(WifiAwareNetworkSpecifier[] nss) { + initialize(); + for (WifiAwareNetworkSpecifier ns : nss) { + mNetworkSpecifiers.add(convert(ns)); + } + } + + public boolean isEmpty() { + return mNetworkSpecifiers.isEmpty(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeArray(mNetworkSpecifiers.toArray()); + } + + public static final Creator<WifiAwareAgentNetworkSpecifier> CREATOR = + new Creator<WifiAwareAgentNetworkSpecifier>() { + @Override + public WifiAwareAgentNetworkSpecifier createFromParcel(Parcel in) { + WifiAwareAgentNetworkSpecifier agentNs = new WifiAwareAgentNetworkSpecifier(); + Object[] objs = in.readArray(null); + for (Object obj : objs) { + agentNs.mNetworkSpecifiers.add((ByteArrayWrapper) obj); + } + return agentNs; + } + + @Override + public WifiAwareAgentNetworkSpecifier[] newArray(int size) { + return new WifiAwareAgentNetworkSpecifier[size]; + } + }; + + @Override + public int hashCode() { + return mNetworkSpecifiers.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof WifiAwareAgentNetworkSpecifier)) { + return false; + } + return mNetworkSpecifiers.equals(((WifiAwareAgentNetworkSpecifier) obj).mNetworkSpecifiers); + } + + @Override + public String toString() { + StringJoiner sj = new StringJoiner(","); + for (ByteArrayWrapper baw: mNetworkSpecifiers) { + sj.add(baw.toString()); + } + return sj.toString(); + } + + @Override + public boolean satisfiedBy(NetworkSpecifier other) { + if (!(other instanceof WifiAwareAgentNetworkSpecifier)) { + return false; + } + WifiAwareAgentNetworkSpecifier otherNs = (WifiAwareAgentNetworkSpecifier) other; + + // called as old.satifiedBy(new): satisfied if old contained in new + for (ByteArrayWrapper baw: mNetworkSpecifiers) { + if (!otherNs.mNetworkSpecifiers.contains(baw)) { + return false; + } + } + + return true; + } + + public boolean satisfiesAwareNetworkSpecifier(WifiAwareNetworkSpecifier ns) { + if (VDBG) Log.v(TAG, "satisfiesAwareNetworkSpecifier: ns=" + ns); + ByteArrayWrapper nsBytes = convert(ns); + return mNetworkSpecifiers.contains(nsBytes); + } + + @Override + public void assertValidFromUid(int requestorUid) { + throw new SecurityException( + "WifiAwareAgentNetworkSpecifier should not be used in network requests"); + } + + private void initialize() { + try { + mDigester = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + Log.e(TAG, "Can not instantiate a SHA-256 digester!? Will match nothing."); + return; + } + } + + private ByteArrayWrapper convert(WifiAwareNetworkSpecifier ns) { + if (mDigester == null) { + return null; + } + + Parcel parcel = Parcel.obtain(); + ns.writeToParcel(parcel, 0); + byte[] bytes = parcel.marshall(); + + mDigester.reset(); + mDigester.update(bytes); + return new ByteArrayWrapper(mDigester.digest()); + } + + private static class ByteArrayWrapper implements Parcelable { + private byte[] mData; + + ByteArrayWrapper(byte[] data) { + mData = data; + } + + @Override + public int hashCode() { + return Arrays.hashCode(mData); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof ByteArrayWrapper)) { + return false; + } + return Arrays.equals(((ByteArrayWrapper) obj).mData, mData); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeBlob(mData); + } + + public static final Creator<ByteArrayWrapper> CREATOR = + new Creator<ByteArrayWrapper>() { + @Override + public ByteArrayWrapper createFromParcel(Parcel in) { + return new ByteArrayWrapper(in.readBlob()); + } + + @Override + public ByteArrayWrapper[] newArray(int size) { + return new ByteArrayWrapper[size]; + } + }; + + @Override + public String toString() { + return new String(HexEncoding.encode(mData)); + } + } +} diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java index eeabbfa25892..6e37fcf4d338 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java @@ -193,6 +193,9 @@ public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements @Override public boolean satisfiedBy(NetworkSpecifier other) { // MatchAllNetworkSpecifier is taken care in NetworkCapabilities#satisfiedBySpecifier. + if (other instanceof WifiAwareAgentNetworkSpecifier) { + return ((WifiAwareAgentNetworkSpecifier) other).satisfiesAwareNetworkSpecifier(this); + } return equals(other); } diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java new file mode 100644 index 000000000000..2dd0537a7aff --- /dev/null +++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java @@ -0,0 +1,177 @@ +/* + * 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 android.net.wifi.aware; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertEquals; + +import android.os.Parcel; +import android.test.suitebuilder.annotation.SmallTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ErrorCollector; + +import java.util.HashSet; +import java.util.Set; + +/** + * Unit test harness for WifiAwareAgentNetworkSpecifier class. + */ +@SmallTest +public class WifiAwareAgentNetworkSpecifierTest { + @Rule + public ErrorCollector collector = new ErrorCollector(); + + @Test + public void testParcel() { + final int numNs = 10; + + Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>(); + for (int i = 0; i < numNs; ++i) { + nsSet.add(getDummyNetworkSpecifier(10 + i)); + } + WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[numNs])); + + Parcel parcelW = Parcel.obtain(); + dut.writeToParcel(parcelW, 0); + byte[] bytes = parcelW.marshall(); + parcelW.recycle(); + + Parcel parcelR = Parcel.obtain(); + parcelR.unmarshall(bytes, 0, bytes.length); + parcelR.setDataPosition(0); + WifiAwareAgentNetworkSpecifier rereadDut = + WifiAwareAgentNetworkSpecifier.CREATOR.createFromParcel(parcelR); + + assertEquals(dut, rereadDut); + } + + /** + * Validate that an empty agent network specifier doesn't match any base network specifier. + */ + @Test + public void testEmptyDoesntMatchAnything() { + WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(); + WifiAwareNetworkSpecifier ns = getDummyNetworkSpecifier(6); + collector.checkThat("No match expected", ns.satisfiedBy(dut), equalTo(false)); + } + + /** + * Validate that an agent network specifier constructed with a single entry matches that entry, + * and only that entry. + */ + @Test + public void testSingleMatch() { + WifiAwareNetworkSpecifier nsThis = getDummyNetworkSpecifier(6); + WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(nsThis); + WifiAwareNetworkSpecifier nsOther = getDummyNetworkSpecifier(8); + collector.checkThat("Match expected", nsThis.satisfiedBy(dut), equalTo(true)); + collector.checkThat("No match expected", nsOther.satisfiedBy(dut), equalTo(false)); + } + + /** + * Validate that an agent network specifier constructed with multiple entries matches all those + * entries - but none other. + */ + @Test + public void testMultipleMatchesAllMembers() { + final int numNs = 10; + + Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>(); + for (int i = 0; i < numNs; ++i) { + nsSet.add(getDummyNetworkSpecifier(10 + i)); + } + + WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[numNs])); + WifiAwareNetworkSpecifier nsOther = getDummyNetworkSpecifier(10000); + + for (WifiAwareNetworkSpecifier nsThis: nsSet) { + collector.checkThat("Match expected", nsThis.satisfiedBy(dut), equalTo(true)); + } + collector.checkThat("No match expected", nsOther.satisfiedBy(dut), equalTo(false)); + } + + /** + * Validate that agent network specifier matches against a super-set. + */ + @Test + public void testMatchSuperset() { + final int numNs = 10; + + Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>(); + for (int i = 0; i < numNs; ++i) { + nsSet.add(getDummyNetworkSpecifier(10 + i)); + } + + WifiAwareAgentNetworkSpecifier oldNs = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()])); + + nsSet.add(getDummyNetworkSpecifier(100 + numNs)); + WifiAwareAgentNetworkSpecifier newNs = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()])); + + collector.checkThat("Match expected", oldNs.satisfiedBy(newNs), equalTo(true)); + } + + /** + * Validate that agent network specifier does not match against a sub-set. + */ + @Test + public void testNoMatchSubset() { + final int numNs = 10; + + Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>(); + for (int i = 0; i < numNs; ++i) { + nsSet.add(getDummyNetworkSpecifier(10 + i)); + } + + WifiAwareAgentNetworkSpecifier newNs = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()])); + + nsSet.add(getDummyNetworkSpecifier(100 + numNs)); + WifiAwareAgentNetworkSpecifier oldNs = new WifiAwareAgentNetworkSpecifier( + nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()])); + + collector.checkThat("Match unexpected", oldNs.satisfiedBy(newNs), equalTo(false)); + } + + /** + * Validate that agent network specifier cannot be used as in network requests - i.e. that + * throws an exception when queried for UID validity. + */ + @Test(expected = SecurityException.class) + public void testNoUsageInRequest() { + WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(); + + dut.assertValidFromUid(0); + } + + // utilities + + /** + * Returns a WifiAwareNetworkSpecifier with dummy (but valid) entries. Each can be + * differentiated (made unique) by specifying a different client ID. + */ + WifiAwareNetworkSpecifier getDummyNetworkSpecifier(int clientId) { + return new WifiAwareNetworkSpecifier(WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_OOB, + WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, clientId, 0, 0, new byte[6], + null, null, 0); + } +} |