diff options
153 files changed, 3976 insertions, 2223 deletions
diff --git a/Android.bp b/Android.bp index 415eff3db7d7..a603006d119d 100644 --- a/Android.bp +++ b/Android.bp @@ -151,8 +151,8 @@ java_defaults { ":libcamera_client_framework_aidl", "core/java/android/hardware/IConsumerIrService.aidl", "core/java/android/hardware/ISerialManager.aidl", - "core/java/android/hardware/biometrics/IBiometricPromptService.aidl", - "core/java/android/hardware/biometrics/IBiometricPromptServiceReceiver.aidl", + "core/java/android/hardware/biometrics/IBiometricService.aidl", + "core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl", "core/java/android/hardware/biometrics/IBiometricPromptReceiver.aidl", "core/java/android/hardware/biometrics/IBiometricServiceLockoutResetCallback.aidl", "core/java/android/hardware/display/IDisplayManager.aidl", diff --git a/api/current.txt b/api/current.txt index f2ad2e859ad1..a8696ff8fc54 100755 --- a/api/current.txt +++ b/api/current.txt @@ -9527,6 +9527,7 @@ package android.content { field public static final int BIND_IMPORTANT = 64; // 0x40 field public static final int BIND_NOT_FOREGROUND = 4; // 0x4 field public static final int BIND_WAIVE_PRIORITY = 32; // 0x20 + field public static final java.lang.String BIOMETRIC_SERVICE = "biometric"; field public static final java.lang.String BLUETOOTH_SERVICE = "bluetooth"; field public static final java.lang.String CAMERA_SERVICE = "camera"; field public static final java.lang.String CAPTIONING_SERVICE = "captioning"; @@ -15934,6 +15935,10 @@ package android.hardware { package android.hardware.biometrics { + public class BiometricManager { + method public boolean hasEnrolledBiometrics(); + } + public class BiometricPrompt { method public void authenticate(android.hardware.biometrics.BiometricPrompt.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback); method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.biometrics.BiometricPrompt.AuthenticationCallback); diff --git a/api/system-current.txt b/api/system-current.txt index 8f7606a2f9f6..0038afb0645d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4305,6 +4305,13 @@ package android.provider { field public static final java.lang.String STATE = "state"; } + public static final class ContactsContract.RawContacts implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.SyncColumns { + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_DELETE_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_INSERT_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_UPDATE_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_URI; + } + public abstract class SearchIndexableData { ctor public SearchIndexableData(); ctor public SearchIndexableData(android.content.Context); diff --git a/api/test-current.txt b/api/test-current.txt index e22f516d9d78..f4d7cbcab6dc 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -932,6 +932,13 @@ package android.provider { field public static final android.net.Uri ENTERPRISE_CONTENT_URI; } + public static final class ContactsContract.RawContacts implements android.provider.BaseColumns android.provider.ContactsContract.ContactNameColumns android.provider.ContactsContract.ContactOptionsColumns android.provider.ContactsContract.RawContactsColumns android.provider.ContactsContract.SyncColumns { + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_DELETE_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_INSERT_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_UPDATE_URI; + field public static final android.net.Uri RAW_CONTACTS_NOTIFICATION_URI; + } + public static final class ContactsContract.RawContactsEntity implements android.provider.BaseColumns android.provider.ContactsContract.DataColumns android.provider.ContactsContract.RawContactsColumns { field public static final android.net.Uri CORP_CONTENT_URI; } diff --git a/config/preloaded-classes b/config/preloaded-classes index 63c583f9264c..d93befdf5143 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -2381,7 +2381,6 @@ android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ android.os.-$$Lambda$StrictMode$yZJXPvy2veRNA-xL_SWdXzX_OLg android.os.-$$Lambda$Trace$2zLZ-Lc2kAXsVjw_nLYeNhqmGq0 android.os.AsyncResult -android.os.AsyncTask android.os.AsyncTask$1 android.os.AsyncTask$2 android.os.AsyncTask$3 diff --git a/config/preloaded-classes-blacklist b/config/preloaded-classes-blacklist index 8b8d640a543b..eca3bf3e47fe 100644 --- a/config/preloaded-classes-blacklist +++ b/config/preloaded-classes-blacklist @@ -1,4 +1,5 @@ android.net.ConnectivityThread$Singleton +android.os.AsyncTask android.os.FileObserver android.widget.Magnifier sun.nio.fs.UnixChannelFactory diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 055a91eaa1cc..14b8ae45d989 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3379,7 +3379,7 @@ public class ActivityManager { */ public ConfigurationInfo getDeviceConfigurationInfo() { try { - return getService().getDeviceConfigurationInfo(); + return getTaskService().getDeviceConfigurationInfo(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index c0c8b799ec3b..519a2749e5bb 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -208,8 +208,6 @@ interface IActivityManager { List<ActivityManager.RunningServiceInfo> getServices(int maxNum, int flags); // Retrieve running application processes in the system List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses(); - // Get device configuration - ConfigurationInfo getDeviceConfigurationInfo(); IBinder peekService(in Intent service, in String resolvedType, in String callingPackage); // Turn on/off profiling in a particular process. boolean profileControl(in String process, int userId, boolean start, diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index abd1cca06d26..b7b6352ad5cf 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -344,6 +344,9 @@ interface IActivityTaskManager { void notifyPinnedStackAnimationStarted(); void notifyPinnedStackAnimationEnded(); + // Get device configuration + ConfigurationInfo getDeviceConfigurationInfo(); + /** * Resizes the pinned stack. * diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 003f36438c5a..a6791660d045 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -53,6 +53,8 @@ import android.hardware.ISerialManager; import android.hardware.SensorManager; import android.hardware.SerialManager; import android.hardware.SystemSensorManager; +import android.hardware.biometrics.BiometricManager; +import android.hardware.biometrics.IBiometricService; import android.hardware.camera2.CameraManager; import android.hardware.display.DisplayManager; import android.hardware.face.FaceManager; @@ -818,6 +820,19 @@ final class SystemServiceRegistry { } }); + registerService(Context.BIOMETRIC_SERVICE, BiometricManager.class, + new CachedServiceFetcher<BiometricManager>() { + @Override + public BiometricManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + final IBinder binder = + ServiceManager.getServiceOrThrow(Context.BIOMETRIC_SERVICE); + final IBiometricService service = + IBiometricService.Stub.asInterface(binder); + return new BiometricManager(ctx.getOuterContext(), service); + } + }); + registerService(Context.TV_INPUT_SERVICE, TvInputManager.class, new CachedServiceFetcher<TvInputManager>() { @Override diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index d88f6e3f9bd1..981be833f3c0 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3031,6 +3031,7 @@ public abstract class Context { AUDIO_SERVICE, FINGERPRINT_SERVICE, //@hide: FACE_SERVICE, + BIOMETRIC_SERVICE, MEDIA_ROUTER_SERVICE, TELEPHONY_SERVICE, TELEPHONY_SUBSCRIPTION_SERVICE, @@ -3681,15 +3682,6 @@ public abstract class Context { public static final String AUDIO_SERVICE = "audio"; /** - * Use with {@link #getSystemService(String)} - * - * @hide - * @see #getSystemService(String) - * @see com.android.server.biometrics.BiometricPromptService - */ - public static final String BIOMETRIC_PROMPT_SERVICE = "biometric_prompt"; - - /** * Use with {@link #getSystemService(String)} to retrieve a * {@link android.hardware.fingerprint.FingerprintManager} for handling management * of fingerprints. @@ -3701,7 +3693,6 @@ public abstract class Context { /** * Use with {@link #getSystemService(String)} to retrieve a - * Use with {@link #getSystemService} to retrieve a * {@link android.hardware.face.FaceManager} for handling management * of face authentication. * @@ -3712,6 +3703,16 @@ public abstract class Context { public static final String FACE_SERVICE = "face"; /** + * Use with {@link #getSystemService(String)} to retrieve a + * {@link android.hardware.biometrics.BiometricManager} for handling management + * of face authentication. + * + * @see #getSystemService + * @see android.hardware.biometrics.BiometricManager + */ + public static final String BIOMETRIC_SERVICE = "biometric"; + + /** * Use with {@link #getSystemService} to retrieve a * {@link android.media.MediaRouter} for controlling and managing * routing of media. diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java new file mode 100644 index 000000000000..36e978b77cab --- /dev/null +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.hardware.biometrics; + +import static android.Manifest.permission.USE_BIOMETRIC; + +import android.annotation.RequiresPermission; +import android.content.Context; +import android.os.RemoteException; + +/** + * A class that contains biometric utilities. For authentication, see {@link BiometricPrompt}. + */ +public class BiometricManager { + + private final Context mContext; + private final IBiometricService mService; + + /** + * @hide + * @param context + * @param service + */ + public BiometricManager(Context context, IBiometricService service) { + mContext = context; + mService = service; + } + + /** + * Determine if there is at least one biometric enrolled. + * + * @return true if at least one biometric is enrolled, false otherwise + */ + @RequiresPermission(USE_BIOMETRIC) + public boolean hasEnrolledBiometrics() { + try { + return mService.hasEnrolledBiometrics(); + } catch (RemoteException e) { + return false; + } + } +} diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index 1cca27d158ab..92a814ca24c5 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -225,7 +225,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan private final IBinder mToken = new Binder(); private final Context mContext; - private final IBiometricPromptService mService; + private final IBiometricService mService; private final Bundle mBundle; private final ButtonInfo mPositiveButtonInfo; private final ButtonInfo mNegativeButtonInfo; @@ -250,8 +250,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } }; - IBiometricPromptServiceReceiver mBiometricPromptServiceReceiver = - new IBiometricPromptServiceReceiver.Stub() { + IBiometricServiceReceiver mBiometricServiceReceiver = + new IBiometricServiceReceiver.Stub() { @Override public void onAuthenticationSucceeded(long deviceId) throws RemoteException { @@ -290,8 +290,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan mBundle = bundle; mPositiveButtonInfo = positiveButtonInfo; mNegativeButtonInfo = negativeButtonInfo; - mService = IBiometricPromptService.Stub.asInterface( - ServiceManager.getService(Context.BIOMETRIC_PROMPT_SERVICE)); + mService = IBiometricService.Stub.asInterface( + ServiceManager.getService(Context.BIOMETRIC_SERVICE)); } /** @@ -516,7 +516,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan mAuthenticationCallback = callback; final long sessionId = crypto != null ? crypto.getOpId() : 0; mService.authenticate(mToken, sessionId, mContext.getUserId(), - mBiometricPromptServiceReceiver, 0 /* flags */, mContext.getOpPackageName(), + mBiometricServiceReceiver, 0 /* flags */, mContext.getOpPackageName(), mBundle, mDialogReceiver); } catch (RemoteException e) { Log.e(TAG, "Remote exception while authenticating", e); diff --git a/core/java/android/hardware/biometrics/IBiometricPromptService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 2c93579bc8bd..bfd6941d1583 100644 --- a/core/java/android/hardware/biometrics/IBiometricPromptService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -18,21 +18,25 @@ package android.hardware.biometrics; import android.os.Bundle; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; +import android.hardware.biometrics.IBiometricServiceReceiver; /** - * Communication channel from BiometricPrompt to BiometricPromptService. The interface does not - * expose specific biometric modalities. The system will use the default biometric for apps. On - * devices with more than one, the choice is dictated by user preference in Settings. + * Communication channel from BiometricPrompt and BiometricManager to BiometricService. The + * interface does not expose specific biometric modalities. The system will use the default + * biometric for apps. On devices with more than one, the choice is dictated by user preference in + * Settings. * @hide */ -interface IBiometricPromptService { +interface IBiometricService { // Requests authentication. The service choose the appropriate biometric to use, and show // the corresponding BiometricDialog. void authenticate(IBinder token, long sessionId, int userId, - IBiometricPromptServiceReceiver receiver, int flags, String opPackageName, + IBiometricServiceReceiver receiver, int flags, String opPackageName, in Bundle bundle, IBiometricPromptReceiver dialogReceiver); // Cancel authentication for the given sessionId void cancelAuthentication(IBinder token, String opPackageName); + + // Returns true if the user has at least one enrolled biometric. + boolean hasEnrolledBiometrics(); }
\ No newline at end of file diff --git a/core/java/android/hardware/biometrics/IBiometricPromptServiceReceiver.aidl b/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl index 1ef6c52c1594..71abdd246097 100644 --- a/core/java/android/hardware/biometrics/IBiometricPromptServiceReceiver.aidl +++ b/core/java/android/hardware/biometrics/IBiometricServiceReceiver.aidl @@ -20,10 +20,10 @@ import android.os.Bundle; import android.os.UserHandle; /** - * Communication channel from the BiometricPromptService back to BiometricPrompt. + * Communication channel from the BiometricService back to BiometricPrompt. * @hide */ -oneway interface IBiometricPromptServiceReceiver { +oneway interface IBiometricServiceReceiver { void onAuthenticationSucceeded(long deviceId); void onAuthenticationFailed(long deviceId); void onError(long deviceId, int error, String message); diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index a0122145c6e6..50d07449493e 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -17,7 +17,7 @@ package android.hardware.face; import android.os.Bundle; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; +import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.face.IFaceServiceReceiver; import android.hardware.face.Face; @@ -35,7 +35,7 @@ interface IFaceService { // This method invokes the BiometricDialog. The arguments are almost the same as above, // but should only be called from (BiometricPromptService). void authenticateFromService(boolean requireConfirmation, IBinder token, long sessionId, - int userId, IBiometricPromptServiceReceiver receiver, int flags, String opPackageName, + int userId, IBiometricServiceReceiver receiver, int flags, String opPackageName, in Bundle bundle, IBiometricPromptReceiver dialogReceiver, int callingUid, int callingPid, int callingUserId); diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 2b2c0b7a098f..2662a11c2dd4 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -17,7 +17,7 @@ package android.hardware.fingerprint; import android.os.Bundle; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; +import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintServiceReceiver; @@ -40,7 +40,7 @@ interface IFingerprintService { // called from BiometricPromptService. The additional uid, pid, userId arguments should be // determined by BiometricPromptService. void authenticateFromService(IBinder token, long sessionId, int userId, - IBiometricPromptServiceReceiver receiver, int flags, String opPackageName, + IBiometricServiceReceiver receiver, int flags, String opPackageName, in Bundle bundle, IBiometricPromptReceiver dialogReceiver, int callingUid, int callingPid, int callingUserId); diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 112329e48703..f126c49227fb 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -2783,7 +2783,48 @@ public final class ContactsContract { * The content:// style URI for this table, which requests a directory of * raw contact rows matching the selection criteria. */ - public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "raw_contacts"); + public static final Uri CONTENT_URI = + Uri.withAppendedPath(AUTHORITY_URI, "raw_contacts"); + + /** + * The URI to register for all raw contacts change notification. + * + * @hide + */ + @SystemApi + @TestApi + public static final Uri RAW_CONTACTS_NOTIFICATION_URI = + Uri.parse("content://com.android.contacts.raw_contacts"); + + /** + * The URI to register for raw contacts insert notification. + * + * @hide + */ + @SystemApi + @TestApi + public static final Uri RAW_CONTACTS_NOTIFICATION_INSERT_URI = + Uri.withAppendedPath(RAW_CONTACTS_NOTIFICATION_URI, "insert"); + + /** + * The URI to register for raw contacts update notification. + * + * @hide + */ + @SystemApi + @TestApi + public static final Uri RAW_CONTACTS_NOTIFICATION_UPDATE_URI = + Uri.withAppendedPath(RAW_CONTACTS_NOTIFICATION_URI, "update"); + + /** + * The URI to register for raw contacts delete notification. + * + * @hide + */ + @SystemApi + @TestApi + public static final Uri RAW_CONTACTS_NOTIFICATION_DELETE_URI = + Uri.withAppendedPath(RAW_CONTACTS_NOTIFICATION_URI, "delete"); /** * The MIME type of the results from {@link #CONTENT_URI} when a specific diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 0c9a85a92422..897f6fa53774 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -325,33 +325,6 @@ bool GraphicsJNI::SetPixels(JNIEnv* env, jintArray srcColors, int srcOffset, int return true; } -//////////////////// ToColor procs - -static void ToColor_SA8(SkColor dst[], const void* src, int width) { - SkASSERT(width > 0); - const uint8_t* s = (const uint8_t*)src; - do { - uint8_t c = *s++; - *dst++ = SkColorSetARGB(c, 0, 0, 0); - } while (--width != 0); -} - -static void ToF16_SA8(void* dst, const void* src, int width) { - SkASSERT(width > 0); - uint64_t* d = (uint64_t*)dst; - const uint8_t* s = (const uint8_t*)src; - - for (int i = 0; i < width; i++) { - uint8_t c = *s++; - SkPM4f a; - a.fVec[SkPM4f::R] = 0.0f; - a.fVec[SkPM4f::G] = 0.0f; - a.fVec[SkPM4f::B] = 0.0f; - a.fVec[SkPM4f::A] = c / 255.0f; - *d++ = a.toF16(); - } -} - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -416,23 +389,12 @@ static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src, SkImageInfo dstInfo = srcPM.info().makeColorType(dstCT); switch (dstCT) { case kRGB_565_SkColorType: - // copyTo() has never been strict on alpha type. Here we set the src to opaque to - // allow the call to readPixels() to succeed and preserve this lenient behavior. - if (kOpaque_SkAlphaType != srcPM.alphaType()) { - srcPM = SkPixmap(srcPM.info().makeAlphaType(kOpaque_SkAlphaType), srcPM.addr(), - srcPM.rowBytes()); - dstInfo = dstInfo.makeAlphaType(kOpaque_SkAlphaType); - } + dstInfo = dstInfo.makeAlphaType(kOpaque_SkAlphaType); break; case kRGBA_F16_SkColorType: // The caller does not have an opportunity to pass a dst color space. Assume that // they want linear sRGB. dstInfo = dstInfo.makeColorSpace(SkColorSpace::MakeSRGBLinear()); - - if (!srcPM.colorSpace()) { - // Skia needs a color space to convert to F16. nullptr should be treated as sRGB. - srcPM.setColorSpace(SkColorSpace::MakeSRGB()); - } break; default: break; @@ -445,57 +407,11 @@ static bool bitmapCopyTo(SkBitmap* dst, SkColorType dstCT, const SkBitmap& src, return false; } - // Skia does not support copying from kAlpha8 to types that are not alpha only. - // We will handle this case here. - if (kAlpha_8_SkColorType == srcPM.colorType() && kAlpha_8_SkColorType != dstCT) { - switch (dstCT) { - case kRGBA_8888_SkColorType: - case kBGRA_8888_SkColorType: { - for (int y = 0; y < src.height(); y++) { - const uint8_t* srcRow = srcPM.addr8(0, y); - uint32_t* dstRow = dst->getAddr32(0, y); - ToColor_SA8(dstRow, srcRow, src.width()); - } - return true; - } - case kRGB_565_SkColorType: { - for (int y = 0; y < src.height(); y++) { - uint16_t* dstRow = dst->getAddr16(0, y); - memset(dstRow, 0, sizeof(uint16_t) * src.width()); - } - return true; - } - case kRGBA_F16_SkColorType: { - for (int y = 0; y < src.height(); y++) { - const uint8_t* srcRow = srcPM.addr8(0, y); - void* dstRow = dst->getAddr(0, y); - ToF16_SA8(dstRow, srcRow, src.width()); - } - return true; - } - default: - return false; - } - } - SkPixmap dstPM; if (!dst->peekPixels(&dstPM)) { return false; } - // Skia needs a color space to convert from F16. nullptr should be treated as sRGB. - if (kRGBA_F16_SkColorType == srcPM.colorType() && !dstPM.colorSpace()) { - dstPM.setColorSpace(SkColorSpace::MakeSRGB()); - } - - // readPixels does not support color spaces with parametric transfer functions. This - // works around that restriction when the color spaces are equal. - if (kRGBA_F16_SkColorType != dstCT && kRGBA_F16_SkColorType != srcPM.colorType() && - dstPM.colorSpace() == srcPM.colorSpace()) { - dstPM.setColorSpace(nullptr); - srcPM.setColorSpace(nullptr); - } - return srcPM.readPixels(dstPM); } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index c2c9254867c0..3b124dabed88 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Probleem om Wi-Fi-oproepe by jou diensverskaffer te registreer: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi-oproep"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi-oproepe"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-oproep"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>-WLAN-oproep"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>-Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-oproepe | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g>-VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Af"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Verkies Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Verkies mobiel"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nie herken nie"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk is gestaaf"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Vingerafdrukhardeware is nie beskikbaar nie."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan nie gestoor word nie. Verwyder asseblief \'n bestaande vingerafdruk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Gesiguittelling is bereik. Probeer weer."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gesig kan nie geberg word nie."</string> <string name="face_error_canceled" msgid="283945501061931023">"Gesighandeling is gekanselleer."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogings. Probeer later weer."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogings. Gesigstawingsensor is gedeaktiveer."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer weer."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Kleurkorreksie"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aangeskakel"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Toeganklikheidskortpad het <xliff:g id="SERVICE_NAME">%1$s</xliff:g> afgeskakel"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gebruik weer toeganklikheidskortpad om die huidige toeganklikheidskenmerk te begin"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies \'n kenmerk om te gebruik wanneer jy op die Toeganklikheid-knoppie tik:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Raak en hou die Toeganklikheid-knoppie om kenmerke te verander."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 45f962b890f3..3cd1b5024d20 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ከእርስዎ አገልግሎት አቅራቢ ጋር የWi‑Fi ጥሪን በማስመዝገብ ላይ ችግር፦ <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"የ%s Wi-Fi ጥሪ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> የWi-Fi ጥሪ አደራረግ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"የWLAN ጥሪ"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> የWLAN ጥሪ"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"የWiFi ጥሪ አደራረግ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ጠፍቷል"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ተመርጧል"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"የተንቀሳቃሽ ስልክ ተመራጭ ነው"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"አልታወቀም"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"የጣት አሻራ ትክክለኛነት ተረጋግጧል"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"የጣት አሻራ ሃርድዌር አይገኝም።"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"የጣት አሻራ ሊከማች አይችልም። እባክዎ አሁን ያለውን የጣት አሻራ ያስወግዱ።"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"የፊት ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ፊት ሊከማች አይችልም።"</string> <string name="face_error_canceled" msgid="283945501061931023">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"በጣም ብዙ ሙከራዎች። የፊት ማረጋገጫ ተሰናክሏል።"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"እንደገና ይሞክሩ።"</string> @@ -868,7 +878,7 @@ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"በፊት መክፈት።"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"የሲም ፒን ክፈት።"</string> - <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"የሲም ፒዩኬ ክፈት።"</string> + <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"የሲም PUK ክፈት።"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"በይለፍ ቃል መክፈት።"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"የስርዓተ-ጥለት አካባቢ።"</string> <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"የማንሸራተቻ አካባቢ።"</string> @@ -1582,7 +1592,7 @@ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ሲም ካርዱን በመክፈት ላይ…"</string> <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ትክክል ያልሆነ ፒን ኮድ።"</string> <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ከ4 እስከ 8 ቁጥሮች የያዘ ፒን ይተይቡ።"</string> - <string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"የፒዩኬ ኮድ 8 ቁጥሮች ነው መሆን ያለበት።"</string> + <string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"የPUK ኮድ 8 ቁጥሮች ነው መሆን ያለበት።"</string> <string name="kg_invalid_puk" msgid="3638289409676051243">"ትክክለኛውን የPUK ኮድ እንደገና ያስገቡ። ተደጋጋሚ ሙከራዎች ሲም ካርዱን እስከመጨረሻው ያሰናክሉታል።"</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ፒን ኮዶች አይገጣጠሙም"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"በጣም ብዙ የስርዓተ ጥለት ሙከራዎች"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"የቀለም ማስተካከያ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አብርቶታል"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"የተደራሽነት አቋራጭ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ን አጥፍቶታል"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"አሁን ያለውን የተደራሽነት ባህሪ ለመጀመር እንደገና የተደራሽነት አቋራጭን ይጠቀሙ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"የተደራሽነት አዝራርን መታ በሚያደርጉበት ጊዜ ጥቅም ላይ የሚውለውን ባህሪ ይምረጡ፦"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ባህሪያትን ለመለወጥ የተደራሽነት አዝራሩን ይንኩ እና ይያዙት።"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ማጉላት"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index bbdea6adc2eb..cf3b0351959e 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -132,10 +132,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"حدثت مشكلة أثناء تسجيل الاتصال عبر Wi‑Fi باستخدام مشغِّل شبكة الجوّال: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s الاتصال عبر Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"الاتصال عبر شبكة Wi-Fi التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"مكالمة عبر شبكة WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"مكالمة عبر شبكة WLAN التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"شبكة Wi-Fi التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"الاتصال عبر شبكة WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"شبكة VoWifi التابعة لـ <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"إيقاف"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"شبكة Wi-Fi مفضّلة"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"شبكة بيانات الجوال مفضَّلة"</string> @@ -536,6 +540,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"لم يتم التعرف عليها."</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"تم مصادقة بصمة الإصبع"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"جهاز بصمة الإصبع غير متاح."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string> @@ -572,6 +580,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"انتهت مهلة التعرُّف على الوجه. أعِد المحاولة."</string> <string name="face_error_no_space" msgid="8224993703466381314">"يتعذَّر حفظ الوجه."</string> <string name="face_error_canceled" msgid="283945501061931023">"تمّ إلغاء عملية مصادقة الوجه."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"تمّ إجراء محاولات كثيرة. ميزة مصادقة الوجه متوقفة."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"يُرجى إعادة المحاولة."</string> @@ -1712,6 +1722,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"تصحيح الألوان"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"شغَّل اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"أوقف اختصار إمكانية الوصول خدمة <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"استخدِم اختصار إمكانية الوصول لبدء ميزة إمكانية الوصول الحالية."</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"يمكنك اختيار إحدى الميزات لاستخدامها عند النقر على زر إمكانية الوصول:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"لتغيير الميزات، يمكنك لمس زر \"إمكانية الوصول\" مع الاستمرار."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"التكبير"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 48d44b0f22bc..997486778665 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"আপোনাৰ বাহকৰ ওচৰত ৱাই-ফাই কলিং সুবিধা পঞ্জীয়ন কৰাত সমস্যাৰ উদ্ভৱ হৈছে: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ৱাই- ফাই কলিং"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ৱাই- ফাই কলিং"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN কল"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN কল"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ৱাই-ফাই"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ৱাই- ফাই কলিং | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"অফ হৈ আছে"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ৱাই-ফাইক অগ্ৰাধিকাৰ দিয়া হৈছে"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ম\'বাইলক অগ্ৰাধিকাৰ দিয়া হৈছে"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"চিনাক্ত কৰিব পৰা নাই"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ফিংগাৰপ্ৰিণ্টৰ সত্যাপন কৰা হ’ল"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ফিংগাৰপ্ৰিণ্ট হাৰ্ডৱেৰ নাই।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ফিংগাৰপ্ৰিণ্ট সঞ্চয় কৰিব পৰা নগ\'ল। পূর্বে সঞ্চিত ফিংগাৰপ্ৰিণ্ট এটা আঁতৰাওক।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ফিংগাৰপ্ৰিণ্ট গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"মুখমণ্ডল গ্ৰহণৰ সময়সীমা উকলি গৈছে। আকৌ চেষ্টা কৰক।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"মুখমণ্ডল সঞ্চয় কৰিব নোৱাৰি।"</string> <string name="face_error_canceled" msgid="283945501061931023">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অত্যধিক প্ৰয়াস। মুখমণ্ডলৰ জৰিয়তে সত্যাপন অক্ষম কৰা হ’ল।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"আকৌ চেষ্টা কৰক।"</string> @@ -1404,7 +1414,7 @@ <string name="forward_intent_to_work" msgid="621480743856004612">"আপুনি আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ ভিতৰত এই এপটো ব্যৱহাৰ কৰি আছে"</string> <string name="input_method_binding_label" msgid="1283557179944992649">"ইনপুট পদ্ধতি"</string> <string name="sync_binding_label" msgid="3687969138375092423">"ছিংক"</string> - <string name="accessibility_binding_label" msgid="4148120742096474641">"সাধ্য় সুবিধাসমূহ"</string> + <string name="accessibility_binding_label" msgid="4148120742096474641">"সাধ্য সুবিধাসমূহ"</string> <string name="wallpaper_binding_label" msgid="1240087844304687662">"ৱালপেপাৰ"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"ৱালপেপাৰ সলনি কৰক"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"জাননী নিৰীক্ষক"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ৰং শুধৰণী"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অন কৰিছে"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"দিব্যাংগসকলৰ সুবিধাৰ শ্বৰ্টকাটটোৱে <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ক অফ কৰিছে"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"বর্তমানৰ সাধ্য সুবিধাসমূহৰ আৰম্ভ কৰিবলৈ সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট পুনৰ ব্যৱহাৰ কৰক"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"আপুনি দিব্যাংগসকলৰ সুবিধাৰ বুটামটো টিপিলে ব্যৱহাৰ কৰিবলগীয়া কোনো সুবিধা বাছক:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"সুবিধাসমূহ সলনি কৰিবলৈ দিব্যাংগসকলৰ সুবিধাৰ বুটামটো স্পৰ্শ কৰি থাকক।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বিবৰ্ধন"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 44bcd565051e..3236b5237c8e 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Operatorla Wi‑Fi zənglərini qeydə alarkən xəta baş verdi: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Zəngi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Zəngi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Zəngi"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Zəngi"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi Zəngi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Deaktiv"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi tərcih edilir"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil tərcih"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmır"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmaq izi doğrulandı"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmaq izi üçün avadanlıq yoxdur."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmaq izi saxlana bilməz. Lütfən, mövcud barmaq izini silin."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmaq izinin vaxtı başa çatdı. Yenidən cəhd edin."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Üz proqramı taymerinin vaxtı bitdi. Yenidən cəhd edin."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Üz bərpa edilmədi."</string> <string name="face_error_canceled" msgid="283945501061931023">"Üz əməliyyatı ləğv edildi."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Həddindən çox cəhd. Sonraya saxlayın."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Həddindən çox cəhd. Üz identifikasiyası deaktiv edildi."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Yenidən cəhd edin."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Rəng korreksiyası"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini aktiv etdi"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Əlçatımlıq Qısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> xidmətini deaktiv etdi"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Cari əlçatımlılıq funksiyasını yenidən başlatmaq üçün Əlçatımlılıq Qısayolundan istifadə edin"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Əlçatımlılıq düyməsinə kliklədikdə istifadə etmək üçün funksiya seçin:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyaları dəyişmək üçün Əlçatımlılıq düyməsinə basıb saxlayın."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Böyütmə"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 260f63efb6d9..2bbf9b276349 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Problem u vezi sa registrovanjem pozivanja preko Wi‑Fi-ja kod mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Wi-Fi pozivanje preko operatera %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> pozivanje preko Wi-Fi-ja"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN poziv"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN poziv"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Pozivanje preko Wi-Fi-ja | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednost ima Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Želim mobilne podatke"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otiske prstiju nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vreme za proveru lica. Probajte ponovo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće sačuvati lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Obrada lica je otkazana."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Probajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Više pokušaja. Potvrda identiteta je onemogućena."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probajte ponovo."</string> @@ -1640,6 +1650,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcija boja"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Upotrebite ponovo prečicu za pristupačnost da biste pokrenuli aktuelnu funkciju pristupačnosti"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izaberite funkciju koja će se koristiti kada dodirnete dugme za pristupačnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pritisnite i zadržite dugme za pristupačnost da biste menjali funkcije."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 3d46662c996e..0ec976fedef6 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Памылка падключэння Wi‑Fi-тэлефаніі ў вашага аператара: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Wi-Fi-тэлефанія %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-тэлефанія ад <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Выклік праз WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Выклік праз WLAN ад <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ад <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-тэлефанія | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWi-Fi ад <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Выкл."</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Прыярытэт Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Прыярытэт мабільнай сеткі"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не распазнана"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Адбітак пальца распазнаны"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратныя сродкі адбіткаў пальцаў недаступныя."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Адбіткі пальцаў нельга захаваць. Выдаліце існы адбітак."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Час чакання твару выйшаў. Паўтарыце спробу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Не ўдалося захаваць твар."</string> <string name="face_error_canceled" msgid="283945501061931023">"Распазнаванне твару скасавана."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Занадта шмат спроб. Паўтарыце спробу пазней."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Занадта шмат спроб. Аўтэнтыфікацыя твару адключана"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Паўтарыце спробу."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Карэкцыя колеру"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў уключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Каб запусціць функцыю спецыяльных магчымасцей, паўторна скарыстайце ярлык спецыяльных магчымасцей"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберыце функцыю для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Каб змяняць функцыі, краніце і ўтрымлівайце кнопку \"Спецыяльныя магчымасці\"."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Павелічэнне"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e9ecba6b272b..3af930f6db4d 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"При регистрирането на функцията за обаждания през Wi-Fi с оператора ви възникна грешка: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s – обаждания през Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Обаждания през Wi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Обаждане през WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Обаждане през WLAN от <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Обаждания през Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWi-Fi от <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Изключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предпочита се Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Предпочитат се мобилни данни"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не е разпознато"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатъкът е удостоверен"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардуерът за отпечатъци не е налице."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Времето за изчакване изтече. Опитайте отново."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да бъде съхранено."</string> <string name="face_error_canceled" msgid="283945501061931023">"Операцията с лице е анулирана."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Твърде много опити. Опитайте отново по-късно."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Твърде много опити. Удост. с лице е деактивирано."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Опитайте отново."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Коригиране на цветовете"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Прекият път за достъпност включи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Прекият път за достъпност изключи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Използвайте отново прекия път към функцията за достъпност, за да стартирате текущата"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функция, която да използвате, когато докоснете бутона за достъпност:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За да промените функции, докоснете и задръжте бутона за достъпност."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ниво на мащаба"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 4ece21bea213..301bcc07876f 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"পরিষেবা প্রদানকারীতে ওয়াই-ফাই কলিং রেজিস্টার করতে সমস্যা হয়েছে: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ওয়াই-ফাই কলিং"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ওয়াই-ফাই কলিং"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN কল"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN কল"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ওয়াই-ফাই"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ওয়াই-ফাই কলিং | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"বন্ধ আছে"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"পছন্দের ওয়াই-ফাই"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"পছন্দের মোবাইল"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"স্বীকৃত নয়"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"আঙ্গুলের ছাপ যাচাই করা হয়েছে"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"আঙ্গুলের ছাপ নেওয়ার হার্ডওয়্যার অনুপলব্ধ৷"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ফেসের ছাপ নেওয়ার সময়সীমা শেষ৷ আবার চেষ্টা করুন৷"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ফেস স্টোর করা যাবে না।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"অনেকবার চেষ্টা করা হয়েছে৷ ফেস যাচাইকরণ বন্ধ আছে।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"আবার চেষ্টা করুন।"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"রঙ সংশোধন"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে চালু করেছে"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"অ্যাক্সেসযোগ্যতা শর্টকাট <xliff:g id="SERVICE_NAME">%1$s</xliff:g> কে বন্ধ করেছে"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"বর্তমান অ্যাক্সেসিবিলিটি বৈশিষ্ট্য শুরু করার জন্য অ্যাক্সেসিবিলিটি শর্টকাটটি আবার ব্যবহার করুন"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"অ্যাক্সেসযোগ্যতা বোতামের সাহায্যে যে বৈশিষ্ট্যটি নিয়ন্ত্রণ করতে চান, সেটি বেছে নিন:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"বৈশিষ্ট্যগুলি পরিবর্তন করতে অ্যাক্সেসযোগ্যতা বোতামটি ট্যাপ করে ধরে রাখুন।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"বড় করে দেখা"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 918ecf98be5c..e6fde5b1f3bc 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Došlo je do problema prilikom registracije pozivanja putem WiFi mreže kod vašeg operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Pozivanje putem WiFi-ja preko operatera %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Pozivanje putem WiFi-ja"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN poziv"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN poziv"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WiFi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Pozivanje putem WiFi-ja | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferira se WiFi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferira se mobilna mreža"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisak prsta je potvrđen"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta se ne može pohraniti. Uklonite postojeći otisak prsta."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vrijeme za prepoznavanje otiska prsta je isteklo. Pokušajte ponovo."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Vrijeme za prepoznavanje lica je isteklo. Pokušajte ponovo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Prepoznavanje lica je otkazano."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string> @@ -1642,6 +1652,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Ispravka boja"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečica za pristupačnost je uključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečica za pristupačnost je isključila uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Ponovo koristite Prečicu za pristupačnost da započnete trenutnu funkciju pristupačnosti"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite funkciju koja će se koristiti kada dodirnete dugme Pristupačnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da promijenite funkcije, dodirnite i držite dugme Pristupačnost."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Uvećanje"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index f6c46ba09a98..9318715935e5 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Hi ha hagut un problema en registrar les trucades per Wi-Fi amb el teu operador de telefonia mòbil: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Trucades per Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Trucades per Wi‑Fi (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Trucada per WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Trucada per WLAN (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi‑Fi (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Trucades per Wi‑Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi (<xliff:g id="SPN">%s</xliff:g>)"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivat"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferència per la Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferència per dades mòbils"</string> @@ -295,7 +299,7 @@ <string name="permgroupdesc_calllog" msgid="3006237336748283775">"llegir i editar el registre de trucades del telèfon"</string> <string name="permgrouprequest_calllog" msgid="8487355309583773267">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi als registres de trucades del telèfon?"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Telèfon"</string> - <string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades telefòniques"</string> + <string name="permgroupdesc_phone" msgid="6234224354060641055">"fer i gestionar trucades"</string> <string name="permgrouprequest_phone" msgid="9166979577750581037">"Vols permetre que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> faci trucades i les gestioni?"</string> <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensors corporals"</string> <string name="permgroupdesc_sensors" msgid="7147968539346634043">"accedir a les dades del sensor sobre els signes vitals"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No s\'ha reconegut"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"L\'empremta digital s\'ha autenticat"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El maquinari per a empremtes digitals no està disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"S\'ha esgotat el temps d\'espera. Torna-ho a provar."</string> <string name="face_error_no_space" msgid="8224993703466381314">"La cara no es pot desar."</string> <string name="face_error_canceled" msgid="283945501061931023">"S\'ha cancel·lat el reconeixement facial."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Massa intents. Torna-ho a provar més tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Massa intents. Autenticació facial desactivada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Torna-ho a provar."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correcció del color"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La drecera d\'accessibilitat ha activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La drecera d\'accessibilitat ha desactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Torna a utilitzar la drecera d\'accessibilitat per iniciar la funció d\'accessibilitat actual"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Tria la funció que s\'utilitzarà quan toquis el botó Accessibilitat:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per canviar les funcions, toca i mantén premut el botó Accessibilitat."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliació"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index e882f427b577..45c57d0007d4 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Při registraci volání přes Wi-Fi u operátora <xliff:g id="CODE">%1$s</xliff:g> došlo k chybě"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Volání přes Wi-Fi: %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>: volání přes Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Volání přes WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>: volání přes WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>: Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Volání přes Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g>: VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuto"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferována síť W-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferována mobilní data"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznáno"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Otisk byl ověřen"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Není k dispozici hardware ke snímání otisků prstů."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisk prstu nelze uložit. Odstraňte existující otisk prstu."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limit ověření obličeje vypršel. Zkuste to znovu."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Obličej nelze uložit."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operace snímání obličeje byla zrušena."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Příliš mnoho pokusů. Zkuste to později."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Příliš mnoho pokusů. Ověření obličeje je zakázáno."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Zkuste to znovu."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Oprava barev"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Zkratka přístupnosti zapnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Zkratka přístupnosti vypnula službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Znovu použijte zkratku přístupnosti, čímž spustíte aktuální funkci pro usnadnění přístupu"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Určete, jakou funkci aktivujete klepnutím na tlačítko Přístupnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Chcete-li vybrat jinou funkci, podržte tlačítko Přístupnost."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zvětšení"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 9a793a879da9..f279f0bb650d 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Der opstod et problem under registrering af Wi-Fi-opkald hos dit mobilselskab: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi-opkald"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-opkald via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-opkald"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-opkald via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-opkald | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi via <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Fra"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi-netværk er foretrukket"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobildata foretrækkes"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke genkendt"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeraftrykket blev godkendt"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardwaren til fingeraftryk er ikke tilgængelig."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeraftrykket kan ikke gemmes. Fjern et eksisterende fingeraftryk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Ansigtsgenkendelse fik timeout. Prøv igen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ansigtet kan ikke gemmes."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansigtshandlingen blev annulleret."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Du har prøvet for mange gange. Prøv igen senere."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøg – Ansigtsgenkendelse deaktiveret."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igen."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Korriger farve"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Genvejen til hjælpefunktioner aktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Genvejen til hjælpefunktioner deaktiverede <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Brug Genvej til hjælpefunktioner for at starte den aktuelle hjælpefunktion"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Vælg, hvilken funktion du vil bruge, når du trykker på knappen Hjælpefunktioner:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryk på knappen Hjælpefunktioner, og hold fingeren nede for at skifte funktioner."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørrelse"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 8eb0eb89825d..7ec4401180db 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Probleme beim Registrieren der WLAN-Telefonie bei deinem Mobilfunkanbieter: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s WLAN-Telefonie"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> WLAN-Telefonie"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-Anruf"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-Anruf"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WLAN"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WLAN-Telefonie | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWLAN"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Aus"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WLAN bevorzugt"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobilverbindung bevorzugt"</string> @@ -150,7 +154,7 @@ <string name="httpErrorAuth" msgid="1435065629438044534">"Bei der Authentifizierung ist ein Fehler aufgetreten."</string> <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Authentifizierung via Proxyserver ist fehlgeschlagen."</string> <string name="httpErrorConnect" msgid="8714273236364640549">"Verbindung zum Server konnte nicht hergestellt werden."</string> - <string name="httpErrorIO" msgid="2340558197489302188">"Kommunikation mit dem Server konnte nicht hergestellt werden. Bitte versuche es später erneut."</string> + <string name="httpErrorIO" msgid="2340558197489302188">"Kommunikation mit dem Server konnte nicht hergestellt werden. Bitte versuche es später noch einmal."</string> <string name="httpErrorTimeout" msgid="4743403703762883954">"Zeitüberschreitung bei Serververbindung."</string> <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Die Seite enthält zu viele Server-Redirects."</string> <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Das Protokoll wird nicht unterstützt."</string> @@ -158,7 +162,7 @@ <string name="httpErrorBadUrl" msgid="3636929722728881972">"Die Seite kann nicht geöffnet werden, weil die URL ungültig ist."</string> <string name="httpErrorFile" msgid="2170788515052558676">"Auf die Datei konnte nicht zugegriffen werden."</string> <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Die angeforderte Datei wurde nicht gefunden."</string> - <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Es werden zurzeit zu viele Anfragen verarbeitet. Versuche es später erneut."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Es werden zurzeit zu viele Anfragen verarbeitet. Bitte versuche es später noch einmal."</string> <string name="notification_title" msgid="8967710025036163822">"Fehler bei Anmeldung für <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="8353523060269335667">"Synchronisierung"</string> <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Synchronisierung nicht möglich"</string> @@ -515,23 +519,27 @@ <string name="permlab_mediaLocation" msgid="8675148183726247864">"Standorte aus meiner Mediensammlung abrufen"</string> <string name="permdesc_mediaLocation" msgid="2237023389178865130">"Ermöglicht der App, Standorte aus deiner Mediensammlung abzurufen."</string> <string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Biometrische Hardware nicht verfügbar"</string> - <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Fingerabdruck teilweise erkannt. Versuche es erneut."</string> - <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingerabdruck konnte nicht verarbeitet werden. Versuche es erneut."</string> - <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerabdrucksensor ist verschmutzt. Reinige ihn und versuche es erneut."</string> - <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger zu schnell bewegt. Versuche es erneut."</string> - <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Finger zu langsam bewegt. Versuche es erneut."</string> + <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Fingerabdruck teilweise erkannt. Bitte versuche es noch einmal."</string> + <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Fingerabdruck konnte nicht verarbeitet werden. Bitte versuche es noch einmal."</string> + <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Fingerabdrucksensor ist verschmutzt. Reinige ihn und versuche es noch einmal."</string> + <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Finger zu schnell bewegt. Bitte versuche es noch einmal."</string> + <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Finger zu langsam bewegt. Bitte versuche es noch einmal."</string> <string-array name="fingerprint_acquired_vendor"> </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nicht erkannt"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerabdruck wurde authentifiziert"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerabdruckhardware nicht verfügbar"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck."</string> - <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuche es erneut."</string> + <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Bitte versuche es noch einmal."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerabdruckvorgang abgebrochen"</string> <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Vorgang der Fingerabdruckauthentifizierung vom Nutzer abgebrochen."</string> - <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zu viele Versuche. Versuche es später erneut."</string> + <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zu viele Versuche. Bitte versuche es später noch einmal."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Zu viele Versuche. Der Fingerabdrucksensor wurde deaktiviert."</string> - <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bitte versuche es erneut."</string> + <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bitte versuche es noch einmal."</string> <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Keine Fingerabdrücke erfasst."</string> <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Dieses Gerät hat keinen Fingerabdrucksensor"</string> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Zeitüberschreitung für Gesicht. Versuch es erneut."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gesicht kann nicht gespeichert werden."</string> <string name="face_error_canceled" msgid="283945501061931023">"Gesichtserkennung abgebrochen."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Zu viele Versuche. Versuch es später noch einmal."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zu viele Versuche. Gesichtserkennung deaktiviert."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Versuch es noch einmal."</string> @@ -1085,7 +1095,7 @@ <string name="view_flight" msgid="7691640491425680214">"Verfolgen"</string> <string name="view_flight_desc" msgid="3876322502674253506">"Ausgewählten Flug verfolgen"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Der Speicherplatz wird knapp"</string> - <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Einige Systemfunktionen funktionieren möglicherweise nicht."</string> + <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Einige Systemfunktionen funktionieren eventuell nicht."</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Der Speicherplatz reicht nicht für das System aus. Stelle sicher, dass 250 MB freier Speicherplatz vorhanden sind, und starte das Gerät dann neu."</string> <string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> wird ausgeführt"</string> <string name="app_running_notification_text" msgid="1197581823314971177">"Für weitere Informationen oder zum Beenden der App tippen."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Farbkorrektur"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung aktiviert"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> wurde durch die Bedienungshilfenverknüpfung deaktiviert"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Verwende noch einmal die Verknüpfung für Bedienungshilfen, um die aktuelle Bedienungshilfe zu starten."</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wähle eine Funktion aus, die verwendet wird, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Um die Funktionen zu ändern, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergrößerung"</string> @@ -1723,7 +1734,7 @@ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Neue PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Neue PIN bestätigen"</string> <string name="restr_pin_create_pin" msgid="8017600000263450337">"PIN für das Ändern von Einschränkungen erstellen"</string> - <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Die PINs stimmen nicht überein. Bitte versuche es erneut."</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Die PINs stimmen nicht überein. Bitte versuche es noch einmal."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Die PIN ist zu kurz. Sie muss mindestens 4 Ziffern umfassen."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688"> <item quantity="other">In <xliff:g id="COUNT">%d</xliff:g> Sek. wiederholen</item> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 3a50f9e7d0f8..f2309e84b71b 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Παρουσιάστηκε πρόβλημα με την εγγραφή της κλήσης Wi‑Fi με την εταιρεία κινητής τηλεφωνίας: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Κλήση Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Κλήση Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Κλήση μέσω WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Κλήση μέσω WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Κλήση Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ανενεργό"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Προτίμηση Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Προτίμηση δικτύου κινητής τηλεφωνίας"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Δεν αναγνωρίστηκε"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Η ταυτότητα του δακτυλικού αποτυπώματος ελέγχθηκε"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Ο εξοπλισμός μοναδικού χαρακτηριστικού δεν είναι διαθέσιμος."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Λήξη χρονικού ορίου προσώπου. Δοκιμάστε ξανά."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Δεν είναι δυνατή η αποθήκευση του προσώπου."</string> <string name="face_error_canceled" msgid="283945501061931023">"Η ενέργεια προσώπου ακυρώθηκε."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Πολλές προσπάθειες. Αποτυχία ελέγ. ταυτ. προσώπου."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Δοκιμάστε ξανά."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Διόρθωση χρωμάτων"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Η συντόμευση προσβασιμότητας ενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Η συντόμευση προσβασιμότητας απενεργοποίησε την υπηρεσία <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Χρησιμοποιήστε τη Συντόμευση προσβασιμότητας ξανά, για να ξεκινήσετε την τρέχουσα λειτουργία προσβασιμότητας"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Επιλέξτε μια λειτουργία που θα χρησιμοποιείται κατά το πάτημα του κουμπιού \"Προσβασιμότητα\"."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Για να αλλάξετε λειτουργίες, αγγίξτε παρατεταμένα το κουμπί \"Προσβασιμότητα\"."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Μεγιστοποίηση"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 04b20ba076d5..1eeb1c33c4e0 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Calling"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index c1ca0c4a279a..699e50f33050 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Calling"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 04b20ba076d5..1eeb1c33c4e0 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Calling"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 04b20ba076d5..1eeb1c33c4e0 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your operator: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Calling"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognised"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Colour Correction"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 4add7752b58a..63726f8dc906 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Issue registering Wi‑Fi calling with your carrier: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Calling"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobile preferred"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Not recognized"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingerprint authenticated"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingerprint hardware not available."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerprint can\'t be stored. Please remove an existing fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint time out reached. Try again."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Face time out reached. Try again."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Face can’t be stored."</string> <string name="face_error_canceled" msgid="283945501061931023">"Face operation canceled."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Too many attempts. Facial authentication disabled."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Try again."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Color Correction"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use Accessibility Shortcut again to start the current accessibility feature"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choose a feature to use when you tap the Accessibility button:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"To change features, touch & hold the Accessibility button."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Magnification"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index f317a4ecc2ea..6a49e033d811 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Error al registrar la Llamada con Wi‑Fi con tu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Llamada por Wi-Fi de %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Llamada por Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Llamada por WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Llamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Llamada por Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivada"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Red Wi-Fi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Red móvil preferida"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoció"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se autenticó la huella digital"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware para detectar huellas digitales no está disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Se agotó el tiempo. Vuelve a intentarlo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"No se puede almacenar el rostro."</string> <string name="face_error_canceled" msgid="283945501061931023">"Se canceló el reconocimiento facial."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Vuelve a intentarlo."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de color"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo de accesibilidad activó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo de accesibilidad desactivó <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Vuelve a usar el acceso directo de accesibilidad para iniciar la función de accesibilidad actual"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Elige una función para usar cuando presionas el botón Accesibilidad:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar funciones, mantén presionado el botón Accesibilidad."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c42f53c8b21a..b62f4c9b435e 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"No se ha podido registrar la llamada por Wi‑Fi con tu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Llamadas Wi-Fi de %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Llamada por Wi‑Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Llamada por WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Llamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi‑Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Llamada por Wi‑Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWiFi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Dar preferencia a Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferir datos móviles"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"No se reconoce"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Se ha autenticado la huella digital"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"El hardware de huella digital no está disponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Has sobrepasado el tiempo. Inténtalo de nuevo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"No se pueden registrar más caras."</string> <string name="face_error_canceled" msgid="283945501061931023">"Se ha cancelado el reconocimiento facial."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autent. facial inhabilitada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Inténtalo de nuevo."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de color"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"El acceso directo a accesibilidad ha activado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"El acceso directo a accesibilidad ha desactivado <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Usa de nuevo la combinación de teclas de accesibilidad para iniciar la función de accesibilidad actual"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Selecciona la función que se utilizará cuando toques el botón Accesibilidad:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar las funciones, mantén pulsado el botón Accesibilidad."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliar"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index cc052c47289d..8f011f859c35 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Probleem WiFi-kõnede registreerimisel teie operaatoriga: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s WiFi kaudu helistamine"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>: WiFi-kõned"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-kõne"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>: WLAN-kõne"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>: WiFi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi-kõne | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g>: VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Väljas"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi eelistusega"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Eelistatud on mobiilne andmeside"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tuvastatud"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sõrmejälg autenditi"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sõrmejälje riistvara pole saadaval."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Näotuvastuse taimeri ajalõpp. Proovige uuesti."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nägu ei saa salvestada."</string> <string name="face_error_canceled" msgid="283945501061931023">"Näotuvastuse toiming tühistati."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Liiga palju katseid. Proovige hiljem uuesti."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liiga palju katseid. Näotuvastus on keelatud."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Proovige uuesti."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Värviparandus"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> sisse"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Juurdepääsetavuse otsetee lülitas teenuse <xliff:g id="SERVICE_NAME">%1$s</xliff:g> välja"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Praeguse juurdepääsufunktsiooni käivitamiseks kasutage juurdpääsetavuse otseteed uuesti"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valige, millist funktsiooni kasutada, kui vajutate nuppu Juurdepääsetavus:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funktsioonide muutmiseks puudutage pikalt nuppu Juurdepääsetavus."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurendus"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 275e17150be5..a070cc523e93 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Arazo bat izan da Wi‑Fi bidezko deiak zure operadorearekin erregistratzean: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi bidezko deiak"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi bidezko deiak"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN bidezko deia"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN bidezko deia"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi bidezko deiak | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desaktibatuta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi sarea hobesten da"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Datu-konexioa hobesten da"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ez da ezagutu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentifikatu da hatz-marka"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hatz-markaren hardwarea ez dago erabilgarri."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ezin da gorde hatz-marka digitala. Kendu lehendik gordeta duzunetako bat."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Gainditu da aurpegiak prozesatzeko denbora-muga. Saiatu berriro."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ezin da gorde aurpegia."</string> <string name="face_error_canceled" msgid="283945501061931023">"Utzi da aurpegiaren bidezko eragiketa."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Saiakera gehiegi egin dituzu. Desgaitu egin da autentifikazioa."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Saiatu berriro."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Koloreen zuzenketa"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktibatu du"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erabilerraztasun-lasterbideak <xliff:g id="SERVICE_NAME">%1$s</xliff:g> desaktibatu du"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Uneko erabilerraztasun-eginbidea abiarazteko, erabili erabilerraztasun-lasterbidea berriro"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Aukeratu zein eginbide erabili nahi duzun Erabilerraztasuna botoia sakatzean:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Eginbideak aldatzeko, eduki sakatuta Erabilerraztasuna botoia."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Lupa"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5055e8ba5c30..3101b7262df0 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"مشکل هنگام ثبت تماس ازطریق Wi‑Fi با شرکت مخابراتی: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"تماس %s Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"تماس ازطریق Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"تماس ازطریق WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"تماس ازطریق WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"درحال تماس ازطریق WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"خاموش"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"داده شبکه تلفن همراه ارجح است"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"شناسایی نشد"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"اثر انگشت احراز هویت شد"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"سختافزار اثرانگشت در دسترس نیست."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"مهلت زمانی شناسایی چهره تمام شد. دوباره امتحان کنید"</string> <string name="face_error_no_space" msgid="8224993703466381314">"نمیتوان چهره را ذخیره کرد."</string> <string name="face_error_canceled" msgid="283945501061931023">"عملیات شناسایی چهره لغو شد."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"چندین تلاش ناموفق. احراز هویت با چهره غیرفعال شد."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"دوباره امتحان کنید."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"تصحیح رنگ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را روشن کرد"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"«میانبر دسترسپذیری» <xliff:g id="SERVICE_NAME">%1$s</xliff:g> را خاموش کرد"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"برای راهاندازی ویژگی دسترسپذیری کنونی، دوباره از «میانبر دسترسپذیری» استفاده کنید"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"قابلیتی را انتخاب کنید که هنگام ضربه زدن روی دکمه «دسترسپذیری» استفاده میشود:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"برای تغییر دادن قابلیتها، دکمه «دسترسپذیری» را لمس کنید و نگهدارید."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"درشتنمایی"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index d54cb72cfc91..346992f89b85 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Virhe otettaessa Wi-Fi-puheluita käyttöön operaattorille <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Wi-Fi-puhelut: %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-puhelut (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-puhelu"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-puhelu (<xliff:g id="SPN">%s</xliff:g>)"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-puhelut | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ei käytössä"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ensisijainen"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobiiliverkko ensisijainen"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ei tunnistettu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sormenjälki tunnistettu"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Sormenjälkilaitteisto ei ole käytettävissä."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Kasvotoiminto aikakatkaistiin. Yritä uudelleen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Kasvoja ei voi tallentaa."</string> <string name="face_error_canceled" msgid="283945501061931023">"Kasvotoiminto peruutettu"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Liikaa yrityksiä. Kasvojentodennus ei käytössä."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Yritä uudelleen."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Värinkorjaus"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> otettiin käyttöön esteettömyystilan pikanäppäimellä."</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> poistettiin käytöstä esteettömyystilan pikanäppäimellä."</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Valitse esteettömyystilan oikopolku uudelleen käynnistääksesi esteettömyysominaisuuden"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Valitse toiminto, jonka Esteettömyys-painike aktivoi:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jos haluat muokata ominaisuuksia, kosketa Esteettömyys-painiketta pitkään."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Suurennus"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 0c0cdea4f571..16fd62a2bedd 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Une erreur s\'est produite lors de l\'enregistrement des appels Wi-Fi avec votre fournisseur de services : <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Appels Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Appels Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Appel WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Appel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Appels Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"Voix par Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Réseau Wi-Fi de préférence"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Connexion cellulaire de préférence"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Données biométriques non reconnues"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Temps de reconn. visage écoulé. Veuillez réessayer."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker le visage."</string> <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance du visage annulée."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Veuillez réessayer plus tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop de tentatives. Capt. reconn. visage désactivé."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correction des couleurs"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé la fonction <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilisez à nouveau le raccourci d\'accessibilité pour démarrer la fonctionnalité d\'accessibilité actuelle"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous touchez le bouton d\'accessibilité :"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer des fonctionnalités, maintenez le doigt sur le bouton d\'accessibilité."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zoom"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index e153082045ec..76eed1f5782c 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Problème lors de l\'enregistrement des appels Wi‑Fi avec votre opérateur : <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Appels Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Appels Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Appel WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Appel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Appels Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWiFi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi de préférence"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Priorité au mobile"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non reconnu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Empreinte digitale authentifiée"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Délai de détection du visage expiré. Réessayez."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Impossible de stocker les informations du visage."</string> <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance faciale annulée."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Réessayez plus tard."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Trop d\'essais. Authentification faciale désactivée."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Réessayez."</string> @@ -1300,14 +1310,14 @@ <string name="perm_costs_money" msgid="4902470324142151116">"Cela peut engendrer des frais"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> <string name="usb_charging_notification_title" msgid="1595122345358177163">"Appareil en charge via USB"</string> - <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Rechargement via USB de l\'appareil connecté"</string> + <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Recharge via USB de l\'appareil connecté"</string> <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transfert de fichiers via USB activé"</string> <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB activé"</string> <string name="usb_tether_notification_title" msgid="3716143122035802501">"Partage de connexion via USB activé"</string> <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB activé"</string> <string name="usb_accessory_notification_title" msgid="1785694450621427730">"Accessoire USB connecté"</string> <string name="usb_notification_message" msgid="3370903770828407960">"Appuyez ici pour plus d\'options."</string> - <string name="usb_power_notification_message" msgid="4647527153291917218">"Rechargement de l\'appareil connecté. Appuyez ici pour plus d\'options."</string> + <string name="usb_power_notification_message" msgid="4647527153291917218">"Recharge de l\'appareil connecté. Appuyez ici pour plus d\'options."</string> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessoire audio analogique détecté"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Appuyez ici pour en savoir plus."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correction des couleurs"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Le raccourci d\'accessibilité a activé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Le raccourci d\'accessibilité a désactivé <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilisez à nouveau le raccourci d\'accessibilité pour démarrer la fonctionnalité d\'accessibilité actuelle"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Choisissez une fonctionnalité à utiliser lorsque vous appuyez sur le bouton d\'accessibilité :"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pour changer des fonctionnalités, appuyez de manière prolongée sur le bouton d\'accessibilité."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Agrandissement"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index ba66adfe31ca..f64491986cdb 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Produciuse un problema ao rexistrar as chamadas por wifi co teu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Chamadas por wifi de %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamadas por wifi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wifi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Chamadas por wifi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wifi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Datos móbiles preferidos"</string> @@ -298,8 +302,8 @@ <string name="permgroupdesc_phone" msgid="6234224354060641055">"facer e xestionar chamadas telefónicas"</string> <string name="permgrouprequest_phone" msgid="9166979577750581037">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> realice e xestione chamadas telefónicas?"</string> <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string> - <string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos do sensor sobre as túas constantes vitais"</string> - <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda aos datos do sensor sobre as túas constantes vitais?"</string> + <string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder aos datos dos sensores sobre as túas constantes vitais"</string> + <string name="permgrouprequest_sensors" msgid="6349806962814556786">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda aos datos dos sensores sobre as túas constantes vitais?"</string> <string name="permgrouplab_aural" msgid="965607064083134896">"Música"</string> <string name="permgroupdesc_aural" msgid="4870189506255958055">"acceder á música"</string> <string name="permgrouprequest_aural" msgid="6787926123071735620">"Queres permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda á túa música?"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non se recoñeceu"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autenticouse a impresión dixital"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impresión dixital non dispoñible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Esgotouse o tempo de espera. Téntao de novo."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Non se puido almacenar a cara."</string> <string name="face_error_canceled" msgid="283945501061931023">"Cancelouse a operación relacionada coa cara"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Téntao de novo máis tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiados intentos. Autenticación desactivada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Téntao de novo."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Corrección de cor"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atallo de accesibilidade activou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atallo de accesibilidade desactivou <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Para iniciar a función de accesibilidade actual, utiliza de novo o atallo de accesibilidade"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolle que función queres utilizar cando toques o botón Accesibilidade:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para cambiar as funcións, mantén premido o botón Accesibilidade."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliación"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 2b96f3fe6c11..4ea553cb0043 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"તમારા કૅરિઅરમાં વાઇ-ફાઇ કૉલિંગ રજિસ્ટર કરવામાં સમસ્યા આવી: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s વાઇ-ફાઇ કૉલિંગ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> વાઇ-ફાઇ કૉલિંગ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN કૉલ"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN કૉલ"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> વાઇ-ફાઇ"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"વાઇ-ફાઇ કૉલિંગ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"બંધ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"વાઇ-ફાઇ પસંદ કર્યું"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"મોબાઇલને પસંદગી"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ઓળખાયેલ નથી"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ફિંગરપ્રિન્ટ પ્રમાણિત કરી"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ફિંગરપ્રિન્ટ હાર્ડવેર ઉપલબ્ધ નથી."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ફિંગરપ્રિન્ટ સંગ્રહિત કરી શકાતી નથી. કૃપા કરીને અસ્તિત્વમાંની ફિંગરપ્રિન્ટ દૂર કરો."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ચહેરા માટેનો સમય સમાપ્ત થયો. ફરી પ્રયાસ કરો."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ચહેરો સંગ્રહિત કરી શકાશે નહીં."</string> <string name="face_error_canceled" msgid="283945501061931023">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ઘણા બધા પ્રયત્નો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ફરી પ્રયાસ કરો."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"રંગ સુધારણા"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ઍક્સેસિબિલિટી શૉર્ટકટે <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"વર્તમાન ઍક્સેસિબિલિટી સુવિધાને શરૂ કરવા માટે ફરીથી ઍક્સેસિબિલિટી શૉર્ટકટનો ઉપયોગ કરો"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"જ્યારે તમે ઍક્સેસિબિલિટી બટન પર ટૅપ કરો, ત્યારે ઉપયોગ કરવાની સુવિધા પસંદ કરો:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"સુવિધાઓ બદલવા માટે, ઍક્સેસિબિલિટી બટન દબાવી રાખો."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"વિસ્તૃતીકરણ"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6afe603993ab..c24b0ae0ca43 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"वाई-फ़ाई कॉलिंग की सुविधा के लिए आपकी मोबाइल और इंटरनेट सेवा देने वाली कंपनी के साथ रजिस्टर करने से जुड़ी समस्या: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s वाई-फ़ाई कॉलिंग"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> वाई-फ़ाई कॉलिंग"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कॉल"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कॉल"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> वाई-फ़ाई"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"वाई-फ़ाई कॉलिंग | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"बंद"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"वाई-फ़ाई को प्राथमिकता"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"मोबाइल को प्राथमिकता"</string> @@ -526,6 +530,10 @@ <!-- no translation found for biometric_not_recognized (5770511773560736082) --> <skip /> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फ़िंगरप्रिंट की पुष्टि हो गई"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फ़िंगरप्रिंट हार्डवेयर उपलब्ध नहीं है."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहित नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string> @@ -562,6 +570,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरे की पहचान का समय खत्म हुआ. फिर से कोशिश करें."</string> <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा सेव करने की सीमा पूरी हो गई है."</string> <string name="face_error_canceled" msgid="283945501061931023">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"कई बार कोशिश की गई. बाद में कोशिश करें."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"कई बार कोशिश की. चेहरा पहचानने की सुविधा बंद हुई."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"फिर से कोशिश करें."</string> @@ -1618,6 +1628,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"रंग में सुधार करने की सुविधा"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को चालू किया"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"सुलभता शॉर्टकट ने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> को बंद किया"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"मौजूदा सुलभता सुविधा शुरू करने के लिए \'सुलभता शॉर्टकट\' का फिर से इस्तेमाल करें"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"सुलभता बटन पर टैप करते समय इस्तेमाल की जाने वाली सुविधा चुनें:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाओं में बदलाव करने के लिए, सुलभता बटन को दबाकर रखें."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"बड़ा करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index e7b6b5fc6ac8..6a9d307070d9 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Poteškoća s registracijom Wi‑Fi poziva kod mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi pozivanje"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi pozivi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Poziv putem WLAN-a"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> poziv putem WLAN-a"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi pozivi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednost ima Wi-Fi mreža"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Za mobilne uređaje"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nije prepoznato"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Autentificirano otiskom prsta"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otisak prsta nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Isteklo je vrijeme čekanja za lice. Pokušajte opet"</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nije moguće pohraniti lice."</string> <string name="face_error_canceled" msgid="283945501061931023">"Otkazana je radnja s licem."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Previše pokušaja. Autentifikacija lica onemogućena"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Pokušajte ponovo."</string> @@ -1640,6 +1650,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcija boje"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Prečac pristupačnosti uključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Prečac pristupačnosti isključio je uslugu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Ponovo upotrijebite prečac pristupačnosti da biste pokrenuli trenutačnu značajku pristupačnosti"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Odaberite značajku koju ćete upotrebljavati kada dodirnete gumb Pristupačnost:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Da biste promijenili značajke, dodirnite i zadržite gumb Pristupačnost."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povećavanje"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 3d9a35bbb6c3..474c73a287f4 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Hiba történt a Wi‑Fi-hívás szolgáltatónál való regisztrálása során: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi-hívás"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-hívás"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-hívás"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-hívás"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-hívás | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ki"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi előnyben részesítve"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferált: mobil"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nem ismerhető fel"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Ujjlenyomat hitelesítve"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Az ujjlenyomathoz szükséges hardver nem érhető el."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Időtúllépés az arcbeolvasásnál. Próbálja újra."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Az arc nem tárolható."</string> <string name="face_error_canceled" msgid="283945501061931023">"Az arccal kapcsolatos művelet törölve."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Túl sok próbálkozás. Próbálja újra később."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Túl sok próbálkozás. Arcfelismerés letiltva."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Próbálkozzon újra."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Színkorrekció"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"A Kisegítő lehetőségek gyorsparancsa bekapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"A Kisegítő lehetőségek gyorsparancsa kikapcsolta a következő szolgáltatást: <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Használja újból a Kisegítő lehetőségek gyorsparancsát az aktuális kisegítő lehetőségek elindításához"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Válassza ki a Kisegítő lehetőségek gombra koppintáskor használni kívánt funkciót:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"A funkciók módosításához tartsa lenyomva a Kisegítő lehetőségek gombot."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Nagyítás"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 6a5f287d6f68..b9e6c6263e96 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Wi‑Fi-ի միջոցով արվող զանգերը չհաջողվեց գրանցել ձեր օպերատորի մոտ՝ <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi զանգեր"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-ի միջոցով զանգեր"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Զանգ WLAN ցանցով"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ցանցով զանգեր"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Զանգեր Wi-Fi-ի միջոցով | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Անջատված է"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi, նախընտրելի"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Նախընտրելի է բջջային ցանցը"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Չհաջողվեց ճանաչել"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Մատնահետքը նույնականացվեց"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Մատնահետքի սարքն անհասանելի է:"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Հնարավոր չէ պահել մատնահետքը: Հեռացրեք առկա մատնահետքը:"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Մատնահետքի գրանցման ժամանակը սպառվել է: Փորձեք նորից:"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Ժամանակը սպառվել է: Նորից փորձեք:"</string> <string name="face_error_no_space" msgid="8224993703466381314">"Դեմքը հնարավոր չէ պահել։"</string> <string name="face_error_canceled" msgid="283945501061931023">"Դեմքի ճանաչումը չեղարկվել է։"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Չափից շատ փորձեր եք կատարել: Դեմքի ճանաչման գործառույթն անջատվել է։"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Նորից փորձեք:"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Գունաշտկում"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Մատչելիության դյուրանցումն միացրել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Մատչելիության դյուրանցումն անջատել է <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ծառայությունը"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Հատուկ գործառույթների դյուրանցումը գործարկելու համար նորից օգտագործեք համապատասխան դյուրանցումը"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Ընտրեք որևէ գործառույթ, որը կօգտագործվի Հատուկ գործառույթներ կոճակին հպելու դեպքում՝"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Գործառույթները փոխելու համար հպեք և պահեք Հատուկ գործառույթներ կոճակը։"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Խոշորացում"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 6d1da48b1264..8298a18eae03 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Terjadi masalah saat mendaftarkan panggilan Wi‑Fi dengan operator Anda: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Panggilan Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Panggilan WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Panggilan WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Panggilan WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Nonaktif"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi dipilih"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Seluler dipilih"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Sidik jari diautentikasi"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware sidik jari tidak tersedia."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sidik jari tidak dapat disimpan. Hapus sidik jari yang ada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Waktu sidik jari habis. Coba lagi."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Waktu tunggu wajah habis. Harap coba lagi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string> <string name="face_error_canceled" msgid="283945501061931023">"Pemrosesan wajah dibatalkan."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percobaan. Coba lagi nanti."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu sering dicoba. Autentikasi wajah dinonaktifkan."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Coba lagi."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Koreksi Warna"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan Aksesibilitas mengaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Aksesibilitas menonaktifkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gunakan Pintasan Aksesibilitas lagi untuk memulai fitur aksesibilitas saat ini"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih fitur yang akan digunakan saat menge-tap tombol Aksesibilitas:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk mengubah fitur, sentuh & tahan tombol Aksesibilitas."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 4d7996fb1fb4..2649a1a05b1f 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Vandamál kom upp við að skrá Wi‑Fi símtöl hjá símafyrirtækinu: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi símtöl"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi símtöl"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-símtal"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-símtal"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi símtal | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Slökkt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi í forgangi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Farsímakerfi í forgangi"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Þekktist ekki"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingrafar staðfest"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Fingrafarsvélbúnaður ekki til staðar."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tímamörk runnu út fyrir andlit. Reyndu aftur."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ekki tókst að geyma andlit."</string> <string name="face_error_canceled" msgid="283945501061931023">"Hætt við andlitsgreiningu."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Of margar tilraunir. Reyndu aftur síðar."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Of margar tilraunir. Slökkt á andlitsgreiningu."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Reyndu aftur."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Litaleiðrétting"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Flýtileið aðgengisstillingar kveikti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Flýtileið aðgengisstillingar slökkti á <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Notaðu flýtileið aðgengisstillingar aftur til að opna aðgengiseiginleika"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Veldu eiginleika sem á að nota þegar ýtt er á aðgengishnappinn:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Haltu fingri á aðgengishnappinum til að breyta eiginleikum."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Stækkun"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 44818a3bc10e..5c28097f3dc2 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Si è verificato un problema con la registrazione delle chiamate Wi‑Fi con l\'operatore: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Chiamata Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chiamate Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chiamata WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chiamata WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Chiamate Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Non attiva"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Rete preferita: Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Rete preferita: dati mobili"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Non riconosciuto"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impronta digitale autenticata"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware per l\'impronta digitale non disponibile."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Timeout operazione associata al volto. Riprova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Il volto non può essere memorizzato."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operazione associata al volto annullata."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Troppi tentativi. Riprova più tardi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Troppi tentativi. Autenticazione disattivata."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Riprova."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correzione del colore"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"La scorciatoia Accessibilità ha attivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"La scorciatoia Accessibilità ha disattivato <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Usa di nuovo la scorciatoia Accessibilità per avviare l\'attuale funzione di accessibilità"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Scegli una funzione da usare quando tocchi il pulsante Accessibilità:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Per cambiare le funzioni, tocca e tieni premuto il pulsante Accessibilità."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ingrandimento"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index fd5c2a11051d..5dd16172d3c3 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"אירעה בעיה ברישום שיחות Wi-Fi אצל הספק שלך: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"שיחות Wi-Fi של %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"שיחות Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"שיחה ברשת אלחוטית"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"שיחת WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"שיחות WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"כבוי"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi מועדף"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"מצב מועדף: רשת סלולרית"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"לא זוהתה"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"טביעת האצבע אומתה"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"החומרה בשביל טביעת אצבע אינה זמינה."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"חלף הזמן הקצוב לזיהוי הפנים. יש לנסות שוב."</string> <string name="face_error_no_space" msgid="8224993703466381314">"לא ניתן לשמור את הפנים."</string> <string name="face_error_canceled" msgid="283945501061931023">"פעולת הפנים בוטלה."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"יותר מדי ניסיונות. אימות הפנים הושבת."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"יש לנסות שוב."</string> @@ -1228,13 +1238,13 @@ <string name="volume_call" msgid="3941680041282788711">"עוצמת קול בשיחה"</string> <string name="volume_bluetooth_call" msgid="2002891926351151534">"עוצמת הקול בשיחה ב-Bluetooth"</string> <string name="volume_alarm" msgid="1985191616042689100">"עוצמת קול של התראה"</string> - <string name="volume_notification" msgid="2422265656744276715">"עוצמת קול של הודעות"</string> + <string name="volume_notification" msgid="2422265656744276715">"עוצמת הקול של ההתראות"</string> <string name="volume_unknown" msgid="1400219669770445902">"עוצמת קול"</string> <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"עוצמת קול של Bluetooth"</string> <string name="volume_icon_description_ringer" msgid="3326003847006162496">"עוצמת קול של רינגטון"</string> <string name="volume_icon_description_incall" msgid="8890073218154543397">"עוצמת קול של שיחות"</string> <string name="volume_icon_description_media" msgid="4217311719665194215">"עוצמת קול של מדיה"</string> - <string name="volume_icon_description_notification" msgid="7044986546477282274">"עוצמת קול של הודעות"</string> + <string name="volume_icon_description_notification" msgid="7044986546477282274">"עוצמת הקול של ההתראות"</string> <string name="ringtone_default" msgid="3789758980357696936">"רינגטון ברירת מחדל"</string> <string name="ringtone_default_with_actual" msgid="1767304850491060581">"ברירת מחדל (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> <string name="ringtone_silent" msgid="7937634392408977062">"ללא"</string> @@ -1502,7 +1512,7 @@ <string name="sync_really_delete" msgid="2572600103122596243">"מחק את הפריטים"</string> <string name="sync_undo_deletes" msgid="2941317360600338602">"בטל את פעולות המחיקה"</string> <string name="sync_do_nothing" msgid="3743764740430821845">"אל תעשה דבר כרגע"</string> - <string name="choose_account_label" msgid="5655203089746423927">"בחר חשבון"</string> + <string name="choose_account_label" msgid="5655203089746423927">"בחירת חשבון"</string> <string name="add_account_label" msgid="2935267344849993553">"הוספת חשבון"</string> <string name="add_account_button_label" msgid="3611982894853435874">"הוספת חשבון"</string> <string name="number_picker_increment_button" msgid="2412072272832284313">"הוסף"</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"תיקון צבעים"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הופעל על-ידי קיצור הדרך לנגישות"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> הושבת על-ידי קיצור הדרך לנגישות"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"יש להשתמש שוב במקש הקיצור לנגישות כדי להפעיל את תכונת הנגישות הנוכחית"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"בחר תכונה שתופעל כשתלחץ על הלחצן \'נגישות\':"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"כדי להחליף תכונה, גע בלחצן \'נגישות\' והחזק אותו."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"הגדלה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 4915111c9e07..7b53ed4e44d2 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"携帯通信会社への Wi‑Fi 通話の登録中に問題が発生しました(<xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Wi-Fi通話(%s)"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi 通話 | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"OFF"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi優先"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"モバイル優先"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"認識されませんでした"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋認証を完了しました"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋ハードウェアは使用できません。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋を保存できません。既存の指紋を削除してください。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"読み取りのタイムアウトです。もう一度お試しください。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"顔の情報を保存できません。"</string> <string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"試行回数の上限です。顔認証は無効になりました。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"もう一度お試しください。"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"色補正"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は ON になっています"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ユーザー補助機能のショートカットにより <xliff:g id="SERVICE_NAME">%1$s</xliff:g> は OFF になっています"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"現在のユーザー補助機能を開始するには、ユーザー補助機能のショートカットをもう一度使用してください"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"[ユーザー補助] ボタンをタップした場合に使用する機能を選択してください。"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"機能を変更するには、[ユーザー補助] ボタンを押し続けてください。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"拡大"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 51a4c28f4d9e..722629698789 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Wi‑Fi დარეკვის თქვენს ოპერატორთან რეგისტრირებისას შეცდომა წარმოიქმნა: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s დარეკვა Wi-Fi-ს მეშვეობით"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi დარეკვა"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ზარი"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ზარი"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi დარეკვა | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"გამორთული"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"სასურველია Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"უპირატესობა მიენიჭოს მობილურს"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"არ არის ამოცნობილი"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"თითის ანაბეჭდი ავტორიზებულია"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"თითის ანაბეჭდის აპარატურა არ არის ხელმისაწვდომი."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"სახის ამოცნობის დრო ამოიწურა. ცადეთ ხელახლა."</string> <string name="face_error_no_space" msgid="8224993703466381314">"სახის შენახვა ვერ მოხერხდა."</string> <string name="face_error_canceled" msgid="283945501061931023">"სახის ამოცნობა გაუქმდა."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"დაფიქსირდა ბევრი მცდელობა. სახის ამოცნობა გაითიშა."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ცადეთ ხელახლა."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ფერთა კორექცია"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"მარტივი წვდომის მალსახმობმა ჩართო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"მარტივი წვდომის მალსახმობმა გამორთო <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"მარტივი წვდომის ამჟამინდელი ფუნქციის გასაშვებად გამოიყენეთ მარტივი წვდომის მალსახმობი"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"აირჩიეთ მარტივი წვდომის ღილაკზე შეხებისას გამოსაყენებელი ფუნქცია:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ფუნქციების შესაცვლელად ხანგრძლივად შეეხეთ მარტივი წვდომის ღილაკს."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"გადიდება"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 18be1e6d285f..457933e16444 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Оператордың Wi‑Fi қоңырауын тіркеу кезінде қате шықты: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi арқылы қоңырау шалу"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi қоңыраулары"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN қоңырауы"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN қоңырауы"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi қоңыраулары | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Өшірулі"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Қалаулы Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Таңдаулы мобильдік байланыс"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Танылмады"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Саусақ ізі аутентификацияланды"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Саусақ ізі жабдығы қолжетімді емес."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Саусақ ізін сақтау мүмкін емес. Бар саусақ ізін жойыңыз."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Саусақ ізін күту уақыты бітті. Әрекетті қайталаңыз."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Күту уақыты бітті. Әрекетті қайталаңыз."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Бетті сақтау мүмкін емес."</string> <string name="face_error_canceled" msgid="283945501061931023">"Бетті танудан бас тартылды."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Тым көп әрекет жасалды. Кейінірек қайталаңыз."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Тым көп әрекет жасалды. Бетті тану функциясы өшірілді."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Қайталап көріңіз."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Түсті түзету"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін қосты"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Арнайы мүмкіндіктер таңбашасы <xliff:g id="SERVICE_NAME">%1$s</xliff:g> қызметін өшірді"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Арнайы мүмкіндіктер функциясын іске қосу үшін оның таңбашасын пайдаланыңыз"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"\"Арнайы мүмкіндіктер\" түймесін түрткенде пайдаланатын мүмкіндікті таңдаңыз:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Мүмкіндіктерді өзгерту үшін \"Арнайы мүмкіндіктер\" түймесін түртіп, ұстап тұрыңыз."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ұлғайту"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 091fa713db5f..b3a3a01c7564 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"មានបញ្ហាក្នុងការចុះឈ្មោះការហៅតាម Wi‑Fi ជាមួយក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក៖ <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"ការហៅតាមរយៈ Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ការហៅតាម Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"ការហៅតាម WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> ការហៅតាម WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ការហៅតាម WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"បិទ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ជាអាទិភាព"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ទិន្នន័យទូរសព្ទចល័តជាអាទិភាព"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"មិនអាចសម្គាល់បានទេ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"បានផ្ទៀងផ្ទាត់ស្នាមម្រាមដៃ"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ផ្នែករឹងស្នាមម្រាមដៃមិនមានទេ។"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"មិនអាចផ្ទុកស្នាមម្រាមដៃទេ។ សូមយកស្នាមម្រាមដៃដែលមានស្រាប់ចេញ។"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ការផ្តិតម្រាមដៃបានអស់ពេល។ សូមព្យាយាមម្តងទៀត។"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ការសម្គាល់ផ្ទៃមុខបានអស់ម៉ោង។ សូមព្យាយាមម្ដងទៀត។"</string> <string name="face_error_no_space" msgid="8224993703466381314">"មិនអាចរក្សាទុកផ្ទៃមុខបានទេ។"</string> <string name="face_error_canceled" msgid="283945501061931023">"បានបោះបង់ប្រតិបត្តិការចាប់ផ្ទៃមុខ។"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ព្យាយាមចូលច្រើនពេកហើយ។ បានបិទការផ្ទៀងផ្ទាត់ផ្ទៃមុខ។"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"សូមព្យាយាមម្ដងទៀត។"</string> @@ -1618,6 +1628,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ការកែពណ៌"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ផ្លូវកាត់ភាពងាយស្រួលបានបើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ផ្លូវកាត់ភាពងាយស្រួលបានបិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ប្រើផ្លូវកាត់ភាពងាយស្រួលម្ដងទៀត ដើម្បីចាប់ផ្ដើមមុខងារភាពងាយប្រើបច្ចុប្បន្ន"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ជ្រើសរើសមុខងារដែលត្រូវប្រើ នៅពេលដែលអ្នកចុចប៊ូតុងភាពងាយស្រួល៖"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ដើម្បីផ្លាស់ប្តូរមុខងារ សូមចុចប៊ូតុងភាពងាយស្រួលឲ្យជាប់។"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ការពង្រីក"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index e228d35d7067..2dc0bb1cfcec 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ನಿಮ್ಮ ವಾಹಕದೊಂದಿಗೆ ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ ಸಮಸ್ಯೆ ನೋಂದಾಯಿಸುವಿಕೆ: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ಕರೆ"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ಕರೆ"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ವೈ-ಫೈ"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ವೈಫೈ ಕರೆಮಾಡುವಿಕೆ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ಆಫ್"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ವೈ-ಫೈಗೆ ಆದ್ಯತೆ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ಮೊಬೈಲ್ಗೆ ಆದ್ಯತೆ"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಪ್ರಮಾಣೀಕರಣ ಮಾಡಲಾಗಿದೆ"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ಬೆರಳಚ್ಚು ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ಬೆರಳಚ್ಚು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬೆರಳಚ್ಚು ತೆಗೆದುಹಾಕಿ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಬೆರಳಚ್ಚು ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ಮುಖ ಸಮಯದ ಅವಧಿಯನ್ನು ತಲುಪಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ಮುಖವನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುವುದಿಲ್ಲ."</string> <string name="face_error_canceled" msgid="283945501061931023">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ಹಲವು ಪ್ರಯತ್ನ. ಮುಖದ ದೃಢೀಕರಣ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆನ್ ಮಾಡಿದೆ"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ಪ್ರಸ್ತುತ ಪ್ರವೇಶದ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಪ್ರಾರಂಭಿಸಲು ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃ ಬಳಸಿ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ನೀವು ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ ಬಳಸುವುದಕ್ಕಾಗಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆರಿಸಿ:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಪ್ರವೇಶಿಸುವಿಕೆ ಬಟನ್ ಒತ್ತಿಹಿಡಿದುಕೊಳ್ಳಿ."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ಹಿಗ್ಗಿಸುವಿಕೆ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d37a4750e205..abed24c1070d 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"이동통신사를 통해 Wi‑Fi 통화를 등록하는 중에 문제가 발생했습니다. 오류 코드: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi 통화"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 통화"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 통화"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 통화"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi 통화 | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"꺼짐"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi를 기본으로 설정"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"모바일에 최적화됨"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"인식할 수 없음"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"지문이 인증됨"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"지문 인식 하드웨어를 사용할 수 없습니다."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"지문을 저장할 수 없습니다. 기존 지문을 삭제하세요."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"얼굴 인식 시간이 초과되었습니다. 다시 시도하세요."</string> <string name="face_error_no_space" msgid="8224993703466381314">"얼굴을 저장할 수 없습니다."</string> <string name="face_error_canceled" msgid="283945501061931023">"얼굴 인식 작업이 취소되었습니다."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"시도 횟수가 너무 많아 얼굴 인증이 사용 중지되었습니다."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"다시 시도해 보세요."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"색상 보정"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 설정되었습니다."</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"접근성 단축키로 인해 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>이(가) 사용 중지되었습니다."</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"현재 접근성 기능을 시작하려면 접근성 단축키를 다시 사용하세요"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"접근성 버튼을 탭할 때 사용할 기능을 선택하세요."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"기능을 변경하려면 접근성 버튼을 길게 터치하세요."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"확대"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index cf5f53165285..fb8a81656499 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Байланыш операторуңуз менен Wi-Fi аркылуу чалууну каттоодо ката кетти: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Чалуу"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi аркылуу чалуу"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN аркылуу чалуу"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN аркылуу чалуу"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi аркылуу чалуу | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Өчүк"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi тандалган"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Тандалган мобилдик түзмөк"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Таанылган жок"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Манжа изинин аныктыгы текшерилди"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Манжа изинин аппараттык камсыздоосу жеткиликтүү эмес."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Манжа изин сактоо мүмкүн эмес. Учурдагы манжа изин алып салыңыз."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Манжа изин күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Жүздүн аныктыгын текшерүүнү күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Жүздү сактоо мүмкүн эмес."</string> <string name="face_error_canceled" msgid="283945501061931023">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Өтө көп жолу аракет жасадыңыз. Жүздүн аныктыгын текшерүү сенсору өчүрүлдү."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Кайра аракет кылыңыз."</string> @@ -1618,6 +1628,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Түсүн тууралоо"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын күйгүздү"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Атайын мүмкүнчүлүктөр кыска жолу <xliff:g id="SERVICE_NAME">%1$s</xliff:g> кызматын өчүрдү"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Учурдагы атайын мүмкүнчүлүктөр функциясын иштетүү үчүн кыска жолду кайра колдонуңуз"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Атайын мүмкүнчүлүктөр баскычын таптаганыңызда иштетиле турган функцияны тандаңыз:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Функцияларды өзгөртүү үчүн Атайын мүмкүнчүлүктөр баскычын басып, кармап туруңуз."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Чоңойтуу"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 7d8a4e2f97f9..8b6a052369fe 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ເກີດບັນຫາໃນການລົງທະບຽນການໂທ Wi‑Fi ກັບຜູ້ໃຫ້ບໍລິການຂອງທ່ານ: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"ການໂທ %s Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi Calling"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Call"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Call"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi Calling | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ປິດ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ເລືອກໃຊ້ Wi-Fi ກ່ອນ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ຕ້ອງການໃຊ້ມືຖື"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ບໍ່ຮັບຮູ້"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ພິສູດຢືນຢັນລາຍນິ້ວມືແລ້ວ"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ບໍ່ມີຮາດແວລາຍນີ້ວມືໃຫ້ຢູ່."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ບໍ່ສາມາດເກັບຮັກສາລາຍນີ້ວມືໄວ້ໄດ້. ກະລຸນາເອົາລາຍນີ້ວມືທີ່ມີຢູ່ອອກໄປ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ໝົດເວລາກວດໃບໜ້າແລ້ວ. ກະລຸນາລອງອີກຄັ້ງ."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ບໍ່ສາມາດເກັບຮັກສາໃບໜ້າໄວ້ໄດ້."</string> <string name="face_error_canceled" msgid="283945501061931023">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ປິດນຳໃຊ້ການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າແລ້ວ."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ລອງອີກຄັ້ງ."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ການແກ້ໄຂຄ່າສີ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> on"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Accessibility Shortcut turned <xliff:g id="SERVICE_NAME">%1$s</xliff:g> off"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ໃຊ້ປຸ່ມລັດການຊ່ວຍເຂົ້າເຖິງອີກເທື່ອໜຶ່ງເພື່ອຊອກຫາຄຸນສົມບັດການຊ່ວຍເຂົ້າເຖິງໃນປັດຈຸບັນ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ເລືອກຄຸນສົມບັດທີ່ຈະໃຊ້ເມື່ອທ່ານແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງ:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ເພື່ອປ່ຽນຄຸນສົມບັດ, ໃຫ້ແຕະປຸ່ມການຊ່ວຍເຂົ້າເຖິງຄ້າງໄວ້."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ການຂະຫຍາຍ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index a0015c35d099..7fc1c9893539 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Kilo problema registruojant „Wi‑Fi“ skambinimą pas operatorių: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"„%s“ „Wi-Fi“ skambinimas"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> „Wi-Fi“ skambinimas"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN skambutis"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN skambutis"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> „Wi-Fi“"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"„Wi-Fi“ skambinimas | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> „VoWifi“"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Išjungta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Pageidautinas „Wi-Fi“ ryšys"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Pirmenybė mobiliojo ryšio tinklui"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Neatpažinta"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Kontrolinis kodas autentifikuotas"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Kontrolinio kodo aparatinė įranga nepasiekiama."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Baigėsi veido atpaž. skirt. laik. Band. dar kartą."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nepavyko išsaugoti veido duomenų."</string> <string name="face_error_canceled" msgid="283945501061931023">"Veido atpažinimo operacija atšaukta."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Per daug bandymų. Vėliau bandykite dar kartą."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Per daug bandymų. Veido autentifik. išjungtas."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Bandykite dar kartą."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Spalvų taisymas"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo įjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pritaikymo neįgaliesiems sparčiuoju klavišu buvo išjungta „<xliff:g id="SERVICE_NAME">%1$s</xliff:g>“"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Norėdami įjungti dabartinę pritaikymo neįgaliesiems funkciją, dar kartą naudokite spartųjį pritaikymo neįgaliesiems klavišą"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pasirinkite funkciją, kuri bus naudojama, kai paliesite pritaikymo neįgaliesiems mygtuką:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Jei norite pakeisti funkcijas, palieskite ir palaikykite pritaikymo neįgaliesiems mygtuką."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Didinimas"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index a1aebe1184ad..60a32de5d585 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Reģistrējot Wi-Fi zvanus pie mobilo sakaru operatora, radās problēma: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi zvani"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi zvani"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN zvans"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN zvans"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi zvani | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izslēgts"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Vēlams Wi-Fi tīkls"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Vēlams mobilo datu savienojums"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Dati nav atpazīti"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pirksta nospiedums tika autentificēts."</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Nospieduma aparatūra nav pieejama."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Sejas datu nolasīšanas noildze. Mēģiniet vēlreiz."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Sejas datus nevar saglabāt."</string> <string name="face_error_canceled" msgid="283945501061931023">"Darbība ar sejas datiem atcelta."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Par daudz mēģinājumu. Sejas atpazīšana atspējota."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Mēģiniet vēlreiz."</string> @@ -1640,6 +1650,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Krāsu korekcija"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pieejamības saīsne aktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pieejamības saīsne deaktivizēja lietotni <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Lai sāktu izmantot pašreizējo pieejamības funkciju, vēlreiz izmantojiet pieejamības saīsni."</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izvēlieties funkciju, ko izmantot, kad pieskaraties pogai Pieejamība."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Lai mainītu funkcijas, pieskarieties pogai Pieejamība un turiet to."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Palielinājums"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 0ab31b3229a0..4ae6f31b4c4d 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Проблем при регистрирањето на функцијата „Повици преку Wi‑Fi“ со операторот: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Повикување преку Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Повици преку Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Повик преку WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Повик преку WLAN на <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Повици преку Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"Глас преку Wi-Fi на <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Исклучено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Се претпочита Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Претпочитам мобилен интернет"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Непознат"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечатокот е проверен"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отпечаток од прст не е достапен."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатокот не може да се складира. Отстранете го постоечкиот отпечаток."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Се достигна времето на истекување на отпечатокот. Обидете се повторно."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Истече времето за проверка на лице. Повторен обид."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Лицето не може да се чува."</string> <string name="face_error_canceled" msgid="283945501061931023">"Операцијата со лице се откажа."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Премногу обиди. Обидете се повторно подоцна."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Премногу обиди. Проверката на лице е оневозможена."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Обидете се повторно."</string> @@ -1619,6 +1629,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Корекција на бои"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Кратенката за пристапност ја вклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Кратенката за пристапност ја исклучи <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Повторно употребете ја кратенката за пристапност за да ја стартувате тековната функција за пристапност"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изберете функција за користење кога ќе го допрете копчето за „Пристапност“."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"За променување функции, допрете го и задржете го копчето за „Пристапност“."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Зголемување"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index eafd6a4c148f..2cd83cc95ba4 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"നിങ്ങളുടെ കാരിയർ ഉപയോഗിച്ച് വൈഫൈ കോളിംഗ് രജിസ്റ്റർ ചെയ്യുന്നതിൽ പ്രശ്നം: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s വൈഫൈ കോളിംഗ്"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> വൈഫൈ കോളിംഗ്"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN കോൾ"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN കോൾ"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> വൈഫൈ"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"വൈഫൈ കോളിംഗ് | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> Voവൈഫൈ"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ഓഫ്"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"വൈഫൈ തിരഞ്ഞെടുത്തിരിക്കുന്നു"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ താൽപ്പര്യപ്പെടുന്നു"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"തിരിച്ചറിഞ്ഞില്ല"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ഫിംഗർപ്രിന്റ് പരിശോധിച്ചുറപ്പിച്ചു"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ഫിംഗർപ്രിന്റ് ഹാർഡ്വെയർ ലഭ്യമല്ല."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"വിരലടയാളം സംഭരിക്കാനാവില്ല. നിലവിലുള്ള വിരലടയാളം നീക്കംചെയ്യുക."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"മുഖം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> <string name="face_error_no_space" msgid="8224993703466381314">"മുഖം സൂക്ഷിക്കാനാവില്ല."</string> <string name="face_error_canceled" msgid="283945501061931023">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"നിരവധി തവണ ശ്രമിച്ചു. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"വീണ്ടും ശ്രമിക്കുക."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"വർണ്ണം ക്രമീകരിക്കൽ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓൺ ചെയ്തിരിക്കുന്നു"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ഉപയോഗസഹായിക്കുള്ള കുറുക്കുവഴി <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ഓഫ് ചെയ്തിരിക്കുന്നു"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"നിലവിലെ ഉപയോഗസഹായി ഫീച്ചർ ആരംഭിക്കാൻ വീണ്ടും ഉപയോഗസഹായി കുറുക്കുവഴി ഉപയോഗിക്കുക"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"നിങ്ങൾ ഉപയോഗസഹായി ബട്ടൺ ടാപ്പുചെയ്യുമ്പോൾ ഉപയോഗിക്കുന്നതിന് ഒരു ഫീച്ചർ തിരഞ്ഞെടുക്കുക:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ഫീച്ചറുകൾ മാറ്റുന്നതിന് ഉപയോഗസഹായി ബട്ടൺ സ്പർശിച്ചുപിടിക്കുക."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"മാഗ്നിഫിക്കേഷൻ"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 12e318631dd6..35936eec055a 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Таны оператор компанийн Wi‑Fi дуудлагыг бүртгэхэд асуудал гарлаа: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi Дуудлага"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi дуудлага"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN дуудлага"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN дуудлага"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi дуудлага | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Идэвхгүй"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi давуу эрхтэй"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Мобайл давуу эрхтэй"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Таниагүй"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Хурууны хээг нотолсон"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хурууны хээний тоног төхөөрөмж бэлэн бус байна."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Царай таниулах хугацаа дууслаа. Дахин оролдоно уу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Царайг хадгалах боломжгүй байна."</string> <string name="face_error_canceled" msgid="283945501061931023">"Царайны үйл ажиллагааг цуцаллаа."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Хэт олон удаа оролдлоо. Царай танилтыг идэвхгүй болголоо."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Дахин оролдоно уу."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Өнгөний засвар"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г асаасан"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Хүртээмжийн товчлол <xliff:g id="SERVICE_NAME">%1$s</xliff:g>-г унтраасан"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Одоогийн хүртээмжит онцлогийг эхлүүлэхийн тулд нэвтрэлтийн товчлолыг ашиглах"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Хүртээмжийн товчлуурыг товших үедээ ашиглах онцлогийг сонгоно уу:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Онцлогийг өөрчлөхийн тулд Хүртээмжийн товчлуурыг дараад хүлээнэ үү."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Томруулах"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index fe248c11370f..ec96ec17baa4 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"तुमच्या या वाहकासह वाय-फाय कॉलिंग नोंदणी करताना समस्या आली आहे:<xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s वाय-फाय कॉलिंग"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> वाय-फाय कॉलिंग"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कॉल"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कॉल"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> वाय-फाय"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"वाय-फाय कॉलिंग | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"बंद"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"वाय-फाय अग्रमानांकित"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"प्राधान्य दिलेला मोबाइल"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ओळखले नाही"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिंट ऑथेंटिकेट केली आहे"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"फिंगरप्रिंट हार्डवेअर उपलब्ध नाही."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट स्टोअर केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट टाइमआउट झाले. पुन्हा प्रयत्न करा."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"चेहरा टाइमआउट झाला. पुन्हा प्रयत्न करा."</string> <string name="face_error_no_space" msgid="8224993703466381314">"चेहरा स्टोअर केला जाऊ शकत नाही."</string> <string name="face_error_canceled" msgid="283945501061931023">"चेहरा ऑपरेशन रद्द केले गेले."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"खूप जास्त प्रयत्न केले. चेहरा ऑथेंटिकेशन बंद केले गेले."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"पुन्हा प्रयत्न करा."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"रंग सुधारणा"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> चालू केली"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"प्रवेशयोग्यता शॉर्टकटने <xliff:g id="SERVICE_NAME">%1$s</xliff:g> बंद केली"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"सध्याचे अॅक्सेसिबिलिटी वैशिष्ट्य पुन्हा सुरू करण्यासाठी अॅक्सेसिबिलिटी शॉर्टकट वापरा"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तुम्ही प्रवेशयोग्यता बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"वैशिष्ट्ये बदलण्यासाठी, प्रवेशयोग्यता बटणाला स्पर्श करा आणि धरून ठेवा."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"मोठे करणे"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index a813a7bdeff1..7de8dc110f46 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Terdapat masalah semasa mendaftarkan panggilan Wi-Fi dengan pembawa anda: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Panggilan Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Panggilan Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Panggilan WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Panggilan WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Panggilan Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Mati"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi diutamakan"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mudah alih diutamakan"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tidak dikenali"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Cap jari disahkan"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Perkakasan cap jari tidak tersedia."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tamat masa wajah dicapai. Cuba lagi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Wajah tidak dapat disimpan."</string> <string name="face_error_canceled" msgid="283945501061931023">"Pengendalian wajah dibatalkan."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percubaan. Cuba sebentar lagi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Cuba lagi."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Pembetulan Warna"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Pintasan kebolehaksesan menghidupkan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Pintasan Kebolehaksesan mematikan <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gunakan Pintasan Kebolehaksesan sekali lagi untuk memulakan ciri kebolehaksesan semasa"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pilih ciri yang hendak digunakan apabila anda mengetik butang Kebolehaksesan:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Untuk menukar ciri, sentuh & tahan butang Kebolehaksesan."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pembesaran"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 812ff751d962..9f107f88362b 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"သင်၏ ဝန်ဆောင်မှုပေးသူဖြင့် Wi‑Fi ခေါ်ဆိုမှုကို မှတ်ပုံတင်ရာတွင် ပြဿနာရှိနေသည်− <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi ခေါ်ဆိုမှု"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi ခေါ်ဆိုမှု"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ခေါ်ဆိုမှု"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ခေါ်ဆိုမှု"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi ခေါ်ဆိုမှု | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ပိတ်ထားရသည်"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ဝိုင်ဖိုင်အား ပိုနှစ်သက်သော"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"မိုဘိုင်းကို အသုံးပြုလိုပါသည်"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"မသိပါ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"လက်ဗွေကို အထောက်အထား စိစစ်ပြီးပါပြီ"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"လက်ဗွေရာ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"လက်ဗွေရာ သိုလှောင်၍မရပါ။ ကျေးဇူးပြု၍ ရှိပြီးလက်ဗွေရာအား ဖယ်ရှားပါ။"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"မျက်နှာ သက်တမ်းကုန်သွားပါပြီ။ ထပ်စမ်းကြည့်ပါ။"</string> <string name="face_error_no_space" msgid="8224993703466381314">"မျက်နှာကို သိမ်း၍မရပါ။"</string> <string name="face_error_canceled" msgid="283945501061931023">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ ပိတ်လိုက်ပါပြီ။"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ထပ်စမ်းကြည့်ပါ။"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"အရောင်ပြင်ဆင်ခြင်း"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ဖွင့်လိုက်ပါသည်"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်သည် <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို ပိတ်လိုက်ပါသည်"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"လက်ရှိ အသုံးလွယ်ရေး ဝန်ဆောင်မှုကို စတင်ရန် အသုံးလွယ်ရေး ဖြတ်လမ်းလင့်ခ်ကို သုံးပါ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ဝန်ဆောင်မှုများကို ပြောင်းလဲရန် အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့၍ ထိထားပါ။"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ချဲ့ခြင်း"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 439b0de35ba9..d315acaa8bfe 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Problem med å registrere Wi-Fi-anrop med operatøren din: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi-anrop"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi-anrop"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-anrop"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN-anrop"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-anrop | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi er foretrukket"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Først-på-mobil"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ikke gjenkjent"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrykket er godkjent"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maskinvare for fingeravtrykk er ikke tilgjengelig."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsavbrudd for ansikt er nådd. Prøv igjen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ansiktet kan ikke lagres."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansikt-operasjonen ble avbrutt."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"For mange forsøk. Prøv igjen senere."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"For mange forsøk. Ansiktsautentisering er slått av."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Prøv igjen."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Fargekorrigering"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Snarveien for tilgjengelighet slo på <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Snarveien for tilgjengelighet slo av <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Bruk tilgjengelighetssnarveien igjen for å starte den nåværende tilgjengelighetsfunksjonen"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Velg en funksjon du vil bruke når du trykker på Tilgjengelighet-knappen:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"For å endre funksjoner, trykk på og hold inne Tilgjengelighet-knappen."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Forstørring"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index d45e28b024d5..c67a871e08a1 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"तपाईंको सेवा प्रदायकमार्फत Wi-Fi कलिङ सुविधा दर्ता गर्ने क्रममा देखिएको समस्या: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi कलिङ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi कलिङ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN कल"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN कल"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wifi कलिङ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"निष्क्रिय"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi मनपराइयो"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"रूचाइएको मोबाइल"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"पहिचान भएन"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"फिंगरप्रिन्ट प्रमाणीकरण गरियो"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"औँठाछाप हार्डवेयर उपलब्ध छैन।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"औँठाछाप भण्डारण गर्न सकिँदैन। कृपया अवस्थित औठाछाप हटाउनुहोस्।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"अनुहारको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"अनुहार भण्डारण गर्न सकिँदैन।"</string> <string name="face_error_canceled" msgid="283945501061931023">"अनुहार पहिचान रद्द गरियो।"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"अत्यधिक धेरैपटक गलत प्रयासहरू भए। अनुहार प्रमाणिकरणलाई असक्षम पारियो।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"फेरि प्रयास गर्नुहोस्।"</string> @@ -1622,6 +1632,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"रङ सच्याउने सुविधा"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई सक्रिय पार्यो"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"पहुँचको सर्टकटले <xliff:g id="SERVICE_NAME">%1$s</xliff:g> लाई निष्क्रिय पार्यो"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"हालको पहुँचसम्बन्धी सुविधा प्रयोग गर्न फेरि पहुँचसम्बन्धी सर्टकट प्रयोग गर्नुहोस्"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"तपाईंले पहुँच सम्बन्धी बटनलाई ट्याप गर्दा प्रयोग गर्नुपर्ने सुविधा रोज्नुहोस्:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"सुविधाहरूलाई बदल्न, पहुँच सम्बन्धी बटनलाई छोएर थिची राख्नुहोस्।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"म्याग्निफिकेसन"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index df152b2f46fb..345d9d49d60e 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -79,7 +79,7 @@ <string name="CLIRPermanent" msgid="3377371145926835671">"U kunt de instelling voor de beller-ID niet wijzigen."</string> <string name="RestrictedOnDataTitle" msgid="5221736429761078014">"Geen service voor mobiele data"</string> <string name="RestrictedOnEmergencyTitle" msgid="6855466023161191166">"Noodoproepen niet beschikbaar"</string> - <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen service voor spraakoproepen"</string> + <string name="RestrictedOnNormalTitle" msgid="3179574012752700984">"Geen belservice"</string> <string name="RestrictedOnAllVoiceTitle" msgid="8037246983606545202">"Geen spraakservice of noodoproepen"</string> <string name="RestrictedStateContent" msgid="6538703255570997248">"Tijdelijk uitgeschakeld door je provider"</string> <string name="RestrictedStateContentMsimTemplate" msgid="673416791370248176">"Tijdelijk uitgeschakeld door je provider voor sim <xliff:g id="SIMNUMBER">%d</xliff:g>"</string> @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Probleem bij registratie van Bellen via wifi bij je provider: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Bellen via wifi van %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Bellen via wifi van <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Bellen via WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Bellen via WLAN van <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wifi van <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Bellen via wifi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi van <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Uit"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Voorkeur voor wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Voorkeur voor mobiel"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Niet herkend"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Vingerafdruk geverifieerd"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware voor vingerafdruk niet beschikbaar."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Time-out voor gezicht bereikt. Probeer opnieuw."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Gezicht kan niet worden opgeslagen."</string> <string name="face_error_canceled" msgid="283945501061931023">"Bewerking voor gezichtsherkenning geannuleerd."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogingen. Probeer het later opnieuw."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Te veel pogingen. Gezichtsherkenning inactief."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Probeer het opnieuw."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Kleurcorrectie"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ingeschakeld"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"\'Snelle link voor toegankelijkheid\' heeft <xliff:g id="SERVICE_NAME">%1$s</xliff:g> uitgeschakeld"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gebruik de snelkoppeling voor toegankelijkheid nogmaals om de huidige toegankelijkheidsfunctie te starten"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Kies een functie om te gebruiken wanneer je op de knop Toegankelijkheid tikt:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Als je functies wilt wijzigen, tik je op de knop Toegankelijkheid en houd je deze vast."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Vergroting"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 78566da2c06f..3e4260f4ca0f 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ଆପଣଙ୍କ କେରିଅର୍ ସହିତ ୱାଇ-ଫାଇ କଲ୍ କରିବା ପାଇଁ ପଞ୍ଜୀକରଣ କରିବାରେ ସମସ୍ୟା: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ୱାଇ-ଫାଇ କଲିଂ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN କଲ୍"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN କଲ୍"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ୱାଇ-ଫାଇ"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ୱାଇଫାଇ କଲିଂ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ଅଫ୍"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ପସନ୍ଦ କରାଯାଇଥିବା ୱାଇ-ଫାଇ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ପସନ୍ଦର ମୋବାଇଲ୍"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ପ୍ରମାଣୀକୃତ ହେଲା"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ହାର୍ଡୱେର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି ପୂର୍ବରୁ ଥିବା ଆଙ୍ଗୁଠି ଚିହ୍ନକୁ ବାହାର କରିଦିଅନ୍ତୁ।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ଆଙ୍ଗୁଠି ଚିହ୍ନର ସମୟ ଶେଷ ହେଲା । ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ଫେସ୍ର ସମୟସୀମା ସରିଗଲା। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ଫେସ୍ ମେମୋରୀରେ ଷ୍ଟୋର୍ କରାଯାଇପାରିବ ନାହିଁ।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ଫେସ୍ର ଅପରେଶନ୍ କ୍ୟାନ୍ସଲ୍ ହୋଇଗଲା"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ବାରମ୍ବାର ଚେଷ୍ଟା। ଫେସ୍ ପ୍ରମାଣୀକରଣ ଅକ୍ଷମ କରାଗଲା।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ରଙ୍ଗ ସଂଶୋଧନ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅନ୍ କରାଯାଇଛି"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ଆକ୍ସେସିବିଲିଟୀ ଶର୍ଟକଟ୍ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ଅଫ୍ କରାଯାଇଛି"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ବର୍ତ୍ତମାନର ଆକ୍ସେସିବିଲିଟୀ ବୈଶିଷ୍ଟ୍ୟ ଆରମ୍ଭ କରିବାକୁ ପୁଣି ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟ୍କର୍ଟ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ଆପଣ ଆକ୍ସେସବିଲିଟି ବଟନ୍ ଟାପ୍ କରିବା ବେଳେ ଏକ ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ ବାଛନ୍ତୁ:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇବାକୁ, ଆକ୍ସେସବିଲିଟି ବଟନ୍ ସ୍ପର୍ଶ କରନ୍ତୁ ଓ ଧରିରଖନ୍ତୁ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ମ୍ୟାଗ୍ନିଫିକେସନ୍"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index bb38c886edd3..bdcf2fec85a1 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ਤੁਹਾਡੇ ਕੈਰੀਅਰ ਨਾਲ ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ ਨੂੰ ਰਜਿਸਟਰ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ਕਾਲ"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ਕਾਲ"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> ਵਾਈ-ਫਾਈ"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ਬੰਦ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ਤਰਜੀਹੀ ਵਾਈ-ਫਾਈ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ਮੋਬਾਈਲ ਨੂੰ ਤਰਜੀਹ ਹੈ"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਮਾਣਿਤ ਹੋਇਆ"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੌਜੂਦਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਟਾਓ।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ਚਿਹਰਾ ਪਛਾਣਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_error_no_space" msgid="8224993703466381314">"ਚਿਹਰੇ ਦੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string> <string name="face_error_canceled" msgid="283945501061931023">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਹੈ।"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"ਰੰਗ ਸੁਧਾਈ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕੀਤਾ"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਨੇ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ਨੂੰ ਬੰਦ ਕੀਤਾ"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ਮੌਜੂਦਾ ਪਹੁੰਚਯੋਗਤਾ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ \'ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ\' ਦੀ ਦੁਬਾਰਾ ਵਰਤੋਂ ਕਰੋ"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਟੈਪ ਕੀਤੇ ਜਾਣ \'ਤੇ ਵਰਤਣ ਲਈ ਕੋਈ ਵਿਸ਼ੇਸ਼ਤਾ ਚੁਣੋ:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬਦਲਣ ਲਈ, ਪਹੁੰਚਯੋਗਤਾ ਬਟਨ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ।"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"ਵੱਡਦਰਸ਼ੀਕਰਨ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d59b1386181a..3e08d500520a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Podczas rejestrowania połączeń przez Wi-Fi u operatora wystąpił problem: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Połączenia przez Wi-Fi (%s)"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>, połączenia przez Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Połączenie przez WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g>, połączenie przez WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g>, Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Połączenia przez Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g>, VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Wył."</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferuj Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferowane komórkowe"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nie rozpoznano"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Uwierzytelniono odciskiem palca"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Czytnik linii papilarnych nie jest dostępny."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie można zapisać odcisku palca. Usuń istniejący odcisk palca."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Upłynął limit czasu analizy twarzy. Spróbuj ponownie."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Nie można zapisać informacji o twarzy."</string> <string name="face_error_canceled" msgid="283945501061931023">"Analiza twarzy została anulowana."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Zbyt wiele prób. Spróbuj ponownie później."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Zbyt wiele prób. Wyłączono uwierzytelnianie za pomocą twarzy."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Spróbuj ponownie."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Korekcja kolorów"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skrót ułatwień dostępu wyłączył usługę <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Użyj ponownie skrótu ułatwień dostępu, by uruchomić bieżące ułatwienie dostępu"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Wybierz funkcję używaną po kliknięciu przycisku ułatwień dostępu."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Aby zmienić funkcje, kliknij i przytrzymaj przycisk ułatwień dostępu."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Powiększenie"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 48302a0d9d4c..d604aab7b9a1 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Ocorreu um problema ao registrar a chamada no Wi‑Fi junto à sua operadora: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s chamada Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Chamada no Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferido"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferência pela rede móvel"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correção de cor"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use o atalho de acessibilidade novamente para iniciar o recurso de acessibilidade atual"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado ao tocar no botão Acessibilidade:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 3f02828cf3f3..cde63d54d2b7 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Ocorreu um problema ao registar a funcionalidade Chamadas Wi-Fi junto do seu operador: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Chamadas por Wi-Fi da %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamadas Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Chamadas Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Rede Wi-Fi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferência pela rede móvel"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido."</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"A impressão digital foi autenticada."</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não é possível armazenar a impressão digital. Remova uma impressão digital existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limite de tempo de rosto atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar o rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação de rosto cancelada."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiadas tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Demasiadas tentativas. Autenticação facial desativada."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correção da cor"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O Atalho de acessibilidade ativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O Atalho de acessibilidade desativou o serviço <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Utilize novamente o atalho de acessibilidade para iniciar a funcionalidade de acessibilidade atual."</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha uma funcionalidade para utilizar quando tocar no botão Acessibilidade:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar as funcionalidades, toque sem soltar no botão Acessibilidade."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 48302a0d9d4c..d604aab7b9a1 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Ocorreu um problema ao registrar a chamada no Wi‑Fi junto à sua operadora: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s chamada Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Chamada no Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Chamada por WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Chamada por WLAN de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi de <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Chamada no Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi de <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferido"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferência pela rede móvel"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Não reconhecido"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Impressão digital autenticada"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware de impressão digital não disponível."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não foi possível armazenar a impressão digital. Remova uma impressão digital já existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tempo máx. p/ captura facial atingido. Tente novamente."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Não é possível armazenar um rosto."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Excesso de tentativas. Autenticação facial desat."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tente novamente."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Correção de cor"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"O atalho de acessibilidade ativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"O atalho de acessibilidade desativou o <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Use o atalho de acessibilidade novamente para iniciar o recurso de acessibilidade atual"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Escolha um recurso a ser usado ao tocar no botão Acessibilidade:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Para alterar os recursos, mantenha o botão Acessibilidade pressionado."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ampliação"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 1c955591ebcd..add43b849234 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"A apărut o problemă la înregistrarea apelării prin Wi‑Fi la operatorul dvs.: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Apelare prin Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Apelare prin Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Apel WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Apel WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Apelare prin Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Dezactivată"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Se preferă conexiunea Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Se preferă datele mobile"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nu este recunoscut"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Amprentă autentificată"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardware-ul pentru amprentă nu este disponibil."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Amprenta nu poate fi stocată. Eliminați o amprentă existentă."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timpul pentru amprentare a expirat. Încercați din nou."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Timpul pentru reunoaștere facială a expirat. Încercați din nou."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Chipul nu poate fi stocat."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operațiunea privind chipul a fost anulată."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Prea multe încercări. Reîncercați mai târziu."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Prea multe încercări. Autentificarea facială este dezactivată."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Încercați din nou."</string> @@ -1640,6 +1650,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Corecția culorii"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Comanda rapidă de accesibilitate a activat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Comanda rapidă de accesibilitate a dezactivat <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Folosiți din nou comanda rapidă Accesibilitate pentru a porni funcția de accesibilitate prezentă"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Alegeți o funcție pe care să o folosiți când atingeți butonul Accesibilitate:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Pentru a schimba funcțiile, atingeți lung butonul Accesibilitate."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Mărire"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index c14bce471bda..3a4ed8242875 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Ошибка подключения функции \"Звонки по Wi-Fi\" через вашего оператора: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Звонки по Wi-Fi (%s)"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Звонки по Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Вызов WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> Вызов WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Звонки по Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Отключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Приоритет Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Приоритет мобильного Интернета"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не распознано"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отпечаток пальца проверен"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Сканер недоступен"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Чтобы сохранить новый отпечаток, удалите существующий."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Превышено время ожидания. Повторите попытку."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Невозможно сохранить распознанное лицо"</string> <string name="face_error_canceled" msgid="283945501061931023">"Распознавание отменено"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Слишком много попыток. Повторите позже."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Слишком много попыток. Сканер отключен."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Попробуйте ещё раз"</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Коррекция цвета"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> включен"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Сервис <xliff:g id="SERVICE_NAME">%1$s</xliff:g> отключен"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Чтобы активировать выбранные специальные возможности, воспользуйтесь быстрым включением ещё раз"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Выберите функцию, которая запускается при нажатии кнопки специальных возможностей:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Чтобы изменить функцию, удерживайте кнопку специальных возможностей."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увеличение"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 0f353f28b2f8..17ead66d2c81 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"ඔබගේ වාහකය සමඟ Wi-Fi ඇමතුම් ලියාපදිංචි කිරීම නිකුත් කරන්න: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi අමතමින්"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi ඇමතුම්"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN ඇමතුම"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN ඇමතුම්"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi ඇමතුම් | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ක්රියාවිරහිතයි"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi වඩා කැමතියි"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ජංගම කැමතියි"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"හඳුනා නොගන්නා ලදී"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ඇඟිලි සලකුණ සත්යාපනය කරන ලදී"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ඇඟිලි සලකුණු දෘඪාංගය ලද නොහැකිය."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ඇඟිලි සලකුණ ගබඩා කළ නොහැක. දැනට පවතින ඇඟිලි සලකුණක් ඉවත් කරන්න."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"මුහුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string> <string name="face_error_no_space" msgid="8224993703466381314">"මුහුණ ගබඩා කළ නොහැක."</string> <string name="face_error_canceled" msgid="283945501061931023">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"උත්සාහයන් ඉතා වැඩි ගණනකි. මුහුණු සත්යාපනය අබල කරන ලදී."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"නැවත උත්සාහ කරන්න."</string> @@ -1618,6 +1628,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"වර්ණ නිවැරදි කිරීම"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාත්මක කරන ලදී"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ප්රවේශ්යතා කෙටි මග <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ක්රියාවිරහිත කරන ලදී"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"වර්තමාන ප්රවේශ්යතා විශේෂංගය ආරම්භ කිරීම සඳහා ප්රවේශ්යතා කෙටි මග භාවිතා කරන්න"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ඔබ ප්රවේශ්යතා බොත්තම තට්ටු කරන විට භාවිතා කිරීමට අංගයක් තෝරාගන්න:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"අංග වෙනස් කිරීමට ප්රවේශ්යතා බොත්තම ස්පර්ශ කර අල්ලා ගෙන සිටින්න."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"විශාලනය"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 31097024b5e6..cb44b7422e3b 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Pri registrácii volania cez Wi‑Fi u operátora nastala chyba <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Volanie siete Wi‑Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> volanie cez Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Volanie cez WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> volanie cez WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Volanie cez WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuté"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferovať Wi‑Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferovať mobilné spojenie"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nerozpoznané"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Odtlačok bol overený"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardvér na snímanie odtlačku prsta nie je k dispozícii"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Limit rozpoznania tváre vypršal. Skúste to znova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Tvár sa nedá uchovať."</string> <string name="face_error_canceled" msgid="283945501061931023">"Operácia týkajúca sa tváre bola zrušená"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Príliš veľa pokusov. Skúste to znova neskôr."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Príliš veľa pokusov. Overenie tváre je zakázané."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Skúste to znova."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Úprava farieb"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Skratka dostupnosti zapla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Skratka dostupnosti vypla službu <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Znova použite skratku dostupnosti, čím sprístupníte aktuálnu funkciu dostupnosti"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Klepnutím na tlačidlo dostupnosti vyberte požadovanú funkciu:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ak chcete zmeniť funkcie, klepnite na tlačidlo dostupnosti a podržte ho"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Priblíženie"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 4575d00e6497..039bbaa47b3e 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Težava pri registriranju klicanja prek Wi-Fi-ja pri operaterju: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Klicanje prek Wi-Fi-ja (%s)"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Klicanje prek Wi-Fi-ja operaterja <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Klic prek omrežja WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Klic prek omrežja WLAN operaterja <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi operaterja <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Klicanje prek WiFi-ja | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"Govor prek Wi-Fi-ja operaterja <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izklopljeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednostno Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Prednostno mobilno"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Ni prepoznano"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Pristnost prstnega odtisa je preverjena"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Strojna oprema za prstne odtise ni na voljo."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Dosežena časovna omejitev za obraz. Poskusite znova."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Obraza ni mogoče shraniti."</string> <string name="face_error_canceled" msgid="283945501061931023">"Dejanje z obrazom je bilo preklicano."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Preveč poskusov. Poskusite znova pozneje."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Preveč poskusov. Preverjanje pristnosti obraza je onemogočeno."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Poskusite znova."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Popravljanje barv"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Bližnjica funkcij za ljudi s posebnimi potrebami je vklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Bližnjica funkcij za ljudi s posebnimi potrebami je izklopila <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Če želite zagnati trenutno funkcijo za ljudi s posebnimi potrebami, znova uporabite bližnjico funkcij za ljudi s posebnimi potrebami"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Izberite funkcijo, ki jo želite uporabljati, ko se dotaknete gumba »Dostopnost«:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Če želite spremeniti funkcije, se dotaknite gumba »Dostopnost« in ga pridržite."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Povečava"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 11494218c9bd..ee0960bb10b0 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Problem gjatë regjistrimit të telefonatave me Wi‑Fi me operatorin tënd celular: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Telefonatat me Wi-Fi nga %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Telefonatë me Wi-Fi në <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Telefonatë me WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Telefonatë me WLAN në <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi në <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Telefonatë me Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi në <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Çaktivizuar"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferohet Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferohet rrjeti celular"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Nuk njihet"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Gjurma e gishtit u vërtetua"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardueri i gjurmës së gishtit nuk mundësohet."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Gjurma e gishtit nuk mund të ruhet. Hiq një gjurmë gishti ekzistuese."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Koha e veprimit për gjurmën e gishtit skadoi. Provo përsëri."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Mbaroi afati për fytyrën. Provo sërish."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Fytyra nuk mund të ruhet."</string> <string name="face_error_canceled" msgid="283945501061931023">"Veprimi me fytyrën u anulua."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Shumë përpjekje. Provo sërish më vonë."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Shumë përpjekje. Vërtetimi për fytyrën joaktiv."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Provo sërish."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Korrigjimi i ngjyrës"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Shkurtorja e qasshmërisë e aktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Shkurtorja e qasshmërisë e çaktivizoi <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Përdor përsëri \"Shkurtoren e qasshmërisë\" për të nisur funksionin aktual të qasshmërisë"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Zgjidh një funksion për ta përdorur kur troket butonin e \"Qasshmërisë\":"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Për të ndryshuar funksionet, prek dhe mbaj butonin e \"Qasshmërisë\"."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Zmadhimi"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 753653195f32..6ff3a7837e12 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -129,10 +129,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Проблем у вези са регистровањем позивања преко Wi‑Fi-ја код мобилног оператера: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Wi-Fi позивање преко оператера %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> позивање преко Wi-Fi-ја"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN позив"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN позив"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Позивање преко Wi-Fi-ја | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Искључено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предност има Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Желим мобилне податке"</string> @@ -527,6 +531,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Није препознато"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Отисак прста је потврђен"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отиске прстију није доступан."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string> @@ -563,6 +571,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Истекло је време за проверу лица. Пробајте поново."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Није могуће сачувати лице."</string> <string name="face_error_canceled" msgid="283945501061931023">"Обрада лица је отказана."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Превише покушаја. Пробајте поново касније."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Више покушаја. Потврда идентитета је онемогућена."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Пробајте поново."</string> @@ -1640,6 +1650,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Корекција боја"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Пречица за приступачност је укључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Пречица за приступачност је искључила услугу <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Употребите поново пречицу за приступачност да бисте покренули актуелну функцију приступачности"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Изаберите функцију која ће се користити када додирнете дугме за приступачност:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Притисните и задржите дугме за приступачност да бисте мењали функције."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Увећање"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 31bb34919c1f..20969d3daf2e 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Följande fel uppstod när Wi-Fi-samtal skulle registreras hos operatören: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi-samtal"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Wi-Fi-samtal via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN-samtal"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"WLAN-samtal via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi via <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi-samtal | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi via <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi i första hand"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Använd mobildata"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Identifierades inte"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Fingeravtrycket har autentiserats"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Det finns ingen maskinvara för fingeravtryck."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Tidsgränsen för ansikte har nåtts. Försök igen."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Det gick inte att lagra ansiktet."</string> <string name="face_error_canceled" msgid="283945501061931023">"Ansiktsåtgärden har avbrutits."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Du har gjort för många försök. Försök igen senare."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"För många försök. Ansiktsautentisering inaktiverad"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Försök igen."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Färgkorrigering"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> aktiverades av Aktivera tillgänglighet snabbt"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> inaktiverades av Aktivera tillgänglighet snabbt"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Använd Aktivera tillgänglighet snabbt en gång till om du vill aktivera tillgänglighetsfunktionen i fråga"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Välj en funktion som ska användas när du trycker på tillgänglighetsknappen:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Tryck länge på tillgänglighetsknappen för att ändra funktioner."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Förstoring"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 3d2622469cbf..ce81bc7c3adb 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -128,8 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Tatizo limetokea wakati wa kuisajili huduma ya kupiga simu kupitia Wi‑Fi kwa mtoa huduma wako: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <!-- String.format failed for translation --> - <!-- no translation found for wfcSpnFormats:0 (6830082633573257149) --> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g>Kupiga simu Kupitia Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Simu ya WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> Simu ya WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ya <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Kupiga Simu kupitia WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi ya <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Imezimwa"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi inapedelewa"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mtandao wa simu unapendelewa"</string> @@ -522,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Hayatambuliki"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Imethibitisha alama ya kidole"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Maunzi ya kitambulisho hayapatikani."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Kitambulisho hakiwezi kuhifadhiwa. Tafadhali ondoa kitambulisho kilichopo."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string> @@ -558,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Muda wa kutambua uso umeisha. Jaribu tena."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Huwezi kuhifadhi uso."</string> <string name="face_error_canceled" msgid="283945501061931023">"Utendaji wa kitambulisho umeghairiwa."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Umejaribu mara nyingi mno. Kitambuzi cha uso kimezimwa."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Jaribu tena."</string> @@ -1614,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Usahihishaji wa rangi"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imewasha <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Njia ya mkato ya zana za walio na matatizo ya kuona au kusikia imezima <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Tumia njia ya Mkato wa Zana za walio na matatizo ya kuona au kusikia tena ili kuanzisha kipengele kilichopo cha walio na matatizo ya kuona au kusikia"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chagua kipengele utakachotumia, ukigonga Kitufe cha zana za walio na matatizo ya kuona au kusikia."</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ili kubadilisha vipengele, gusa na ushikile Kitufe cha zana za walio na matatizo ya kuona au kusikia."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukuzaji"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 35592a696d68..9683e4cb21ce 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"உங்கள் மொபைல் நிறுவனத்துடன் வைஃபை அழைப்பைப் பதிவுசெய்வதில் சிக்கல்: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s வைஃபை அழைப்பு"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> வைஃபை அழைப்பு"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN அழைப்பு"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN அழைப்பு"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> வைஃபை"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"வைஃபை அழைப்பு | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ஆஃப்"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"வைஃபைக்கு முன்னுரிமை"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"மொபைல் தரவிற்கு முன்னுரிமை"</string> @@ -514,8 +518,7 @@ <string name="permdesc_imagesWrite" msgid="7073662756617474375">"உங்களின் படத் தொகுப்பை மாற்ற ஆப்ஸை அனுமதிக்கும்."</string> <string name="permlab_mediaLocation" msgid="8675148183726247864">"மீடியா தொகுப்பிலிருந்து இடங்களை அறிதல்"</string> <string name="permdesc_mediaLocation" msgid="2237023389178865130">"உங்களின் மீடியா தொகுப்பிலிருந்து இடங்களை அறிந்துகொள்ள ஆப்ஸை அனுமதிக்கும்."</string> - <!-- no translation found for biometric_error_hw_unavailable (645781226537551036) --> - <skip /> + <string name="biometric_error_hw_unavailable" msgid="645781226537551036">"பயோமெட்ரிக் வன்பொருள் இல்லை"</string> <string name="fingerprint_acquired_partial" msgid="735082772341716043">"கைரேகையை ஓரளவுதான் கண்டறிய முடிந்தது. மீண்டும் முயலவும்."</string> <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"கைரேகையைச் செயலாக்க முடியவில்லை. மீண்டும் முயலவும்."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"கைரேகை உணர்வியில் தூசி உள்ளது. சுத்தம் செய்து, முயலவும்."</string> @@ -523,9 +526,12 @@ <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"விரலை மிகவும் மெதுவாக நகர்த்திவிட்டீர்கள். மீண்டும் முயற்சிக்கவும்."</string> <string-array name="fingerprint_acquired_vendor"> </string-array> - <!-- no translation found for biometric_not_recognized (5770511773560736082) --> - <skip /> + <string name="biometric_not_recognized" msgid="5770511773560736082">"அடையாளங்காணபடவில்லை"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"கைரேகை அங்கீகரிக்கப்பட்டது"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"கைரேகை வன்பொருள் இல்லை."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string> @@ -562,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"முகப் பதிவிற்கான நேரம் முடிந்தது. மீண்டும் முயல்க."</string> <string name="face_error_no_space" msgid="8224993703466381314">"முகத்தைச் சேமிக்க இயலாது."</string> <string name="face_error_canceled" msgid="283945501061931023">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"பலமுறை தோல்வி. முக அங்கீகாரம் முடக்கப்பட்டது."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"மீண்டும் முயலவும்."</string> @@ -1619,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"வண்ணத் திருத்தம்"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"அணுகல்தன்மைக் குறுக்குவழியானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ இயக்கியது"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"அணுகல்தன்மைக் குறுக்குவழியானது <xliff:g id="SERVICE_NAME">%1$s</xliff:g>ஐ முடக்கியது"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"தற்போதுள்ள அணுகல்தன்மை அம்சத்தை மீண்டும் தொடங்க ’அணுகல்தன்மை ஷார்ட்கட்டைப்’ பயன்படுத்தவும்"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"அணுகல்தன்மைப் பொத்தானைத் தட்டி, பயன்படுத்துவதற்கான அம்சத்தைத் தேர்ந்தெடுக்கவும்:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"அம்சங்களை மாற்ற, அணுகல்தன்மைப் பொத்தானைத் தொட்டுப் பிடித்திருக்கவும்."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"பெரிதாக்கல்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 2027d3333dcf..975772061516 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"మీ క్యారియర్తో Wi‑Fi కాలింగ్ని నమోదు చేయడంలో సమస్య: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi కాలింగ్"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi కాలింగ్"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN కాల్"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN కాల్"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi కాలింగ్ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ఆఫ్లో ఉంది"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fiకి ప్రాధాన్యత"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"మొబైల్కి ప్రాధాన్యత ఇవ్వబడింది"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"గుర్తించలేదు"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"వేలిముద్ర ప్రమాణీకరించబడింది"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"వేలిముద్ర హార్డ్వేర్ అందుబాటులో లేదు."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"వేలిముద్రను నిల్వ చేయడం సాధ్యపడదు. దయచేసి ఇప్పటికే ఉన్న వేలిముద్రను తీసివేయండి."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"ముఖ గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string> <string name="face_error_no_space" msgid="8224993703466381314">"ముఖం నిల్వ చేయబడదు."</string> <string name="face_error_canceled" msgid="283945501061931023">"ముఖ కార్యకలాపం రద్దయింది."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"మళ్లీ ప్రయత్నించండి."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"రంగు సవరణ"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"యాక్సెస్ సామర్థ్య షార్ట్కట్ ద్వారా <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ప్రస్తుత యాక్సెస్ సౌలభ్య ఫీచర్ను ఉపయోగించడానికి యాక్సెసిబిలిటీ షార్ట్కట్ను మళ్లీ ప్రారంభించండి"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"యాక్సెస్ సామర్థ్య బటన్ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్ను ఎంచుకోండి:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"ఫీచర్లను మార్చడానికి, యాక్సెస్ సామర్థ్య బటన్ను నొక్కి & పట్టుకోండి."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"మాగ్నిఫికేషన్"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 84fd018cf11e..89202ca06866 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"เกิดปัญหาในการลงทะเบียนการโทรผ่าน Wi‑Fi กับผู้ให้บริการของคุณ: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"กำลังเรียก Wi-Fi ของ %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"การโทรผ่าน Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"การโทรผ่าน WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"การโทรผ่าน WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"การโทรผ่าน Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ปิด"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ต้องการใช้ Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"ต้องการใช้อินเทอร์เน็ตมือถือ"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"ไม่รู้จัก"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"ตรวจสอบสิทธิ์ลายนิ้วมือแล้ว"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"ฮาร์ดแวร์ลายนิ้วมือไม่พร้อมใช้งาน"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"หมดเวลาใช้ใบหน้าแล้ว โปรดลองอีกครั้ง"</string> <string name="face_error_no_space" msgid="8224993703466381314">"จัดเก็บข้อมูลใบหน้าไม่ได้"</string> <string name="face_error_canceled" msgid="283945501061931023">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"ดำเนินการหลายครั้งเกินไป ปิดใช้การตรวจสอบสิทธิ์ด้วยใบหน้าแล้ว"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"ลองอีกครั้ง"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"การปรับแก้สี"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"ใช้ทางลัดการช่วยเหลือพิเศษอีกครั้งเพื่อเริ่มฟีเจอร์การช่วยเหลือพิเศษปัจจุบัน"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"การขยาย"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 49318cfd9c77..983b53f81450 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Nagkaroon ng isyu sa pagrehistro ng pagtawag gamit ang Wi‑Fi sa iyong carrier: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Pagtawag sa Pamamagitan ng Wi-Fi ng %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Pagtawag Gamit ang Wi-Fi ng <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Pagtawag Gamit ang WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Pagtawag Gamit ang WLAN ng <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi ng <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Pagtawag Gamit ang Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi ng <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Naka-off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Mas gusto ang Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mas gusto ang mobile"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Hindi nakilala"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Na-authenticate ang fingerprint"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hindi available ang hardware na ginagamitan ng fingerprint."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Nag-time out ang mukha. Subukang muli."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Hindi ma-store ang mukha."</string> <string name="face_error_canceled" msgid="283945501061931023">"Nakansela ang operation kaugnay ng mukha."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Masyadong maraming pagsubok. Subukang muli mamaya."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Sobrang pagsubok. Bawal na: facial authentication."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Subukang muli."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Pagwawasto ng Kulay"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Na-on ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Na-off ng Shortcut sa Accessibility ang <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Gamiting muli ang Shortcut sa Pagiging Naa-access para simulan ang kasalukuyang feature ng pagiging naa-access"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Pumili ng feature na gagamitin kapag na-tap mo ang button ng Pagiging Naa-access:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Upang baguhin ang mga feature, pindutin nang matagal ang button ng Pagiging Naa-access."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Pag-magnify"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index c6d18ecad7cd..031527623c57 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Kablosuz çağrının operatörünüze kaydı sırasında hata oluştu: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Kablosuz Çağrı"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Kablosuz Çağrı"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN Üzerinden Çağrı"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN Üzerinden Çağrı"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Kablosuz"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Kablosuz Çağrı | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Kapalı"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kablosuz bağlantı tercihli"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil tercihli"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Tanınmadı"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Parmak izi kimlik doğrulaması yapıldı"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Parmak izi donanımı kullanılamıyor."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Parmak izi depolanamıyor. Lütfen mevcut parmak izlerinden birini kaldırın."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Yüz için zaman aşımı oluştu. Tekrar deneyin."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Yüz kaydedilemiyor."</string> <string name="face_error_canceled" msgid="283945501061931023">"Yüz işlemi iptal edildi."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı bırakıldı."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Tekrar deneyin."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Renk Düzeltme"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini açtı"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Erişilebilirlik Kısayolu <xliff:g id="SERVICE_NAME">%1$s</xliff:g> hizmetini kapattı"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Geçerli erişilebilirlik özelliğini başlatmak için Erişilebilirlik Kısayolu\'nu tekrar kullanın"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Erişilebilirlik düğmesine dokunduğunuzda kullanmak üzere bir özellik seçin:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Özellikleri değiştirmek için Erişilebilirlik düğmesine dokunup basılı tutun."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Büyütme"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 6e6dd9a2d163..88e2475ffe6c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -130,10 +130,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Проблема з реєстрацією дзвінків через Wi‑Fi у вашого оператора: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Дзвінок через Wi-Fi від оператора %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Виклики <xliff:g id="SPN">%s</xliff:g> через Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Виклик через WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Виклик <xliff:g id="SPN">%s</xliff:g> через WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> через Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Виклики через Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> через VoWi-Fi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Вимкнено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi за умовчанням"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Мобільна мережа за умовчанням"</string> @@ -530,6 +534,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Не розпізнано"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Відбиток автентифіковано"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Апаратне забезпечення для сканування відбитка недоступне."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Не вдалося зберегти відбиток. Видаліть наявний відбиток."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string> @@ -566,6 +574,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Час очікування обличчя минув. Повторіть спробу."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Не вдається зберегти обличчя."</string> <string name="face_error_canceled" msgid="283945501061931023">"Дію з обличчям скасовано."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Забагато спроб. Повторіть пізніше."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Забагато спроб. Автентифікацію обличчя вимкнено."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Повторіть спробу."</string> @@ -1664,6 +1674,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Корекція кольорів"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Ярлик спеціальних можливостей увімкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Ярлик спеціальних можливостей вимкнув <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Щоб запустити поточну функцію спеціальних можливостей, знову скористайтеся відповідним ярликом"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Виберіть функцію для кнопки спеціальних можливостей:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Щоб змінити функцію, натисніть і втримуйте кнопку спеціальних можливостей."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Збільшення"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 2a2ca621eb9e..6e98ebbd275d 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"آپ کے کیریئر کے ساتھ Wi‑Fi کالنگ رجسٹر کرنے میں مسئلہ درپیش ہے: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi کالنگ"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi کالنگ"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN کال"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN کال"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi کالنگ | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"آف"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"موبائل ترجیحی"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"تسلیم شدہ نہیں ہے"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"فنگر پرنٹ کی تصدیق ہو گئی"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"فنگر پرنٹ ہارڈ ویئر دستیاب نہیں ہے۔"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"چہرہ پہچانے کی میعاد ختم ہو گئی۔ دوبارہ کوشش کریں۔"</string> <string name="face_error_no_space" msgid="8224993703466381314">"چہرے کو اسٹور نہیں کیا جا سکتا۔"</string> <string name="face_error_canceled" msgid="283945501061931023">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"کافی زیادہ کوششیں کی گئیں۔ چہرے کی توثیق منسوخ ہو گئی۔"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"دوبارہ کوشش کریں۔"</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"رنگ کی تصحیح"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آن کر دیا"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ایکسیسبیلٹی شارٹ کٹ نے <xliff:g id="SERVICE_NAME">%1$s</xliff:g> کو آف کر دیا"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"موجودہ ایکسیسبیلٹی خصوصیت کو شروع کرنے کیلئے دوبارہ ایکسیسبیلٹی شارٹ کٹ استعمال کریں"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"ایکسیسبیلٹی بٹن پر تھپتھپانے وقت استعمال کرنے کیلئے ایک خصوصیت چنیں:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"خصوصیات تبدیل کرنے کیلئے، ایکسیسبیلٹی بٹن ٹچ کریں اور دبائے رکھیں۔"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"میگنیفکیشن"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 7ffc7e7bb9da..15671d18056f 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Aloqa operatoringiz orqali Wi-Fi chaqiruv funksiyasinini ulashda xato: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi qo‘ng‘iroqlar"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi chaqiruv"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN chaqiruv"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN chaqiruv"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi chaqiruv | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWi-Fi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chiq"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzalligi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Mobil internet afzalligi"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Aniqlanmadi"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Barmoq izi tekshirildi"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Barmoq izi skaneri ish holatida emas."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Yuzni aniqlash vaqti tugadi. Qaytadan urining."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Aniqlangan yuz saqlanmadi."</string> <string name="face_error_canceled" msgid="283945501061931023">"Yuzni aniqlash bekor qilindi."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Juda ko‘p urinildi. Skaner faolsizlantirildi."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Qaytadan urining."</string> @@ -1617,6 +1627,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Rangni tuzatish"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati yoqildi"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> xizmati o‘chirib qo‘yildi"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Joriy maxsus imkoniyatlar funksiyasini boshlash uchun tezkor ishga tushirishdan qayta foydalaning"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Maxsus imkoniyatlar tugmasi bosilganda ishga tushadigan funksiyani tanlang:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Funksiyalarni o‘zgartirish uchun Maxsus imkoniyatlar tugmasini bosib turing."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Kattalashtirish"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index a5f458b097e2..00ebbbcd342e 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Sự cố khi đăng ký dịch vụ gọi qua Wi‑Fi với nhà mạng của bạn: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"Gọi điện qua Wi-Fi %s"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"Gọi qua Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Cuộc gọi qua WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"Cuộc gọi qua WLAN <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"Wi-Fi <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Gọi qua Wi-Fi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"VoWifi <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Tắt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Ưu tiên Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Ưu tiên dữ liệu di động"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Không nhận dạng được"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Đã xác thực vân tay"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Phần cứng vân tay không khả dụng."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lưu vân tay. Vui lòng xóa vân tay hiện có."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Đã hết thời gian chờ khuôn mặt. Hãy thử lại."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Không thể lưu khuôn mặt."</string> <string name="face_error_canceled" msgid="283945501061931023">"Đã hủy thao tác dùng khuôn mặt."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Bạn đã thử quá nhiều lần. Hãy thử lại sau."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Đã thử quá nhiều lần. Đã tắt xác thực khuôn mặt."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Hãy thử lại."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Sửa màu"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Đã bật phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Đã tắt phím tắt trợ năng <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Sử dụng lại Phím tắt hỗ trợ tiếp cận để bắt đầu tính năng hỗ trợ tiếp cận hiện tại"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Chọn tính năng sẽ sử dụng khi bạn nhấn nút Trợ năng:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Để thay đổi các tính năng, hãy chạm và giữ nút Trợ năng."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Phóng to"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 966a5a53ffd8..e60afa731f9a 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"向您的运营商注册 WLAN 通话时遇到问题:<xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s WLAN 通话功能"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> WLAN 通话"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通话"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通话"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> WLAN"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WLAN 通话 | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"关闭"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首选 WLAN"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"首选移动数据网络"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"无法识别"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"已验证指纹"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指纹硬件无法使用。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"无法存储指纹。请移除一个现有的指纹。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"面孔处理操作超时,请重试。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"无法存储面孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"面孔处理操作已取消。"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"尝试次数过多,请稍后重试。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"尝试次数过多,系统已停用人脸身份验证功能。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"请重试。"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"无障碍快捷方式已开启<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"无障碍快捷方式已关闭<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再次使用无障碍快捷方式即可启动目前设置的无障碍功能"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"选择按下“无障碍”按钮时要使用的功能:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"要更改指定的功能,请触摸并按住“无障碍”按钮。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大功能"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 87eb41f2acba..cb93c61df88f 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"向您的流動網絡供應商註冊 Wi-Fi 通話時發生問題:<xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi 通話"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"WiFi 通話 | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首選 Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"流動數據優先"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"未能識別"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"驗證咗指紋"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"無法使用指紋軟件。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋無法儲存。請移除現有指紋。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔操作已逾時,請再試一次。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"臉孔操作已取消。"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證已停用。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"無障礙功能快速鍵已啟用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"無障礙功能快速鍵已停用 <xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再用一次無障礙功能捷徑,就可以啟用宜家設定咗嘅無障礙功能"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"請選擇輕按「無障礙功能」按鈕時使用的功能:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更功能,可按住「無障礙功能」按鈕。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index bd36ed654915..9c3d75ba68e5 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"向你的電信業者註冊 Wi‑Fi 通話時發生問題:<xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s Wi-Fi 通話"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi 通話"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> WLAN 通話"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Wi-Fi 通話 | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi 優先"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"行動網路優先"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"無法辨識"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"指紋驗證成功"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋硬體無法使用。"</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"無法儲存指紋,請先移除現有指紋。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"臉孔處理作業逾時,請再試一次。"</string> <string name="face_error_no_space" msgid="8224993703466381314">"無法儲存臉孔。"</string> <string name="face_error_canceled" msgid="283945501061931023">"臉孔處理作業已取消。"</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"嘗試次數過多,臉孔驗證功能已停用。"</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"請再試一次。"</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"色彩校正"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"協助工具捷徑啟用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"協助工具捷徑停用了「<xliff:g id="SERVICE_NAME">%1$s</xliff:g>」"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"再次使用協助工具捷徑即可啟動目前設定的無障礙功能"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"輕觸 [協助工具] 按鈕後,選擇你想使用的功能:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"如要變更指派的功能,請按住 [協助工具] 按鈕。"</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"放大"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index fd6614cecbe0..07c05aac0836 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -128,10 +128,14 @@ <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="7372514042696663278">"Inkinga yokubhalisa ukushaya kwe-Wi-Fi ngenkampani yakho yenethiwekhi: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> - <string-array name="wfcSpnFormats"> - <item msgid="6830082633573257149">"%s"</item> - <item msgid="4397097370387921767">"%s ukushaya kwe-Wi-Fi"</item> - </string-array> + <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> + <skip /> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="136001023263502280">"<xliff:g id="SPN">%s</xliff:g> ukushaya kwe-Wi-Fi"</string> + <string name="wfcSpnFormat_wlan_call" msgid="2533371081782489793">"Ikholi ye-WLAN"</string> + <string name="wfcSpnFormat_spn_wlan_call" msgid="2315240198303197168">"<xliff:g id="SPN">%s</xliff:g> ikholi ye-WLAN"</string> + <string name="wfcSpnFormat_spn_wifi" msgid="6546481665561961938">"<xliff:g id="SPN">%s</xliff:g> Wi-Fi"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="1726178784338466265">"Ukushaya kwe-WiFi | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_spn_vowifi" msgid="4444638298656953681">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Valiwe"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kuncanyelwa i-Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Kuncanyelwa iselula"</string> @@ -524,6 +528,10 @@ </string-array> <string name="biometric_not_recognized" msgid="5770511773560736082">"Akwaziwa"</string> <string name="fingerprint_authenticated" msgid="5309333983002526448">"Isingxivizo somunwe sigunyaziwe"</string> + <!-- no translation found for face_authenticated_no_confirmation_required (4018680978348659031) --> + <skip /> + <!-- no translation found for face_authenticated_confirmation_required (8778347003507633610) --> + <skip /> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Izingxenyekazi zekhompuyutha zezingxivizo zeminwe azitholakali."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Izigxivizo zeminwe azikwazi ukugcinwa. Sicela ususe izigxivizo zeminwe ezikhona."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string> @@ -560,6 +568,8 @@ <string name="face_error_timeout" msgid="4014326147867150054">"Kufinyelelwe kusikhathi sokuvala sobuso. Zama futhi."</string> <string name="face_error_no_space" msgid="8224993703466381314">"Ubuso abukwazi ukugcinwa."</string> <string name="face_error_canceled" msgid="283945501061931023">"Umsebenzi wobuso ukhanselwe."</string> + <!-- no translation found for face_error_user_canceled (8943921120862164539) --> + <skip /> <string name="face_error_lockout" msgid="3407426963155388504">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> <string name="face_error_lockout_permanent" msgid="8198354656746088890">"Imizamo eminingi kakhulu. Ukufakazela ubuqiniso kobuso kukhutshaziwe."</string> <string name="face_error_unable_to_process" msgid="238761109287767270">"Zama futhi."</string> @@ -1616,6 +1626,7 @@ <string name="color_correction_feature_name" msgid="6779391426096954933">"Ukulungiswa kombala"</string> <string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"Isinqamuleli sokufinyelela sivule i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> <string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"Isinqamuleli sokufinyelela sivale i-<xliff:g id="SERVICE_NAME">%1$s</xliff:g>"</string> + <string name="accessibility_shortcut_spoken_feedback" msgid="6143872712930414829">"Sebenzisa isinqamuleli sokufinyelela futhi ukuze uqale isici samanje sokufinyelela"</string> <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"Khetha isici ozosisebenzisa uma uthepha inkinobho yokufinyelela:"</string> <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"Ukuze ushintshe izici, thinta uphinde ubambe inkinobho yokufinyelela."</string> <string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"Ukukhuliswa"</string> diff --git a/packages/CaptivePortalLogin/res/values-de/strings.xml b/packages/CaptivePortalLogin/res/values-de/strings.xml index e64fb767669d..d8f7be991846 100644 --- a/packages/CaptivePortalLogin/res/values-de/strings.xml +++ b/packages/CaptivePortalLogin/res/values-de/strings.xml @@ -7,6 +7,6 @@ <string name="action_bar_label" msgid="917235635415966620">"Im Netzwerk anmelden"</string> <string name="action_bar_title" msgid="5645564790486983117">"In %1$s anmelden"</string> <string name="ssl_error_warning" msgid="6653188881418638872">"Im Netzwerk, zu dem du eine Verbindung herstellen möchtest, liegen Sicherheitsprobleme vor."</string> - <string name="ssl_error_example" msgid="647898534624078900">"Beispiel: Die Log-in-Seite gehört möglicherweise nicht zur angezeigten Organisation."</string> + <string name="ssl_error_example" msgid="647898534624078900">"Beispiel: Die Log-in-Seite gehört eventuell nicht zur angezeigten Organisation."</string> <string name="ssl_error_continue" msgid="6492718244923937110">"Trotzdem in einem Browser fortfahren"</string> </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 24dcd3e3b70d..2fbf42fc0f39 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -508,4 +508,7 @@ <!-- Allow dragging the PIP to a location to close it --> <bool name="config_pipEnableDismissDragToEdge">true</bool> + + <!-- SystemUI Plugins that can be loaded on user builds. --> + <string-array name="config_pluginWhitelist" translatable="false" /> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 8ac3aa1748ce..7c355c9b05e8 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -650,7 +650,6 @@ <dimen name="keyguard_affordance_icon_width">24dp</dimen> <dimen name="keyguard_indication_margin_bottom">65dp</dimen> - <dimen name="keyguard_indication_margin_bottom_ambient">16dp</dimen> <!-- The text size for battery level --> <dimen name="battery_level_text_size">12sp</dimen> @@ -939,9 +938,8 @@ burn-in on AOD. --> <dimen name="burn_in_prevention_offset_y">50dp</dimen> - <!-- The maximum offset in either direction that the charging indication moves vertically - to prevent burn-in on AOD. --> - <dimen name="charging_indication_burn_in_prevention_offset_y">5dp</dimen> + <!-- The maximum offset in either direction that icons move to prevent burn-in on AOD. --> + <dimen name="default_burn_in_prevention_offset">5dp</dimen> <dimen name="corner_size">8dp</dimen> <dimen name="top_padding">0dp</dimen> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index ff6a1c9501cc..10c8ec09bd5b 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -39,9 +39,9 @@ import android.app.PendingIntent; import android.app.UserSwitchObserver; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; -import android.hardware.biometrics.BiometricSourceType; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -49,11 +49,13 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.ContentObserver; +import android.hardware.biometrics.BiometricSourceType; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; import android.media.AudioManager; +import android.net.Uri; import android.os.BatteryManager; import android.os.CancellationSignal; import android.os.Handler; @@ -75,7 +77,6 @@ import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.util.Log; import android.util.SparseBooleanArray; -import android.util.SparseIntArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.IccCardConstants; @@ -250,6 +251,51 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms private static final int HW_UNAVAILABLE_RETRY_MAX = 3; + private class SettingObserver extends ContentObserver { + private final Uri FACE_UNLOCK_KEYGUARD_ENABLED = + Settings.Secure.getUriFor(Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED); + + private final ContentResolver mContentResolver; + + /** + * Creates a content observer. + * + * @param handler The handler to run {@link #onChange} on, or null if none. + */ + public SettingObserver(Handler handler) { + super(handler); + mContentResolver = mContext.getContentResolver(); + updateContentObserver(); + } + + public void updateContentObserver() { + mContentResolver.unregisterContentObserver(this); + mContentResolver.registerContentObserver(FACE_UNLOCK_KEYGUARD_ENABLED, + false /* notifyForDescendents */, + this, + UserHandle.USER_CURRENT); + + // Update the value immediately + onChange(true /* selfChange */, FACE_UNLOCK_KEYGUARD_ENABLED); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + if (FACE_UNLOCK_KEYGUARD_ENABLED.equals(uri)) { + mFaceSettingEnabledForUser = + Settings.Secure.getIntForUser( + mContentResolver, + Settings.Secure.FACE_UNLOCK_KEYGUARD_ENABLED, + 1 /* default */, + UserHandle.USER_CURRENT) != 0; + updateBiometricListeningState(); + } + } + } + + private final SettingObserver mSettingObserver; + private boolean mFaceSettingEnabledForUser; + private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { @@ -1389,6 +1435,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mSubscriptionManager = SubscriptionManager.from(context); mDeviceProvisioned = isDeviceProvisionedInSettingsDb(); mStrongAuthTracker = new StrongAuthTracker(context); + mSettingObserver = new SettingObserver(mHandler); // Since device can't be un-provisioned, we only need to register a content observer // to update mDeviceProvisioned when we are... @@ -1549,7 +1596,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { (mBouncer && !mKeyguardGoingAway) || mGoingToSleep || shouldListenForFaceAssistant() || (mKeyguardOccluded && mIsDreaming)) && !mSwitchingUser && !isFaceDisabled(getCurrentUser()) - && !mKeyguardGoingAway; + && !mKeyguardGoingAway && mFaceSettingEnabledForUser; } @@ -1719,6 +1766,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { * Handle {@link #MSG_USER_SWITCH_COMPLETE} */ private void handleUserSwitchComplete(int userId) { + mSettingObserver.updateContentObserver(); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt new file mode 100644 index 000000000000..d1e5059756ed --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/doze/util/BurnInHelper.kt @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.doze.util + +import android.util.MathUtils + +private const val MILLIS_PER_MINUTES = 1000 * 60f +private const val BURN_IN_PREVENTION_PERIOD_Y = 521f +private const val BURN_IN_PREVENTION_PERIOD_X = 83f + +/** + * Returns the translation offset that should be used to avoid burn in at + * the current time (in pixels.) + * + * @param amplitude Maximum translation that will be interpolated. + * @param xAxis If we're moving on X or Y. + */ +fun getBurnInOffset(amplitude: Int, xAxis: Boolean): Int { + return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, + amplitude.toFloat(), + if (xAxis) BURN_IN_PREVENTION_PERIOD_X else BURN_IN_PREVENTION_PERIOD_Y).toInt() +} + +/** + * Implements a continuous, piecewise linear, periodic zig-zag function + * + * Can be thought of as a linear approximation of abs(sin(x))) + * + * @param period period of the function, ie. zigzag(x + period) == zigzag(x) + * @param amplitude maximum value of the function + * @return a value between 0 and amplitude + */ +private fun zigzag(x: Float, amplitude: Float, period: Float): Float { + val xprime = x % period / (period / 2) + val interpolationAmount = if (xprime <= 1) xprime else 2 - xprime + return MathUtils.lerp(0f, amplitude, interpolationAmount) +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java index d5541e9be17e..7bc7e5f0095e 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java @@ -33,6 +33,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.UserHandle; +import android.util.ArraySet; import android.util.Log; import android.view.LayoutInflater; @@ -41,7 +42,9 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.plugins.VersionInfo.InvalidVersionException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import com.android.systemui.R; public class PluginInstanceManager<T extends Plugin> { @@ -63,17 +66,19 @@ public class PluginInstanceManager<T extends Plugin> { private final boolean isDebuggable; private final PackageManager mPm; private final PluginManagerImpl mManager; + private final ArraySet<String> mWhitelistedPlugins = new ArraySet<>(); PluginInstanceManager(Context context, String action, PluginListener<T> listener, boolean allowMultiple, Looper looper, VersionInfo version, PluginManagerImpl manager) { this(context, context.getPackageManager(), action, listener, allowMultiple, looper, version, - manager, Build.IS_DEBUGGABLE); + manager, Build.IS_DEBUGGABLE, + context.getResources().getStringArray(R.array.config_pluginWhitelist)); } @VisibleForTesting PluginInstanceManager(Context context, PackageManager pm, String action, PluginListener<T> listener, boolean allowMultiple, Looper looper, VersionInfo version, - PluginManagerImpl manager, boolean debuggable) { + PluginManagerImpl manager, boolean debuggable, String[] pluginWhitelist) { mMainHandler = new MainHandler(Looper.getMainLooper()); mPluginHandler = new PluginHandler(looper); mManager = manager; @@ -83,6 +88,7 @@ public class PluginInstanceManager<T extends Plugin> { mListener = listener; mAllowMultiple = allowMultiple; mVersion = version; + mWhitelistedPlugins.addAll(Arrays.asList(pluginWhitelist)); isDebuggable = debuggable; } @@ -294,9 +300,9 @@ public class PluginInstanceManager<T extends Plugin> { protected PluginInfo<T> handleLoadPlugin(ComponentName component) { // This was already checked, but do it again here to make extra extra sure, we don't // use these on production builds. - if (!isDebuggable) { + if (!isDebuggable && !mWhitelistedPlugins.contains(component.getPackageName())) { // Never ever ever allow these on production builds, they are only for prototyping. - Log.d(TAG, "Somehow hit second debuggable check"); + Log.w(TAG, "Plugin cannot be loaded on production build: " + component); return null; } String pkg = component.getPackageName(); diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java index 2a17e35f00dd..1cbf1fe0f2c4 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java @@ -37,13 +37,12 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; -import android.util.Log.TerribleFailure; -import android.util.Log.TerribleFailureHandler; import android.widget.Toast; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; +import com.android.systemui.R; import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper; import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.annotations.ProvidesInterface; @@ -53,13 +52,14 @@ import dalvik.system.PathClassLoader; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Arrays; import java.util.Map; - /** * @see Plugin */ public class PluginManagerImpl extends BroadcastReceiver implements PluginManager { + private static final String TAG = PluginManagerImpl.class.getSimpleName(); static final String DISABLE_PLUGIN = "com.android.systemui.action.DISABLE_PLUGIN"; private static PluginManager sInstance; @@ -68,6 +68,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage = new ArrayMap<>(); private final Map<String, ClassLoader> mClassLoaders = new ArrayMap<>(); private final ArraySet<String> mOneShotPackages = new ArraySet<>(); + private final ArraySet<String> mWhitelistedPlugins = new ArraySet<>(); private final Context mContext; private final PluginInstanceManagerFactory mFactory; private final boolean isDebuggable; @@ -79,30 +80,30 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage private boolean mWtfsSet; public PluginManagerImpl(Context context) { - this(context, new PluginInstanceManagerFactory(), - Build.IS_DEBUGGABLE, Thread.getUncaughtExceptionPreHandler()); + this(context, new PluginInstanceManagerFactory(), Build.IS_DEBUGGABLE, + context.getResources().getStringArray(R.array.config_pluginWhitelist), + Thread.getUncaughtExceptionPreHandler()); } @VisibleForTesting PluginManagerImpl(Context context, PluginInstanceManagerFactory factory, boolean debuggable, - UncaughtExceptionHandler defaultHandler) { + String[] whitelistedPlugins, UncaughtExceptionHandler defaultHandler) { mContext = context; mFactory = factory; mLooper = Dependency.get(Dependency.BG_LOOPER); isDebuggable = debuggable; + mWhitelistedPlugins.addAll(Arrays.asList(whitelistedPlugins)); mPluginPrefs = new PluginPrefs(mContext); PluginExceptionHandler uncaughtExceptionHandler = new PluginExceptionHandler( defaultHandler); Thread.setUncaughtExceptionPreHandler(uncaughtExceptionHandler); - if (isDebuggable) { - new Handler(mLooper).post(() -> { - // Plugin dependencies that don't have another good home can go here, but - // dependencies that have better places to init can happen elsewhere. - Dependency.get(PluginDependencyProvider.class) - .allowPluginDependency(ActivityStarter.class); - }); - } + new Handler(mLooper).post(() -> { + // Plugin dependencies that don't have another good home can go here, but + // dependencies that have better places to init can happen elsewhere. + Dependency.get(PluginDependencyProvider.class) + .allowPluginDependency(ActivityStarter.class); + }); } public <T extends Plugin> T getOneShotPlugin(Class<T> cls) { @@ -117,10 +118,6 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage } public <T extends Plugin> T getOneShotPlugin(String action, Class<?> cls) { - if (!isDebuggable) { - // Never ever ever allow these on production builds, they are only for prototyping. - return null; - } if (Looper.myLooper() != Looper.getMainLooper()) { throw new RuntimeException("Must be called from UI thread"); } @@ -153,10 +150,6 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage public <T extends Plugin> void addPluginListener(String action, PluginListener<T> listener, Class cls, boolean allowMultiple) { - if (!isDebuggable) { - // Never ever ever allow these on production builds, they are only for prototyping. - return; - } mPluginPrefs.addAction(action); PluginInstanceManager p = mFactory.createPluginInstanceManager(mContext, action, listener, allowMultiple, mLooper, cls, this); @@ -166,10 +159,6 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage } public void removePluginListener(PluginListener<?> listener) { - if (!isDebuggable) { - // Never ever ever allow these on production builds, they are only for prototyping. - return; - } if (!mPluginMap.containsKey(listener)) return; mPluginMap.remove(listener).destroy(); if (mPluginMap.size() == 0) { @@ -261,6 +250,11 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage } public ClassLoader getClassLoader(String sourceDir, String pkg) { + if (!isDebuggable && !mWhitelistedPlugins.contains(pkg)) { + Log.w(TAG, "Cannot get class loader for non-whitelisted plugin. Src:" + sourceDir + + ", pkg: " + pkg); + return null; + } if (mClassLoaders.containsKey(pkg)) { return mClassLoaders.get(pkg); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 551e8a9dcb81..0c5f39198b4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -298,27 +298,6 @@ public class KeyguardIndicationController { if (mVisible) { // Walk down a precedence-ordered list of what indication // should be shown based on user or device state - if (mDozing) { - mTextView.setTextColor(Color.WHITE); - if (!TextUtils.isEmpty(mTransientIndication)) { - // When dozing we ignore any text color and use white instead, because - // colors can be hard to read in low brightness. - mTextView.switchIndication(mTransientIndication); - } else if (mPowerPluggedIn) { - String indication = computePowerIndication(); - if (animate) { - animateText(mTextView, indication); - } else { - mTextView.switchIndication(indication); - } - } else { - String percentage = NumberFormat.getPercentInstance() - .format(mBatteryLevel / 100f); - mTextView.switchIndication(percentage); - } - return; - } - KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); int userId = KeyguardUpdateMonitor.getCurrentUser(); String trustGrantedIndication = getTrustGrantedIndication(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java new file mode 100644 index 000000000000..4f957bfcbbcc --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButton.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.annotation.DrawableRes; +import android.annotation.IdRes; +import android.content.Context; +import android.view.View; +import com.android.systemui.statusbar.policy.KeyButtonDrawable; +import com.android.systemui.statusbar.policy.KeyButtonView; + +/** + * Simple contextual button that is added to the {@link ContextualButtonGroup}. Extend if need extra + * functionality. + */ +public class ContextualButton extends ButtonDispatcher { + + protected final @DrawableRes int mIconResId; + + /** + * Create a contextual button that will use a {@link KeyButtonView} and + * {@link KeyButtonDrawable} get and show the button from xml to its icon drawable. + * @param buttonResId the button view from xml layout + * @param iconResId icon resource to be used + */ + public ContextualButton(@IdRes int buttonResId, @DrawableRes int iconResId) { + super(buttonResId); + mIconResId = iconResId; + } + + /** + * Reload the drawable from resource id, should reapply the previous dark intensity. + */ + public void updateIcon() { + final KeyButtonDrawable currentDrawable = getImageDrawable(); + KeyButtonDrawable drawable = getNewDrawable(); + if (currentDrawable != null) { + drawable.setDarkIntensity(currentDrawable.getDarkIntensity()); + } + setImageDrawable(drawable); + } + + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + + // Stop any active animations if hidden + final KeyButtonDrawable currentDrawable = getImageDrawable(); + if (visibility != View.VISIBLE && currentDrawable != null && currentDrawable.canAnimate()) { + currentDrawable.clearAnimationCallbacks(); + currentDrawable.resetAnimation(); + } + } + + protected KeyButtonDrawable getNewDrawable() { + return KeyButtonDrawable.create(getContext(), mIconResId, false /* shadow */); + } + + protected Context getContext() { + return getCurrentView().getContext(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButtonGroup.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButtonGroup.java new file mode 100644 index 000000000000..1b039663ab73 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ContextualButtonGroup.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.annotation.IdRes; +import android.annotation.NonNull; +import android.view.View; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +public class ContextualButtonGroup extends ButtonDispatcher { + private static final int INVALID_INDEX = -1; + + // List of pairs that contains the button and if the button was visible within this group + private final List<ButtonData> mButtonData = new ArrayList<>(); + + public ContextualButtonGroup(@IdRes int containerId) { + super(containerId); + } + + /** + * Add a contextual button to the group. The order of adding increases in its priority. The + * priority is used to determine which button should be visible when setting multiple button's + * visibility {@see setButtonVisiblity}. + * @param button the button added to the group + */ + public void addButton(@NonNull ContextualButton button) { + mButtonData.add(new ButtonData(button)); + } + + public ContextualButton getContextButton(@IdRes int buttonResId) { + int index = getContextButtonIndex(buttonResId); + if (index != INVALID_INDEX) { + return mButtonData.get(index).button; + } + return null; + } + + public ContextualButton getVisibleContextButton() { + for (int i = mButtonData.size() - 1; i >= 0; --i) { + if (mButtonData.get(i).markedVisible) { + return mButtonData.get(i).button; + } + } + return null; + } + + /** + * Set the visibility of the button by {@param buttonResId} with {@param visible}. Only one + * button is shown at a time. The input button will only show up if it has higher priority than + * a previous button, otherwise it will be marked as visible and shown later if all higher + * priority buttons are invisible. Therefore hiding a button will show the next marked visible + * button. This group's view will be visible if at least one button is visible. + * @return if the button is visible after operation + * @throws RuntimeException if the input id does not match any of the ids in the group + */ + public int setButtonVisiblity(@IdRes int buttonResId, boolean visible) { + final int index = getContextButtonIndex(buttonResId); + if (index == INVALID_INDEX) { + throw new RuntimeException("Cannot find the button id of " + buttonResId + + " in context group"); + } + setVisibility(View.INVISIBLE); + mButtonData.get(index).markedVisible = visible; + + // Make all buttons invisible except the first markedVisible button + boolean alreadyFoundVisibleButton = false; + int i = mButtonData.size() - 1; + for (; i >= 0; --i) { + final ButtonData buttonData = mButtonData.get(i); + if (!alreadyFoundVisibleButton && buttonData.markedVisible) { + buttonData.setVisibility(View.VISIBLE); + setVisibility(View.VISIBLE); + alreadyFoundVisibleButton = true; + } else { + buttonData.setVisibility(View.INVISIBLE); + } + } + return mButtonData.get(index).button.getVisibility(); + } + + /** + * See if button is group visible. Group visible determines if a button can be visible when + * higher priority buttons go invisible. + * @param buttonResId the button to see if it is group visible + * @return true if button is group visible + */ + public boolean isButtonVisibleWithinGroup(@IdRes int buttonResId) { + final int index = getContextButtonIndex(buttonResId); + return index != INVALID_INDEX && mButtonData.get(index).markedVisible; + } + + /** + * Update all the icons that are attached to this group. This will get all the buttons to update + * their icons for their buttons. + */ + public void updateIcons() { + for (ButtonData data : mButtonData) { + data.button.updateIcon(); + } + } + + public void dump(PrintWriter pw) { + pw.println("ContextualButtonGroup {"); + pw.println(" getVisibleContextButton(): " + getVisibleContextButton()); + pw.println(" isVisible(): " + isVisible()); + pw.println(" mButtonData [ "); + for (int i = mButtonData.size() - 1; i >= 0; --i) { + final ButtonData data = mButtonData.get(i); + pw.println(" " + i + ": markedVisible=" + data.markedVisible + + " visible=" + data.button.getVisibility() + + " alpha=" + data.button.getAlpha()); + } + pw.println(" ]"); + pw.println(" }"); + } + + private int getContextButtonIndex(@IdRes int buttonResId) { + for (int i = 0; i < mButtonData.size(); ++i) { + if (mButtonData.get(i).button.getId() == buttonResId) { + return i; + } + } + return INVALID_INDEX; + } + + private final static class ButtonData { + ContextualButton button; + boolean markedVisible; + + ButtonData(ContextualButton button) { + this.button = button; + this.markedVisible = false; + } + + void setVisibility(int visiblity) { + button.setVisibility(visiblity); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index d89bcdaffe3e..f667726461f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK; import static android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_BUTTON; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_LEFT_UNLOCK; import static com.android.systemui.tuner.LockscreenFragment.LOCKSCREEN_RIGHT_BUTTON; @@ -171,7 +172,6 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mDozing; private int mIndicationBottomMargin; - private int mIndicationBottomMarginAmbient; private float mDarkAmount; private int mBurnInXOffset; private int mBurnInYOffset; @@ -246,10 +246,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mIndicationText = findViewById(R.id.keyguard_indication_text); mIndicationBottomMargin = getResources().getDimensionPixelSize( R.dimen.keyguard_indication_margin_bottom); - mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize( - R.dimen.keyguard_indication_margin_bottom_ambient); mBurnInYOffset = getResources().getDimensionPixelSize( - R.dimen.charging_indication_burn_in_prevention_offset_y); + R.dimen.default_burn_in_prevention_offset); updateCameraVisibility(); mUnlockMethodCache = UnlockMethodCache.getInstance(getContext()); mUnlockMethodCache.addListener(this); @@ -320,10 +318,8 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL super.onConfigurationChanged(newConfig); mIndicationBottomMargin = getResources().getDimensionPixelSize( R.dimen.keyguard_indication_margin_bottom); - mIndicationBottomMarginAmbient = getResources().getDimensionPixelSize( - R.dimen.keyguard_indication_margin_bottom_ambient); mBurnInYOffset = getResources().getDimensionPixelSize( - R.dimen.charging_indication_burn_in_prevention_offset_y); + R.dimen.default_burn_in_prevention_offset); MarginLayoutParams mlp = (MarginLayoutParams) mIndicationArea.getLayoutParams(); if (mlp.bottomMargin != mIndicationBottomMargin) { mlp.bottomMargin = mIndicationBottomMargin; @@ -567,9 +563,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } mDarkAmount = darkAmount; - mIndicationArea.setAlpha(MathUtils.lerp(1f, 0.7f, darkAmount)); - mIndicationArea.setTranslationY(MathUtils.lerp(0, - mIndicationBottomMargin - mIndicationBottomMarginAmbient, darkAmount)); + mIndicationArea.setAlpha(1f - darkAmount); } private static boolean isSuccessfulLaunch(int result) { @@ -842,10 +836,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL public void dozeTimeTick() { if (mDarkAmount == 1) { - // Move indication every minute to avoid burn-in - int dozeTranslation = mIndicationBottomMargin - mIndicationBottomMarginAmbient; - int burnInYOffset = (int) (-mBurnInYOffset + Math.random() * mBurnInYOffset * 2); - mIndicationArea.setTranslationY(dozeTranslation + burnInYOffset); + // Move views every minute to avoid burn-in + int burnInYOffset = getBurnInOffset(mBurnInYOffset * 2, false /* xAxis */) + - mBurnInYOffset; + mLockIcon.setTranslationY(burnInYOffset); } } @@ -854,7 +848,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL return; } mBurnInXOffset = burnInXOffset; - mIndicationArea.setTranslationX(burnInXOffset); + mLockIcon.setTranslationX(burnInXOffset); } private class DefaultLeftButton implements IntentButton { 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 042e4ff16d3a..33bc164d807c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import static com.android.systemui.statusbar.notification.NotificationUtils.interpolate; import android.content.res.Resources; @@ -30,10 +31,6 @@ import com.android.systemui.R; */ public class KeyguardClockPositionAlgorithm { - private static final long MILLIS_PER_MINUTES = 1000 * 60; - private static final float BURN_IN_PREVENTION_PERIOD_Y = 521; - private static final float BURN_IN_PREVENTION_PERIOD_X = 83; - /** * How much the clock height influences the shade position. * 0 means nothing, 1 means move the shade up by the height of the clock @@ -228,34 +225,15 @@ public class KeyguardClockPositionAlgorithm { } private float burnInPreventionOffsetY() { - return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, - mBurnInPreventionOffsetY * 2, - BURN_IN_PREVENTION_PERIOD_Y) + return getBurnInOffset(mBurnInPreventionOffsetY * 2, false /* xAxis */) - mBurnInPreventionOffsetY; } private float burnInPreventionOffsetX() { - return zigzag(System.currentTimeMillis() / MILLIS_PER_MINUTES, - mBurnInPreventionOffsetX * 2, - BURN_IN_PREVENTION_PERIOD_X) + return getBurnInOffset(mBurnInPreventionOffsetX * 2, true /* xAxis */) - mBurnInPreventionOffsetX; } - /** - * Implements a continuous, piecewise linear, periodic zig-zag function - * - * Can be thought of as a linear approximation of abs(sin(x))) - * - * @param period period of the function, ie. zigzag(x + period) == zigzag(x) - * @param amplitude maximum value of the function - * @return a value between 0 and amplitude - */ - private float zigzag(float x, float amplitude, float period) { - float xprime = (x % period) / (period / 2); - float interpolationAmount = (xprime <= 1) ? xprime : (2 - xprime); - return interpolate(0, amplitude, interpolationAmount); - } - public static class Result { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 5630da6662e9..7c84df91fffa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.ScreenDecorations.DisplayCutoutView.boundsFromDirection; +import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import android.annotation.ColorInt; import android.content.Context; @@ -70,16 +71,18 @@ public class KeyguardStatusBarView extends RelativeLayout private static final int LAYOUT_CUTOUT = 1; private static final int LAYOUT_NO_CUTOUT = 2; + private final Rect mEmptyRect = new Rect(0, 0, 0, 0); + private boolean mShowPercentAvailable; private boolean mBatteryCharging; private boolean mKeyguardUserSwitcherShowing; private boolean mBatteryListening; private TextView mCarrierLabel; - private View mSystemIconsSuperContainer; private MultiUserSwitch mMultiUserSwitch; private ImageView mMultiUserAvatar; private BatteryMeterView mBatteryView; + private StatusIconContainer mStatusIconContainer; private BatteryController mBatteryController; private KeyguardUserSwitcher mKeyguardUserSwitcher; @@ -99,6 +102,18 @@ public class KeyguardStatusBarView extends RelativeLayout */ private int mCutoutSideNudge = 0; + /** + * How much to move icons to avoid burn in. + */ + private int mBurnInOffset; + private int mCurrentBurnInOffsetX; + private int mCurrentBurnInOffsetY; + + /** + * Ratio representing being in ambient mode or not. + */ + private float mDarkAmount; + public KeyguardStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -113,6 +128,7 @@ public class KeyguardStatusBarView extends RelativeLayout mBatteryView = mSystemIconsContainer.findViewById(R.id.battery); mCutoutSpace = findViewById(R.id.cutout_space_view); mStatusIconArea = findViewById(R.id.status_icon_area); + mStatusIconContainer = findViewById(R.id.statusIcons); loadDimens(); updateUserSwitcher(); @@ -169,6 +185,8 @@ public class KeyguardStatusBarView extends RelativeLayout R.dimen.system_icons_super_container_avatarless_margin_end); mCutoutSideNudge = getResources().getDimensionPixelSize( R.dimen.display_cutout_margin_consumption); + mBurnInOffset = getResources().getDimensionPixelSize( + R.dimen.default_burn_in_prevention_offset); mShowPercentAvailable = getContext().getResources().getBoolean( com.android.internal.R.bool.config_battery_percentage_setting_available); } @@ -440,6 +458,14 @@ public class KeyguardStatusBarView extends RelativeLayout } public void onThemeChanged() { + mBatteryView.setColorsFromContext(mContext); + updateIconsAndTextColors(); + // Reload user avatar + ((UserInfoControllerImpl) Dependency.get(UserInfoController.class)) + .onDensityOrFontScaleChanged(); + } + + private void updateIconsAndTextColors() { @ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor); @ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext, @@ -448,14 +474,9 @@ public class KeyguardStatusBarView extends RelativeLayout float intensity = textColor == Color.WHITE ? 0 : 1; mCarrierLabel.setTextColor(iconColor); mIconManager.setTint(iconColor); - mBatteryView.setColorsFromContext(mContext); - Rect tintArea = new Rect(0, 0, 0, 0); - applyDarkness(R.id.battery, tintArea, intensity, iconColor); - applyDarkness(R.id.clock, tintArea, intensity, iconColor); - // Reload user avatar - ((UserInfoControllerImpl) Dependency.get(UserInfoController.class)) - .onDensityOrFontScaleChanged(); + applyDarkness(R.id.battery, mEmptyRect, intensity * (1f - mDarkAmount), iconColor); + applyDarkness(R.id.clock, mEmptyRect, intensity, iconColor); } private void applyDarkness(int id, Rect tintArea, float intensity, int color) { @@ -475,4 +496,32 @@ public class KeyguardStatusBarView extends RelativeLayout mBatteryView.dump(fd, pw, args); } } + + public void setDarkAmount(float darkAmount) { + mDarkAmount = darkAmount; + if (darkAmount == 0) { + dozeTimeTick(); + } + updateDozeState(); + } + + public void dozeTimeTick() { + mCurrentBurnInOffsetX = getBurnInOffset(mBurnInOffset, true /* xAxis */); + mCurrentBurnInOffsetY = getBurnInOffset(mBurnInOffset, false /* xAxis */); + updateDozeState(); + } + + private void updateDozeState() { + float alpha = 1f - mDarkAmount; + int visibility = alpha != 0f ? VISIBLE : INVISIBLE; + mCarrierLabel.setAlpha(alpha); + mCarrierLabel.setVisibility(visibility); + mStatusIconContainer.setAlpha(alpha); + mStatusIconContainer.setVisibility(visibility); + + mSystemIconsContainer.setTranslationX(-mCurrentBurnInOffsetX * mDarkAmount); + mSystemIconsContainer.setTranslationY(mCurrentBurnInOffsetY * mDarkAmount); + updateIconsAndTextColors(); + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 66486cedcfb5..cbbb0e3dea96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -463,7 +463,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { style = rotationCCW ? R.style.RotateButtonCCWStart0 : R.style.RotateButtonCWStart0; } - mNavigationBarView.updateRotateSuggestionButtonStyle(style, true); + mNavigationBarView.updateRotateSuggestionButtonStyle(style); } if (mNavigationBarWindowState != WINDOW_STATE_SHOWING) { 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 9d13ea22b281..aebcb9f27e24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -36,8 +36,6 @@ import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; -import android.graphics.drawable.AnimatedVectorDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -46,7 +44,6 @@ import androidx.annotation.ColorInt; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; -import android.view.ContextThemeWrapper; import android.view.Display; import android.view.MotionEvent; import android.view.Surface; @@ -59,7 +56,6 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; -import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.DockedStackExistsListener; import com.android.systemui.Interpolators; @@ -106,10 +102,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav boolean mVertical; private int mCurrentRotation = -1; - boolean mShowMenu; - boolean mShowAccessibilityButton; boolean mLongClickableAccessibilityButton; - boolean mShowRotateButton; int mDisabledFlags = 0; int mNavigationIconHints = 0; @@ -125,10 +118,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private KeyButtonDrawable mHomeDefaultIcon; private KeyButtonDrawable mRecentIcon; private KeyButtonDrawable mDockedIcon; - private KeyButtonDrawable mImeIcon; - private KeyButtonDrawable mMenuIcon; - private KeyButtonDrawable mAccessibilityIcon; - private KeyButtonDrawable mRotateSuggestionIcon; private GestureHelper mGestureHelper; private final DeadZone mDeadZone; @@ -151,6 +140,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private boolean mDockedStackExists; private final SparseArray<ButtonDispatcher> mButtonDispatchers = new SparseArray<>(); + private final ContextualButtonGroup mContextualButtonGroup; private Configuration mConfiguration; private NavigationBarInflaterView mNavigationInflaterView; @@ -159,8 +149,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav private RecentsOnboarding mRecentsOnboarding; private NotificationPanelView mPanelView; - private int mRotateBtnStyle = R.style.RotateButtonCCWStart90; - /** * Helper that is responsible for showing the right toast when a disallowed activity operation * occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in @@ -279,17 +267,30 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav Context.WINDOW_SERVICE)).getDefaultDisplay(); mVertical = false; - mShowMenu = false; - - mShowAccessibilityButton = false; mLongClickableAccessibilityButton = false; + // Set up the context group of buttons + mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container); + final ContextualButton menuButton = new ContextualButton(R.id.menu, + R.drawable.ic_sysbar_menu); + final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher, + R.drawable.ic_ime_switcher_default); + final RotationContextButton rotateSuggestionButton = new RotationContextButton( + R.id.rotate_suggestion, R.drawable.ic_sysbar_rotate_button, + R.style.RotateButtonCCWStart90); + final ContextualButton accessibilityButton = + new ContextualButton(R.id.accessibility_button, + R.drawable.ic_sysbar_accessibility_button); + mContextualButtonGroup.addButton(menuButton); + mContextualButtonGroup.addButton(imeSwitcherButton); + mContextualButtonGroup.addButton(rotateSuggestionButton); + mContextualButtonGroup.addButton(accessibilityButton); + mOverviewProxyService = Dependency.get(OverviewProxyService.class); mRecentsOnboarding = new RecentsOnboarding(context, mOverviewProxyService); mConfiguration = new Configuration(); mConfiguration.updateFrom(context.getResources().getConfiguration()); - reloadNavIcons(); mScreenPinningNotify = new ScreenPinningNotify(mContext); mBarTransitions = new NavigationBarTransitions(this); @@ -297,14 +298,11 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mButtonDispatchers.put(R.id.back, new ButtonDispatcher(R.id.back)); mButtonDispatchers.put(R.id.home, new ButtonDispatcher(R.id.home)); mButtonDispatchers.put(R.id.recent_apps, new ButtonDispatcher(R.id.recent_apps)); - mButtonDispatchers.put(R.id.menu, new ButtonDispatcher(R.id.menu)); - mButtonDispatchers.put(R.id.ime_switcher, new ButtonDispatcher(R.id.ime_switcher)); - mButtonDispatchers.put(R.id.accessibility_button, - new ButtonDispatcher(R.id.accessibility_button)); - mButtonDispatchers.put(R.id.rotate_suggestion, - new ButtonDispatcher(R.id.rotate_suggestion)); - mButtonDispatchers.put(R.id.menu_container, - new ButtonDispatcher(R.id.menu_container)); + mButtonDispatchers.put(R.id.menu, menuButton); + mButtonDispatchers.put(R.id.ime_switcher, imeSwitcherButton); + mButtonDispatchers.put(R.id.accessibility_button, accessibilityButton); + mButtonDispatchers.put(R.id.rotate_suggestion, rotateSuggestionButton); + mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup); mDeadZone = new DeadZone(this); } @@ -432,10 +430,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav return mButtonDispatchers.get(R.id.rotate_suggestion); } - public ButtonDispatcher getMenuContainer() { - return mButtonDispatchers.get(R.id.menu_container); - } - public SparseArray<ButtonDispatcher> getButtonDispatchers() { return mButtonDispatchers; } @@ -473,14 +467,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } if (densityChange || dirChange) { mRecentIcon = getDrawable(R.drawable.ic_sysbar_recent); - mMenuIcon = getDrawable(R.drawable.ic_sysbar_menu); - - mAccessibilityIcon = getDrawable(R.drawable.ic_sysbar_accessibility_button, - false /* hasShadow */); - - mImeIcon = getDrawable(R.drawable.ic_ime_switcher_default, false /* hasShadow */); - - updateRotateSuggestionButtonStyle(mRotateBtnStyle, false); + mContextualButtonGroup.updateIcons(); } if (orientationChange || densityChange || dirChange) { mBackIcon = getBackDrawable(); @@ -538,19 +525,11 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } private KeyButtonDrawable getDrawable(@DrawableRes int icon) { - return getDrawable(mContext, icon, true /* hasShadow */); + return KeyButtonDrawable.create(mContext, icon, true /* hasShadow */); } private KeyButtonDrawable getDrawable(@DrawableRes int icon, boolean hasShadow) { - return getDrawable(mContext, icon, hasShadow); - } - - private KeyButtonDrawable getDrawable(Context ctx, @DrawableRes int icon, boolean hasShadow) { - final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme); - final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme); - Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme); - Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme); - return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow); + return KeyButtonDrawable.create(mContext, icon, hasShadow); } @Override @@ -609,24 +588,8 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav updateRecentsIcon(); // Update IME button visibility, a11y and rotate button always overrides the appearance - final boolean showImeButton = - !mShowAccessibilityButton && - !mShowRotateButton && - ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); - getImeSwitchButton().setVisibility(showImeButton ? View.VISIBLE : View.INVISIBLE); - getImeSwitchButton().setImageDrawable(mImeIcon); - updateContextualContainerVisibility(); - - // Update menu button, visibility logic in method - setMenuVisibility(mShowMenu, true); - getMenuButton().setImageDrawable(mMenuIcon); - - // Update rotate button, visibility altered by a11y button logic - getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); - - // Update a11y button, visibility logic in state method - setAccessibilityButtonState(mShowAccessibilityButton, mLongClickableAccessibilityButton); - getAccessibilityButton().setImageDrawable(mAccessibilityIcon); + mContextualButtonGroup.setButtonVisiblity(R.id.ime_switcher, + (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); mBarTransitions.reapplyDarkIntensity(); @@ -782,88 +745,28 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } public void setMenuVisibility(final boolean show) { - setMenuVisibility(show, false); + mContextualButtonGroup.setButtonVisiblity(R.id.menu, show); } - public void setMenuVisibility(final boolean show, final boolean force) { - if (!force && mShowMenu == show) return; - - mShowMenu = show; - - // Only show Menu if IME switcher, rotate and Accessibility buttons are not shown. - final boolean shouldShow = mShowMenu && - !mShowAccessibilityButton && - !mShowRotateButton && - ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0); - - getMenuButton().setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE); - updateContextualContainerVisibility(); + public void updateRotateSuggestionButtonStyle(@StyleRes int style) { + RotationContextButton button = (RotationContextButton) mContextualButtonGroup + .getContextButton(R.id.rotate_suggestion); + button.setStyle(style); + button.updateIcon(); } public void setAccessibilityButtonState(final boolean visible, final boolean longClickable) { - mShowAccessibilityButton = visible; mLongClickableAccessibilityButton = longClickable; - if (visible) { - // Accessibility button overrides Menu, IME switcher and rotate buttons. - setMenuVisibility(false, true); - getImeSwitchButton().setVisibility(View.INVISIBLE); - setRotateButtonVisibility(false); - } - - getAccessibilityButton().setVisibility(visible ? View.VISIBLE : View.INVISIBLE); getAccessibilityButton().setLongClickable(longClickable); - updateContextualContainerVisibility(); - } - - public void updateRotateSuggestionButtonStyle(@StyleRes int style, boolean setIcon) { - mRotateBtnStyle = style; - final Context ctx = getContext(); - - // Use the supplied style to set the icon's rotation parameters - Context rotateContext = new ContextThemeWrapper(ctx, style); - - // Recreate the icon and set it if needed - float previousIntensity = mRotateSuggestionIcon != null - ? mRotateSuggestionIcon.getDarkIntensity() : 0; - mRotateSuggestionIcon = getDrawable(rotateContext, R.drawable.ic_sysbar_rotate_button, - false /* hasShadow */); - mRotateSuggestionIcon.setDarkIntensity(previousIntensity); - - if (setIcon) getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon); + mContextualButtonGroup.setButtonVisiblity(R.id.accessibility_button, visible); } public int setRotateButtonVisibility(boolean visible) { - // Never show if a11y is visible - final boolean adjVisible = visible && !mShowAccessibilityButton; - final int vis = adjVisible ? View.VISIBLE : View.INVISIBLE; - - // No need to do anything if the request matches the current state - if (vis == getRotateSuggestionButton().getVisibility()) return vis; - - getRotateSuggestionButton().setVisibility(vis); - mShowRotateButton = visible; - updateContextualContainerVisibility(); - - // Stop any active animations if hidden - if (!visible && mRotateSuggestionIcon.canAnimate()) { - mRotateSuggestionIcon.clearAnimationCallbacks(); - mRotateSuggestionIcon.resetAnimation(); - } - - // Hide/restore other button visibility, if necessary - updateNavButtonIcons(); - - // Return applied visibility - return vis; + return mContextualButtonGroup.setButtonVisiblity(R.id.rotate_suggestion, visible); } - public boolean isRotateButtonVisible() { return mShowRotateButton; } - - private void updateContextualContainerVisibility() { - // Only show the menu container when one of its buttons are visible - getMenuContainer().setVisibility((mShowAccessibilityButton || mShowRotateButton || mShowMenu - || (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0) - ? VISIBLE : INVISIBLE); + public boolean isRotateButtonVisible() { + return getRotateSuggestionButton().isVisible(); } void hideRecentsOnboarding() { @@ -897,6 +800,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav DockedStackExistsListener.register(mDockedListener); updateRotatedViews(); + reloadNavIcons(); } public void onDarkIntensityChange(float intensity) { @@ -998,7 +902,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav // force the low profile & disabled states into compliance mBarTransitions.init(); - setMenuVisibility(mShowMenu, true /* force */); if (DEBUG) { Log.d(TAG, "reorient(): rot=" + mCurrentRotation); @@ -1204,17 +1107,19 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav pw.println(String.format(" disabled=0x%08x vertical=%s menu=%s", mDisabledFlags, mVertical ? "true" : "false", - mShowMenu ? "true" : "false")); + getMenuButton().isVisible() ? "true" : "false")); dumpButton(pw, "back", getBackButton()); dumpButton(pw, "home", getHomeButton()); dumpButton(pw, "rcnt", getRecentsButton()); dumpButton(pw, "menu", getMenuButton()); + dumpButton(pw, "rota", getRotateSuggestionButton()); dumpButton(pw, "a11y", getAccessibilityButton()); - mRecentsOnboarding.dump(pw); - pw.println(" }"); + + mContextualButtonGroup.dump(pw); + mRecentsOnboarding.dump(pw); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index e5e5d4038c37..3a4c218d337e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -63,6 +63,7 @@ import com.android.systemui.classifier.FalsingManager; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.fragments.FragmentHostManager.FragmentListener; import com.android.systemui.plugins.qs.QS; +import com.android.systemui.qs.QSFragment; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.GestureRecorder; import com.android.systemui.statusbar.KeyguardAffordanceView; @@ -455,6 +456,10 @@ public class NotificationPanelView extends PanelView implements initBottomArea(); setDarkAmount(mLinearDarkAmount, mInterpolatedDarkAmount); + if (mKeyguardStatusBar != null) { + mKeyguardStatusBar.onThemeChanged(); + } + setKeyguardStatusViewVisibility(mBarState, false, false); setKeyguardBottomAreaVisibility(mBarState, false); } @@ -1836,10 +1841,10 @@ public class NotificationPanelView extends PanelView implements return; } float alphaQsExpansion = 1 - Math.min(1, getQsExpansionFraction() * 2); - mKeyguardStatusBar.setAlpha(Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) - * mKeyguardStatusBarAnimateAlpha); - mKeyguardStatusBar.setVisibility(mKeyguardStatusBar.getAlpha() != 0f - && !mDozing ? VISIBLE : INVISIBLE); + float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) + * mKeyguardStatusBarAnimateAlpha; + mKeyguardStatusBar.setAlpha(newAlpha); + mKeyguardStatusBar.setVisibility(newAlpha != 0f ? VISIBLE : INVISIBLE); } private void updateKeyguardBottomAreaAlpha() { @@ -2347,16 +2352,7 @@ public class NotificationPanelView extends PanelView implements } private void updateDozingVisibilities(boolean animate) { - if (mDozing) { - mKeyguardStatusBar.setVisibility(View.INVISIBLE); - mKeyguardBottomArea.setDozing(mDozing, animate); - } else { - mKeyguardStatusBar.setVisibility(View.VISIBLE); - mKeyguardBottomArea.setDozing(mDozing, animate); - if (animate) { - animateKeyguardStatusBarIn(DOZE_ANIMATION_DURATION); - } - } + mKeyguardBottomArea.setDozing(mDozing, animate); } @Override @@ -2749,6 +2745,9 @@ public class NotificationPanelView extends PanelView implements } }); mNotificationStackScroller.setQsContainer((ViewGroup) mQs.getView()); + if (mQs instanceof QSFragment) { + mKeyguardStatusBar.setQSPanel(((QSFragment) mQs).getQsPanel()); + } updateQsExpansion(); } @@ -2811,6 +2810,7 @@ public class NotificationPanelView extends PanelView implements private void setDarkAmount(float linearAmount, float amount) { mInterpolatedDarkAmount = amount; mLinearDarkAmount = linearAmount; + mKeyguardStatusBar.setDarkAmount(mInterpolatedDarkAmount); mKeyguardStatusView.setDarkAmount(mInterpolatedDarkAmount); mKeyguardBottomArea.setDarkAmount(mInterpolatedDarkAmount); positionClockAndNotifications(); @@ -2837,6 +2837,7 @@ public class NotificationPanelView extends PanelView implements } public void dozeTimeTick() { + mKeyguardStatusBar.dozeTimeTick(); mKeyguardStatusView.dozeTimeTick(); mKeyguardBottomArea.dozeTimeTick(); if (mInterpolatedDarkAmount > 0) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java new file mode 100644 index 000000000000..15e189cc8baf --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RotationContextButton.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import android.annotation.DrawableRes; +import android.annotation.IdRes; +import android.annotation.NonNull; +import android.annotation.StyleRes; +import android.content.Context; +import android.content.ContextWrapper; +import android.view.ContextThemeWrapper; +import android.view.View; +import com.android.systemui.statusbar.policy.KeyButtonDrawable; +import com.android.systemui.util.Utils; + +public class RotationContextButton extends ContextualButton { + + private @StyleRes int mStyleRes; + + public RotationContextButton(@IdRes int buttonResId, @DrawableRes int iconResId, + @StyleRes int style) { + super(buttonResId, iconResId); + mStyleRes = style; + } + + public void setStyle(@StyleRes int styleRes) { + mStyleRes = styleRes; + } + + @Override + public void setVisibility(int visibility) { + super.setVisibility(visibility); + + // Start the rotation animation once it becomes visible + final KeyButtonDrawable currentDrawable = getImageDrawable(); + if (visibility == View.VISIBLE && currentDrawable != null) { + currentDrawable.resetAnimation(); + currentDrawable.startAnimation(); + } + } + + @Override + protected KeyButtonDrawable getNewDrawable() { + Context context = new ContextThemeWrapper(getContext().getApplicationContext(), mStyleRes); + return KeyButtonDrawable.create(context, mIconResId, false /* shadow */); + } +} 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 e1d86387cdfd..103781b7ae3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -381,8 +381,6 @@ public class StatusBar extends SystemUI implements DemoMode, // settings private QSPanel mQSPanel; - // top bar - private KeyguardStatusBarView mKeyguardStatusBar; KeyguardIndicationController mKeyguardIndicationController; // RemoteInputView to be activated after unlock @@ -805,7 +803,6 @@ public class StatusBar extends SystemUI implements DemoMode, mAboveShelfObserver = new AboveShelfObserver(mStackScroller); mAboveShelfObserver.setListener(mStatusBarWindow.findViewById( R.id.notification_container_parent)); - mKeyguardStatusBar = mStatusBarWindow.findViewById(R.id.keyguard_header); mNotificationIconAreaController = SystemUIFactory.getInstance() .createNotificationIconAreaController(context, this); @@ -980,7 +977,6 @@ public class StatusBar extends SystemUI implements DemoMode, ((QSFragment) qs).setHost(qsh); mQSPanel = ((QSFragment) qs).getQsPanel(); mQSPanel.setBrightnessMirror(mBrightnessMirrorController); - mKeyguardStatusBar.setQSPanel(mQSPanel); } }); } @@ -1118,8 +1114,6 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onThemeChanged() { - // The status bar on the keyguard is a special layout. - if (mKeyguardStatusBar != null) mKeyguardStatusBar.onThemeChanged(); // Recreate Indication controller because internal references changed mKeyguardIndicationController = SystemUIFactory.getInstance().createKeyguardIndicationController(mContext, @@ -1154,7 +1148,8 @@ public class StatusBar extends SystemUI implements DemoMode, protected void createUserSwitcher() { mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext, - mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), mKeyguardStatusBar, + mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), + mStatusBarWindow.findViewById(R.id.keyguard_header), mNotificationPanel); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java index 945d9b9ebf6b..2340786d81fb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.policy; import android.animation.ArgbEvaluator; import android.annotation.ColorInt; import android.annotation.DrawableRes; +import android.annotation.NonNull; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -35,6 +36,7 @@ import android.graphics.Rect; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.util.FloatProperty; +import android.view.ContextThemeWrapper; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -388,6 +390,23 @@ public class KeyButtonDrawable extends Drawable { } } + /** + * Creates a KeyButtonDrawable with a shadow given its icon. The tint applied to the drawable + * is determined by the dark and light theme given by the context. + * @param ctx Context to get the drawable and determine the dark and light theme + * @param icon the icon resource id + * @param hasShadow if a shadow will appear with the drawable + * @return KeyButtonDrawable + */ + public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, + boolean hasShadow) { + final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme); + final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme); + Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme); + Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme); + return KeyButtonDrawable.create(lightContext, darkContext, icon, hasShadow); + } + public static KeyButtonDrawable create(Context lightContext, Context darkContext, @DrawableRes int iconResId, boolean hasShadow) { return create(lightContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java index 04441abee92e..19974f8fc710 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java @@ -64,6 +64,7 @@ import java.util.List; @RunWith(AndroidJUnit4.class) public class PluginInstanceManagerTest extends SysuiTestCase { + private static final String WHITELISTED_PACKAGE = "com.android.systemui"; // Static since the plugin needs to be generated by the PluginInstanceManager using newInstance. private static Plugin sMockPlugin; @@ -88,7 +89,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { mMockVersionInfo = mock(VersionInfo.class); mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction", mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo, - mMockManager, true); + mMockManager, true, new String[0]); sMockPlugin = mock(Plugin.class); when(sMockPlugin.getVersion()).thenReturn(1); } @@ -186,7 +187,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { // Create a version that thinks the build is not debuggable. mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction", mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo, - mMockManager, false); + mMockManager, false, new String[0]); setupFakePmQuery(); mPluginInstanceManager.loadAll(); @@ -199,6 +200,25 @@ public class PluginInstanceManagerTest extends SysuiTestCase { } @Test + public void testNonDebuggable_whitelist() throws Exception { + // Create a version that thinks the build is not debuggable. + mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction", + mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo, + mMockManager, false, new String[] {WHITELISTED_PACKAGE}); + setupFakePmQuery(); + + mPluginInstanceManager.loadAll(); + + waitForIdleSync(mPluginInstanceManager.mPluginHandler); + waitForIdleSync(mPluginInstanceManager.mMainHandler); + + // Verify startup lifecycle + verify(sMockPlugin).onCreate(ArgumentCaptor.forClass(Context.class).capture(), + ArgumentCaptor.forClass(Context.class).capture()); + verify(mMockListener).onPluginConnected(any(), any()); + } + + @Test public void testCheckAndDisable() throws Exception { createPlugin(); // Get into valid created state. 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 94dbc2ad7147..438f9e49699b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java @@ -13,8 +13,9 @@ */ package com.android.systemui.plugins; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertSame; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -26,8 +27,6 @@ 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; @@ -36,11 +35,10 @@ 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.annotations.ProvidesInterface; import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.PluginManagerImpl.PluginInstanceManagerFactory; +import com.android.systemui.plugins.annotations.ProvidesInterface; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -54,6 +52,8 @@ import java.lang.Thread.UncaughtExceptionHandler; @RunWithLooper public class PluginManagerTest extends SysuiTestCase { + private static final String WHITELISTED_PACKAGE = "com.android.systemui"; + private PluginInstanceManagerFactory mMockFactory; private PluginInstanceManager mMockPluginInstance; private PluginManagerImpl mPluginManager; @@ -74,7 +74,7 @@ public class PluginManagerTest extends SysuiTestCase { when(mMockFactory.createPluginInstanceManager(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any())) .thenReturn(mMockPluginInstance); - mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, true, + mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, true, new String[0], mMockExceptionHandler); resetExceptionHandler(); mMockListener = mock(PluginListener.class); @@ -87,7 +87,7 @@ public class PluginManagerTest extends SysuiTestCase { when(mMockPluginInstance.getPlugin()).thenReturn(new PluginInfo(null, null, mockPlugin, null, null)); Plugin result = mPluginManager.getOneShotPlugin("myAction", TestPlugin.class); - assertTrue(result == mockPlugin); + assertSame(mockPlugin, result); } @Test @@ -106,16 +106,27 @@ public class PluginManagerTest extends SysuiTestCase { } @Test - public void testNonDebuggable() { + @RunWithLooper(setAsMainLooper = true) + public void testNonDebuggable_noWhitelist() { mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, false, - mMockExceptionHandler); + new String[0], mMockExceptionHandler); resetExceptionHandler(); mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class); - verify(mMockPluginInstance, Mockito.never()).loadAll(); - assertNull(mPluginManager.getOneShotPlugin("myPlugin", TestPlugin.class)); - verify(mMockPluginInstance, Mockito.never()).getPlugin(); + assertNull(mPluginManager.getClassLoader("myPlugin", WHITELISTED_PACKAGE)); + } + + @Test + @RunWithLooper(setAsMainLooper = true) + public void testNonDebuggable_whitelistedPkg() { + mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, false, + new String[] {WHITELISTED_PACKAGE}, mMockExceptionHandler); + resetExceptionHandler(); + + mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class); + assertNotNull(mPluginManager.getClassLoader("myPlugin", WHITELISTED_PACKAGE)); + assertNull(mPluginManager.getClassLoader("myPlugin", "com.android.invalidpackage")); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java new file mode 100644 index 000000000000..c792459418f3 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarContextTest.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.doReturn; + +import android.graphics.drawable.Drawable; +import android.support.test.filters.SmallTest; +import android.view.View; +import com.android.systemui.statusbar.policy.KeyButtonDrawable; +import com.android.systemui.SysuiTestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import android.support.test.runner.AndroidJUnit4; + +/** atest NavigationBarContextTest */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class NavigationBarContextTest extends SysuiTestCase { + private static final int GROUP_ID = 1; + private static final int BUTTON_0_ID = GROUP_ID + 1; + private static final int BUTTON_1_ID = GROUP_ID + 2; + private static final int BUTTON_2_ID = GROUP_ID + 3; + + private static final float TEST_DARK_INTENSITY = 0.6f; + private static final float DARK_INTENSITY_ERR = 0.0002f; + private static final int ICON_RES_ID = 1; + + private ContextualButtonGroup mGroup; + private ContextualButton mBtn0; + private ContextualButton mBtn1; + private ContextualButton mBtn2; + + @Before + public void setup() { + mGroup = new ContextualButtonGroup(GROUP_ID); + mBtn0 = new ContextualButton(BUTTON_0_ID, ICON_RES_ID); + mBtn1 = new ContextualButton(BUTTON_1_ID, ICON_RES_ID); + mBtn2 = new ContextualButton(BUTTON_2_ID, ICON_RES_ID); + + // Order of adding buttons to group determines the priority, ascending priority order + mGroup.addButton(mBtn0); + mGroup.addButton(mBtn1); + mGroup.addButton(mBtn2); + } + + @Test + public void testAddGetContextButtons() throws Exception { + assertEquals(mBtn0, mGroup.getContextButton(BUTTON_0_ID)); + assertEquals(mBtn1, mGroup.getContextButton(BUTTON_1_ID)); + assertEquals(mBtn2, mGroup.getContextButton(BUTTON_2_ID)); + } + + @Test + public void testSetButtonVisibility() throws Exception { + assertFalse("By default the group should be invisible.", mGroup.isVisible()); + + // Set button 1 to be visible, make sure it is the only visible button + showButton(mBtn1); + assertFalse(mBtn0.isVisible()); + assertTrue(mBtn1.isVisible()); + assertFalse(mBtn2.isVisible()); + + // Hide button 1 and make sure the group is also invisible + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_1_ID, false /* visible */), View.VISIBLE); + assertFalse("No buttons are visible, group should also be hidden", mGroup.isVisible()); + assertNull("No buttons should be visible", mGroup.getVisibleContextButton()); + } + + @Test(expected = RuntimeException.class) + public void testSetButtonVisibilityUnaddedButton() throws Exception { + int id = mBtn2.getId() + 1; + mGroup.setButtonVisiblity(id, true /* visible */); + fail("Did not throw when setting a button with an invalid id"); + } + + @Test + public void testSetHigherPriorityButton() throws Exception { + // Show button 0 + showButton(mBtn0); + + // Show button 1 + showButton(mBtn1); + assertTrue("Button 0 should be visible behind", + mGroup.isButtonVisibleWithinGroup(mBtn0.getId())); + + // Show button 2 + showButton(mBtn2); + assertTrue("Button 1 should be visible behind", + mGroup.isButtonVisibleWithinGroup(mBtn1.getId())); + assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn0.getId())); + assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn1.getId())); + assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn2.getId())); + + // Hide button 2 + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_2_ID, false /* visible */), View.VISIBLE); + assertEquals("Hiding button 2 should show button 1", mBtn1, + mGroup.getVisibleContextButton()); + + // Hide button 1 + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_1_ID, false /* visible */), View.VISIBLE); + assertEquals("Hiding button 1 should show button 0", mBtn0, + mGroup.getVisibleContextButton()); + + // Hide button 0, all buttons are now invisible + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_0_ID, false /* visible */), View.VISIBLE); + assertFalse("No buttons are visible, group should also be invisible", mGroup.isVisible()); + assertNull(mGroup.getVisibleContextButton()); + assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn0.getId())); + assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn1.getId())); + assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn2.getId())); + } + + @Test + public void testSetLowerPriorityButton() throws Exception { + // Show button 2 + showButton(mBtn2); + + // Show button 1 + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_1_ID, true /* visible */), View.VISIBLE); + assertTrue("Showing button 1 lower priority should be hidden but visible underneath", + mGroup.isButtonVisibleWithinGroup(BUTTON_1_ID)); + assertFalse(mBtn0.isVisible()); + assertFalse(mBtn1.isVisible()); + assertTrue(mBtn2.isVisible()); + + // Hide button 1 + assertNotEquals(mGroup.setButtonVisiblity(BUTTON_1_ID, false /* visible */), View.VISIBLE); + assertFalse("Hiding button 1 with lower priority hides itself underneath", + mGroup.isButtonVisibleWithinGroup(BUTTON_1_ID)); + assertTrue("A button still visible, group should also be visible", mGroup.isVisible()); + assertEquals(mBtn2, mGroup.getVisibleContextButton()); + } + + @Test + public void testSetSamePriorityButton() throws Exception { + // Show button 1 + showButton(mBtn1); + + // Show button 1 again + showButton(mBtn1); + + // The original button should still be visible + assertEquals(mBtn1, mGroup.getVisibleContextButton()); + assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn0.getId())); + assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn2.getId())); + } + + @Test + public void testUpdateIconsDarkIntensity() throws Exception { + final int unusedColor = 0; + final Drawable d = mock(Drawable.class); + final ContextualButton button = spy(mBtn0); + final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor)); + final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor)); + kbd1.setDarkIntensity(TEST_DARK_INTENSITY); + kbd2.setDarkIntensity(0f); + + // Update icon returns the drawable intensity to half + doReturn(kbd1).when(button).getNewDrawable(); + button.updateIcon(); + assertEquals(TEST_DARK_INTENSITY, kbd1.getDarkIntensity(), DARK_INTENSITY_ERR); + + // Return old dark intensity on new drawable after update icon + doReturn(kbd2).when(button).getNewDrawable(); + button.updateIcon(); + assertEquals(TEST_DARK_INTENSITY, kbd2.getDarkIntensity(), DARK_INTENSITY_ERR); + } + + private void showButton(ContextualButton button) { + assertEquals(View.VISIBLE, mGroup.setButtonVisiblity(button.getId(), true /* visible */)); + assertTrue("After set a button visible, group should also be visible", mGroup.isVisible()); + assertEquals(button, mGroup.getVisibleContextButton()); + } +} diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index 998e441f67d8..c2aec29e688a 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -16,6 +16,15 @@ package com.android.server; +import static android.app.AppOpsManager.UID_STATE_BACKGROUND; +import static android.app.AppOpsManager.UID_STATE_CACHED; +import static android.app.AppOpsManager.UID_STATE_FOREGROUND; +import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE; +import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED; +import static android.app.AppOpsManager.UID_STATE_PERSISTENT; +import static android.app.AppOpsManager.UID_STATE_TOP; +import static android.app.AppOpsManager._NUM_UID_STATE; + import android.Manifest; import android.app.ActivityManager; import android.app.ActivityThread; @@ -98,15 +107,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import static android.app.AppOpsManager._NUM_UID_STATE; -import static android.app.AppOpsManager.UID_STATE_BACKGROUND; -import static android.app.AppOpsManager.UID_STATE_CACHED; -import static android.app.AppOpsManager.UID_STATE_FOREGROUND; -import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE; -import static android.app.AppOpsManager.UID_STATE_LAST_NON_RESTRICTED; -import static android.app.AppOpsManager.UID_STATE_PERSISTENT; -import static android.app.AppOpsManager.UID_STATE_TOP; - public class AppOpsService extends IAppOpsService.Stub { static final String TAG = "AppOps"; static final boolean DEBUG = false; @@ -1016,7 +1016,7 @@ public class AppOpsService extends IAppOpsService.Stub { scheduleWriteLocked(); } } else { - if (uidState.opModes.get(code) == mode) { + if (uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == mode) { return; } if (mode == defaultMode) { @@ -1971,6 +1971,7 @@ public class AppOpsService extends IAppOpsService.Stub { continue; } boolean doAllPackages = uidState.opModes != null + && uidState.opModes.indexOfKey(code) >= 0 && uidState.opModes.get(code) == AppOpsManager.MODE_FOREGROUND; if (uidState.pkgOps != null) { for (int pkgi = uidState.pkgOps.size() - 1; pkgi >= 0; pkgi--) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f7fe9e2455f1..8c7fc849b79e 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5895,7 +5895,8 @@ public class ActivityManagerService extends IActivityManager.Stub PackageManager.NOTIFY_PACKAGE_USE_INSTRUMENTATION); } if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Binding proc " - + processName + " with config " + getGlobalConfiguration()); + + processName + " with config " + + app.getWindowProcessController().getConfiguration()); ApplicationInfo appInfo = instr != null ? instr.mTargetInfo : app.info; app.compat = compatibilityInfoForPackage(appInfo); @@ -6008,8 +6009,8 @@ public class ActivityManagerService extends IActivityManager.Stub instr2.mUiAutomationConnection, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.isPersistent(), - new Configuration(getGlobalConfiguration()), app.compat, - getCommonServicesLocked(app.isolated), + new Configuration(app.getWindowProcessController().getConfiguration()), + app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), buildSerial, isAutofillCompatEnabled); } else { @@ -6017,8 +6018,8 @@ public class ActivityManagerService extends IActivityManager.Stub null, null, null, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.isPersistent(), - new Configuration(getGlobalConfiguration()), app.compat, - getCommonServicesLocked(app.isolated), + new Configuration(app.getWindowProcessController().getConfiguration()), + app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), buildSerial, isAutofillCompatEnabled); } @@ -8718,7 +8719,7 @@ public class ActivityManagerService extends IActivityManager.Stub StatsLog.write(StatsLog.ISOLATED_UID_CHANGED, info.uid, uid, StatsLog.ISOLATED_UID_CHANGED__EVENT__CREATED); } - final ProcessRecord r = new ProcessRecord(this, info, proc, uid); + final ProcessRecord r = new ProcessRecord(this, info, proc, uid, getGlobalConfiguration()); if (!mBooted && !mBooting && userId == UserHandle.USER_SYSTEM && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { @@ -17082,30 +17083,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } - // ========================================================= - // CONFIGURATION - // ========================================================= - - public ConfigurationInfo getDeviceConfigurationInfo() { - ConfigurationInfo config = new ConfigurationInfo(); - synchronized (this) { - final Configuration globalConfig = getGlobalConfiguration(); - config.reqTouchScreen = globalConfig.touchscreen; - config.reqKeyboardType = globalConfig.keyboard; - config.reqNavigation = globalConfig.navigation; - if (globalConfig.navigation == Configuration.NAVIGATION_DPAD - || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) { - config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; - } - if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED - && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) { - config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; - } - config.reqGlEsVersion = GL_ES_VERSION; - } - return config; - } - @Override public StackInfo getFocusedStackInfo() throws RemoteException { return mActivityTaskManager.getFocusedStackInfo(); diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index b24c36ad9179..4bcaf7145e60 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -2063,7 +2063,12 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.print("has-secure-screen-lock: "); pw.println(kgm.isDeviceSecure()); } - ConfigurationInfo configInfo = mInternal.getDeviceConfigurationInfo(); + ConfigurationInfo configInfo = null; + try { + configInfo = mTaskInterface.getDeviceConfigurationInfo(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) { if (protoOutputStream != null) { protoOutputStream.write(DeviceConfigurationProto.OPENGL_VERSION, diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index c887370024ee..1127db134d66 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1558,7 +1558,8 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // we have to always create a new Configuration here. final MergedConfiguration mergedConfiguration = new MergedConfiguration( - mService.getGlobalConfiguration(), r.getMergedOverrideConfiguration()); + app.getWindowProcessController().getConfiguration(), + r.getMergedOverrideConfiguration()); r.setLastReportedConfiguration(mergedConfiguration); logIfTransactionTooLarge(r.intent, r.icicle); diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java index 9acb04be525b..4dc28510c5ec 100644 --- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java @@ -149,6 +149,7 @@ import android.content.IIntentSender; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; @@ -649,6 +650,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class); } + int increaseConfigurationSeqLocked() { + mConfigurationSeq = Math.max(++mConfigurationSeq, 1); + return mConfigurationSeq; + } + protected ActivityStackSupervisor createStackSupervisor() { final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper()); supervisor.initialize(); @@ -704,6 +710,46 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return mLockTaskController; } + /** + * Return the global configuration used by the process corresponding to the input pid. This is + * usually the global configuration with some overrides specific to that process. + */ + Configuration getGlobalConfigurationForCallingPid() { + final int pid = Binder.getCallingPid(); + if (pid == MY_PID || pid < 0) { + return getGlobalConfiguration(); + } + synchronized (mGlobalLock) { + final WindowProcessController app = mPidMap.get(pid); + return app != null ? app.getConfiguration() : getGlobalConfiguration(); + } + } + + /** + * Return the device configuration info used by the process corresponding to the input pid. + * The value is consistent with the global configuration for the process. + */ + @Override + public ConfigurationInfo getDeviceConfigurationInfo() { + ConfigurationInfo config = new ConfigurationInfo(); + synchronized (mGlobalLock) { + final Configuration globalConfig = getGlobalConfigurationForCallingPid(); + config.reqTouchScreen = globalConfig.touchscreen; + config.reqKeyboardType = globalConfig.keyboard; + config.reqNavigation = globalConfig.navigation; + if (globalConfig.navigation == Configuration.NAVIGATION_DPAD + || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) { + config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; + } + if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED + && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) { + config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; + } + config.reqGlEsVersion = mAm.GL_ES_VERSION; + } + return config; + } + private void start() { mInternal = new LocalService(); LocalServices.addService(ActivityTaskManagerInternal.class, mInternal); @@ -4264,7 +4310,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public Configuration getConfiguration() { Configuration ci; synchronized(mGlobalLock) { - ci = new Configuration(getGlobalConfiguration()); + ci = new Configuration(getGlobalConfigurationForCallingPid()); ci.userSetLocale = false; } return ci; @@ -4420,8 +4466,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { locales.get(bestLocaleIndex))); } - mConfigurationSeq = Math.max(++mConfigurationSeq, 1); - mTempConfig.seq = mConfigurationSeq; + mTempConfig.seq = increaseConfigurationSeqLocked(); // Update stored global config and notify everyone about the change. mStackSupervisor.onConfigurationChanged(mTempConfig); @@ -4455,6 +4500,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mAm.mHandler.sendMessage(msg); } + // TODO: Consider using mPidMap to update configurations for processes. for (int i = mAm.mLruProcesses.size() - 1; i >= 0; i--) { ProcessRecord app = mAm.mLruProcesses.get(i); try { @@ -5596,5 +5642,47 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } + /** + * Set the corresponding display information for the process global configuration. To be + * called when we need to show IME on a different display. + * + * @param pid The process id associated with the IME window. + * @param displayId The ID of the display showing the IME. + */ + @Override + public void onImeWindowSetOnDisplay(int pid, int displayId) { + if (pid == MY_PID || pid < 0) { + if (DEBUG_CONFIGURATION) { + Slog.w(TAG, + "Trying to update display configuration for system/invalid process."); + } + return; + } + mH.post(() -> { + synchronized (mGlobalLock) { + // Check if display is initialized in AM. + if (!mStackSupervisor.isDisplayAdded(displayId)) { + // Call come when display is not yet added or has already been removed. + if (DEBUG_CONFIGURATION) { + Slog.w(TAG, "Trying to update display configuration for non-existing " + + "displayId=" + displayId); + } + return; + } + final WindowProcessController imeProcess = mPidMap.get(pid); + if (imeProcess == null) { + if (DEBUG_CONFIGURATION) { + Slog.w(TAG, "Trying to update display configuration for invalid pid: " + + pid); + } + return; + } + // Fetch the current override configuration of the display and set it to the + // process global configuration. + imeProcess.onConfigurationChanged( + mStackSupervisor.getDisplayOverrideConfiguration(displayId)); + } + }); + } } } diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index d3dc0f34cbf1..667d3faefc9f 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -17,18 +17,10 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; + import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import android.os.Debug; -import android.util.ArraySet; -import android.util.DebugUtils; -import android.util.EventLog; -import android.util.Slog; -import com.android.internal.app.procstats.ProcessStats; -import com.android.internal.app.procstats.ProcessState; -import com.android.internal.os.BatteryStatsImpl; - import android.app.ActivityManager; import android.app.Dialog; import android.app.IApplicationThread; @@ -36,7 +28,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.res.CompatibilityInfo; +import android.content.res.Configuration; import android.os.Binder; +import android.os.Debug; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; @@ -44,10 +38,18 @@ import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.DebugUtils; +import android.util.EventLog; +import android.util.Slog; import android.util.StatsLog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; +import com.android.internal.app.procstats.ProcessState; +import com.android.internal.app.procstats.ProcessStats; +import com.android.internal.os.BatteryStatsImpl; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -307,6 +309,7 @@ final class ProcessRecord implements WindowProcessListener { pw.print(prefix); pw.print("manageSpaceActivityName="); pw.println(info.manageSpaceActivityName); } + pw.print(prefix); pw.print("dir="); pw.print(info.sourceDir); pw.print(" publicDir="); pw.print(info.publicSourceDir); pw.print(" data="); pw.println(info.dataDir); @@ -520,7 +523,7 @@ final class ProcessRecord implements WindowProcessListener { } ProcessRecord(ActivityManagerService _service, ApplicationInfo _info, String _processName, - int _uid) { + int _uid, Configuration config) { mService = _service; info = _info; isolated = _info.uid != _uid; @@ -534,7 +537,7 @@ final class ProcessRecord implements WindowProcessListener { removed = false; lastStateTime = lastPssTime = nextPssTime = SystemClock.uptimeMillis(); mWindowProcessController = new WindowProcessController( - mService.mActivityTaskManager, info, processName, uid, userId, this, this); + mService.mActivityTaskManager, info, processName, uid, userId, this, this, config); pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.longVersionCode)); } diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java index e5551b51a093..da172fb10511 100644 --- a/services/core/java/com/android/server/am/WindowProcessController.java +++ b/services/core/java/com/android/server/am/WindowProcessController.java @@ -17,7 +17,10 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; + +import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE; +import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -29,11 +32,12 @@ import static com.android.server.am.ActivityStack.ActivityState.RESUMED; import static com.android.server.am.ActivityStack.ActivityState.STOPPING; import android.app.Activity; -import android.app.ActivityTaskManager; import android.app.ActivityThread; import android.app.IApplicationThread; +import android.app.servertransaction.ConfigurationChangeItem; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.res.Configuration; import android.os.RemoteException; import android.util.ArraySet; import android.util.Log; @@ -41,7 +45,7 @@ import android.util.Slog; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.util.function.pooled.PooledLambda; -import com.android.internal.util.function.pooled.PooledRunnable; +import com.android.server.wm.ConfigurationContainer; import java.io.PrintWriter; import java.util.ArrayList; @@ -57,9 +61,10 @@ import java.util.ArrayList; * window manager so the window manager lock is held and appropriate permissions are checked before * calls are allowed to proceed. */ -public class WindowProcessController { +public class WindowProcessController extends ConfigurationContainer<ConfigurationContainer> { private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowProcessController" : TAG_AM; private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE; + private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; // all about the first app in the process final ApplicationInfo mInfo; @@ -108,8 +113,12 @@ public class WindowProcessController { // any tasks this process had run root activities in private final ArrayList<TaskRecord> mRecentTasks = new ArrayList<>(); + // Last configuration that was reported to the process. + private final Configuration mLastReportedConfiguration; + WindowProcessController(ActivityTaskManagerService atm, ApplicationInfo info, String name, - int uid, int userId, Object owner, WindowProcessListener listener) { + int uid, int userId, Object owner, WindowProcessListener listener, + Configuration config) { mInfo = info; mName = name; mUid = uid; @@ -117,6 +126,10 @@ public class WindowProcessController { mOwner = owner; mListener = listener; mAtm = atm; + mLastReportedConfiguration = new Configuration(); + if (config != null) { + onConfigurationChanged(config); + } } public void setPid(int pid) { @@ -219,6 +232,21 @@ public class WindowProcessController { return mInstrumenting; } + @Override + protected int getChildCount() { + return 0; + } + + @Override + protected ConfigurationContainer getChildAt(int index) { + return null; + } + + @Override + protected ConfigurationContainer getParent() { + return null; + } + public void addPackage(String packageName) { synchronized (mAtm.mGlobalLock) { mPkgList.add(packageName); @@ -526,6 +554,50 @@ public class WindowProcessController { mAtm.mH.post(r); } + @Override + public void onConfigurationChanged(Configuration newGlobalConfig) { + super.onConfigurationChanged(newGlobalConfig); + updateConfiguration(); + } + + @Override + public void onOverrideConfigurationChanged(Configuration newOverrideConfig) { + super.onOverrideConfigurationChanged(newOverrideConfig); + updateConfiguration(); + } + + private void updateConfiguration() { + final Configuration config = getConfiguration(); + if (mLastReportedConfiguration.diff(config) == 0) { + // Nothing changed. + return; + } + + try { + if (mThread == null) { + return; + } + if (DEBUG_CONFIGURATION) { + Slog.v(TAG_CONFIGURATION, "Sending to proc " + mName + + " new config " + config); + } + config.seq = mAtm.increaseConfigurationSeqLocked(); + mAtm.getLifecycleManager().scheduleTransaction(mThread, + ConfigurationChangeItem.obtain(config)); + setLastReportedConfiguration(config); + } catch (Exception e) { + Slog.e(TAG_CONFIGURATION, "Failed to schedule configuration change", e); + } + } + + private void setLastReportedConfiguration(Configuration config) { + mLastReportedConfiguration.setTo(config); + } + + Configuration getLastReportedConfiguration() { + return mLastReportedConfiguration; + } + /** Returns the total time (in milliseconds) spent executing in both user and system code. */ public long getCpuTime() { return (mListener != null) ? mListener.getCpuTime() : 0; @@ -574,6 +646,9 @@ public class WindowProcessController { pw.print(prefix); pw.print("mVrThreadTid="); pw.println(mVrThreadTid); } } + pw.println(prefix + " Configuration=" + getConfiguration()); + pw.println(prefix + " OverrideConfiguration=" + getOverrideConfiguration()); + pw.println(prefix + " mLastReportedConfiguration=" + mLastReportedConfiguration); } } diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index 65e55d66a4bb..aa4d34ef78b6 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -139,8 +139,8 @@ public abstract class AuthenticationClient extends ClientMonitor { public abstract void onAuthenticationConfirmed(); public AuthenticationClient(Context context, Metrics metrics, - BiometricService.DaemonWrapper daemon, long halDeviceId, IBinder token, - BiometricService.ServiceListener listener, int targetUserId, int groupId, long opId, + BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, + BiometricServiceBase.ServiceListener listener, int targetUserId, int groupId, long opId, boolean restricted, String owner, Bundle bundle, IBiometricPromptReceiver dialogReceiver, IStatusBarService statusBarService, boolean requireConfirmation) { @@ -207,7 +207,7 @@ public abstract class AuthenticationClient extends ClientMonitor { private void notifyClientAuthenticationSucceeded(BiometricAuthenticator.Identifier identifier) throws RemoteException { - final BiometricService.ServiceListener listener = getListener(); + final BiometricServiceBase.ServiceListener listener = getListener(); // Explicitly have if/else here to make it super obvious in case the code is // touched in the future. if (!getIsRestricted()) { @@ -256,7 +256,7 @@ public abstract class AuthenticationClient extends ClientMonitor { } } - final BiometricService.ServiceListener listener = getListener(); + final BiometricServiceBase.ServiceListener listener = getListener(); if (listener != null) { try { mMetricsLogger.action(mMetrics.actionBiometricAuth(), authenticated); diff --git a/services/core/java/com/android/server/biometrics/BiometricPromptService.java b/services/core/java/com/android/server/biometrics/BiometricPromptService.java deleted file mode 100644 index 35c9d3ed9a51..000000000000 --- a/services/core/java/com/android/server/biometrics/BiometricPromptService.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.biometrics; - -import static android.Manifest.permission.USE_BIOMETRIC; -import static android.Manifest.permission.USE_FINGERPRINT; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.hardware.biometrics.BiometricAuthenticator; -import android.hardware.biometrics.BiometricConstants; -import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptService; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; -import android.hardware.face.FaceManager; -import android.hardware.face.IFaceService; -import android.hardware.fingerprint.FingerprintManager; -import android.hardware.fingerprint.IFingerprintService; -import android.os.Binder; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.UserHandle; -import android.util.Slog; - -import com.android.internal.R; -import com.android.server.SystemService; - -import java.util.ArrayList; - -/** - * System service that arbitrates the modality for BiometricPrompt to use. - */ -public class BiometricPromptService extends SystemService { - - private static final String TAG = "BiometricPromptService"; - - /** - * No biometric methods or nothing has been enrolled. - * Move/expose these in BiometricPrompt if we ever want to allow applications to "blacklist" - * modalities when calling authenticate(). - */ - private static final int BIOMETRIC_NONE = 0; - - /** - * Constant representing fingerprint. - */ - private static final int BIOMETRIC_FINGERPRINT = 1 << 0; - - /** - * Constant representing iris. - */ - private static final int BIOMETRIC_IRIS = 1 << 1; - - /** - * Constant representing face. - */ - private static final int BIOMETRIC_FACE = 1 << 2; - - private static final int[] FEATURE_ID = { - BIOMETRIC_FINGERPRINT, - BIOMETRIC_IRIS, - BIOMETRIC_FACE - }; - - private final Handler mHandler; - private final boolean mHasFeatureFingerprint; - private final boolean mHasFeatureIris; - private final boolean mHasFeatureFace; - - private IFingerprintService mFingerprintService; - private IFaceService mFaceService; - - // Get and cache the available authenticator (manager) classes. Used since aidl doesn't support - // polymorphism :/ - final ArrayList<Authenticator> mAuthenticators = new ArrayList<>(); - - // Cache the current service that's being used. This is the service which - // cancelAuthentication() must be forwarded to. This is just a cache, and the actual - // check (is caller the current client) is done in the <Biometric>Service. - // Since Settings/System (not application) is responsible for changing preference, this - // should be safe. - private int mCurrentModality; - - private final class Authenticator { - int mType; - BiometricAuthenticator mAuthenticator; - - Authenticator(int type, BiometricAuthenticator authenticator) { - mType = type; - mAuthenticator = authenticator; - } - - int getType() { - return mType; - } - - BiometricAuthenticator getAuthenticator() { - return mAuthenticator; - } - } - - /** - * This is just a pass-through service that wraps Fingerprint, Iris, Face services. This service - * should not carry any state. The reality is we need to keep a tiny amount of state so that - * cancelAuthentication() can go to the right place. - */ - private final class BiometricPromptServiceWrapper extends IBiometricPromptService.Stub { - - @Override // Binder call - public void authenticate(IBinder token, long sessionId, int userId, - IBiometricPromptServiceReceiver receiver, int flags, String opPackageName, - Bundle bundle, IBiometricPromptReceiver dialogReceiver) throws RemoteException { - // Check the USE_BIOMETRIC permission here. In the BiometricService, check do the - // AppOps and foreground check. - checkPermission(); - - if (token == null || receiver == null || opPackageName == null || bundle == null - || dialogReceiver == null) { - Slog.e(TAG, "Unable to authenticate, one or more null arguments"); - return; - } - - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); - final int callingUserId = UserHandle.getCallingUserId(); - - mHandler.post(() -> { - mCurrentModality = checkAndGetBiometricModality(receiver); - - try { - // No polymorphism :( - if (mCurrentModality == BIOMETRIC_FINGERPRINT) { - mFingerprintService.authenticateFromService(token, sessionId, userId, - receiver, flags, opPackageName, bundle, dialogReceiver, - callingUid, callingPid, callingUserId); - } else if (mCurrentModality == BIOMETRIC_IRIS) { - Slog.w(TAG, "Unsupported modality"); - } else if (mCurrentModality == BIOMETRIC_FACE) { - mFaceService.authenticateFromService(true /* requireConfirmation */, token, - sessionId, userId, receiver, flags, opPackageName, bundle, - dialogReceiver, callingUid, callingPid, callingUserId); - } else { - Slog.w(TAG, "Unsupported modality"); - } - } catch (RemoteException e) { - Slog.e(TAG, "Unable to start authentication", e); - } - }); - } - - @Override // Binder call - public void cancelAuthentication(IBinder token, String opPackageName) - throws RemoteException { - checkPermission(); - - if (token == null || opPackageName == null) { - Slog.e(TAG, "Unable to cancel, one or more null arguments"); - return; - } - - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); - final int callingUserId = UserHandle.getCallingUserId(); - - mHandler.post(() -> { - try { - if (mCurrentModality == BIOMETRIC_FINGERPRINT) { - mFingerprintService.cancelAuthenticationFromService(token, opPackageName, - callingUid, callingPid, callingUserId); - } else if (mCurrentModality == BIOMETRIC_IRIS) { - Slog.w(TAG, "Unsupported modality"); - } else if (mCurrentModality == BIOMETRIC_FACE) { - mFaceService.cancelAuthenticationFromService(token, opPackageName, - callingUid, callingPid, callingUserId); - } else { - Slog.w(TAG, "Unsupported modality"); - } - } catch (RemoteException e) { - Slog.e(TAG, "Unable to cancel authentication"); - } - }); - } - } - - private void checkPermission() { - if (getContext().checkCallingPermission(USE_FINGERPRINT) - != PackageManager.PERMISSION_GRANTED) { - getContext().enforceCallingPermission(USE_BIOMETRIC, - "Must have USE_BIOMETRIC permission"); - } - } - - /** - * Initializes the system service. - * <p> - * Subclasses must define a single argument constructor that accepts the context - * and passes it to super. - * </p> - * - * @param context The system server context. - */ - public BiometricPromptService(Context context) { - super(context); - - mHandler = new Handler(Looper.getMainLooper()); - - final PackageManager pm = context.getPackageManager(); - mHasFeatureFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT); - mHasFeatureIris = pm.hasSystemFeature(PackageManager.FEATURE_IRIS); - mHasFeatureFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE); - } - - @Override - public void onStart() { - // TODO: maybe get these on-demand - if (mHasFeatureFingerprint) { - mFingerprintService = IFingerprintService.Stub.asInterface( - ServiceManager.getService(Context.FINGERPRINT_SERVICE)); - } - if (mHasFeatureFace) { - mFaceService = IFaceService.Stub.asInterface( - ServiceManager.getService(Context.FACE_SERVICE)); - } - - // Cache the authenticators - for (int i = 0; i < FEATURE_ID.length; i++) { - if (hasFeature(FEATURE_ID[i])) { - Authenticator authenticator = - new Authenticator(FEATURE_ID[i], getAuthenticator(FEATURE_ID[i])); - mAuthenticators.add(authenticator); - } - } - - publishBinderService(Context.BIOMETRIC_PROMPT_SERVICE, new BiometricPromptServiceWrapper()); - } - - /** - * Checks if there are any available biometrics, and returns the modality. This method also - * returns errors through the callback (no biometric feature, hardware not detected, no - * templates enrolled, etc). This service must not start authentication if errors are sent. - */ - private int checkAndGetBiometricModality(IBiometricPromptServiceReceiver receiver) { - int modality = BIOMETRIC_NONE; - final String hardwareUnavailable = - getContext().getString(R.string.biometric_error_hw_unavailable); - - // No biometric features, send error - if (mAuthenticators.isEmpty()) { - try { - receiver.onError(0 /* deviceId */, - BiometricConstants.BIOMETRIC_ERROR_HW_NOT_PRESENT, - hardwareUnavailable); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to send error", e); - } - return BIOMETRIC_NONE; - } - - // Find first authenticator that's both detected and enrolled - boolean isHardwareDetected = false; - boolean hasTemplatesEnrolled = false; - for (int i = 0; i < mAuthenticators.size(); i++) { - int featureId = mAuthenticators.get(i).getType(); - BiometricAuthenticator authenticator = mAuthenticators.get(i).getAuthenticator(); - if (authenticator.isHardwareDetected()) { - isHardwareDetected = true; - if (authenticator.hasEnrolledTemplates()) { - hasTemplatesEnrolled = true; - modality = featureId; - break; - } - } - } - - // Check error conditions - if (!isHardwareDetected) { - try { - receiver.onError(0 /* deviceId */, - BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, - hardwareUnavailable); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to send error", e); - } - return BIOMETRIC_NONE; - } - if (!hasTemplatesEnrolled) { - try { - receiver.onError(0 /* deviceId */, - BiometricConstants.BIOMETRIC_ERROR_NO_BIOMETRICS, - FaceManager.getErrorString(getContext(), - BiometricConstants.BIOMETRIC_ERROR_NO_BIOMETRICS, - 0 /* vendorCode */)); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to send error", e); - } - return BIOMETRIC_NONE; - } - - return modality; - } - - private BiometricAuthenticator getAuthenticator(int type) { - switch (type) { - case BIOMETRIC_FINGERPRINT: - return (FingerprintManager) - getContext().getSystemService(Context.FINGERPRINT_SERVICE); - case BIOMETRIC_IRIS: - return null; - case BIOMETRIC_FACE: - return (FaceManager) - getContext().getSystemService(Context.FACE_SERVICE); - default: - return null; - } - } - - private boolean hasFeature(int type) { - switch (type) { - case BIOMETRIC_FINGERPRINT: - return mHasFeatureFingerprint; - case BIOMETRIC_IRIS: - return mHasFeatureIris; - case BIOMETRIC_FACE: - return mHasFeatureFace; - default: - return false; - } - } -} diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index c9b740d203cf..fa22b84f452e 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -11,512 +11,221 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License + * limitations under the License. */ package com.android.server.biometrics; -import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; +import static android.Manifest.permission.USE_BIOMETRIC; +import static android.Manifest.permission.USE_FINGERPRINT; -import android.app.ActivityManager; -import android.app.ActivityTaskManager; -import android.app.AlarmManager; -import android.app.AppOpsManager; -import android.app.IActivityTaskManager; -import android.app.PendingIntent; -import android.app.SynchronousUserSwitchObserver; -import android.app.TaskStackListener; -import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; -import android.hardware.fingerprint.Fingerprint; +import android.hardware.biometrics.IBiometricService; +import android.hardware.biometrics.IBiometricServiceReceiver; +import android.hardware.face.FaceManager; +import android.hardware.face.IFaceService; +import android.hardware.fingerprint.FingerprintManager; +import android.hardware.fingerprint.IFingerprintService; import android.os.Binder; import android.os.Bundle; -import android.os.DeadObjectException; import android.os.Handler; import android.os.IBinder; -import android.os.IHwBinder; -import android.os.IRemoteCallback; -import android.os.PowerManager; +import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemClock; import android.os.UserHandle; -import android.os.UserManager; import android.util.Slog; -import android.util.SparseBooleanArray; -import android.util.SparseIntArray; -import com.android.internal.logging.MetricsLogger; -import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.R; import com.android.server.SystemService; -import com.android.server.biometrics.fingerprint.FingerprintService; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; /** - * Abstract base class containing all of the business logic for biometric services, e.g. - * Fingerprint, Face, Iris. - * - * @hide + * System service that arbitrates the modality for BiometricPrompt to use. */ -public abstract class BiometricService extends SystemService implements IHwBinder.DeathRecipient { - - protected static final boolean DEBUG = true; - - private static final String KEY_LOCKOUT_RESET_USER = "lockout_reset_user"; - private static final int MSG_USER_SWITCHING = 10; - private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30 * 1000; - private static final long CANCEL_TIMEOUT_LIMIT = 3000; // max wait for onCancel() from HAL,in ms - - private final Context mContext; - private final String mKeyguardPackage; - private final AppOpsManager mAppOps; - private final SparseBooleanArray mTimedLockoutCleared; - private final SparseIntArray mFailedAttempts; - private final IActivityTaskManager mActivityTaskManager; - private final AlarmManager mAlarmManager; - private final PowerManager mPowerManager; - private final UserManager mUserManager; - private final MetricsLogger mMetricsLogger; - private final BiometricTaskStackListener mTaskStackListener = new BiometricTaskStackListener(); - private final ResetClientStateRunnable mResetClientState = new ResetClientStateRunnable(); - private final LockoutReceiver mLockoutReceiver = new LockoutReceiver(); - private final ArrayList<LockoutResetMonitor> mLockoutMonitors = new ArrayList<>(); - - protected final IStatusBarService mStatusBarService; - protected final Map<Integer, Long> mAuthenticatorIds = - Collections.synchronizedMap(new HashMap<>()); - protected final ResetFailedAttemptsForUserRunnable mResetFailedAttemptsForCurrentUserRunnable = - new ResetFailedAttemptsForUserRunnable(); - protected final H mHandler = new H(); - - private ClientMonitor mCurrentClient; - private ClientMonitor mPendingClient; - private PerformanceStats mPerformanceStats; - protected int mCurrentUserId = UserHandle.USER_NULL; - // Tracks if the current authentication makes use of CryptoObjects. - protected boolean mIsCrypto; - // Normal authentications are tracked by mPerformanceMap. - protected HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>(); - // Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap. - protected HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>(); - - protected class PerformanceStats { - public int accept; // number of accepted biometrics - public int reject; // number of rejected biometrics - public int acquire; // total number of acquisitions. Should be >= accept+reject due to poor - // image acquisition in some cases (too fast, too slow, dirty sensor, etc.) - public int lockout; // total number of lockouts - public int permanentLockout; // total number of permanent lockouts - } - - /** - * @return the log tag. - */ - protected abstract String getTag(); - - /** - * @return the biometric utilities for a specific implementation. - */ - protected abstract BiometricUtils getBiometricUtils(); - - /** - * @return the number of failed attempts after which the user will be temporarily locked out - * from using the biometric. A strong auth (pin/pattern/pass) clears this counter. - */ - protected abstract int getFailedAttemptsLockoutTimed(); - - /** - * @return the number of failed attempts after which the user will be permanently locked out - * from using the biometric. A strong auth (pin/pattern/pass) clears this counter. - */ - protected abstract int getFailedAttemptsLockoutPermanent(); - - /** - * @return the metrics constants for a biometric implementation. - */ - protected abstract Metrics getMetrics(); - - /** - * @param userId - * @return true if the enrollment limit has been reached. - */ - protected abstract boolean hasReachedEnrollmentLimit(int userId); - - /** - * Notifies the HAL that the user has changed. - * @param userId - * @param clientPackage - */ - protected abstract void updateActiveGroup(int userId, String clientPackage); - - /** - * @return The protected intent to reset lockout for a specific biometric. - */ - protected abstract String getLockoutResetIntent(); - - /** - * @return The permission the sender is required to have in order for the lockout reset intent - * to be received by the BiometricService implementation. - */ - protected abstract String getLockoutBroadcastPermission(); - - /** - * @return The HAL ID. - */ - protected abstract long getHalDeviceId(); +public class BiometricService extends SystemService { - /** - * This method is called when the user switches. Implementations should probably notify the - * HAL. - * @param userId - */ - protected abstract void handleUserSwitching(int userId); + private static final String TAG = "BiometricPromptService"; /** - * @param userId - * @return Returns true if the user has any enrolled biometrics. + * No biometric methods or nothing has been enrolled. + * Move/expose these in BiometricPrompt if we ever want to allow applications to "blacklist" + * modalities when calling authenticate(). */ - protected abstract boolean hasEnrolledBiometrics(int userId); + private static final int BIOMETRIC_NONE = 0; /** - * @return Returns the MANAGE_* permission string, which is required for enrollment, removal - * etc. + * Constant representing fingerprint. */ - protected abstract String getManageBiometricPermission(); + private static final int BIOMETRIC_FINGERPRINT = 1 << 0; /** - * Checks if the caller has permission to use the biometric service - throws a SecurityException - * if not. + * Constant representing iris. */ - protected abstract void checkUseBiometricPermission(); + private static final int BIOMETRIC_IRIS = 1 << 1; /** - * @return Returns one of the {@link AppOpsManager} constants which pertains to the specific - * biometric service. + * Constant representing face. */ - protected abstract int getAppOp(); + private static final int BIOMETRIC_FACE = 1 << 2; + private static final int[] FEATURE_ID = { + BIOMETRIC_FINGERPRINT, + BIOMETRIC_IRIS, + BIOMETRIC_FACE + }; - /** - * Notifies clients of any change in the biometric state (active / idle). This is mainly for - * Fingerprint navigation gestures. - * @param isActive - */ - protected void notifyClientActiveCallbacks(boolean isActive) {} + private final Handler mHandler; + private final boolean mHasFeatureFingerprint; + private final boolean mHasFeatureIris; + private final boolean mHasFeatureFace; - protected abstract class AuthenticationClientImpl extends AuthenticationClient { + private IFingerprintService mFingerprintService; + private IFaceService mFaceService; - public AuthenticationClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, - IBinder token, ServiceListener listener, int targetUserId, int groupId, long opId, - boolean restricted, String owner, Bundle bundle, - IBiometricPromptReceiver dialogReceiver, - IStatusBarService statusBarService, boolean requireConfirmation) { - super(context, getMetrics(), daemon, halDeviceId, token, listener, - targetUserId, groupId, opId, restricted, owner, bundle, dialogReceiver, - statusBarService, requireConfirmation); - } + // Get and cache the available authenticator (manager) classes. Used since aidl doesn't support + // polymorphism :/ + final ArrayList<Authenticator> mAuthenticators = new ArrayList<>(); - @Override - public void onStart() { - try { - mActivityTaskManager.registerTaskStackListener(mTaskStackListener); - } catch (RemoteException e) { - Slog.e(getTag(), "Could not register task stack listener", e); - } - } + // Cache the current service that's being used. This is the service which + // cancelAuthentication() must be forwarded to. This is just a cache, and the actual + // check (is caller the current client) is done in the <Biometric>Service. + // Since Settings/System (not application) is responsible for changing preference, this + // should be safe. + private int mCurrentModality; - @Override - public void onStop() { - try { - mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener); - } catch (RemoteException e) { - Slog.e(getTag(), "Could not unregister task stack listener", e); - } - } + private final class Authenticator { + int mType; + BiometricAuthenticator mAuthenticator; - @Override - public void resetFailedAttempts() { - resetFailedAttemptsForUser(true /* clearAttemptCounter */, - ActivityManager.getCurrentUser()); + Authenticator(int type, BiometricAuthenticator authenticator) { + mType = type; + mAuthenticator = authenticator; } - @Override - public void notifyUserActivity() { - userActivity(); - } - - @Override - public int handleFailedAttempt() { - final int currentUser = ActivityManager.getCurrentUser(); - mFailedAttempts.put(currentUser, mFailedAttempts.get(currentUser, 0) + 1); - mTimedLockoutCleared.put(ActivityManager.getCurrentUser(), false); - final int lockoutMode = getLockoutMode(); - if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) { - mPerformanceStats.permanentLockout++; - } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) { - mPerformanceStats.lockout++; - } - - // Failing multiple times will continue to push out the lockout time - if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) { - scheduleLockoutResetForUser(currentUser); - return lockoutMode; - } - return AuthenticationClient.LOCKOUT_NONE; + int getType() { + return mType; } - @Override - public void onAuthenticationConfirmed() { - removeClient(mCurrentClient); - } - } - - protected class EnrollClientImpl extends EnrollClient { - - public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, - IBinder token, ServiceListener listener, int userId, int groupId, - byte[] cryptoToken, boolean restricted, String owner) { - super(context, getMetrics(), daemon, halDeviceId, token, listener, - userId, groupId, cryptoToken, restricted, owner, getBiometricUtils()); - } - - @Override - public void notifyUserActivity() { - userActivity(); - } - } - - protected class RemovalClientImpl extends RemovalClient { - private boolean mShouldNotify; - - public RemovalClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, - IBinder token, ServiceListener listener, int fingerId, int groupId, int userId, - boolean restricted, String owner) { - super(context, getMetrics(), daemon, halDeviceId, token, listener, fingerId, groupId, - userId, restricted, owner, getBiometricUtils()); - } - - public void setShouldNotifyUserActivity(boolean shouldNotify) { - mShouldNotify = shouldNotify; - } - - @Override - public void notifyUserActivity() { - if (mShouldNotify) { - userActivity(); - } - } - } - - protected class EnumerateClientImpl extends EnumerateClient { - - public EnumerateClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, - IBinder token, ServiceListener listener, int groupId, int userId, - boolean restricted, String owner) { - super(context, getMetrics(), daemon, halDeviceId, token, listener, groupId, userId, - restricted, owner); - } - - @Override - public void notifyUserActivity() { - userActivity(); + BiometricAuthenticator getAuthenticator() { + return mAuthenticator; } } /** - * Wraps the callback interface from Service -> Manager + * This is just a pass-through service that wraps Fingerprint, Iris, Face services. This service + * should not carry any state. The reality is we need to keep a tiny amount of state so that + * cancelAuthentication() can go to the right place. */ - protected interface ServiceListener { - default void onEnrollResult(BiometricAuthenticator.Identifier identifier, - int remaining) throws RemoteException {}; - - void onAcquired(long deviceId, int acquiredInfo, int vendorCode) - throws RemoteException; - - void onAuthenticationSucceeded(long deviceId, - BiometricAuthenticator.Identifier biometric, int userId) - throws RemoteException; - - void onAuthenticationFailed(long deviceId) - throws RemoteException; - - void onError(long deviceId, int error, int vendorCode) - throws RemoteException; - - default void onRemoved(BiometricAuthenticator.Identifier identifier, - int remaining) throws RemoteException {}; - - default void onEnumerated(BiometricAuthenticator.Identifier identifier, - int remaining) throws RemoteException {}; - } + private final class BiometricPromptServiceWrapper extends IBiometricService.Stub { + + @Override // Binder call + public void authenticate(IBinder token, long sessionId, int userId, + IBiometricServiceReceiver receiver, int flags, String opPackageName, + Bundle bundle, IBiometricPromptReceiver dialogReceiver) throws RemoteException { + // Check the USE_BIOMETRIC permission here. In the BiometricService, check do the + // AppOps and foreground check. + checkPermission(); + + if (token == null || receiver == null || opPackageName == null || bundle == null + || dialogReceiver == null) { + Slog.e(TAG, "Unable to authenticate, one or more null arguments"); + return; + } - /** - * Wraps a portion of the interface from Service -> Daemon that is used by the ClientMonitor - * subclasses. - */ - protected interface DaemonWrapper { - int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. see errno.h. - int authenticate(long operationId, int groupId) throws RemoteException; - int cancel() throws RemoteException; - int remove(int groupId, int biometricId) throws RemoteException; - int enumerate() throws RemoteException; - int enroll(byte[] cryptoToken, int groupId, int timeout) throws RemoteException; - } + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final int callingUserId = UserHandle.getCallingUserId(); - /** - * Handler which all subclasses should post events to. - */ - protected final class H extends Handler { - @Override - public void handleMessage(android.os.Message msg) { - switch (msg.what) { - case MSG_USER_SWITCHING: - handleUserSwitching(msg.arg1); - break; + mHandler.post(() -> { + mCurrentModality = checkAndGetBiometricModality(receiver); - default: - Slog.w(getTag(), "Unknown message:" + msg.what); - } - } - } - - private final class BiometricTaskStackListener extends TaskStackListener { - @Override - public void onTaskStackChanged() { - try { - if (!(mCurrentClient instanceof AuthenticationClient)) { - return; - } - final String currentClient = mCurrentClient.getOwnerString(); - if (isKeyguard(currentClient)) { - return; // Keyguard is always allowed - } - List<ActivityManager.RunningTaskInfo> runningTasks = - mActivityTaskManager.getTasks(1); - if (!runningTasks.isEmpty()) { - final String topPackage = runningTasks.get(0).topActivity.getPackageName(); - if (!topPackage.contentEquals(currentClient)) { - Slog.e(getTag(), "Stopping background authentication, top: " + topPackage - + " currentClient: " + currentClient); - mCurrentClient.stop(false /* initiatedByClient */); + try { + // No polymorphism :( + if (mCurrentModality == BIOMETRIC_FINGERPRINT) { + mFingerprintService.authenticateFromService(token, sessionId, userId, + receiver, flags, opPackageName, bundle, dialogReceiver, + callingUid, callingPid, callingUserId); + } else if (mCurrentModality == BIOMETRIC_IRIS) { + Slog.w(TAG, "Unsupported modality"); + } else if (mCurrentModality == BIOMETRIC_FACE) { + mFaceService.authenticateFromService(true /* requireConfirmation */, token, + sessionId, userId, receiver, flags, opPackageName, bundle, + dialogReceiver, callingUid, callingPid, callingUserId); + } else { + Slog.w(TAG, "Unsupported modality"); } + } catch (RemoteException e) { + Slog.e(TAG, "Unable to start authentication", e); } - } catch (RemoteException e) { - Slog.e(getTag(), "Unable to get running tasks", e); - } + }); } - } - private final class ResetClientStateRunnable implements Runnable { - @Override - public void run() { - /** - * Warning: if we get here, the driver never confirmed our call to cancel the current - * operation (authenticate, enroll, remove, enumerate, etc), which is - * really bad. The result will be a 3-second delay in starting each new client. - * If you see this on a device, make certain the driver notifies with - * {@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} in response to cancel() - * once it has successfully switched to the IDLE state in the HAL. - * Additionally,{@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} should only be sent - * in response to an actual cancel() call. - */ - Slog.w(getTag(), "Client " - + (mCurrentClient != null ? mCurrentClient.getOwnerString() : "null") - + " failed to respond to cancel, starting client " - + (mPendingClient != null ? mPendingClient.getOwnerString() : "null")); + @Override // Binder call + public void cancelAuthentication(IBinder token, String opPackageName) + throws RemoteException { + checkPermission(); - mCurrentClient = null; - startClient(mPendingClient, false); - } - } - - private final class LockoutReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - Slog.v(getTag(), "Resetting lockout: " + intent.getAction()); - if (getLockoutResetIntent().equals(intent.getAction())) { - final int user = intent.getIntExtra(KEY_LOCKOUT_RESET_USER, 0); - resetFailedAttemptsForUser(false /* clearAttemptCounter */, user); + if (token == null || opPackageName == null) { + Slog.e(TAG, "Unable to cancel, one or more null arguments"); + return; } - } - } - - private final class ResetFailedAttemptsForUserRunnable implements Runnable { - @Override - public void run() { - resetFailedAttemptsForUser(true /* clearAttemptCounter */, - ActivityManager.getCurrentUser()); - } - } - private final class LockoutResetMonitor implements IBinder.DeathRecipient { - private static final long WAKELOCK_TIMEOUT_MS = 2000; - private final IBiometricServiceLockoutResetCallback mCallback; - private final PowerManager.WakeLock mWakeLock; + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final int callingUserId = UserHandle.getCallingUserId(); - public LockoutResetMonitor(IBiometricServiceLockoutResetCallback callback) { - mCallback = callback; - mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - "lockout reset callback"); - try { - mCallback.asBinder().linkToDeath(LockoutResetMonitor.this, 0); - } catch (RemoteException e) { - Slog.w(getTag(), "caught remote exception in linkToDeath", e); - } - } - - public void sendLockoutReset() { - if (mCallback != null) { + mHandler.post(() -> { try { - mWakeLock.acquire(WAKELOCK_TIMEOUT_MS); - mCallback.onLockoutReset(getHalDeviceId(), new IRemoteCallback.Stub() { - @Override - public void sendResult(Bundle data) throws RemoteException { - releaseWakelock(); - } - }); - } catch (DeadObjectException e) { - Slog.w(getTag(), "Death object while invoking onLockoutReset: ", e); - mHandler.post(mRemoveCallbackRunnable); + if (mCurrentModality == BIOMETRIC_FINGERPRINT) { + mFingerprintService.cancelAuthenticationFromService(token, opPackageName, + callingUid, callingPid, callingUserId); + } else if (mCurrentModality == BIOMETRIC_IRIS) { + Slog.w(TAG, "Unsupported modality"); + } else if (mCurrentModality == BIOMETRIC_FACE) { + mFaceService.cancelAuthenticationFromService(token, opPackageName, + callingUid, callingPid, callingUserId); + } else { + Slog.w(TAG, "Unsupported modality"); + } } catch (RemoteException e) { - Slog.w(getTag(), "Failed to invoke onLockoutReset: ", e); - releaseWakelock(); + Slog.e(TAG, "Unable to cancel authentication"); } - } + }); } - private final Runnable mRemoveCallbackRunnable = new Runnable() { - @Override - public void run() { - releaseWakelock(); - removeLockoutResetCallback(LockoutResetMonitor.this); - } - }; + @Override // Binder call + public boolean hasEnrolledBiometrics() { + checkPermission(); - @Override - public void binderDied() { - Slog.e(getTag(), "Lockout reset callback binder died"); - mHandler.post(mRemoveCallbackRunnable); + boolean hasEnrolled = false; + final long ident = Binder.clearCallingIdentity(); + try { + // Note: On devices with multi-modal authentication, the selection logic will need to + // be updated. + for (int i = 0; i < mAuthenticators.size(); i++) { + if (mAuthenticators.get(i).getAuthenticator().hasEnrolledTemplates()) { + hasEnrolled = true; + break; + } + } + } finally { + Binder.restoreCallingIdentity(ident); + } + return hasEnrolled; } + } - private void releaseWakelock() { - if (mWakeLock.isHeld()) { - mWakeLock.release(); - } + private void checkPermission() { + if (getContext().checkCallingPermission(USE_FINGERPRINT) + != PackageManager.PERMISSION_GRANTED) { + getContext().enforceCallingPermission(USE_BIOMETRIC, + "Must have USE_BIOMETRIC permission"); } } @@ -531,582 +240,129 @@ public abstract class BiometricService extends SystemService implements IHwBinde */ public BiometricService(Context context) { super(context); - mContext = context; - mStatusBarService = IStatusBarService.Stub.asInterface( - ServiceManager.getService(Context.STATUS_BAR_SERVICE)); - mKeyguardPackage = ComponentName.unflattenFromString(context.getResources().getString( - com.android.internal.R.string.config_keyguardComponent)).getPackageName(); - mAppOps = context.getSystemService(AppOpsManager.class); - mTimedLockoutCleared = new SparseBooleanArray(); - mFailedAttempts = new SparseIntArray(); - mActivityTaskManager = ((ActivityTaskManager) context.getSystemService( - Context.ACTIVITY_TASK_SERVICE)).getService(); - mPowerManager = mContext.getSystemService(PowerManager.class); - mAlarmManager = mContext.getSystemService(AlarmManager.class); - mUserManager = UserManager.get(mContext); - mMetricsLogger = new MetricsLogger(); - mContext.registerReceiver(mLockoutReceiver, new IntentFilter(getLockoutResetIntent()), - getLockoutBroadcastPermission(), null /* handler */); - } - - @Override - public void onStart() { - listenForUserSwitches(); - } - - @Override - public void serviceDied(long cookie) { - Slog.e(getTag(), "HAL died"); - mMetricsLogger.count(getMetrics().tagHalDied(), 1); - handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, - 0 /*vendorCode */); - } - - protected ClientMonitor getCurrentClient() { - return mCurrentClient; - } - - protected ClientMonitor getPendingClient() { - return mPendingClient; - } - - /** - * Callback handlers from the daemon. The caller must put this on a handler. - */ - - protected void handleAcquired(long deviceId, int acquiredInfo, int vendorCode) { - ClientMonitor client = mCurrentClient; - if (client != null && client.onAcquired(acquiredInfo, vendorCode)) { - removeClient(client); - } - if (mPerformanceStats != null && getLockoutMode() == AuthenticationClient.LOCKOUT_NONE - && client instanceof AuthenticationClient) { - // ignore enrollment acquisitions or acquisitions when we're locked out - mPerformanceStats.acquire++; - } - } - - protected void handleAuthenticated(BiometricAuthenticator.Identifier identifier, - ArrayList<Byte> token) { - ClientMonitor client = mCurrentClient; - final boolean authenticated = identifier.getBiometricId() != 0; - - if (client != null && client.onAuthenticated(identifier, authenticated, token)) { - removeClient(client); - } - if (authenticated) { - mPerformanceStats.accept++; - } else { - mPerformanceStats.reject++; - } - } - - protected void handleEnrollResult(BiometricAuthenticator.Identifier identifier, - int remaining) { - ClientMonitor client = mCurrentClient; - if (client != null && client.onEnrollResult(identifier, remaining)) { - removeClient(client); - // When enrollment finishes, update this group's authenticator id, as the HAL has - // already generated a new authenticator id when the new biometric is enrolled. - if (identifier instanceof Fingerprint) { - updateActiveGroup(((Fingerprint)identifier).getGroupId(), null); - } else { - updateActiveGroup(mCurrentUserId, null); - } - - } - } - - protected void handleError(long deviceId, int error, int vendorCode) { - final ClientMonitor client = mCurrentClient; - - if (DEBUG) Slog.v(getTag(), "handleError(client=" - + (client != null ? client.getOwnerString() : "null") + ", error = " + error + ")"); - - if (client != null && client.onError(deviceId, error, vendorCode)) { - removeClient(client); - } - - if (error == BiometricConstants.BIOMETRIC_ERROR_CANCELED) { - mHandler.removeCallbacks(mResetClientState); - if (mPendingClient != null) { - if (DEBUG) Slog.v(getTag(), "start pending client " + mPendingClient.getOwnerString()); - startClient(mPendingClient, false); - mPendingClient = null; - } - } - } - - protected void handleRemoved(BiometricAuthenticator.Identifier identifier, - final int remaining) { - if (DEBUG) Slog.w(getTag(), "Removed: fid=" + identifier.getBiometricId() - + ", dev=" + identifier.getDeviceId() - + ", rem=" + remaining); - - ClientMonitor client = mCurrentClient; - if (client != null && client.onRemoved(identifier, remaining)) { - removeClient(client); - // When the last biometric of a group is removed, update the authenticator id - int userId = mCurrentUserId; - if (identifier instanceof Fingerprint) { - userId = ((Fingerprint) identifier).getGroupId(); - } - if (!hasEnrolledBiometrics(userId)) { - updateActiveGroup(userId, null); - } - } - } - - /** - * Calls from the Manager. These are still on the calling binder's thread. - */ - - protected void enrollInternal(EnrollClientImpl client, int userId) { - if (hasReachedEnrollmentLimit(userId)) { - return; - } - - // Group ID is arbitrarily set to parent profile user ID. It just represents - // the default biometrics for the user. - if (!isCurrentUserOrProfile(userId)) { - return; - } - - mHandler.post(() -> { - startClient(client, true /* initiatedByClient */); - }); - } - - protected void cancelEnrollmentInternal(IBinder token) { - mHandler.post(() -> { - ClientMonitor client = mCurrentClient; - if (client instanceof EnrollClient && client.getToken() == token) { - client.stop(client.getToken() == token); - } - }); - } - - protected void authenticateInternal(AuthenticationClientImpl client, long opId, - String opPackageName) { - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); - final int callingUserId = UserHandle.getCallingUserId(); - authenticateInternal(client, opId, opPackageName, callingUid, callingPid, callingUserId); - } - - protected void authenticateInternal(AuthenticationClientImpl client, long opId, - String opPackageName, int callingUid, int callingPid, int callingUserId) { - if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid, - callingUserId)) { - if (DEBUG) Slog.v(getTag(), "authenticate(): reject " + opPackageName); - return; - } - mHandler.post(() -> { - mMetricsLogger.histogram(getMetrics().tagAuthToken(), opId != 0L ? 1 : 0); + mHandler = new Handler(Looper.getMainLooper()); - // Get performance stats object for this user. - HashMap<Integer, PerformanceStats> pmap - = (opId == 0) ? mPerformanceMap : mCryptoPerformanceMap; - PerformanceStats stats = pmap.get(mCurrentUserId); - if (stats == null) { - stats = new PerformanceStats(); - pmap.put(mCurrentUserId, stats); - } - mPerformanceStats = stats; - mIsCrypto = (opId != 0); - - startAuthentication(client, opPackageName); - }); - } - - protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName) { - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); - final int callingUserId = UserHandle.getCallingUserId(); - cancelAuthenticationInternal(token, opPackageName, callingUid, callingPid, callingUserId); - } - - protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName, - int callingUid, int callingPid, int callingUserId) { - if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid, - callingUserId)) { - if (DEBUG) Slog.v(getTag(), "cancelAuthentication(): reject " + opPackageName); - return; - } - - mHandler.post(() -> { - ClientMonitor client = mCurrentClient; - if (client instanceof AuthenticationClient) { - if (client.getToken() == token) { - if (DEBUG) Slog.v(getTag(), "stop client " + client.getOwnerString()); - client.stop(client.getToken() == token); - } else { - if (DEBUG) Slog.v(getTag(), "can't stop client " - + client.getOwnerString() + " since tokens don't match"); - } - } else if (client != null) { - if (DEBUG) Slog.v(getTag(), "can't cancel non-authenticating client " - + client.getOwnerString()); - } - }); + final PackageManager pm = context.getPackageManager(); + mHasFeatureFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT); + mHasFeatureIris = pm.hasSystemFeature(PackageManager.FEATURE_IRIS); + mHasFeatureFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE); } - protected void setActiveUserInternal(int userId) { - mHandler.post(() -> { - updateActiveGroup(userId, null /* clientPackage */); - }); - } - - protected void removeInternal(RemovalClientImpl client) { - mHandler.post(() -> { - startClient(client, true /* initiatedByClient */); - }); - } - - protected void enumerateInternal(EnumerateClientImpl client) { - mHandler.post(() -> { - startClient(client, true /* initiatedByClient */); - }); - } - - // Should be done on a handler thread - not on the Binder's thread. - private void startAuthentication(AuthenticationClientImpl client, String opPackageName) { - updateActiveGroup(client.getGroupId(), opPackageName); - - if (DEBUG) Slog.v(getTag(), "startAuthentication(" + opPackageName + ")"); - - int lockoutMode = getLockoutMode(); - if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) { - Slog.v(getTag(), "In lockout mode(" + lockoutMode + - ") ; disallowing authentication"); - int errorCode = lockoutMode == AuthenticationClient.LOCKOUT_TIMED ? - BiometricConstants.BIOMETRIC_ERROR_LOCKOUT : - BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT; - if (!client.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */)) { - Slog.w(getTag(), "Cannot send permanent lockout message to client"); + @Override + public void onStart() { + // TODO: maybe get these on-demand + if (mHasFeatureFingerprint) { + mFingerprintService = IFingerprintService.Stub.asInterface( + ServiceManager.getService(Context.FINGERPRINT_SERVICE)); + } + if (mHasFeatureFace) { + mFaceService = IFaceService.Stub.asInterface( + ServiceManager.getService(Context.FACE_SERVICE)); + } + + // Cache the authenticators + for (int i = 0; i < FEATURE_ID.length; i++) { + if (hasFeature(FEATURE_ID[i])) { + Authenticator authenticator = + new Authenticator(FEATURE_ID[i], getAuthenticator(FEATURE_ID[i])); + mAuthenticators.add(authenticator); } - return; } - startClient(client, true /* initiatedByClient */); - } - - protected void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback) { - mHandler.post(() -> { - final LockoutResetMonitor monitor = new LockoutResetMonitor(callback); - if (!mLockoutMonitors.contains(monitor)) { - mLockoutMonitors.add(monitor); - } - }); - } - - /** - * Helper methods. - */ - - /** - * @param opPackageName name of package for caller - * @param requireForeground only allow this call while app is in the foreground - * @return true if caller can use the biometric API - */ - protected boolean canUseBiometric(String opPackageName, boolean requireForeground, int uid, - int pid, int userId) { - checkUseBiometricPermission(); - if (isKeyguard(opPackageName)) { - return true; // Keyguard is always allowed - } - if (!isCurrentUserOrProfile(userId)) { - Slog.w(getTag(), "Rejecting " + opPackageName + "; not a current user or profile"); - return false; - } - if (mAppOps.noteOp(getAppOp(), uid, opPackageName) != AppOpsManager.MODE_ALLOWED) { - Slog.w(getTag(), "Rejecting " + opPackageName + "; permission denied"); - return false; - } - if (requireForeground && !(isForegroundActivity(uid, pid) || isCurrentClient( - opPackageName))) { - Slog.w(getTag(), "Rejecting " + opPackageName + "; not in foreground"); - return false; - } - return true; + publishBinderService(Context.BIOMETRIC_SERVICE, new BiometricPromptServiceWrapper()); } /** - * @param opPackageName package of the caller - * @return true if this is the same client currently using the biometric + * Checks if there are any available biometrics, and returns the modality. This method also + * returns errors through the callback (no biometric feature, hardware not detected, no + * templates enrolled, etc). This service must not start authentication if errors are sent. */ - private boolean isCurrentClient(String opPackageName) { - return mCurrentClient != null && mCurrentClient.getOwnerString().equals(opPackageName); - } + private int checkAndGetBiometricModality(IBiometricServiceReceiver receiver) { + int modality = BIOMETRIC_NONE; + final String hardwareUnavailable = + getContext().getString(R.string.biometric_error_hw_unavailable); - /** - * @return true if this is keyguard package - */ - private boolean isKeyguard(String clientPackage) { - return mKeyguardPackage.equals(clientPackage); - } - - protected int getLockoutMode() { - final int currentUser = ActivityManager.getCurrentUser(); - final int failedAttempts = mFailedAttempts.get(currentUser, 0); - if (failedAttempts >= getFailedAttemptsLockoutPermanent()) { - return AuthenticationClient.LOCKOUT_PERMANENT; - } else if (failedAttempts > 0 && - mTimedLockoutCleared.get(currentUser, false) == false - && (failedAttempts % getFailedAttemptsLockoutTimed() == 0)) { - return AuthenticationClient.LOCKOUT_TIMED; - } - return AuthenticationClient.LOCKOUT_NONE; - } - - private boolean isForegroundActivity(int uid, int pid) { - try { - List<ActivityManager.RunningAppProcessInfo> procs = - ActivityManager.getService().getRunningAppProcesses(); - int N = procs.size(); - for (int i = 0; i < N; i++) { - ActivityManager.RunningAppProcessInfo proc = procs.get(i); - if (proc.pid == pid && proc.uid == uid - && proc.importance <= IMPORTANCE_FOREGROUND_SERVICE) { - return true; - } + // No biometric features, send error + if (mAuthenticators.isEmpty()) { + try { + receiver.onError(0 /* deviceId */, + BiometricConstants.BIOMETRIC_ERROR_HW_NOT_PRESENT, + hardwareUnavailable); + } catch (RemoteException e) { + Slog.e(TAG, "Unable to send error", e); } - } catch (RemoteException e) { - Slog.w(getTag(), "am.getRunningAppProcesses() failed"); - } - return false; - } - - /** - * Calls the HAL to switch states to the new task. If there's already a current task, - * it calls cancel() and sets mPendingClient to begin when the current task finishes - * ({@link BiometricConstants#BIOMETRIC_ERROR_CANCELED}). - * - * @param newClient the new client that wants to connect - * @param initiatedByClient true for authenticate, remove and enroll - */ - private void startClient(ClientMonitor newClient, boolean initiatedByClient) { - ClientMonitor currentClient = mCurrentClient; - if (currentClient != null) { - if (DEBUG) Slog.v(getTag(), "request stop current client " + - currentClient.getOwnerString()); - - // This check only matters for FingerprintService, since enumerate may call back - // multiple times. - if (currentClient instanceof FingerprintService.EnumerateClientImpl || - currentClient instanceof FingerprintService.RemovalClientImpl) { - // This condition means we're currently running internal diagnostics to - // remove extra fingerprints in the hardware and/or the software - // TODO: design an escape hatch in case client never finishes - if (newClient != null) { - Slog.w(getTag(), "Internal cleanup in progress but trying to start client " - + newClient.getClass().getSuperclass().getSimpleName() - + "(" + newClient.getOwnerString() + ")" - + ", initiatedByClient = " + initiatedByClient); + return BIOMETRIC_NONE; + } + + // Find first authenticator that's both detected and enrolled + boolean isHardwareDetected = false; + boolean hasTemplatesEnrolled = false; + for (int i = 0; i < mAuthenticators.size(); i++) { + int featureId = mAuthenticators.get(i).getType(); + BiometricAuthenticator authenticator = mAuthenticators.get(i).getAuthenticator(); + if (authenticator.isHardwareDetected()) { + isHardwareDetected = true; + if (authenticator.hasEnrolledTemplates()) { + hasTemplatesEnrolled = true; + modality = featureId; + break; } - } else { - currentClient.stop(initiatedByClient); } - mPendingClient = newClient; - mHandler.removeCallbacks(mResetClientState); - mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT); - } else if (newClient != null) { - mCurrentClient = newClient; - if (DEBUG) Slog.v(getTag(), "starting client " - + newClient.getClass().getSuperclass().getSimpleName() - + "(" + newClient.getOwnerString() + ")" - + ", initiatedByClient = " + initiatedByClient); - notifyClientActiveCallbacks(true); - - newClient.start(); } - } - protected void removeClient(ClientMonitor client) { - if (client != null) { - client.destroy(); - if (client != mCurrentClient && mCurrentClient != null) { - Slog.w(getTag(), "Unexpected client: " + client.getOwnerString() + "expected: " - + mCurrentClient.getOwnerString()); - } - } - if (mCurrentClient != null) { - if (DEBUG) Slog.v(getTag(), "Done with client: " + client.getOwnerString()); - mCurrentClient = null; - } - if (mPendingClient == null) { - notifyClientActiveCallbacks(false); - } - } - - /** - * Populates existing authenticator ids. To be used only during the start of the service. - */ - protected void loadAuthenticatorIds() { - // This operation can be expensive, so keep track of the elapsed time. Might need to move to - // background if it takes too long. - long t = System.currentTimeMillis(); - mAuthenticatorIds.clear(); - for (UserInfo user : UserManager.get(getContext()).getUsers(true /* excludeDying */)) { - int userId = getUserOrWorkProfileId(null, user.id); - if (!mAuthenticatorIds.containsKey(userId)) { - updateActiveGroup(userId, null); + // Check error conditions + if (!isHardwareDetected) { + try { + receiver.onError(0 /* deviceId */, + BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + hardwareUnavailable); + } catch (RemoteException e) { + Slog.e(TAG, "Unable to send error", e); } + return BIOMETRIC_NONE; } - - t = System.currentTimeMillis() - t; - if (t > 1000) { - Slog.w(getTag(), "loadAuthenticatorIds() taking too long: " + t + "ms"); - } - } - - /** - * @param clientPackage the package of the caller - * @return the profile id - */ - protected int getUserOrWorkProfileId(String clientPackage, int userId) { - if (!isKeyguard(clientPackage) && isWorkProfile(userId)) { - return userId; - } - return getEffectiveUserId(userId); - } - - protected boolean isRestricted() { - // Only give privileged apps (like Settings) access to biometric info - final boolean restricted = !hasPermission(getManageBiometricPermission()); - return restricted; - } - - protected boolean hasPermission(String permission) { - return getContext().checkCallingOrSelfPermission(permission) - == PackageManager.PERMISSION_GRANTED; - } - - protected void checkPermission(String permission) { - getContext().enforceCallingOrSelfPermission(permission, - "Must have " + permission + " permission."); - } - - protected boolean isCurrentUserOrProfile(int userId) { - UserManager um = UserManager.get(mContext); - if (um == null) { - Slog.e(getTag(), "Unable to acquire UserManager"); - return false; - } - - final long token = Binder.clearCallingIdentity(); - try { - // Allow current user or profiles of the current user... - for (int profileId : um.getEnabledProfileIds(ActivityManager.getCurrentUser())) { - if (profileId == userId) { - return true; - } + if (!hasTemplatesEnrolled) { + try { + receiver.onError(0 /* deviceId */, + BiometricConstants.BIOMETRIC_ERROR_NO_BIOMETRICS, + FaceManager.getErrorString(getContext(), + BiometricConstants.BIOMETRIC_ERROR_NO_BIOMETRICS, + 0 /* vendorCode */)); + } catch (RemoteException e) { + Slog.e(TAG, "Unable to send error", e); } - } finally { - Binder.restoreCallingIdentity(token); - } - - return false; - } - - /*** - * @param opPackageName the name of the calling package - * @return authenticator id for the calling user - */ - protected long getAuthenticatorId(String opPackageName) { - final int userId = getUserOrWorkProfileId(opPackageName, UserHandle.getCallingUserId()); - return mAuthenticatorIds.getOrDefault(userId, 0L); - } - - private void scheduleLockoutResetForUser(int userId) { - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS, - getLockoutResetIntentForUser(userId)); - } - - private PendingIntent getLockoutResetIntentForUser(int userId) { - return PendingIntent.getBroadcast(mContext, userId, - new Intent(getLockoutResetIntent()).putExtra(KEY_LOCKOUT_RESET_USER, userId), - PendingIntent.FLAG_UPDATE_CURRENT); - } - - private void userActivity() { - long now = SystemClock.uptimeMillis(); - mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); - } - - /** - * @param userId - * @return true if this is a work profile - */ - private boolean isWorkProfile(int userId) { - UserInfo userInfo = null; - final long token = Binder.clearCallingIdentity(); - try { - userInfo = mUserManager.getUserInfo(userId); - } finally { - Binder.restoreCallingIdentity(token); - } - return userInfo != null && userInfo.isManagedProfile(); - } - - - private int getEffectiveUserId(int userId) { - UserManager um = UserManager.get(mContext); - if (um != null) { - final long callingIdentity = Binder.clearCallingIdentity(); - userId = um.getCredentialOwnerProfile(userId); - Binder.restoreCallingIdentity(callingIdentity); - } else { - Slog.e(getTag(), "Unable to acquire UserManager"); + return BIOMETRIC_NONE; } - return userId; - } - // Attempt counter should only be cleared when Keyguard goes away or when - // a biometric is successfully authenticated. - private void resetFailedAttemptsForUser(boolean clearAttemptCounter, int userId) { - if (DEBUG && getLockoutMode() != AuthenticationClient.LOCKOUT_NONE) { - Slog.v(getTag(), "Reset biometric lockout, clearAttemptCounter=" + clearAttemptCounter); - } - if (clearAttemptCounter) { - mFailedAttempts.put(userId, 0); - } - mTimedLockoutCleared.put(userId, true); - // If we're asked to reset failed attempts externally (i.e. from Keyguard), - // the alarm might still be pending; remove it. - cancelLockoutResetForUser(userId); - notifyLockoutResetMonitors(); + return modality; } - private void cancelLockoutResetForUser(int userId) { - mAlarmManager.cancel(getLockoutResetIntentForUser(userId)); - } - - private void listenForUserSwitches() { - try { - ActivityManager.getService().registerUserSwitchObserver( - new SynchronousUserSwitchObserver() { - @Override - public void onUserSwitching(int newUserId) throws RemoteException { - mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */) - .sendToTarget(); - } - }, getTag()); - } catch (RemoteException e) { - Slog.w(getTag(), "Failed to listen for user switching event" ,e); + private BiometricAuthenticator getAuthenticator(int type) { + switch (type) { + case BIOMETRIC_FINGERPRINT: + return (FingerprintManager) + getContext().getSystemService(Context.FINGERPRINT_SERVICE); + case BIOMETRIC_IRIS: + return null; + case BIOMETRIC_FACE: + return (FaceManager) + getContext().getSystemService(Context.FACE_SERVICE); + default: + return null; } } - private void notifyLockoutResetMonitors() { - for (int i = 0; i < mLockoutMonitors.size(); i++) { - mLockoutMonitors.get(i).sendLockoutReset(); + private boolean hasFeature(int type) { + switch (type) { + case BIOMETRIC_FINGERPRINT: + return mHasFeatureFingerprint; + case BIOMETRIC_IRIS: + return mHasFeatureIris; + case BIOMETRIC_FACE: + return mHasFeatureFace; + default: + return false; } } - - private void removeLockoutResetCallback( - LockoutResetMonitor monitor) { - mLockoutMonitors.remove(monitor); - } } diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java new file mode 100644 index 000000000000..b3c7c19eee71 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -0,0 +1,1114 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics; + +import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE; + +import android.app.ActivityManager; +import android.app.ActivityTaskManager; +import android.app.AlarmManager; +import android.app.AppOpsManager; +import android.app.IActivityTaskManager; +import android.app.PendingIntent; +import android.app.SynchronousUserSwitchObserver; +import android.app.TaskStackListener; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.hardware.biometrics.BiometricAuthenticator; +import android.hardware.biometrics.BiometricConstants; +import android.hardware.biometrics.IBiometricPromptReceiver; +import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; +import android.hardware.fingerprint.Fingerprint; +import android.os.Binder; +import android.os.Bundle; +import android.os.DeadObjectException; +import android.os.Handler; +import android.os.IBinder; +import android.os.IHwBinder; +import android.os.IRemoteCallback; +import android.os.PowerManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemClock; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Slog; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.statusbar.IStatusBarService; +import com.android.server.SystemService; +import com.android.server.biometrics.fingerprint.FingerprintService; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Abstract base class containing all of the business logic for biometric services, e.g. + * Fingerprint, Face, Iris. + * + * @hide + */ +public abstract class BiometricServiceBase extends SystemService + implements IHwBinder.DeathRecipient { + + protected static final boolean DEBUG = true; + + private static final String KEY_LOCKOUT_RESET_USER = "lockout_reset_user"; + private static final int MSG_USER_SWITCHING = 10; + private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30 * 1000; + private static final long CANCEL_TIMEOUT_LIMIT = 3000; // max wait for onCancel() from HAL,in ms + + private final Context mContext; + private final String mKeyguardPackage; + private final AppOpsManager mAppOps; + private final SparseBooleanArray mTimedLockoutCleared; + private final SparseIntArray mFailedAttempts; + private final IActivityTaskManager mActivityTaskManager; + private final AlarmManager mAlarmManager; + private final PowerManager mPowerManager; + private final UserManager mUserManager; + private final MetricsLogger mMetricsLogger; + private final BiometricTaskStackListener mTaskStackListener = new BiometricTaskStackListener(); + private final ResetClientStateRunnable mResetClientState = new ResetClientStateRunnable(); + private final LockoutReceiver mLockoutReceiver = new LockoutReceiver(); + private final ArrayList<LockoutResetMonitor> mLockoutMonitors = new ArrayList<>(); + + protected final IStatusBarService mStatusBarService; + protected final Map<Integer, Long> mAuthenticatorIds = + Collections.synchronizedMap(new HashMap<>()); + protected final ResetFailedAttemptsForUserRunnable mResetFailedAttemptsForCurrentUserRunnable = + new ResetFailedAttemptsForUserRunnable(); + protected final H mHandler = new H(); + + private ClientMonitor mCurrentClient; + private ClientMonitor mPendingClient; + private PerformanceStats mPerformanceStats; + protected int mCurrentUserId = UserHandle.USER_NULL; + // Tracks if the current authentication makes use of CryptoObjects. + protected boolean mIsCrypto; + // Normal authentications are tracked by mPerformanceMap. + protected HashMap<Integer, PerformanceStats> mPerformanceMap = new HashMap<>(); + // Transactions that make use of CryptoObjects are tracked by mCryptoPerformaceMap. + protected HashMap<Integer, PerformanceStats> mCryptoPerformanceMap = new HashMap<>(); + + protected class PerformanceStats { + public int accept; // number of accepted biometrics + public int reject; // number of rejected biometrics + public int acquire; // total number of acquisitions. Should be >= accept+reject due to poor + // image acquisition in some cases (too fast, too slow, dirty sensor, etc.) + public int lockout; // total number of lockouts + public int permanentLockout; // total number of permanent lockouts + } + + /** + * @return the log tag. + */ + protected abstract String getTag(); + + /** + * @return the biometric utilities for a specific implementation. + */ + protected abstract BiometricUtils getBiometricUtils(); + + /** + * @return the number of failed attempts after which the user will be temporarily locked out + * from using the biometric. A strong auth (pin/pattern/pass) clears this counter. + */ + protected abstract int getFailedAttemptsLockoutTimed(); + + /** + * @return the number of failed attempts after which the user will be permanently locked out + * from using the biometric. A strong auth (pin/pattern/pass) clears this counter. + */ + protected abstract int getFailedAttemptsLockoutPermanent(); + + /** + * @return the metrics constants for a biometric implementation. + */ + protected abstract Metrics getMetrics(); + + /** + * @param userId + * @return true if the enrollment limit has been reached. + */ + protected abstract boolean hasReachedEnrollmentLimit(int userId); + + /** + * Notifies the HAL that the user has changed. + * @param userId + * @param clientPackage + */ + protected abstract void updateActiveGroup(int userId, String clientPackage); + + /** + * @return The protected intent to reset lockout for a specific biometric. + */ + protected abstract String getLockoutResetIntent(); + + /** + * @return The permission the sender is required to have in order for the lockout reset intent + * to be received by the BiometricService implementation. + */ + protected abstract String getLockoutBroadcastPermission(); + + /** + * @return The HAL ID. + */ + protected abstract long getHalDeviceId(); + + /** + * This method is called when the user switches. Implementations should probably notify the + * HAL. + * @param userId + */ + protected abstract void handleUserSwitching(int userId); + + /** + * @param userId + * @return Returns true if the user has any enrolled biometrics. + */ + protected abstract boolean hasEnrolledBiometrics(int userId); + + /** + * @return Returns the MANAGE_* permission string, which is required for enrollment, removal + * etc. + */ + protected abstract String getManageBiometricPermission(); + + /** + * Checks if the caller has permission to use the biometric service - throws a SecurityException + * if not. + */ + protected abstract void checkUseBiometricPermission(); + + /** + * @return Returns one of the {@link AppOpsManager} constants which pertains to the specific + * biometric service. + */ + protected abstract int getAppOp(); + + + /** + * Notifies clients of any change in the biometric state (active / idle). This is mainly for + * Fingerprint navigation gestures. + * @param isActive + */ + protected void notifyClientActiveCallbacks(boolean isActive) {} + + protected abstract class AuthenticationClientImpl extends AuthenticationClient { + + public AuthenticationClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, + IBinder token, ServiceListener listener, int targetUserId, int groupId, long opId, + boolean restricted, String owner, Bundle bundle, + IBiometricPromptReceiver dialogReceiver, + IStatusBarService statusBarService, boolean requireConfirmation) { + super(context, getMetrics(), daemon, halDeviceId, token, listener, + targetUserId, groupId, opId, restricted, owner, bundle, dialogReceiver, + statusBarService, requireConfirmation); + } + + @Override + public void onStart() { + try { + mActivityTaskManager.registerTaskStackListener(mTaskStackListener); + } catch (RemoteException e) { + Slog.e(getTag(), "Could not register task stack listener", e); + } + } + + @Override + public void onStop() { + try { + mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener); + } catch (RemoteException e) { + Slog.e(getTag(), "Could not unregister task stack listener", e); + } + } + + @Override + public void resetFailedAttempts() { + resetFailedAttemptsForUser(true /* clearAttemptCounter */, + ActivityManager.getCurrentUser()); + } + + @Override + public void notifyUserActivity() { + userActivity(); + } + + @Override + public int handleFailedAttempt() { + final int currentUser = ActivityManager.getCurrentUser(); + mFailedAttempts.put(currentUser, mFailedAttempts.get(currentUser, 0) + 1); + mTimedLockoutCleared.put(ActivityManager.getCurrentUser(), false); + final int lockoutMode = getLockoutMode(); + if (lockoutMode == AuthenticationClient.LOCKOUT_PERMANENT) { + mPerformanceStats.permanentLockout++; + } else if (lockoutMode == AuthenticationClient.LOCKOUT_TIMED) { + mPerformanceStats.lockout++; + } + + // Failing multiple times will continue to push out the lockout time + if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) { + scheduleLockoutResetForUser(currentUser); + return lockoutMode; + } + return AuthenticationClient.LOCKOUT_NONE; + } + + @Override + public void onAuthenticationConfirmed() { + removeClient(mCurrentClient); + } + } + + protected class EnrollClientImpl extends EnrollClient { + + public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, + IBinder token, ServiceListener listener, int userId, int groupId, + byte[] cryptoToken, boolean restricted, String owner) { + super(context, getMetrics(), daemon, halDeviceId, token, listener, + userId, groupId, cryptoToken, restricted, owner, getBiometricUtils()); + } + + @Override + public void notifyUserActivity() { + userActivity(); + } + } + + protected class RemovalClientImpl extends RemovalClient { + private boolean mShouldNotify; + + public RemovalClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, + IBinder token, ServiceListener listener, int fingerId, int groupId, int userId, + boolean restricted, String owner) { + super(context, getMetrics(), daemon, halDeviceId, token, listener, fingerId, groupId, + userId, restricted, owner, getBiometricUtils()); + } + + public void setShouldNotifyUserActivity(boolean shouldNotify) { + mShouldNotify = shouldNotify; + } + + @Override + public void notifyUserActivity() { + if (mShouldNotify) { + userActivity(); + } + } + } + + protected class EnumerateClientImpl extends EnumerateClient { + + public EnumerateClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, + IBinder token, ServiceListener listener, int groupId, int userId, + boolean restricted, String owner) { + super(context, getMetrics(), daemon, halDeviceId, token, listener, groupId, userId, + restricted, owner); + } + + @Override + public void notifyUserActivity() { + userActivity(); + } + } + + /** + * Wraps the callback interface from Service -> Manager + */ + protected interface ServiceListener { + default void onEnrollResult(BiometricAuthenticator.Identifier identifier, + int remaining) throws RemoteException {}; + + void onAcquired(long deviceId, int acquiredInfo, int vendorCode) + throws RemoteException; + + void onAuthenticationSucceeded(long deviceId, + BiometricAuthenticator.Identifier biometric, int userId) + throws RemoteException; + + void onAuthenticationFailed(long deviceId) + throws RemoteException; + + void onError(long deviceId, int error, int vendorCode) + throws RemoteException; + + default void onRemoved(BiometricAuthenticator.Identifier identifier, + int remaining) throws RemoteException {}; + + default void onEnumerated(BiometricAuthenticator.Identifier identifier, + int remaining) throws RemoteException {}; + } + + /** + * Wraps a portion of the interface from Service -> Daemon that is used by the ClientMonitor + * subclasses. + */ + protected interface DaemonWrapper { + int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. see errno.h. + int authenticate(long operationId, int groupId) throws RemoteException; + int cancel() throws RemoteException; + int remove(int groupId, int biometricId) throws RemoteException; + int enumerate() throws RemoteException; + int enroll(byte[] cryptoToken, int groupId, int timeout) throws RemoteException; + } + + /** + * Handler which all subclasses should post events to. + */ + protected final class H extends Handler { + @Override + public void handleMessage(android.os.Message msg) { + switch (msg.what) { + case MSG_USER_SWITCHING: + handleUserSwitching(msg.arg1); + break; + + default: + Slog.w(getTag(), "Unknown message:" + msg.what); + } + } + } + + private final class BiometricTaskStackListener extends TaskStackListener { + @Override + public void onTaskStackChanged() { + try { + if (!(mCurrentClient instanceof AuthenticationClient)) { + return; + } + final String currentClient = mCurrentClient.getOwnerString(); + if (isKeyguard(currentClient)) { + return; // Keyguard is always allowed + } + List<ActivityManager.RunningTaskInfo> runningTasks = + mActivityTaskManager.getTasks(1); + if (!runningTasks.isEmpty()) { + final String topPackage = runningTasks.get(0).topActivity.getPackageName(); + if (!topPackage.contentEquals(currentClient)) { + Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + + " currentClient: " + currentClient); + mCurrentClient.stop(false /* initiatedByClient */); + } + } + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to get running tasks", e); + } + } + } + + private final class ResetClientStateRunnable implements Runnable { + @Override + public void run() { + /** + * Warning: if we get here, the driver never confirmed our call to cancel the current + * operation (authenticate, enroll, remove, enumerate, etc), which is + * really bad. The result will be a 3-second delay in starting each new client. + * If you see this on a device, make certain the driver notifies with + * {@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} in response to cancel() + * once it has successfully switched to the IDLE state in the HAL. + * Additionally,{@link BiometricConstants#BIOMETRIC_ERROR_CANCELED} should only be sent + * in response to an actual cancel() call. + */ + Slog.w(getTag(), "Client " + + (mCurrentClient != null ? mCurrentClient.getOwnerString() : "null") + + " failed to respond to cancel, starting client " + + (mPendingClient != null ? mPendingClient.getOwnerString() : "null")); + + mCurrentClient = null; + startClient(mPendingClient, false); + } + } + + private final class LockoutReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Slog.v(getTag(), "Resetting lockout: " + intent.getAction()); + if (getLockoutResetIntent().equals(intent.getAction())) { + final int user = intent.getIntExtra(KEY_LOCKOUT_RESET_USER, 0); + resetFailedAttemptsForUser(false /* clearAttemptCounter */, user); + } + } + } + + private final class ResetFailedAttemptsForUserRunnable implements Runnable { + @Override + public void run() { + resetFailedAttemptsForUser(true /* clearAttemptCounter */, + ActivityManager.getCurrentUser()); + } + } + + private final class LockoutResetMonitor implements IBinder.DeathRecipient { + private static final long WAKELOCK_TIMEOUT_MS = 2000; + private final IBiometricServiceLockoutResetCallback mCallback; + private final PowerManager.WakeLock mWakeLock; + + public LockoutResetMonitor(IBiometricServiceLockoutResetCallback callback) { + mCallback = callback; + mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + "lockout reset callback"); + try { + mCallback.asBinder().linkToDeath(LockoutResetMonitor.this, 0); + } catch (RemoteException e) { + Slog.w(getTag(), "caught remote exception in linkToDeath", e); + } + } + + public void sendLockoutReset() { + if (mCallback != null) { + try { + mWakeLock.acquire(WAKELOCK_TIMEOUT_MS); + mCallback.onLockoutReset(getHalDeviceId(), new IRemoteCallback.Stub() { + @Override + public void sendResult(Bundle data) throws RemoteException { + releaseWakelock(); + } + }); + } catch (DeadObjectException e) { + Slog.w(getTag(), "Death object while invoking onLockoutReset: ", e); + mHandler.post(mRemoveCallbackRunnable); + } catch (RemoteException e) { + Slog.w(getTag(), "Failed to invoke onLockoutReset: ", e); + releaseWakelock(); + } + } + } + + private final Runnable mRemoveCallbackRunnable = new Runnable() { + @Override + public void run() { + releaseWakelock(); + removeLockoutResetCallback(LockoutResetMonitor.this); + } + }; + + @Override + public void binderDied() { + Slog.e(getTag(), "Lockout reset callback binder died"); + mHandler.post(mRemoveCallbackRunnable); + } + + private void releaseWakelock() { + if (mWakeLock.isHeld()) { + mWakeLock.release(); + } + } + } + + /** + * Initializes the system service. + * <p> + * Subclasses must define a single argument constructor that accepts the context + * and passes it to super. + * </p> + * + * @param context The system server context. + */ + public BiometricServiceBase(Context context) { + super(context); + mContext = context; + mStatusBarService = IStatusBarService.Stub.asInterface( + ServiceManager.getService(Context.STATUS_BAR_SERVICE)); + mKeyguardPackage = ComponentName.unflattenFromString(context.getResources().getString( + com.android.internal.R.string.config_keyguardComponent)).getPackageName(); + mAppOps = context.getSystemService(AppOpsManager.class); + mTimedLockoutCleared = new SparseBooleanArray(); + mFailedAttempts = new SparseIntArray(); + mActivityTaskManager = ((ActivityTaskManager) context.getSystemService( + Context.ACTIVITY_TASK_SERVICE)).getService(); + mPowerManager = mContext.getSystemService(PowerManager.class); + mAlarmManager = mContext.getSystemService(AlarmManager.class); + mUserManager = UserManager.get(mContext); + mMetricsLogger = new MetricsLogger(); + mContext.registerReceiver(mLockoutReceiver, new IntentFilter(getLockoutResetIntent()), + getLockoutBroadcastPermission(), null /* handler */); + } + + @Override + public void onStart() { + listenForUserSwitches(); + } + + @Override + public void serviceDied(long cookie) { + Slog.e(getTag(), "HAL died"); + mMetricsLogger.count(getMetrics().tagHalDied(), 1); + handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + 0 /*vendorCode */); + } + + protected ClientMonitor getCurrentClient() { + return mCurrentClient; + } + + protected ClientMonitor getPendingClient() { + return mPendingClient; + } + + /** + * Callback handlers from the daemon. The caller must put this on a handler. + */ + + protected void handleAcquired(long deviceId, int acquiredInfo, int vendorCode) { + ClientMonitor client = mCurrentClient; + if (client != null && client.onAcquired(acquiredInfo, vendorCode)) { + removeClient(client); + } + if (mPerformanceStats != null && getLockoutMode() == AuthenticationClient.LOCKOUT_NONE + && client instanceof AuthenticationClient) { + // ignore enrollment acquisitions or acquisitions when we're locked out + mPerformanceStats.acquire++; + } + } + + protected void handleAuthenticated(BiometricAuthenticator.Identifier identifier, + ArrayList<Byte> token) { + ClientMonitor client = mCurrentClient; + final boolean authenticated = identifier.getBiometricId() != 0; + + if (client != null && client.onAuthenticated(identifier, authenticated, token)) { + removeClient(client); + } + if (authenticated) { + mPerformanceStats.accept++; + } else { + mPerformanceStats.reject++; + } + } + + protected void handleEnrollResult(BiometricAuthenticator.Identifier identifier, + int remaining) { + ClientMonitor client = mCurrentClient; + if (client != null && client.onEnrollResult(identifier, remaining)) { + removeClient(client); + // When enrollment finishes, update this group's authenticator id, as the HAL has + // already generated a new authenticator id when the new biometric is enrolled. + if (identifier instanceof Fingerprint) { + updateActiveGroup(((Fingerprint)identifier).getGroupId(), null); + } else { + updateActiveGroup(mCurrentUserId, null); + } + + } + } + + protected void handleError(long deviceId, int error, int vendorCode) { + final ClientMonitor client = mCurrentClient; + + if (DEBUG) Slog.v(getTag(), "handleError(client=" + + (client != null ? client.getOwnerString() : "null") + ", error = " + error + ")"); + + if (client != null && client.onError(deviceId, error, vendorCode)) { + removeClient(client); + } + + if (error == BiometricConstants.BIOMETRIC_ERROR_CANCELED) { + mHandler.removeCallbacks(mResetClientState); + if (mPendingClient != null) { + if (DEBUG) Slog.v(getTag(), "start pending client " + + mPendingClient.getOwnerString()); + startClient(mPendingClient, false); + mPendingClient = null; + } + } + } + + protected void handleRemoved(BiometricAuthenticator.Identifier identifier, + final int remaining) { + if (DEBUG) Slog.w(getTag(), "Removed: fid=" + identifier.getBiometricId() + + ", dev=" + identifier.getDeviceId() + + ", rem=" + remaining); + + ClientMonitor client = mCurrentClient; + if (client != null && client.onRemoved(identifier, remaining)) { + removeClient(client); + // When the last biometric of a group is removed, update the authenticator id + int userId = mCurrentUserId; + if (identifier instanceof Fingerprint) { + userId = ((Fingerprint) identifier).getGroupId(); + } + if (!hasEnrolledBiometrics(userId)) { + updateActiveGroup(userId, null); + } + } + } + + /** + * Calls from the Manager. These are still on the calling binder's thread. + */ + + protected void enrollInternal(EnrollClientImpl client, int userId) { + if (hasReachedEnrollmentLimit(userId)) { + return; + } + + // Group ID is arbitrarily set to parent profile user ID. It just represents + // the default biometrics for the user. + if (!isCurrentUserOrProfile(userId)) { + return; + } + + mHandler.post(() -> { + startClient(client, true /* initiatedByClient */); + }); + } + + protected void cancelEnrollmentInternal(IBinder token) { + mHandler.post(() -> { + ClientMonitor client = mCurrentClient; + if (client instanceof EnrollClient && client.getToken() == token) { + client.stop(client.getToken() == token); + } + }); + } + + protected void authenticateInternal(AuthenticationClientImpl client, long opId, + String opPackageName) { + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final int callingUserId = UserHandle.getCallingUserId(); + authenticateInternal(client, opId, opPackageName, callingUid, callingPid, callingUserId); + } + + protected void authenticateInternal(AuthenticationClientImpl client, long opId, + String opPackageName, int callingUid, int callingPid, int callingUserId) { + if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid, + callingUserId)) { + if (DEBUG) Slog.v(getTag(), "authenticate(): reject " + opPackageName); + return; + } + + mHandler.post(() -> { + mMetricsLogger.histogram(getMetrics().tagAuthToken(), opId != 0L ? 1 : 0); + + // Get performance stats object for this user. + HashMap<Integer, PerformanceStats> pmap + = (opId == 0) ? mPerformanceMap : mCryptoPerformanceMap; + PerformanceStats stats = pmap.get(mCurrentUserId); + if (stats == null) { + stats = new PerformanceStats(); + pmap.put(mCurrentUserId, stats); + } + mPerformanceStats = stats; + mIsCrypto = (opId != 0); + + startAuthentication(client, opPackageName); + }); + } + + protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName) { + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + final int callingUserId = UserHandle.getCallingUserId(); + cancelAuthenticationInternal(token, opPackageName, callingUid, callingPid, callingUserId); + } + + protected void cancelAuthenticationInternal(final IBinder token, final String opPackageName, + int callingUid, int callingPid, int callingUserId) { + if (!canUseBiometric(opPackageName, true /* foregroundOnly */, callingUid, callingPid, + callingUserId)) { + if (DEBUG) Slog.v(getTag(), "cancelAuthentication(): reject " + opPackageName); + return; + } + + mHandler.post(() -> { + ClientMonitor client = mCurrentClient; + if (client instanceof AuthenticationClient) { + if (client.getToken() == token) { + if (DEBUG) Slog.v(getTag(), "stop client " + client.getOwnerString()); + client.stop(client.getToken() == token); + } else { + if (DEBUG) Slog.v(getTag(), "can't stop client " + + client.getOwnerString() + " since tokens don't match"); + } + } else if (client != null) { + if (DEBUG) Slog.v(getTag(), "can't cancel non-authenticating client " + + client.getOwnerString()); + } + }); + } + + protected void setActiveUserInternal(int userId) { + mHandler.post(() -> { + updateActiveGroup(userId, null /* clientPackage */); + }); + } + + protected void removeInternal(RemovalClientImpl client) { + mHandler.post(() -> { + startClient(client, true /* initiatedByClient */); + }); + } + + protected void enumerateInternal(EnumerateClientImpl client) { + mHandler.post(() -> { + startClient(client, true /* initiatedByClient */); + }); + } + + // Should be done on a handler thread - not on the Binder's thread. + private void startAuthentication(AuthenticationClientImpl client, String opPackageName) { + updateActiveGroup(client.getGroupId(), opPackageName); + + if (DEBUG) Slog.v(getTag(), "startAuthentication(" + opPackageName + ")"); + + int lockoutMode = getLockoutMode(); + if (lockoutMode != AuthenticationClient.LOCKOUT_NONE) { + Slog.v(getTag(), "In lockout mode(" + lockoutMode + + ") ; disallowing authentication"); + int errorCode = lockoutMode == AuthenticationClient.LOCKOUT_TIMED ? + BiometricConstants.BIOMETRIC_ERROR_LOCKOUT : + BiometricConstants.BIOMETRIC_ERROR_LOCKOUT_PERMANENT; + if (!client.onError(getHalDeviceId(), errorCode, 0 /* vendorCode */)) { + Slog.w(getTag(), "Cannot send permanent lockout message to client"); + } + return; + } + startClient(client, true /* initiatedByClient */); + } + + protected void addLockoutResetCallback(IBiometricServiceLockoutResetCallback callback) { + mHandler.post(() -> { + final LockoutResetMonitor monitor = new LockoutResetMonitor(callback); + if (!mLockoutMonitors.contains(monitor)) { + mLockoutMonitors.add(monitor); + } + }); + } + + /** + * Helper methods. + */ + + /** + * @param opPackageName name of package for caller + * @param requireForeground only allow this call while app is in the foreground + * @return true if caller can use the biometric API + */ + protected boolean canUseBiometric(String opPackageName, boolean requireForeground, int uid, + int pid, int userId) { + checkUseBiometricPermission(); + + if (isKeyguard(opPackageName)) { + return true; // Keyguard is always allowed + } + if (!isCurrentUserOrProfile(userId)) { + Slog.w(getTag(), "Rejecting " + opPackageName + "; not a current user or profile"); + return false; + } + if (mAppOps.noteOp(getAppOp(), uid, opPackageName) != AppOpsManager.MODE_ALLOWED) { + Slog.w(getTag(), "Rejecting " + opPackageName + "; permission denied"); + return false; + } + if (requireForeground && !(isForegroundActivity(uid, pid) || isCurrentClient( + opPackageName))) { + Slog.w(getTag(), "Rejecting " + opPackageName + "; not in foreground"); + return false; + } + return true; + } + + /** + * @param opPackageName package of the caller + * @return true if this is the same client currently using the biometric + */ + private boolean isCurrentClient(String opPackageName) { + return mCurrentClient != null && mCurrentClient.getOwnerString().equals(opPackageName); + } + + /** + * @return true if this is keyguard package + */ + private boolean isKeyguard(String clientPackage) { + return mKeyguardPackage.equals(clientPackage); + } + + protected int getLockoutMode() { + final int currentUser = ActivityManager.getCurrentUser(); + final int failedAttempts = mFailedAttempts.get(currentUser, 0); + if (failedAttempts >= getFailedAttemptsLockoutPermanent()) { + return AuthenticationClient.LOCKOUT_PERMANENT; + } else if (failedAttempts > 0 && + mTimedLockoutCleared.get(currentUser, false) == false + && (failedAttempts % getFailedAttemptsLockoutTimed() == 0)) { + return AuthenticationClient.LOCKOUT_TIMED; + } + return AuthenticationClient.LOCKOUT_NONE; + } + + private boolean isForegroundActivity(int uid, int pid) { + try { + List<ActivityManager.RunningAppProcessInfo> procs = + ActivityManager.getService().getRunningAppProcesses(); + int N = procs.size(); + for (int i = 0; i < N; i++) { + ActivityManager.RunningAppProcessInfo proc = procs.get(i); + if (proc.pid == pid && proc.uid == uid + && proc.importance <= IMPORTANCE_FOREGROUND_SERVICE) { + return true; + } + } + } catch (RemoteException e) { + Slog.w(getTag(), "am.getRunningAppProcesses() failed"); + } + return false; + } + + /** + * Calls the HAL to switch states to the new task. If there's already a current task, + * it calls cancel() and sets mPendingClient to begin when the current task finishes + * ({@link BiometricConstants#BIOMETRIC_ERROR_CANCELED}). + * + * @param newClient the new client that wants to connect + * @param initiatedByClient true for authenticate, remove and enroll + */ + private void startClient(ClientMonitor newClient, boolean initiatedByClient) { + ClientMonitor currentClient = mCurrentClient; + if (currentClient != null) { + if (DEBUG) Slog.v(getTag(), "request stop current client " + + currentClient.getOwnerString()); + + // This check only matters for FingerprintService, since enumerate may call back + // multiple times. + if (currentClient instanceof FingerprintService.EnumerateClientImpl || + currentClient instanceof FingerprintService.RemovalClientImpl) { + // This condition means we're currently running internal diagnostics to + // remove extra fingerprints in the hardware and/or the software + // TODO: design an escape hatch in case client never finishes + if (newClient != null) { + Slog.w(getTag(), "Internal cleanup in progress but trying to start client " + + newClient.getClass().getSuperclass().getSimpleName() + + "(" + newClient.getOwnerString() + ")" + + ", initiatedByClient = " + initiatedByClient); + } + } else { + currentClient.stop(initiatedByClient); + } + mPendingClient = newClient; + mHandler.removeCallbacks(mResetClientState); + mHandler.postDelayed(mResetClientState, CANCEL_TIMEOUT_LIMIT); + } else if (newClient != null) { + mCurrentClient = newClient; + if (DEBUG) Slog.v(getTag(), "starting client " + + newClient.getClass().getSuperclass().getSimpleName() + + "(" + newClient.getOwnerString() + ")" + + ", initiatedByClient = " + initiatedByClient); + notifyClientActiveCallbacks(true); + + newClient.start(); + } + } + + protected void removeClient(ClientMonitor client) { + if (client != null) { + client.destroy(); + if (client != mCurrentClient && mCurrentClient != null) { + Slog.w(getTag(), "Unexpected client: " + client.getOwnerString() + "expected: " + + mCurrentClient.getOwnerString()); + } + } + if (mCurrentClient != null) { + if (DEBUG) Slog.v(getTag(), "Done with client: " + client.getOwnerString()); + mCurrentClient = null; + } + if (mPendingClient == null) { + notifyClientActiveCallbacks(false); + } + } + + /** + * Populates existing authenticator ids. To be used only during the start of the service. + */ + protected void loadAuthenticatorIds() { + // This operation can be expensive, so keep track of the elapsed time. Might need to move to + // background if it takes too long. + long t = System.currentTimeMillis(); + mAuthenticatorIds.clear(); + for (UserInfo user : UserManager.get(getContext()).getUsers(true /* excludeDying */)) { + int userId = getUserOrWorkProfileId(null, user.id); + if (!mAuthenticatorIds.containsKey(userId)) { + updateActiveGroup(userId, null); + } + } + + t = System.currentTimeMillis() - t; + if (t > 1000) { + Slog.w(getTag(), "loadAuthenticatorIds() taking too long: " + t + "ms"); + } + } + + /** + * @param clientPackage the package of the caller + * @return the profile id + */ + protected int getUserOrWorkProfileId(String clientPackage, int userId) { + if (!isKeyguard(clientPackage) && isWorkProfile(userId)) { + return userId; + } + return getEffectiveUserId(userId); + } + + protected boolean isRestricted() { + // Only give privileged apps (like Settings) access to biometric info + final boolean restricted = !hasPermission(getManageBiometricPermission()); + return restricted; + } + + protected boolean hasPermission(String permission) { + return getContext().checkCallingOrSelfPermission(permission) + == PackageManager.PERMISSION_GRANTED; + } + + protected void checkPermission(String permission) { + getContext().enforceCallingOrSelfPermission(permission, + "Must have " + permission + " permission."); + } + + protected boolean isCurrentUserOrProfile(int userId) { + UserManager um = UserManager.get(mContext); + if (um == null) { + Slog.e(getTag(), "Unable to acquire UserManager"); + return false; + } + + final long token = Binder.clearCallingIdentity(); + try { + // Allow current user or profiles of the current user... + for (int profileId : um.getEnabledProfileIds(ActivityManager.getCurrentUser())) { + if (profileId == userId) { + return true; + } + } + } finally { + Binder.restoreCallingIdentity(token); + } + + return false; + } + + /*** + * @param opPackageName the name of the calling package + * @return authenticator id for the calling user + */ + protected long getAuthenticatorId(String opPackageName) { + final int userId = getUserOrWorkProfileId(opPackageName, UserHandle.getCallingUserId()); + return mAuthenticatorIds.getOrDefault(userId, 0L); + } + + private void scheduleLockoutResetForUser(int userId) { + mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, + SystemClock.elapsedRealtime() + FAIL_LOCKOUT_TIMEOUT_MS, + getLockoutResetIntentForUser(userId)); + } + + private PendingIntent getLockoutResetIntentForUser(int userId) { + return PendingIntent.getBroadcast(mContext, userId, + new Intent(getLockoutResetIntent()).putExtra(KEY_LOCKOUT_RESET_USER, userId), + PendingIntent.FLAG_UPDATE_CURRENT); + } + + private void userActivity() { + long now = SystemClock.uptimeMillis(); + mPowerManager.userActivity(now, PowerManager.USER_ACTIVITY_EVENT_TOUCH, 0); + } + + /** + * @param userId + * @return true if this is a work profile + */ + private boolean isWorkProfile(int userId) { + UserInfo userInfo = null; + final long token = Binder.clearCallingIdentity(); + try { + userInfo = mUserManager.getUserInfo(userId); + } finally { + Binder.restoreCallingIdentity(token); + } + return userInfo != null && userInfo.isManagedProfile(); + } + + + private int getEffectiveUserId(int userId) { + UserManager um = UserManager.get(mContext); + if (um != null) { + final long callingIdentity = Binder.clearCallingIdentity(); + userId = um.getCredentialOwnerProfile(userId); + Binder.restoreCallingIdentity(callingIdentity); + } else { + Slog.e(getTag(), "Unable to acquire UserManager"); + } + return userId; + } + + // Attempt counter should only be cleared when Keyguard goes away or when + // a biometric is successfully authenticated. + private void resetFailedAttemptsForUser(boolean clearAttemptCounter, int userId) { + if (DEBUG && getLockoutMode() != AuthenticationClient.LOCKOUT_NONE) { + Slog.v(getTag(), "Reset biometric lockout, clearAttemptCounter=" + clearAttemptCounter); + } + if (clearAttemptCounter) { + mFailedAttempts.put(userId, 0); + } + mTimedLockoutCleared.put(userId, true); + // If we're asked to reset failed attempts externally (i.e. from Keyguard), + // the alarm might still be pending; remove it. + cancelLockoutResetForUser(userId); + notifyLockoutResetMonitors(); + } + + private void cancelLockoutResetForUser(int userId) { + mAlarmManager.cancel(getLockoutResetIntentForUser(userId)); + } + + private void listenForUserSwitches() { + try { + ActivityManager.getService().registerUserSwitchObserver( + new SynchronousUserSwitchObserver() { + @Override + public void onUserSwitching(int newUserId) throws RemoteException { + mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */) + .sendToTarget(); + } + }, getTag()); + } catch (RemoteException e) { + Slog.w(getTag(), "Failed to listen for user switching event" ,e); + } + } + + private void notifyLockoutResetMonitors() { + for (int i = 0; i < mLockoutMonitors.size(); i++) { + mLockoutMonitors.get(i).sendLockoutReset(); + } + } + + private void removeLockoutResetCallback( + LockoutResetMonitor monitor) { + mLockoutMonitors.remove(monitor); + } +} diff --git a/services/core/java/com/android/server/biometrics/ClientMonitor.java b/services/core/java/com/android/server/biometrics/ClientMonitor.java index 408e26ab0efb..d1daad583fff 100644 --- a/services/core/java/com/android/server/biometrics/ClientMonitor.java +++ b/services/core/java/com/android/server/biometrics/ClientMonitor.java @@ -38,7 +38,7 @@ import java.util.NoSuchElementException; */ public abstract class ClientMonitor implements IBinder.DeathRecipient { protected static final int ERROR_ESRCH = 3; // Likely HAL is dead. See errno.h. - protected static final boolean DEBUG = BiometricService.DEBUG; + protected static final boolean DEBUG = BiometricServiceBase.DEBUG; private static final AudioAttributes FINGERPRINT_SONFICATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) @@ -54,10 +54,10 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { private final String mOwner; private final VibrationEffect mSuccessVibrationEffect; private final VibrationEffect mErrorVibrationEffect; - private final BiometricService.DaemonWrapper mDaemon; + private final BiometricServiceBase.DaemonWrapper mDaemon; private IBinder mToken; - private BiometricService.ServiceListener mListener; + private BiometricServiceBase.ServiceListener mListener; protected final MetricsLogger mMetricsLogger; protected final Metrics mMetrics; @@ -76,9 +76,10 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { * permission * @param owner name of the client that owns this */ - public ClientMonitor(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon, - long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int userId, - int groupId, boolean restricted, String owner) { + public ClientMonitor(Context context, Metrics metrics, + BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, + BiometricServiceBase.ServiceListener listener, int userId, int groupId, + boolean restricted, String owner) { mContext = context; mMetrics = metrics; mDaemon = daemon; @@ -221,11 +222,11 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { return mOwner; } - public final BiometricService.ServiceListener getListener() { + public final BiometricServiceBase.ServiceListener getListener() { return mListener; } - public final BiometricService.DaemonWrapper getDaemonWrapper() { + public final BiometricServiceBase.DaemonWrapper getDaemonWrapper() { return mDaemon; } diff --git a/services/core/java/com/android/server/biometrics/EnrollClient.java b/services/core/java/com/android/server/biometrics/EnrollClient.java index 7d186a925984..76dc5a91bdbe 100644 --- a/services/core/java/com/android/server/biometrics/EnrollClient.java +++ b/services/core/java/com/android/server/biometrics/EnrollClient.java @@ -35,10 +35,10 @@ public abstract class EnrollClient extends ClientMonitor { private final byte[] mCryptoToken; private final BiometricUtils mBiometricUtils; - public EnrollClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon, - long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int userId, - int groupId, byte[] cryptoToken, boolean restricted, String owner, - BiometricUtils utils) { + public EnrollClient(Context context, Metrics metrics, + BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, + BiometricServiceBase.ServiceListener listener, int userId, int groupId, + byte[] cryptoToken, boolean restricted, String owner, BiometricUtils utils) { super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted, owner); mBiometricUtils = utils; diff --git a/services/core/java/com/android/server/biometrics/EnumerateClient.java b/services/core/java/com/android/server/biometrics/EnumerateClient.java index 159d95edf869..47dc7ffda456 100644 --- a/services/core/java/com/android/server/biometrics/EnumerateClient.java +++ b/services/core/java/com/android/server/biometrics/EnumerateClient.java @@ -29,9 +29,10 @@ import java.util.ArrayList; * A class to keep track of the enumeration state for a given client. */ public abstract class EnumerateClient extends ClientMonitor { - public EnumerateClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon, - long halDeviceId, IBinder token, BiometricService.ServiceListener listener, int groupId, - int userId, boolean restricted, String owner) { + public EnumerateClient(Context context, Metrics metrics, + BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, + BiometricServiceBase.ServiceListener listener, int groupId, int userId, + boolean restricted, String owner) { super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted, owner); } diff --git a/services/core/java/com/android/server/biometrics/RemovalClient.java b/services/core/java/com/android/server/biometrics/RemovalClient.java index 1995b9c313d4..15b3773314bf 100644 --- a/services/core/java/com/android/server/biometrics/RemovalClient.java +++ b/services/core/java/com/android/server/biometrics/RemovalClient.java @@ -32,10 +32,10 @@ public abstract class RemovalClient extends ClientMonitor { private final int mBiometricId; private final BiometricUtils mBiometricUtils; - public RemovalClient(Context context, Metrics metrics, BiometricService.DaemonWrapper daemon, - long halDeviceId, IBinder token, BiometricService.ServiceListener listener, - int biometricId, int groupId, int userId, boolean restricted, String owner, - BiometricUtils utils) { + public RemovalClient(Context context, Metrics metrics, + BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, + BiometricServiceBase.ServiceListener listener, int biometricId, int groupId, int userId, + boolean restricted, String owner, BiometricUtils utils) { super(context, metrics, daemon, halDeviceId, token, listener, userId, groupId, restricted, owner); mBiometricId = biometricId; diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 376eabc92875..75cdcf07fa22 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -28,7 +28,7 @@ import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; +import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.biometrics.face.V1_0.IBiometricsFace; import android.hardware.biometrics.face.V1_0.IBiometricsFaceClientCallback; @@ -52,7 +52,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.DumpUtils; import com.android.server.SystemServerInitThreadPool; -import com.android.server.biometrics.BiometricService; +import com.android.server.biometrics.BiometricServiceBase; import com.android.server.biometrics.BiometricUtils; import com.android.server.biometrics.Metrics; @@ -73,7 +73,7 @@ import java.util.List; * * @hide */ -public class FaceService extends BiometricService { +public class FaceService extends BiometricServiceBase { protected static final String TAG = "FaceService"; private static final boolean DEBUG = true; @@ -167,7 +167,7 @@ public class FaceService extends BiometricService { @Override // Binder call public void authenticateFromService(boolean requireConfirmation, IBinder token, long opId, - int groupId, IBiometricPromptServiceReceiver receiver, int flags, + int groupId, IBiometricServiceReceiver receiver, int flags, String opPackageName, Bundle bundle, IBiometricPromptReceiver dialogReceiver, int callingUid, int callingPid, int callingUserId) { checkPermission(USE_BIOMETRIC_INTERNAL); @@ -353,10 +353,10 @@ public class FaceService extends BiometricService { */ private class BiometricPromptServiceListenerImpl implements ServiceListener { - private IBiometricPromptServiceReceiver mBiometricPromptServiceReceiver; + private IBiometricServiceReceiver mBiometricServiceReceiver; - public BiometricPromptServiceListenerImpl(IBiometricPromptServiceReceiver receiver) { - mBiometricPromptServiceReceiver = receiver; + public BiometricPromptServiceListenerImpl(IBiometricServiceReceiver receiver) { + mBiometricServiceReceiver = receiver; } @Override @@ -365,8 +365,8 @@ public class FaceService extends BiometricService { /** * Map the acquired codes onto existing {@link BiometricConstants} acquired codes. */ - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAcquired(deviceId, + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAcquired(deviceId, FaceManager.getMappedAcquiredInfo(acquiredInfo, vendorCode), FaceManager.getAcquiredString(getContext(), acquiredInfo, vendorCode)); } @@ -375,22 +375,22 @@ public class FaceService extends BiometricService { @Override public void onAuthenticationSucceeded(long deviceId, BiometricAuthenticator.Identifier biometric, int userId) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAuthenticationSucceeded(deviceId); + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAuthenticationSucceeded(deviceId); } } @Override public void onAuthenticationFailed(long deviceId) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAuthenticationFailed(deviceId); + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAuthenticationFailed(deviceId); } } @Override public void onError(long deviceId, int error, int vendorCode) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onError(deviceId, error, + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onError(deviceId, error, FaceManager.getErrorString(getContext(), error, vendorCode)); } } diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java index 1852aa84d817..d3ae0642221e 100644 --- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java @@ -31,7 +31,7 @@ import android.content.pm.UserInfo; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.IBiometricPromptReceiver; -import android.hardware.biometrics.IBiometricPromptServiceReceiver; +import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.IBiometricServiceLockoutResetCallback; import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint; import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprintClientCallback; @@ -59,7 +59,7 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.internal.util.DumpUtils; import com.android.server.SystemServerInitThreadPool; import com.android.server.biometrics.AuthenticationClient; -import com.android.server.biometrics.BiometricService; +import com.android.server.biometrics.BiometricServiceBase; import com.android.server.biometrics.BiometricUtils; import com.android.server.biometrics.ClientMonitor; import com.android.server.biometrics.EnumerateClient; @@ -84,7 +84,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * * @hide */ -public class FingerprintService extends BiometricService { +public class FingerprintService extends BiometricServiceBase { protected static final String TAG = "FingerprintService"; private static final boolean DEBUG = true; @@ -189,7 +189,7 @@ public class FingerprintService extends BiometricService { @Override // Binder call public void authenticateFromService(IBinder token, long opId, int groupId, - IBiometricPromptServiceReceiver receiver, int flags, String opPackageName, + IBiometricServiceReceiver receiver, int flags, String opPackageName, Bundle bundle, IBiometricPromptReceiver dialogReceiver, int callingUid, int callingPid, int callingUserId) { checkPermission(MANAGE_BIOMETRIC); @@ -390,17 +390,17 @@ public class FingerprintService extends BiometricService { */ private class BiometricPromptServiceListenerImpl implements ServiceListener { - private IBiometricPromptServiceReceiver mBiometricPromptServiceReceiver; + private IBiometricServiceReceiver mBiometricServiceReceiver; - public BiometricPromptServiceListenerImpl(IBiometricPromptServiceReceiver receiver) { - mBiometricPromptServiceReceiver = receiver; + public BiometricPromptServiceListenerImpl(IBiometricServiceReceiver receiver) { + mBiometricServiceReceiver = receiver; } @Override public void onAcquired(long deviceId, int acquiredInfo, int vendorCode) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAcquired(deviceId, acquiredInfo, + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAcquired(deviceId, acquiredInfo, FingerprintManager.getAcquiredString( getContext(), acquiredInfo, vendorCode)); } @@ -409,22 +409,22 @@ public class FingerprintService extends BiometricService { @Override public void onAuthenticationSucceeded(long deviceId, BiometricAuthenticator.Identifier biometric, int userId) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAuthenticationSucceeded(deviceId); + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAuthenticationSucceeded(deviceId); } } @Override public void onAuthenticationFailed(long deviceId) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onAuthenticationFailed(deviceId); + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onAuthenticationFailed(deviceId); } } @Override public void onError(long deviceId, int error, int vendorCode) throws RemoteException { - if (mBiometricPromptServiceReceiver != null) { - mBiometricPromptServiceReceiver.onError(deviceId, error, + if (mBiometricServiceReceiver != null) { + mBiometricServiceReceiver.onError(deviceId, error, FingerprintManager.getErrorString(getContext(), error, vendorCode)); } } @@ -514,7 +514,7 @@ public class FingerprintService extends BiometricService { /** * An internal class to help clean up unknown fingerprints in the hardware and software. */ - private final class InternalEnumerateClient extends BiometricService.EnumerateClientImpl { + private final class InternalEnumerateClient extends BiometricServiceBase.EnumerateClientImpl { private List<Fingerprint> mEnrolledList; private List<Fingerprint> mUnknownFingerprints = new ArrayList<>(); // list of fp to delete @@ -577,7 +577,7 @@ public class FingerprintService extends BiometricService { /** * An internal class to help clean up unknown fingerprints in hardware and software. */ - private final class InternalRemovalClient extends BiometricService.RemovalClientImpl { + private final class InternalRemovalClient extends BiometricServiceBase.RemovalClientImpl { public InternalRemovalClient(Context context, DaemonWrapper daemon, long halDeviceId, IBinder token, ServiceListener listener, int fingerId, int groupId, int userId, boolean restricted, diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 524ca170336f..7d2fc15a28c5 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -30,7 +30,6 @@ import android.os.IBinder; import android.os.SystemClock; import android.service.voice.IVoiceInteractionSession; import android.util.SparseIntArray; -import android.view.RemoteAnimationAdapter; import com.android.internal.app.IVoiceInteractor; import com.android.server.am.WindowProcessController; @@ -289,4 +288,13 @@ public abstract class ActivityTaskManagerInternal { public abstract void onPackageAdded(String name, boolean replacing); public abstract CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai); + + /** + * Set the corresponding display information for the process global configuration. To be called + * when we need to show IME on a different display. + * + * @param pid The process id associated with the IME window. + * @param displayId The ID of the display showing the IME. + */ + public abstract void onImeWindowSetOnDisplay(int pid, int displayId); } diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 57cae399b01f..27b623bc0ec3 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -19,6 +19,7 @@ package com.android.server.wm; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ClipData; +import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.Region; import android.hardware.display.DisplayManagerInternal; @@ -456,4 +457,11 @@ public abstract class WindowManagerInternal { * Return the display Id for given window. */ public abstract int getDisplayIdForWindow(IBinder windowToken); + + // TODO: use WindowProcessController once go/wm-unified is done. + /** + * Notifies the window manager that configuration of the process associated with the input pid + * changed. + */ + public abstract void onProcessConfigurationChanged(int pid, Configuration newConfig); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 71ce1d9e2ea7..017f667756bc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -182,6 +182,7 @@ import android.util.Log; import android.util.MergedConfiguration; import android.util.Pair; import android.util.Slog; +import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.TimeUtils; @@ -480,6 +481,10 @@ public class WindowManagerService extends IWindowManager.Stub */ WindowState[] mPendingRemoveTmp = new WindowState[20]; + // TODO: use WindowProcessController once go/wm-unified is done. + /** Mapping of process pids to configurations */ + final SparseArray<Configuration> mProcessConfigurations = new SparseArray<>(); + /** * Windows whose surface should be destroyed. */ @@ -7430,6 +7435,19 @@ public class WindowManagerService extends IWindowManager.Stub return Display.INVALID_DISPLAY; } } + + @Override + public void onProcessConfigurationChanged(int pid, Configuration newConfig) { + synchronized (mWindowMap) { + Configuration currentConfig = mProcessConfigurations.get(pid); + if (currentConfig == null) { + currentConfig = new Configuration(newConfig); + } else { + currentConfig.setTo(newConfig); + } + mProcessConfigurations.put(pid, currentConfig); + } + } } void registerAppFreezeListener(AppFreezeListener listener) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 69ff815c7c6d..7161a70b08fe 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -304,6 +304,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP */ private final MergedConfiguration mLastReportedConfiguration = new MergedConfiguration(); + private final Configuration mTempConfiguration = new Configuration(); + /** * The last content insets returned to the client in relayout. We use * these in the bounds animation to ensure we only observe inset changes @@ -2250,8 +2252,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + private Configuration getProcessGlobalConfiguration() { + // For child windows we want to use the pid for the parent window in case the the child + // window was added from another process. + final int pid = isChildWindow() ? getParentWindow().mSession.mPid : mSession.mPid; + mTempConfiguration.setTo(mService.mProcessConfigurations.get( + pid, mService.mRoot.getConfiguration())); + return mTempConfiguration; + } + void getMergedConfiguration(MergedConfiguration outConfiguration) { - final Configuration globalConfig = mService.mRoot.getConfiguration(); + final Configuration globalConfig = getProcessGlobalConfiguration(); final Configuration overrideConfig = getMergedOverrideConfiguration(); outConfiguration.setConfiguration(globalConfig, overrideConfig); } @@ -2854,7 +2865,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mAppToken.mFrozenMergedConfig.peek(); } - return super.getConfiguration(); + // We use the process config this window is associated with as the based global config since + // the process can override it config, but isn't part of the window hierarchy. + final Configuration config = getProcessGlobalConfiguration(); + config.updateFrom(getMergedOverrideConfiguration()); + return config; } void reportResized() { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 9d63305b5858..fb95f5972cbb 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -63,11 +63,10 @@ import com.android.internal.os.BinderInternal; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.EmergencyAffordanceManager; import com.android.internal.widget.ILockSettings; -import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.am.ActivityManagerService; import com.android.server.am.ActivityTaskManagerService; import com.android.server.audio.AudioService; -import com.android.server.biometrics.BiometricPromptService; +import com.android.server.biometrics.BiometricService; import com.android.server.broadcastradio.BroadcastRadioService; import com.android.server.camera.CameraServiceProxy; import com.android.server.clipboard.ClipboardService; @@ -1590,7 +1589,7 @@ public final class SystemServer { if (hasFeatureFace || hasFeatureFingerprint) { // Start this service after all biometric services. traceBeginAndSlog("StartBiometricPromptService"); - mSystemServiceManager.startService(BiometricPromptService.class); + mSystemServiceManager.startService(BiometricService.class); traceEnd(); } diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java index 47ce8796e449..c44e492e308b 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -258,7 +258,7 @@ public class ActivityManagerServiceTest { uidRec.hasInternetPermission = true; mAms.mActiveUids.put(uid, uidRec); - final ProcessRecord appRec = new ProcessRecord(mAms, new ApplicationInfo(), TAG, uid); + final ProcessRecord appRec = new ProcessRecord(mAms, new ApplicationInfo(), TAG, uid, null); appRec.thread = Mockito.mock(IApplicationThread.class); mAms.mLruProcesses.add(appRec); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java index e1ebbcf8f653..9192d6b84fee 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStartControllerTests.java @@ -83,7 +83,7 @@ public class ActivityStartControllerTests extends ActivityTestsBase { final WindowProcessController wpc = new WindowProcessController(mService, mService.mContext.getApplicationInfo(), "name", 12345, UserHandle.getUserId(12345), mock(Object.class), - mock(WindowProcessListener.class)); + mock(WindowProcessListener.class), null); wpc.setThread(mock(IApplicationThread.class)); mController.addPendingActivityLaunch( diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java index 749403ea4013..bac4a525b9ea 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java @@ -208,7 +208,7 @@ public class ActivityStarterTests extends ActivityTestsBase { // If no caller app, return {@code null} {@link ProcessRecord}. final ProcessRecord record = containsConditions(preconditions, PRECONDITION_NO_CALLER_APP) - ? null : new ProcessRecord(service.mAm, mock(ApplicationInfo.class), null, 0); + ? null : new ProcessRecord(service.mAm, mock(ApplicationInfo.class), null, 0, null); doReturn(record).when(service.mAm).getRecordForAppLocked(anyObject()); 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 0e8200992a14..22add018f570 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -281,7 +281,7 @@ public class ActivityTestsBase { final WindowProcessController wpc = new WindowProcessController(mService, mService.mContext.getApplicationInfo(), "name", 12345, UserHandle.getUserId(12345), mock(Object.class), - mock(WindowProcessListener.class)); + mock(WindowProcessListener.class), null); wpc.setThread(mock(IApplicationThread.class)); activity.setProcess(wpc); return activity; diff --git a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java index 87d367fcb2b2..3819e2190d88 100644 --- a/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java +++ b/services/tests/servicestests/src/com/android/server/am/AppErrorDialogTest.java @@ -67,7 +67,7 @@ public class AppErrorDialogTest { @UiThreadTest public void testCreateWorks() throws Exception { AppErrorDialog.Data data = new AppErrorDialog.Data(); - data.proc = new ProcessRecord(null, mContext.getApplicationInfo(), "name", 12345); + data.proc = new ProcessRecord(null, mContext.getApplicationInfo(), "name", 12345, null); data.result = new AppErrorResult(); AppErrorDialog dialog = new AppErrorDialog(mContext, mService, data); |