diff options
166 files changed, 3502 insertions, 3461 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index ce7df5ecd794..6fcf0559aec6 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3693,8 +3693,18 @@ package android.media.audiopolicy { package android.media.session { public final class MediaSessionManager { + method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerCallback(@NonNull android.media.session.MediaSessionManager.Callback, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.SET_MEDIA_KEY_LISTENER) public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER) public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, @Nullable android.os.Handler); + method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void unregisterCallback(@NonNull android.media.session.MediaSessionManager.Callback); + } + + public abstract static class MediaSessionManager.Callback { + ctor public MediaSessionManager.Callback(); + method public abstract void onAddressedPlayerChanged(android.media.session.MediaSession.Token); + method public abstract void onAddressedPlayerChanged(android.content.ComponentName); + method public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.media.session.MediaSession.Token); + method public abstract void onMediaKeyEventDispatched(android.view.KeyEvent, android.content.ComponentName); } public static interface MediaSessionManager.OnMediaKeyListener { diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index 141e8e669dac..25d45b0e6570 100644 --- a/config/hiddenapi-greylist-max-p.txt +++ b/config/hiddenapi-greylist-max-p.txt @@ -70,6 +70,8 @@ Lcom/android/internal/R$styleable;->MenuView:[I Lcom/android/internal/R$styleable;->Searchable:[I Lcom/android/internal/R$styleable;->SearchableActionKey:[I Lcom/android/internal/telephony/IPhoneSubInfo$Stub;-><init>()V +Lcom/android/internal/telephony/ITelephony;->getDataActivity()I +Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 1641afb3d65c..f128a2175547 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -722,31 +722,32 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public int getPermissionFlags(String permissionName, String packageName, UserHandle user) { + public int getPermissionFlags(String permName, String packageName, UserHandle user) { try { - return mPM.getPermissionFlags(permissionName, packageName, user.getIdentifier()); + return mPermissionManager + .getPermissionFlags(permName, packageName, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } @Override - public void updatePermissionFlags(String permissionName, String packageName, + public void updatePermissionFlags(String permName, String packageName, int flagMask, int flagValues, UserHandle user) { if (DEBUG_TRACE_GRANTS - && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) { + && shouldTraceGrant(packageName, permName, user.getIdentifier())) { Log.i(TAG, "App " + mContext.getPackageName() + " is updating flags for " - + permissionName + " for user " + user.getIdentifier() + ": " + + permName + " for user " + user.getIdentifier() + ": " + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_", flagMask) + " := " + DebugUtils.flagsToString( PackageManager.class, "FLAG_PERMISSION_", flagValues), new RuntimeException()); } try { - mPM.updatePermissionFlags(permissionName, packageName, flagMask, - flagValues, - mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q, - user.getIdentifier()); + final boolean checkAdjustPolicyFlagPermission = + mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q; + mPermissionManager.updatePermissionFlags(permName, packageName, flagMask, + flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 277e41dc7e01..21e00173a955 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -108,13 +108,6 @@ interface IPackageManager { void resetRuntimePermissions(); - int getPermissionFlags(String permissionName, String packageName, int userId); - - void updatePermissionFlags(String permissionName, String packageName, int flagMask, - int flagValues, boolean checkAdjustPolicyFlagPermission, int userId); - - void updatePermissionFlagsForAllApps(int flagMask, int flagValues, int userId); - List<String> getWhitelistedRestrictedPermissions(String packageName, int flags, int userId); diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 1c1d7095d913..ec7aee9f80c7 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -742,17 +742,6 @@ public abstract class PackageManagerInternal { public abstract boolean filterAppAccess( @Nullable PackageParser.Package pkg, int callingUid, int userId); - /* - * NOTE: The following methods are temporary until permissions are extracted from - * the package manager into a component specifically for handling permissions. - */ - /** Returns the flags for the given permission. */ - public abstract @Nullable int getPermissionFlagsTEMP(@NonNull String permName, - @NonNull String packageName, int userId); - /** Updates the flags for the given permission. */ - public abstract void updatePermissionFlagsTEMP(@NonNull String permName, - @NonNull String packageName, int flagMask, int flagValues, int userId); - /** Returns whether the given package was signed by the platform */ public abstract boolean isPlatformSigned(String pkg); @@ -1006,4 +995,22 @@ public abstract class PackageManagerInternal { * the settings have been written. */ public abstract void writeSettings(boolean async); + + /** + * Writes all permission settings for the given set of users to disk. If {@code async} + * is {@code true}, the settings are written at some point in the future. Otherwise, + * the call blocks until the settings have been written. + */ + public abstract void writePermissionSettings(@NonNull @UserIdInt int[] userIds, boolean async); + + /** + * Returns the target SDK for the given UID. Will return {@code 0} if there is no + * package associated with the UID or if the package has not been installed for + * the user. Will return the highest target SDK if the UID references packages with + * a shared user id. + */ + public abstract int getTargetSdk(int uid); + + /** HACK. Remove when listeners move to the permission manager */ + public abstract void onPermissionsChangedTEMP(int uid); } diff --git a/core/java/android/os/RedactingFileDescriptor.java b/core/java/android/os/RedactingFileDescriptor.java index 4e5eaac3442f..a1ed2146b38e 100644 --- a/core/java/android/os/RedactingFileDescriptor.java +++ b/core/java/android/os/RedactingFileDescriptor.java @@ -35,7 +35,7 @@ import java.util.Arrays; /** * Variant of {@link FileDescriptor} that allows its creator to specify regions - * that should be redacted (appearing as zeros to the reader). + * that should be redacted. * * @hide */ @@ -44,13 +44,16 @@ public class RedactingFileDescriptor { private static final boolean DEBUG = true; private volatile long[] mRedactRanges; + private volatile long[] mFreeOffsets; private FileDescriptor mInner = null; private ParcelFileDescriptor mOuter = null; - private RedactingFileDescriptor(Context context, File file, int mode, long[] redactRanges) + private RedactingFileDescriptor( + Context context, File file, int mode, long[] redactRanges, long[] freeOffsets) throws IOException { mRedactRanges = checkRangesArgument(redactRanges); + mFreeOffsets = freeOffsets; try { try { @@ -88,13 +91,17 @@ public class RedactingFileDescriptor { * * @param file The underlying file to open. * @param mode The {@link ParcelFileDescriptor} mode to open with. - * @param redactRanges List of file offsets that should be redacted, stored + * @param redactRanges List of file ranges that should be redacted, stored * as {@code [start1, end1, start2, end2, ...]}. Start values are * inclusive and end values are exclusive. + * @param freePositions List of file offsets at which the four byte value 'free' should be + * written instead of zeros within parts of the file covered by {@code redactRanges}. + * Non-redacted bytes will not be modified even if covered by a 'free'. This is + * useful for overwriting boxes in ISOBMFF files with padding data. */ public static ParcelFileDescriptor open(Context context, File file, int mode, - long[] redactRanges) throws IOException { - return new RedactingFileDescriptor(context, file, mode, redactRanges).mOuter; + long[] redactRanges, long[] freePositions) throws IOException { + return new RedactingFileDescriptor(context, file, mode, redactRanges, freePositions).mOuter; } /** @@ -169,6 +176,15 @@ public class RedactingFileDescriptor { for (long j = start; j < end; j++) { data[(int) (j - offset)] = 0; } + // Overwrite data at 'free' offsets within the redaction ranges. + for (long freeOffset : mFreeOffsets) { + final long freeEnd = freeOffset + 4; + final long redactFreeStart = Math.max(freeOffset, start); + final long redactFreeEnd = Math.min(freeEnd, end); + for (long j = redactFreeStart; j < redactFreeEnd; j++) { + data[(int) (j - offset)] = (byte) "free".charAt((int) (j - freeOffset)); + } + } } return n; } diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl index 3b69b122ca1d..cd0b1f62264b 100644 --- a/core/java/android/permission/IPermissionManager.aidl +++ b/core/java/android/permission/IPermissionManager.aidl @@ -39,4 +39,11 @@ interface IPermissionManager { boolean addPermission(in PermissionInfo info, boolean async); void removePermission(String name); + + int getPermissionFlags(String permName, String packageName, int userId); + + void updatePermissionFlags(String permName, String packageName, int flagMask, + int flagValues, boolean checkAdjustPolicyFlagPermission, int userId); + + void updatePermissionFlagsForAllApps(int flagMask, int flagValues, int userId); } diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index adf7692adc56..52172cf04362 100644 --- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java +++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java @@ -36,13 +36,16 @@ public class ScreenDecorationsUtils { } // Radius that should be used in case top or bottom aren't defined. - float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius); + float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius) + - resources.getDimension(R.dimen.rounded_corner_radius_adjustment); - float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top); + float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top) + - resources.getDimension(R.dimen.rounded_corner_radius_top_adjustment); if (topRadius == 0f) { topRadius = defaultRadius; } - float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom); + float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom) + - resources.getDimension(R.dimen.rounded_corner_radius_bottom_adjustment); if (bottomRadius == 0f) { bottomRadius = defaultRadius; } diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 74f0e68ca498..7a0d475a7285 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg foon na links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg foon na regs."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kyk asseblief meer reguit na jou toestel."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan nie jou gesig sien nie. Kyk na die foon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisioneer jou gesig direk voor die foon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Hou foon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skryf jou gesig asseblief weer in."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan nie meer gesig herken nie. Probeer weer."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Maak oop met"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Maak oop met %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Maak oop"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Maak <xliff:g id="HOST">%1$s</xliff:g>-skakels oop met"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Maak skakels oop met"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Maak skakels oop met <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Maak <xliff:g id="HOST">%1$s</xliff:g>-skakels oop met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Verleen toegang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redigeer met"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigeer met %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altyd"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Stel om altyd oop te maak"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Net een keer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s steun nie werkprofiel nie"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index af0ed28ca379..11ab44de7fea 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ስልክን ወደ ግራ ያንቀሳቅሱ።"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ስልክን ወደ ቀኝ ያንቀሳቅሱ።"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"የእርስዎን ፊት መመልከት አይችልም። ስልኩ ላይ ይመልከቱ።"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"መልክዎን በቀጥታ ከስልኩ ፊት ያድርጉት።"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"እባክዎ ፊትዎን እንደገና ያስመዝግቡ"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ከእንግዲህ ፊትን ለይቶ ማወቅ አይችልም። እንደገና ይሞክሩ።"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ክፈት በ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"ክፈት በ%1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ክፈት"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን ክፈት ከዚህ ጋር"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"አገናኞችን ክፈት ከዚህ ጋር"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"አገናኞችን ከ <xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ክፈት"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> አገናኞችን ከ <xliff:g id="APPLICATION">%2$s</xliff:g> ጋር ክፈት"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"መዳረሻ ስጥ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ያርትዑ በ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ያርትዑ በ%1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ማሰሺያን አስነሳ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ጥሪ ተቀበል?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ዘወትር"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ሁልጊዜ ክፍት ወደ የሚል ተቀናብሯል"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"አንዴ ብቻ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ቅንብሮች"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s የስራ መገለጫ አይደግፍም"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 603239fc0936..6edc9339008c 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -580,7 +580,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"يُرجى نقل الهاتف إلى اليمين."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"يُرجى نقل الهاتف إلى اليسار."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"يُرجى النظر إلى جهازك مباشرة أكثر."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"يتعذّر رؤية وجهك. يُرجى النظر إلى الهاتف."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ضع وجهك أمام الهاتف مباشرة."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حركة أكثر من اللازم يُرجى حمل بدون حركة."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"يُرجى إعادة تسجيل وجهك."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى."</string> @@ -1211,14 +1211,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"فتح باستخدام"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"فتح باستخدام %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"فتح"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"فتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"فتح الروابط باستخدام"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"فتح الروابط باستخدام <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"فتح روابط <xliff:g id="HOST">%1$s</xliff:g> باستخدام <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"منح إذن الوصول"</string> <string name="whichEditApplication" msgid="144727838241402655">"تعديل باستخدام"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"تعديل باستخدام %1$s"</string> @@ -1682,8 +1678,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"دومًا"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ضبط على الفتح دائمًا"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"مرة واحدة فقط"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"الإعدادات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"لا يدعم %1$s الملفات الشخصية للعمل"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index b126468c3869..36604039d884 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফ’নটো বাওঁফালে নিয়ক।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফ’নটো সোঁফালে নিয়ক।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপোনাৰ মুখমণ্ডল দেখা নাই। ফ’নটোলৈ চাওক।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপোনাৰ মুখখন পোনপটীয়াকৈ ফ’নটোৰ সন্মুখত ৰাখক।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"মুখমণ্ডল আৰু চিনাক্ত কৰিব নোৱাৰি। আকৌ চেষ্টা কৰক।"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ইয়াৰ জৰিয়তে খোলক"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sৰ জৰিয়তে খোলক"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"খোলক"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> লিংকসমূহ ইয়াৰ জৰিয়তে খোলক"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"লিংকসমূহ ইয়াৰ জৰিয়তে খোলক"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"লিংকসমূহ <xliff:g id="APPLICATION">%1$s</xliff:g>ৰ জৰিয়তে খোলক"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> লিংকসমূহ <xliff:g id="APPLICATION">%2$s</xliff:g>ৰ জৰিয়তে খোলক"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"এক্সেছ দিয়ক"</string> <string name="whichEditApplication" msgid="144727838241402655">"ইয়াৰ দ্বাৰা সম্পাদনা কৰক"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sৰদ্বাৰা সম্পাদনা কৰক"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ব্ৰাউজাৰ লঞ্চ কৰিবনে?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"কল স্বীকাৰ কৰিবনে?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"সদায়"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"সদায় খোলক-লৈ ছেট কৰক"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"মাত্ৰ এবাৰ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ছেটিংসমূহ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sএ কৰ্মস্থানৰ প্ৰ\'ফাইল সমৰ্থন নকৰে।"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index f372fec14a44..e2b399850af7 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hərəkət etdirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hərəkət etdirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Birbaşa cihaza baxın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Üzünüz görünmür. Telefona baxın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Üzünüzü telefonun qarşısında sabit saxlayın."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Cihaz stabil deyil. Telefonu tərpətməyin."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Üzünüzü yenidən qeydiyyatdan keçirin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Üzü artıq tanımaq olmur. Yenidən cəhd edin."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Bununla açın"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ilə açın"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Açın"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> linklərini belə açın:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Linkləri belə açın:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Linkləri <xliff:g id="APPLICATION">%1$s</xliff:g> ilə açın"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> linklərini <xliff:g id="APPLICATION">%2$s</xliff:g> ilə açın"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"İcazə verin"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bununla düzəliş edin:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ilə düzəliş edin"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Zəngi qəbul edək?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Həmişə"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\"Həmişə açıq\" olaraq ayarlayın"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Sadəcə bir dəfə"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s iş profilini dəstəkləmir"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index b4faae72fa2b..821b73039c89 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomerite telefon ulevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte pravo u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mnogo se pomerate. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrujte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Više ne može da se prepozna lice. Probajte ponovo."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvorite pomoću"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvorite pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvarajte <xliff:g id="HOST">%1$s</xliff:g> linkove pomoću"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otvaratej linkove pomoću"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otvarajte linkove pomoću aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvarajte <xliff:g id="HOST">%1$s</xliff:g> linkove pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Izmenite pomoću"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Izmenite pomoću aplikacije %1$s"</string> @@ -1613,8 +1609,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Želite li da pokrenete pregledač?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Želite li da prihvatite poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvek"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Podesi na „uvek otvaraj“"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Podešavanja"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 996a02b13350..d5732028981e 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Перамясціце тэлефон улева."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Перамясціце тэлефон управа."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Глядзіце прама на экран прылады."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не відаць твару. Глядзіце на тэлефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Трымайце тэлефон прама перад тварам."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Трымайце прыладу нерухома. Трымайце тэлефон роўна."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Паўтарыце рэгістрацыю твару."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не ўдаецца распазнаць твар. Паўтарыце спробу."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Адкрыць з дапамогай"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Адкрыць з дапамогай %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Адкрыць"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Адкрываць спасылкі <xliff:g id="HOST">%1$s</xliff:g> з дапамогай"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Адкрываць спасылкі з дапамогай"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Адкрываць спасылкі з дапамогай праграмы \"<xliff:g id="APPLICATION">%1$s</xliff:g>\""</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Адкрываць спасылкі <xliff:g id="HOST">%1$s</xliff:g>з дапамогай праграмы \"<xliff:g id="APPLICATION">%2$s</xliff:g>\""</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даць доступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Рэдагаваць з дапамогай"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Рэдагаваць з дапамогай %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запусцiць браўзер?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прыняць выклік?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Заўсёды"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Прызначыць стандартна для адкрыцця"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Толькі адзін раз"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налады"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не падтрымлівае працоўны профіль"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e4e1e808ae48..e073b7d9948b 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Преместете телефона наляво."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Преместете телефона надясно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Моля, гледайте точно към устройството си."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Лицето ви не се вижда. Погледнете към телефона."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Позиционирайте лицето си директно пред телефона."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Твърде много движение. Дръжте телефона неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Моля, регистрирайте лицето си отново."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Лицето не бе разпознато. Опитайте отново."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отваряне чрез"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отваряне чрез %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отваряне"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> посредством"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Отваряне на връзките посредством"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Отваряне на връзките посредством <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Отваряне на връзките от <xliff:g id="HOST">%1$s</xliff:g> посредством <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Даване на достъп"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редактиране чрез"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактиране чрез %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Винаги"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Задаване винаги да се отваря"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само веднъж"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддържа служебен потребителски профил"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index ca4d12237544..368ff90b5368 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফোনটি বাঁদিকে সরান।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফোনটি ডানদিকে সরান।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"সরাসরি ডিভাইসের দিকে তাকান।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপনার মুখ দেখা যাচ্ছে না। ফোনের দিকে তাকান।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপনার মুখ সরাসরি ফোনের সামনে রাখুন।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপনার মুখের ছবি আবার নথিভুক্ত করুন।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"আর মুখ চিনতে পারবেন না। আবার চেষ্টা করুন।"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"এর মাধ্যমে খুলুন"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s দিয়ে খুলুন"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"খুলুন"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"এই ব্রাউজারে <xliff:g id="HOST">%1$s</xliff:g> লিঙ্কটি খুলুন"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"এই ব্রাউজারে লিঙ্কটি খুলুন"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g>-এ লিঙ্ক খুলুন"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g>-এ <xliff:g id="HOST">%1$s</xliff:g> লিঙ্কটি খুলুন"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"অ্যাক্সেস দিন"</string> <string name="whichEditApplication" msgid="144727838241402655">"এর মাধ্যমে সম্পাদনা করুন"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s দিয়ে সম্পাদনা করুন"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ব্রাউজার লঞ্চ করতে চান?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"কল গ্রহণ করবেন?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"সবসময়"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\'সবসময় খোলা থাকবে\' হিসেবে সেট করুন"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"শুধু একবার"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"সেটিংস"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s কর্মস্থলের প্রোফাইল সমর্থন করে না।"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index fd441287bb39..ce852b6a01dd 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -127,7 +127,7 @@ <item msgid="3910386316304772394">"Da biste pozivali i slali poruke koristeći WiFi mrežu, prvo zatražite od operatera da postavi tu uslugu. Zatim ponovo uključite pozivanje putem WiFi-ja u Postavkama. (Kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <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> + <item msgid="7372514042696663278">"Došlo je do problema prilikom registracije pozivanja putem WiFi mreže kod vašeg mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <!-- no translation found for wfcSpnFormat_spn (4998685024207291232) --> <skip /> @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomjerite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomjerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte direktno u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše pokreta. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nije više moguće prepoznati lice. Pokušajte opet."</string> @@ -802,7 +802,7 @@ <string name="quick_contacts_not_available" msgid="746098007828579688">"Nije pronađena aplikacija za pregled ovog kontakta."</string> <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"Unesite PIN"</string> <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"Unesite PUK i novi PIN"</string> - <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK"</string> + <string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK kôd"</string> <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"Novi PIN"</string> <string name="keyguard_password_entry_touch_hint" msgid="2644215452200037944"><font size="17">"Dodirnite za unos lozinke"</font></string> <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Unesite lozinku za otključavanje tipkovnice"</string> @@ -894,7 +894,7 @@ <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje pinom."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="9149698847116962307">"Otključavanje Pin-om za Sim."</string> - <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje Puk-om za Sim."</string> + <string name="keyguard_accessibility_sim_puk_unlock" msgid="9106899279724723341">"Otključavanje SIM-a PUK-om"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Uzorak oblasti."</string> <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast za pomjeranje klizača."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvori koristeći"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvori koristeći %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otvaranje linkova pomoću"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otvaranje linkova pomoću aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvaranje <xliff:g id="HOST">%1$s</xliff:g> linkova pomoću aplikacije <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dozvoli pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Uredi koristeći"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uredi koristeći %1$s"</string> @@ -1547,7 +1543,7 @@ <string name="time_picker_increment_hour_button" msgid="3652056055810223139">"Povećaj sate"</string> <string name="time_picker_decrement_hour_button" msgid="1377479863429214792">"Smanji sate"</string> <string name="time_picker_increment_set_pm_button" msgid="4147590696151230863">"Postavi za poslijepodne (PM)"</string> - <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Postavi za prijepodne (AM)"</string> + <string name="time_picker_decrement_set_am_button" msgid="8302140353539486752">"Postavi za prijepodne"</string> <string name="date_picker_increment_month_button" msgid="5369998479067934110">"Povećaj mjesece"</string> <string name="date_picker_decrement_month_button" msgid="1832698995541726019">"Smanji mjesece"</string> <string name="date_picker_increment_day_button" msgid="7130465412308173903">"Povećaj dane"</string> @@ -1615,8 +1611,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokretanje preglednika?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Postavi da se uvijek otvara"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo ovaj put"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava poslovni profil"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 1638fd82c243..7cfcaf4c8809 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mou el telèfon cap a l\'esquerra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mou el telèfon cap a la dreta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira més directament cap al dispositiu."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se\'t veu la cara. Mira el telèfon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posa la cara directament davant del telèfon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Massa moviment. Subjecta bé el telèfon."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Torna a registrar la teva cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ja no es reconeix la teva cara. Torna-ho a provar."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Obre amb"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Obre amb %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Obre"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Obre els enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Obre els enllaços amb"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Obre els enllaços amb <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Obre els enllaços de <xliff:g id="HOST">%1$s</xliff:g> amb <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Dona accés"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edita amb"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edita amb %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vols iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vols acceptar la trucada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Obre sempre"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Només una vegada"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuració"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admet perfils professionals."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 5208e5bc1c3a..4171a8bce984 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Přesuňte telefon vlevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Přesuňte telefon vpravo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Dívejte se přímo na zařízení."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obličej není vidět. Podívejte se na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umístěte obličej přímo před telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Příliš mnoho pohybu. Držte telefon nehybně."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zaznamenejte obličej znovu."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obličej už nelze rozpoznat. Zkuste to znovu."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otevřít v aplikaci"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otevřít v aplikaci %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otevřít"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Odkazy <xliff:g id="HOST">%1$s</xliff:g> otevírat pomocí aplikace"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Odkazy otevírat pomocí aplikace"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Odkazy otevírat pomocí aplikace <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Odkazy <xliff:g id="HOST">%1$s</xliff:g> otevírat pomocí aplikace <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udělit přístup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Upravit v aplikaci"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upravit v aplikaci %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Nastavit na Otevírat vždy"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Pouze jednou"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavení"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s pracovní profily nepodporuje."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 401fa4f75334..b6cb874eb647 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flyt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flyt telefonen til højre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kig mere direkte på din enhed."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Dit ansigt kan ikke registreres. Kig på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Sørg for, at dit ansigt er direkte foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Der er for meget bevægelse. Hold telefonen stille."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer dit ansigt igen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansigtet kan ikke længere genkendes. Prøv igen."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Åbn med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åbn med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åbn"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Åbn <xliff:g id="HOST">%1$s</xliff:g>-links med"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Åbn links med"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Åbn links med <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Åbn <xliff:g id="HOST">%1$s</xliff:g>-links med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Giv adgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altid"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Angiv som altid åben"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kun én gang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Indstillinger"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s understøtter ikke arbejdsprofil"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 67c179dc5e95..5316d13a9fcf 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -316,15 +316,15 @@ <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Fensterinhalte abrufen"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Die Inhalte eines Fensters, mit dem du interagierst, werden abgerufen."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"\"Tippen & Entdecken\" aktivieren"</string> - <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Gesten erkundet werden."</string> + <string name="capability_desc_canRequestTouchExploration" msgid="7543249041581408313">"Berührte Elemente werden laut vorgelesen und der Bildschirm kann über Touch-Gesten erkundet werden."</string> <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Text bei der Eingabe beobachten"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Einschließlich personenbezogener Daten wie Kreditkartennummern und Passwörter."</string> <string name="capability_title_canControlMagnification" msgid="3593493281059424855">"Displayvergrößerung festlegen"</string> <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Legt die Zoom-Stufe und -Position auf dem Display fest."</string> - <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Gesten möglich"</string> - <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Tippen, Wischen, Zusammenziehen und andere Gesten möglich."</string> - <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Bewegungen auf dem Fingerabdrucksensor"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Erfasst Bewegungen auf dem Fingerabdrucksensor des Geräts."</string> + <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Touch-Gesten möglich"</string> + <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Tippen, Wischen, Zusammenziehen und andere Touch-Gesten möglich."</string> + <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerabdrucksensor-Gesten"</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"Erfasst Touch-Gesten auf dem Fingerabdrucksensor des Geräts."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"Statusleiste deaktivieren oder ändern"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Ermöglicht der App, die Statusleiste zu deaktivieren oder Systemsymbole hinzuzufügen oder zu entfernen"</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"Statusleiste darstellen"</string> @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweg das Smartphone nach links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweg das Smartphone nach rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Bitte sieh direkt auf dein Gerät."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gesicht wurde nicht gefunden. Blicke aufs Telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Halte dein Gesicht direkt vor dein Smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Zu viel Unruhe. Halte das Smartphone ruhig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Bitte registriere dein Gesicht noch einmal."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Gesicht wird nicht mehr erkannt. Erneut versuchen."</string> @@ -971,8 +971,8 @@ <string name="searchview_description_submit" msgid="2688450133297983542">"Anfrage senden"</string> <string name="searchview_description_voice" msgid="2453203695674994440">"Sprachsuche"</string> <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\"Tippen & Entdecken\" aktivieren?"</string> - <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder Gesten ausführen, um mit dem Tablet zu kommunizieren."</string> - <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder Gesten ausführen, um mit dem Telefon zu kommunizieren."</string> + <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder über Touch-Gesten mit dem Tablet kommunizieren."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> fordert die Aktivierung von \"Tippen & Entdecken\" an. Wenn \"Tippen & Entdecken\" aktiviert ist, kannst du Beschreibungen dessen hören oder sehen, was sich unter deinen Fingern befindet, oder über Touch-Gesten mit dem Telefon kommunizieren."</string> <string name="oneMonthDurationPast" msgid="7396384508953779925">"Vor 1 Monat"</string> <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Vor mehr als 1 Monat"</string> <plurals name="last_num_days" formatted="false" msgid="5104533550723932025"> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Öffnen mit"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mit %1$s öffnen"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öffnen"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Links von <xliff:g id="HOST">%1$s</xliff:g> öffnen mit"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Links öffnen mit"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Links mit <xliff:g id="APPLICATION">%1$s</xliff:g> öffnen"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Links von <xliff:g id="HOST">%1$s</xliff:g> mit <xliff:g id="APPLICATION">%2$s</xliff:g> öffnen"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Zugriff erlauben"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bearbeiten mit"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Mit %1$s bearbeiten"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Anruf annehmen?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Immer"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Auf \"Immer geöffnet\" festlegen"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Nur diesmal"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Einstellungen"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Das Arbeitsprofil wird von %1$s nicht unterstützt."</string> @@ -1675,8 +1670,8 @@ <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="8376923232350078434">"Halten Sie beide Lautstärketasten drei Sekunden lang gedrückt, um <xliff:g id="SERVICE_NAME">%1$s</xliff:g> zu verwenden"</string> <string name="accessibility_button_prompt_text" msgid="1176658502969738564">"Wähle den Dienst aus, der verwendet werden soll, wenn du auf die Schaltfläche für die Bedienungshilfen tippst:"</string> - <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wähle den Dienst aus, der mit der Bewegung für die Bedienungshilfen verwendet werden soll (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> - <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wähle den Dienst aus, der mit der Geste für die Bedienungshilfen verwendet werden soll (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_gesture_prompt_text" msgid="8259145549733019401">"Wähle den Dienst aus, der mit der Touch-Geste für die Bedienungshilfen verwendet werden soll (mit zwei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="1041435574275047665">"Wähle den Dienst aus, der mit der Touch-Geste für die Bedienungshilfen verwendet werden soll (mit drei Fingern vom unteren Bildschirmrand nach oben wischen):"</string> <string name="accessibility_button_instructional_text" msgid="7003212763213614833">"Wenn du zwischen den Diensten wechseln möchtest, halte die Schaltfläche für die Bedienungshilfen gedrückt."</string> <string name="accessibility_gesture_instructional_text" msgid="5261788874937410950">"Wenn du zwischen den Diensten wechseln möchtest, wische mit zwei Fingern nach oben und halte sie gedrückt."</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="4969448938984394550">"Wenn du zwischen den Diensten wechseln möchtest, wische mit drei Fingern nach oben und halte sie gedrückt."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 87d08444db0a..44357ff161b5 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Μετακινήστε το τηλέφωνο στα αριστερά."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Μετακινήστε το τηλέφωνο στα δεξιά."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Κοιτάξτε απευθείας τη συσκευή σας."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Δεν εντοπίστηκε το πρόσωπό σας. Δείτε το τηλέφωνο."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Στρέψτε το πρόσωπό σάς απευθείας στο τηλέφωνο."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Καταχωρίστε ξανά το πρόσωπό σας."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Αδύνατη η αναγνώριση του προσώπου. Επανάληψη."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Άνοιγμα με"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Άνοιγμα με %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Άνοιγμα"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Άνοιγμα συνδέσμων με"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Άνοιγμα συνδέσμων με την εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Άνοιγμα συνδέσμων <xliff:g id="HOST">%1$s</xliff:g> με την εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Παροχή πρόσβασης"</string> <string name="whichEditApplication" msgid="144727838241402655">"Επεξεργασία με"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Επεξεργασία με %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Εκκίνηση προγράμματος περιήγησης;"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Αποδοχή κλήσης;"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Πάντα"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Ορισμός ως πάντα ανοικτής"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Μόνο μία φορά"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ρυθμίσεις"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Το προφίλ εργασίας δεν υποστηρίζεται από %1$s"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 51b031bc535c..cc389f3189f1 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Open links with"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Open links with <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Set to always open"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index fd14d4dc7e31..0e6d49cef10f 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Open links with"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Open links with <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Set to always open"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 51b031bc535c..cc389f3189f1 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Open links with"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Open links with <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Set to always open"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 51b031bc535c..cc389f3189f1 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Open with"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Open with %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Open"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Open <xliff:g id="HOST">%1$s</xliff:g> links with"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Open links with"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Open links with <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Open <xliff:g id="HOST">%1$s</xliff:g> links with <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Give access"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit with"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit with %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accept call?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Always"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Set to always open"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Just once"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Settings"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s doesn\'t support work profile"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 638d29d2aa8f..dade85ebf851 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognize face. Try again."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 43e0823a7c18..3a2ea3e101e7 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -292,7 +292,7 @@ <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> <string name="permgroupdesc_sms" msgid="4656988620100940350">"enviar y ver mensajes SMS"</string> <string name="permgrouprequest_sms" msgid="7168124215838204719">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> envíe y vea SMS?"</string> - <string name="permgrouplab_storage" msgid="1971118770546336966">"Espacio de almacenamiento"</string> + <string name="permgrouplab_storage" msgid="1971118770546336966">"Almacenamiento"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"acceder a las fotos, el contenido multimedia y los archivos"</string> <string name="permgrouprequest_storage" msgid="7885942926944299560">"¿Permitir que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a las fotos, el contenido multimedia y los archivos de tu dispositivo?"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Micrófono"</string> @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira directamente al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se ve tu cara. Mira el teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ubica el rostro directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te estás moviendo demasiado. No muevas el teléfono"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ya no se reconoce la cara. Vuelve a intentarlo."</string> @@ -602,7 +602,7 @@ <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Permite que la aplicación consulte las estadísticas de sincronización de una cuenta, por ejemplo, el historial de eventos sincronizados y la cantidad de datos sincronizados."</string> <string name="permlab_sdcardRead" msgid="1438933556581438863">"ver almacenamiento compartido"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Ver almacenamiento compartido"</string> - <string name="permlab_sdcardWrite" msgid="9220937740184960897">"Cambia/borra almac. compartido"</string> + <string name="permlab_sdcardWrite" msgid="9220937740184960897">"cambiar o borrar contenido de almacenamiento compartido"</string> <string name="permdesc_sdcardWrite" msgid="2834431057338203959">"Editar almacen. compartido"</string> <string name="permlab_use_sip" msgid="2052499390128979920">"realizar/recibir llamadas SIP"</string> <string name="permdesc_use_sip" msgid="2297804849860225257">"Permite que la aplicación realice y reciba llamadas SIP."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abrir vínculos con"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abrir vínculos con <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abrir vínculos de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Otorgar acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Establecer en \"abrir siempre\""</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 90bf8b6dc51b..633759b68cb5 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira de forma más directa al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se detecta tu cara. Mira al teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca la cara directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"El teléfono se mueve demasiado. Mantenlo quieto."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No puede reconocer tu cara. Vuelve a intentarlo."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abrir enlaces con"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abrir enlaces con <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abrir enlaces de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permitir acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Configurar para que se abra siempre"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ajustes"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s no admite perfiles de trabajo"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index cf84482078de..86843c7a3dfd 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Liigutage telefoni vasakule."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Liigutage telefoni paremale."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vaadake otse oma seadmesse."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Teie nägu ei ole näha. Vaadake telefoni poole."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hoidke oma nägu otse telefoni ees."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Liiga palju liikumist. Hoidke telefoni paigal."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreerige oma nägu uuesti."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nägu ei õnnestu enam tuvastada. Proovige uuesti."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Avamine:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avamine rakendusega %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ava"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Ava teenuse <xliff:g id="HOST">%1$s</xliff:g> lingid rakendusega"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Ava lingid rakendusega"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Linkide avamine rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Ava teenuse <xliff:g id="HOST">%1$s</xliff:g> lingid rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Juudep. andmine"</string> <string name="whichEditApplication" msgid="144727838241402655">"Muutmine:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muutmine rakendusega %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Määra alati avama"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Ainult üks kord"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Seaded"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei toeta tööprofiili"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index ba1e0b2b8fdd..d25fe8c24401 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -375,7 +375,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke."</string> - <string name="permlab_foregroundService" msgid="3310786367649133115">"Exekutatu zerbitzuak aurreko planoan"</string> + <string name="permlab_foregroundService" msgid="3310786367649133115">"Abiarazi zerbitzuak aurreko planoan"</string> <string name="permdesc_foregroundService" msgid="6471634326171344622">"Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari."</string> <string name="permlab_getPackageSize" msgid="7472921768357981986">"neurtu aplikazioen biltegiratzeko tokia"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei."</string> @@ -422,7 +422,7 @@ <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telebistan, aplikazioak erabil ditzan."</string> <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"Aplikazioa aurreko planoan dagoenean, zure kokapenaren berri izan dezake sareen iturburuak erabilita; adibidez, telefonia mugikorreko dorreak eta Wi-Fi sareak. Kokapen-zerbitzu horiek aktibatuta eta erabilgarri izan behar dituzu telefonoan, aplikazioak erabil ditzan."</string> <string name="permlab_accessBackgroundLocation" msgid="3965397804300661062">"Atzitu kokapena atzeko planoan"</string> - <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan exekutatu bitartean atzitu ahalko du aplikazioak kokapena."</string> + <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan abian den bitartean atzitu ahalko du aplikazioak kokapena."</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"aldatu audio-ezarpenak"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den."</string> <string name="permlab_recordAudio" msgid="3876049771427466323">"grabatu audioa"</string> @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mugitu telefonoa ezkerretara."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mugitu telefonoa eskuinetara."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Begiratu zuzenago gailuari."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ez da hautematen aurpegia. Begiratu telefonoari."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ipini aurrez aurre aurpegia eta telefonoa."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mugimendu gehiegi dago. Eutsi tinko telefonoari."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Erregistratu berriro aurpegia."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ez dugu ezagutzen aurpegi hori. Saiatu berriro."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ireki honekin:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Irekin %1$s aplikazioarekin"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ireki"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Ireki <xliff:g id="HOST">%1$s</xliff:g> ostalariko estekak honekin:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Ireki estekak honekin:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Ireki estekak <xliff:g id="APPLICATION">%1$s</xliff:g> aplikazioarekin"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Ireki <xliff:g id="HOST">%1$s</xliff:g> ostalariko estekak <xliff:g id="APPLICATION">%2$s</xliff:g> aplikazioarekin"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Eman sarbidea"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editatu honekin:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editatu %1$s aplikazioarekin"</string> @@ -1181,7 +1177,7 @@ <string name="wait" msgid="7147118217226317732">"Itxaron"</string> <string name="webpage_unresponsive" msgid="3272758351138122503">"Orriak ez du erantzuten.\n\nItxi egin nahi duzu?"</string> <string name="launch_warning_title" msgid="1547997780506713581">"Aplikazioa birbideratu da"</string> - <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa exekutatzen ari da."</string> + <string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa abian da."</string> <string name="launch_warning_original" msgid="188102023021668683">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioa lehenago abiarazi da."</string> <string name="screen_compat_mode_scale" msgid="3202955667675944499">"Eskala"</string> <string name="screen_compat_mode_show" msgid="4013878876486655892">"Erakutsi beti"</string> @@ -1207,7 +1203,7 @@ <string name="android_preparing_apk" msgid="8162599310274079154">"<xliff:g id="APPNAME">%1$s</xliff:g> prestatzen."</string> <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string> - <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string> + <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> abian da"</string> <string name="heavy_weight_notification_detail" msgid="2304833848484424985">"Sakatu jokora itzultzeko"</string> <string name="heavy_weight_switcher_title" msgid="387882830435195342">"Aukeratu joko bat"</string> <string name="heavy_weight_switcher_text" msgid="4176781660362912010">"Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean."</string> @@ -1445,7 +1441,7 @@ <string name="ime_action_next" msgid="3138843904009813834">"Hurrengoa"</string> <string name="ime_action_done" msgid="8971516117910934605">"Eginda"</string> <string name="ime_action_previous" msgid="1443550039250105948">"Atzera"</string> - <string name="ime_action_default" msgid="2840921885558045721">"Exekutatu"</string> + <string name="ime_action_default" msgid="2840921885558045721">"Abiarazi"</string> <string name="dial_number_using" msgid="5789176425167573586">"Markatu zenbakia \n<xliff:g id="NUMBER">%s</xliff:g> erabilita"</string> <string name="create_contact_using" msgid="4947405226788104538">"Sortu kontaktua\n<xliff:g id="NUMBER">%s</xliff:g> erabilita"</string> <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira."</string> @@ -1555,7 +1551,7 @@ <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD txartela"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"USB bidezko unitatea"</string> <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> enpresaren USB bidezko unitatea"</string> - <string name="storage_usb" msgid="3017954059538517278">"USB memoria"</string> + <string name="storage_usb" msgid="3017954059538517278">"USB bidezko memoria"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"Editatu"</string> <string name="data_usage_warning_title" msgid="6499834033204801605">"Datuen erabileraren abisua"</string> <string name="data_usage_warning_body" msgid="7340198905103751676">"<xliff:g id="APP">%s</xliff:g> erabili dituzu"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Arakatzailea abiarazi nahi duzu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Deia onartu nahi duzu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Beti"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Ezarri beti irekitzeko"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Behin soilik"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ezarpenak"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s abiarazleak ez du laneko profil hau onartzen"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 280a56ec5f14..48cdafcfed47 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"تلفن را بهسمت چپ حرکت دهید."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"تلفن را به سمت راست حرکت دهید."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"لطفاً مستقیم به دستگاه نگه کنید."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"چهرهتان دیده نمیشود. به تلفن نگاه کنید."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"صورتتان را مستقیماً روبروی تلفن قرار دهید."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حرکت خیلی زیاد است. تلفن را ثابت نگهدارید."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"لطفاً چهرهتان را مجدداً ثبت کنید."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"دیگر چهره را تشخیص نمیدهد. دوباره امتحان کنید."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"باز کردن با"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"باز کردن با %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"باز کردن"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"باز کردن پیوندها با"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"باز کردن پیوندها با <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"باز کردن پیوندهای <xliff:g id="HOST">%1$s</xliff:g> با <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ارائه دسترسی"</string> <string name="whichEditApplication" msgid="144727838241402655">"ویرایش با"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ویرایش با %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راهاندازی شود؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"تماس را میپذیرید؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"همیشه"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"تنظیم روی همیشه باز شدن"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"فقط این بار"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"تنظیمات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s از نمایه کاری پشتیبانی نمیکند"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 7a5003bacce3..cd9a71174649 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Siirrä puhelinta vasemmalle."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Siirrä puhelinta oikealle."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Katso suoremmin laitteeseen."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kasvojasi ei näy. Katso puhelinta."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Aseta kasvosi suoraan puhelimen eteen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Laite liikkui liikaa. Pidä puhelin vakaana."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rekisteröi kasvot uudelleen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ei enää tunnista kasvoja. Yritä uudelleen."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Avaa sovelluksessa"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Avaa sovelluksessa %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Avaa"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g>-linkit avataan:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Linkit avataan:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> avaa linkit"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> avaa linkit (<xliff:g id="HOST">%1$s</xliff:g>)"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Salli"</string> <string name="whichEditApplication" msgid="144727838241402655">"Muokkaa sovelluksessa"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Muokkaa sovelluksessa %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Käynnistetäänkö selain?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vastataanko puheluun?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Aina"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Avaa aina"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Vain kerran"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Asetukset"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ei tue työprofiilia"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 0ddb19abbdd6..2bfef39cf924 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement votre appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage directement devant le téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Tenez le téléphone immobile."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez inscrire votre visage à nouveau."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ce visage ne sera plus reconnu. Réessayez."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Ouvrir les liens <xliff:g id="HOST">%1$s</xliff:g> avec"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Ouvrir les liens avec"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Ouvrir les liens avec <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Ouvrir les liens <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Définir cette activité comme toujours ouverte"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne prend pas en charge le profil professionnel"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 5f98a8acd945..041668fdba58 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement l\'appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage en face du téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Ne bougez pas le téléphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez enregistrer à nouveau votre visage."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossible de reconnaître le visage. Réessayez."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ouvrir avec"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Ouvrir avec %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ouvrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Ouvrir les liens <xliff:g id="HOST">%1$s</xliff:g> avec"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Ouvrir les liens avec"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Ouvrir les liens avec <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Ouvrir les liens <xliff:g id="HOST">%1$s</xliff:g> avec <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Accorder l\'accès"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifier avec"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifier avec %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Définir cette activité comme toujours ouverte"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Une seule fois"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Paramètres"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s n\'est pas compatible avec le profil professionnel."</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 740f699ec9c4..18bba90202ca 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move o teléfono cara á esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move o teléfono cara á dereita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira o dispositivo de forma máis directa."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Non se ve a túa cara. Mira para o teléfono"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca a cara directamente diante do teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movemento. Non movas o teléfono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volve rexistrar a túa cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Xa non se pode recoñecer a cara. Téntao de novo."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abrir ligazóns con"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abrir ligazóns con <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abrir ligazóns de <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acceso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar con %1$s"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar o navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceptar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Definir como abrir sempre"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só unha vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configuración"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non admite o perfil de traballo"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index ddc4aaeec355..1b961727da84 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ફોનને ડાબી બાજુ ખસેડો."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ફોનને જમણી બાજુ ખસેડો."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"તમારો ચહેરો દેખાતો નથી. ફોનની સામે જુઓ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"તમારો ચહેરો તમારા ફોનની બિલકુલ સામે રાખો."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"આની સાથે ખોલો"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s સાથે ખોલો"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ખોલો"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"આના વડે <xliff:g id="HOST">%1$s</xliff:g> લિંક ખોલો"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"આના વડે લિંક ખોલો"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> વડે લિંક ખોલો"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> વડે <xliff:g id="HOST">%1$s</xliff:g> લિંક ખોલો"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ઍક્સેસ આપો"</string> <string name="whichEditApplication" msgid="144727838241402655">"આનાથી સંપાદિત કરો"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s સાથે સંપાદિત કરો"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"બ્રાઉઝર લોન્ચ કરીએ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"કૉલ સ્વીકારીએ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"હંમેશા"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"હંમેશાં ખુલ્લી તરીકે સેટ કરો"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ફક્ત એક વાર"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"સેટિંગ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s કાર્ય પ્રોફાઇલનું સમર્થન કરતું નથી"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 0a1051bb6fc9..9f0df13d8ef0 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फ़ोन को बाईं ओर घुमाएं."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फ़ोन को दाईं ओर घुमाएं."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अपने डिवाइस की तरफ़ सीधे देखें."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"आपका चेहरा नहीं दिखाई दे रहा. फ़ोन की तरफ़ देखें."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"अपने चेहरे को फोन के ठीक सामने लाएं."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें."</string> @@ -784,7 +784,7 @@ <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"हमसफ़र"</string> <string name="relationTypeFather" msgid="5228034687082050725">"पिता"</string> <string name="relationTypeFriend" msgid="7313106762483391262">"दोस्त"</string> - <string name="relationTypeManager" msgid="6365677861610137895">"प्रबंधक"</string> + <string name="relationTypeManager" msgid="6365677861610137895">"मैनेजर"</string> <string name="relationTypeMother" msgid="4578571352962758304">"मां"</string> <string name="relationTypeParent" msgid="4755635567562925226">"अभिभावक"</string> <string name="relationTypePartner" msgid="7266490285120262781">"सहयोगी"</string> @@ -904,7 +904,7 @@ <string name="granularity_label_line" msgid="5764267235026120888">"पंक्ति"</string> <string name="factorytest_failed" msgid="5410270329114212041">"फ़ैक्ट्री परीक्षण विफल"</string> <string name="factorytest_not_system" msgid="4435201656767276723">"FACTORY_TEST का काम केवल /system/app में इंस्टॉल किए गए पैकेज के लिए ही हो सकता है."</string> - <string name="factorytest_no_action" msgid="872991874799998561">"ऐसा कोई पैकेज नहीं मिला था जो FACTORY_TEST कार्रवाई प्रदान करता हो."</string> + <string name="factorytest_no_action" msgid="872991874799998561">"ऐसा कोई पैकेज नहीं मिला था जो FACTORY_TEST कार्रवाई मुहैया करवाता हो."</string> <string name="factorytest_reboot" msgid="6320168203050791643">"रीबूट करें"</string> <string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' पर यह पेज दर्शाता है:"</string> <string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string> @@ -1085,7 +1085,7 @@ <string name="undo" msgid="7905788502491742328">"वापस लाएं"</string> <string name="redo" msgid="7759464876566803888">"फिर से करें"</string> <string name="autofill" msgid="3035779615680565188">"ऑटोमैटिक भरना"</string> - <string name="textSelectionCABTitle" msgid="5236850394370820357">"लेख चयन"</string> + <string name="textSelectionCABTitle" msgid="5236850394370820357">"टेक्स्ट चुनें"</string> <string name="addToDictionary" msgid="4352161534510057874">"शब्दकोश में जोड़ें"</string> <string name="deleteText" msgid="6979668428458199034">"मिटाएं"</string> <string name="inputMethod" msgid="1653630062304567879">"इनपुट विधि"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"इसमें खोलें"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s में खोलें"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोलें"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"इसे इस्तेमाल करके <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलें"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"इसे इस्तेमाल करके लिंक खोलें"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> इस्तेमाल करके लिंक खोलें"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> इस्तेमाल करके <xliff:g id="HOST">%1$s</xliff:g> लिंक खोलें"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"एक्सेस दें"</string> <string name="whichEditApplication" msgid="144727838241402655">"इसके ज़रिये बदलाव करें"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s की मदद से बदलाव करें"</string> @@ -1288,7 +1284,7 @@ <item msgid="75483255295529161">"वाई-फ़ाई"</item> <item msgid="6862614801537202646">"ब्लूटूथ"</item> <item msgid="5447331121797802871">"ईथरनेट"</item> - <item msgid="8257233890381651999">"VPN"</item> + <item msgid="8257233890381651999">"वीपीएन"</item> </string-array> <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"अज्ञात नेटवर्क प्रकार"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाई-फ़ाई से कनेक्ट नहीं हो सका"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउज़र लॉन्च करें?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकार करें?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"हमेशा"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\'हमेशा खुला रखें\' पर सेट करें"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"केवल एक बार"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s वर्क प्रोफ़ाइल का समर्थन नहीं करता"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index cc8eb49e0dee..21fdc2ff1072 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomaknite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomaknite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte izravnije prema uređaju."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Vaše se lice ne vidi. Pogledajte telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice izravno ispred telefona."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše kretanja. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte svoje lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Lice nije prepoznato. Pokušajte ponovo."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvaranje pomoću aplikacije"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvaranje pomoću aplikacije %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvori"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvaranje veza s <xliff:g id="HOST">%1$s</xliff:g> u aplikaciji"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otvaranje veza u aplikaciji"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otvaranje veza u aplikaciji <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvaranje veza s <xliff:g id="HOST">%1$s</xliff:g> u aplikaciji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogući pristup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Uređivanje pomoću aplikacije"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Uređivanje pomoću aplikacije %1$s"</string> @@ -1613,8 +1609,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Postavi to otvaranje kao zadano"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo jednom"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Postavke"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podržava radni profil"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 4ce7d4282893..1198610fe605 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mozgassa a telefont balra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mozgassa a telefont jobbra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Szemből nézzen az eszközre."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nem látszik az arca. Nézzen a telefonra."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"A telefont közvetlenül az arca elé tegye."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Túl sok a mozgás. Tartsa stabilan a telefont."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rögzítsen újra képet az arcáról."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Már nem lehet felismerni az arcát. Próbálja újra."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Megnyitás a következővel:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Megnyitás a következővel: %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Megnyitás"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g>-linkek megnyitása a következővel:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Linkek megnyitása a következővel:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Linkek megnyitása a következővel: <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g>-linkek megnyitása a következővel: <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Engedély adása"</string> <string name="whichEditApplication" msgid="144727838241402655">"Szerkesztés a következővel:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Szerkesztés a következővel: %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Böngésző indítása?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Fogadja a hívást?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Mindig"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Megnyitás mindig ezzel"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Csak egyszer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Beállítások"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"A(z) %1$s nem támogatja a munkaprofilokat."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 2be6d6f32370..cb4886a6a408 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -104,7 +104,7 @@ <string name="serviceClassFAX" msgid="5566624998840486475">"Ֆաքս"</string> <string name="serviceClassSMS" msgid="2015460373701527489">"SMS"</string> <string name="serviceClassDataAsync" msgid="4523454783498551468">"Չհամաժամեցված"</string> - <string name="serviceClassDataSync" msgid="7530000519646054776">"Համաժամել"</string> + <string name="serviceClassDataSync" msgid="7530000519646054776">"Համաժամացնել"</string> <string name="serviceClassPacket" msgid="6991006557993423453">"Փաթեթ"</string> <string name="serviceClassPAD" msgid="3235259085648271037">"Հարթակ"</string> <string name="roamingText0" msgid="7170335472198694945">"Ռոումինգի ցուցիչը միացված է"</string> @@ -169,8 +169,8 @@ <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Չհաջողվեց գտնել հարցվող ֆայլը:"</string> <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Չափից շատ հարցումներ են մշակվում: Փորձեք կրկին ավելի ուշ:"</string> <string name="notification_title" msgid="8967710025036163822">"Մուտք գործելու սխալ` <xliff:g id="ACCOUNT">%1$s</xliff:g>-ի համար"</string> - <string name="contentServiceSync" msgid="8353523060269335667">"Համաժամեցնել"</string> - <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Չի հաջողվում համաժամեցնել"</string> + <string name="contentServiceSync" msgid="8353523060269335667">"Համաժամացնել"</string> + <string name="contentServiceSyncNotificationTitle" msgid="7036196943673524858">"Չի հաջողվում համաժամացնել"</string> <string name="contentServiceTooManyDeletesNotificationDesc" msgid="4884451152168188763">"Հետևյալ ծառայությունից չափազանց շատ տարրեր եք ջնջել՝ <xliff:g id="CONTENT_TYPE">%s</xliff:g>:"</string> <string name="low_memory" product="tablet" msgid="6494019234102154896">"Պլանշետի պահոցը լիքն է: Ջնջեք մի քանի ֆայլ` տարածք ազատելու համար:"</string> <string name="low_memory" product="watch" msgid="4415914910770005166">"Ժամացույցի ֆայլերի պահեստը լիքն է: Ջնջեք որոշ ֆայլեր՝ տարածք ազատելու համար:"</string> @@ -346,7 +346,7 @@ <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"կարդալ բջջային զեկուցվող հաղորդագրությունները"</string> <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Թույլ է տալիս հավելվածին կարդալ ձեր սարքի կողմից ստացված բջջային հեռարձակվող հաղորդագրությունները: Բջջային հեռարձակվող զգուշացումները ուղարկվում են որոշ վայրերում` արտակարգ իրավիճակների մասին ձեզ զգուշացնելու համար: Վնասարար հավելվածները կարող են խանգարել ձեր սարքի արդյունավետությանը կամ շահագործմանը, երբ ստացվում է արտակարգ իրավիճակի մասին բջջային հաղորդում:"</string> <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"կարդալ բաժանորդագրված հոսքերը"</string> - <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Թույլ է տալիս հավելվածին մանրամասներ ստանալ ընթացիկ համաժամեցված հոսքերի մասին:"</string> + <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Թույլ է տալիս հավելվածին մանրամասներ ստանալ ընթացիկ համաժամացված հոսքերի մասին:"</string> <string name="permlab_sendSms" msgid="7544599214260982981">"SMS հաղորդագրությունների ուղարկում և ընթերցում"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Թույլ է տալիս հավելվածին ուղարկել SMS հաղորդագրություններ: Այն կարող է անսպասելի ծախսերի պատճառ դառնալ: Վնասարար հավելվածները կարող են ձեր հաշվից գումար ծախսել` ուղարկելով հաղորդագրություններ` առանց ձեր հաստատման:"</string> <string name="permlab_readSms" msgid="8745086572213270480">"կարդալ ձեր տեքստային հաղորդագրությունները (SMS կամ MMS)"</string> @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Տեղափոխեք հեռախոսը ձախ:"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Տեղափոխեք հեռախոսը աջ:"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Նայեք ուղիղ էկրանին։"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ձեր դեմքը չի երևում։ Նայեք հեռախոսին։"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Պահեք ձեր դեմքն անմիջապես հեռախոսի էկրանի դիմաց:"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Նորից փորձեք։"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Չհաջողվեց ճանաչել դեմքը։ Նորից փորձեք:"</string> @@ -594,12 +594,12 @@ <string-array name="face_error_vendor"> </string-array> <string name="face_icon_content_description" msgid="4024817159806482191">"Դեմքի պատկերակ"</string> - <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամեցման կարգավորումները"</string> - <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամեցման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամեցված է հաշվի հետ:"</string> - <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամեցումը փոխարկել միացվածի և անջատվածի"</string> - <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Թույլ է տալիս հավելվածին փոփոխել համաժամեցման կարգավորումները հաշվի համար: Օրինակ, այն կարող է օգտագործվել` միացնելու Մարդիկ հավելվածի համաժամեցումը հաշվի հետ:"</string> - <string name="permlab_readSyncStats" msgid="7396577451360202448">"կարդալ համաժամեցման վիճակագրությունը"</string> - <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Թույլ է տալիս հավելվածին կարդալ հաշվի համաժամեցման վիճակագրությունը, այդ թվում` համաժամեցման իրադարձությունների պատմությունը և թե որքան տվյալ է համաժամեցված:"</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"կարդալ համաժամացման կարգավորումները"</string> + <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Թույլ է տալիս հավելվածին կարդալ համաժամացման կարգավորումները հաշվի համար: Օրինակ` այն կարող է որոշել, արդյոք Մարդիկ հավելվածը համաժամացված է հաշվի հետ:"</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"համաժամացումը փոխարկել միացվածի և անջատվածի"</string> + <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Թույլ է տալիս հավելվածին փոփոխել համաժամացման կարգավորումները հաշվի համար: Օրինակ, այն կարող է օգտագործվել` միացնելու Մարդիկ հավելվածի համաժամացումը հաշվի հետ:"</string> + <string name="permlab_readSyncStats" msgid="7396577451360202448">"կարդալ համաժամացման վիճակագրությունը"</string> + <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Թույլ է տալիս հավելվածին կարդալ հաշվի համաժամացման վիճակագրությունը, այդ թվում` համաժամացման իրադարձությունների պատմությունը և թե որքան տվյալ է համաժամացված:"</string> <string name="permlab_sdcardRead" msgid="1438933556581438863">"կարդալ ձեր ընդհանուր հիշողության պարունակությունը"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Հավելվածին թույլ է տալիս կարդալ ձեր ընդհանուր հիշողության պարունակությունը:"</string> <string name="permlab_sdcardWrite" msgid="9220937740184960897">"փոփոխել կամ ջնջել ձեր ընդհանուր հիշողության բովանդակությունը"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Բացել հետևյալ ծրագրով՝"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Բացել հավելվածով՝ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Բացել"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> տեսակի հղումները բացել…"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Հղումները բացել…"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Հղումները բացել <xliff:g id="APPLICATION">%1$s</xliff:g> դիտարկիչում"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> տեսակի հղումները բացել <xliff:g id="APPLICATION">%2$s</xliff:g> դիտարկիչում"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Թույլատրել"</string> <string name="whichEditApplication" msgid="144727838241402655">"Խմբագրել հետևյալ ծրագրով՝"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Խմբագրել հետևյալով՝ %1$s"</string> @@ -1156,7 +1152,7 @@ <string name="whichImageCaptureApplicationNamed" msgid="8619384150737825003">"Լուսանկարել %1$s հավելվածի օգնությամբ"</string> <string name="whichImageCaptureApplicationLabel" msgid="6390303445371527066">"Լուսանկարել"</string> <string name="alwaysUse" msgid="4583018368000610438">"Օգտագործել ըստ կանխադրման այս գործողության համար:"</string> - <string name="use_a_different_app" msgid="8134926230585710243">"Օգտագործել այլ հավելված"</string> + <string name="use_a_different_app" msgid="8134926230585710243">"Ուրիշ հավելված"</string> <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Մաքրել լռելյայնը Համակարգի կարգավորումներ > Ծրագրեր >Ներբեռնված էջից:"</string> <string name="chooseActivity" msgid="7486876147751803333">"Ընտրել գործողություն"</string> <string name="chooseUsbActivity" msgid="6894748416073583509">"Ընտրեք հավելված USB սարքի համար"</string> @@ -1457,7 +1453,7 @@ <string name="forward_intent_to_owner" msgid="1207197447013960896">"Դուք օգտագործում եք այս հավելվածը ձեր աշխատանքային պրոֆիլից դուրս"</string> <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="sync_binding_label" msgid="3687969138375092423">"Համաժամացնել"</string> <string name="accessibility_binding_label" msgid="4148120742096474641">"Մատչելիությունը"</string> <string name="wallpaper_binding_label" msgid="1240087844304687662">"Պաստառ"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Փոխել պաստառը"</string> @@ -1590,9 +1586,8 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Գործարկե՞լ զննարկիչը:"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ընդունե՞լ զանգը:"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Միշտ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> - <string name="activity_resolver_use_once" msgid="2404644797149173758">"Միայն մեկ անգամ"</string> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Միշտ բացել"</string> + <string name="activity_resolver_use_once" msgid="2404644797149173758">"Միայն այս անգամ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Կարգավորումներ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s-ը չի աջակցում աշխատանքային պրոֆիլներ"</string> <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"Գրասալիկ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index e71ab41f378d..ca369ebf8b40 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Gerakkan ponsel ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Gerakkan ponsel ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lihat langsung ke perangkat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Tidak dapat melihat wajah Anda. Lihat ke ponsel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisikan wajah Anda langsung di depan ponsel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu banyak gerakan. Stabilkan ponsel."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Daftarkan ulang wajah Anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengenali wajah. Coba lagi."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Buka link <xliff:g id="HOST">%1$s</xliff:g> dengan"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Buka link dengan"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Buka link dengan <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Buka link <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string> @@ -1383,7 +1379,7 @@ <string name="alert_windows_notification_channel_group_name" msgid="1463953341148606396">"Tampilkan di atas apl lain"</string> <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string> - <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string> + <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, ketuk untuk membuka setelan dan menonaktifkannya."</string> <string name="alert_windows_notification_turn_off_action" msgid="2902891971380544651">"Nonaktifkan"</string> <string name="ext_media_checking_notification_title" msgid="4411133692439308924">"Memeriksa <xliff:g id="NAME">%s</xliff:g>…"</string> <string name="ext_media_checking_notification_message" msgid="410185170877285434">"Meninjau konten saat ini"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Setel untuk selalu membuka"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setelan"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak mendukung profil kerja"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 3d2acd9c7d24..572313aa0ed6 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Færðu símann til vinstri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Færðu símann til hægri."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Horfðu beint á tækið."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Sé ekki andlit þitt. Horfðu á símann."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hafðu andlitið beint fyrir framan símann."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Of mikil hreyfing. Haltu símanum stöðugum."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skráðu nafnið þitt aftur."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Andlit þekkist ekki lengur. Reyndu aftur."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Opna með"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Opna með %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Opna"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Opna <xliff:g id="HOST">%1$s</xliff:g> tengla með"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Opna tengla með"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Opna tengla með <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Opna <xliff:g id="HOST">%1$s</xliff:g> tengla með <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Veita aðgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Breyta með"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Breyta með %1$s"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Opna vafra?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Samþykkja símtal?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltaf"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Stilla á „Alltaf opið“"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara einu sinni"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Stillingar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s styður ekki vinnusnið"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6d1d132f2ea6..6c579b85600f 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -325,7 +325,7 @@ <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Consente di toccare, far scorrere, pizzicare ed eseguire altri gesti."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Gesti con sensore di impronte digitali"</string> <string name="capability_desc_canCaptureFingerprintGestures" msgid="4386487962402228670">"È in grado di rilevare i gesti compiuti con il sensore di impronte digitali dei dispositivi."</string> - <string name="permlab_statusBar" msgid="7417192629601890791">"disattivare o modificare la barra di stato"</string> + <string name="permlab_statusBar" msgid="7417192629601890791">"disattivazione o modifica della barra di stato"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Consente all\'applicazione di disattivare la barra di stato o di aggiungere e rimuovere icone di sistema."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"ruolo di barra di stato"</string> <string name="permdesc_statusBarService" msgid="716113660795976060">"Consente di visualizzare l\'applicazione nella barra di stato."</string> @@ -337,7 +337,7 @@ <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Consente all\'applicazione di rimuovere le scorciatoie della schermata Home automaticamente."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"reindirizzamento chiamate in uscita"</string> <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Consente all\'app di rilevare il numero digitato durante una chiamata in uscita, con la possibilità di reindirizzare la telefonata a un numero diverso o interromperla del tutto."</string> - <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"rispondi a telefonate in arrivo"</string> + <string name="permlab_answerPhoneCalls" msgid="4077162841226223337">"risposta a telefonate in arrivo"</string> <string name="permdesc_answerPhoneCalls" msgid="2901889867993572266">"Consente all\'app di rispondere a una telefonata in arrivo."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"ricezione messaggi di testo (SMS)"</string> <string name="permdesc_receiveSms" msgid="6424387754228766939">"Consente all\'applicazione di ricevere ed elaborare messaggi SMS. Significa che l\'applicazione potrebbe monitorare o eliminare i messaggi inviati al tuo dispositivo senza mostrarteli."</string> @@ -347,7 +347,7 @@ <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Consente all\'applicazione di leggere i messaggi cell broadcast ricevuti dal dispositivo. Gli avvisi cell broadcast vengono trasmessi in alcune località per avvertire di eventuali situazioni di emergenza. Le applicazioni dannose potrebbero interferire con il rendimento o con il funzionamento del dispositivo quando si riceve un messaggio cell broadcast di emergenza."</string> <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lettura feed sottoscritti"</string> <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Consente all\'applicazione di ottenere dettagli sui feed attualmente sincronizzati."</string> - <string name="permlab_sendSms" msgid="7544599214260982981">"inviare e visualizzare SMS"</string> + <string name="permlab_sendSms" msgid="7544599214260982981">"invio e visualizzazione di SMS"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Consente all\'applicazione di inviare messaggi SMS. Ciò potrebbe comportare costi imprevisti. Applicazioni dannose potrebbero generare dei costi inviando messaggi senza la tua conferma."</string> <string name="permlab_readSms" msgid="8745086572213270480">"lettura messaggi di testo personali (SMS o MMS)"</string> <string name="permdesc_readSms" product="tablet" msgid="4741697454888074891">"Questa app può leggere tutti i messaggi di testo (SMS) memorizzati sul tablet."</string> @@ -375,7 +375,7 @@ <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il tablet."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Consente all\'app di rendere alcune sue parti persistenti nella memoria. Potrebbe così essere limitata la memoria a disposizione di altre app ed essere rallentata la TV."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Consente all\'applicazione di rendere persistenti in memoria alcune sue parti. Ciò può limitare la memoria disponibile per altre applicazioni, rallentando il telefono."</string> - <string name="permlab_foregroundService" msgid="3310786367649133115">"esegui servizio in primo piano"</string> + <string name="permlab_foregroundService" msgid="3310786367649133115">"esecuzione servizio in primo piano"</string> <string name="permdesc_foregroundService" msgid="6471634326171344622">"Consente all\'app di utilizzare i servizi in primo piano."</string> <string name="permlab_getPackageSize" msgid="7472921768357981986">"calcolo spazio di archiviazione applicazioni"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Consente all\'applicazione di recuperare il suo codice, i suoi dati e le dimensioni della cache"</string> @@ -405,7 +405,7 @@ <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Consente all\'applicazione di modificare il registro chiamate del telefono, inclusi i dati sulle chiamate in arrivo e in uscita. Le applicazioni dannose potrebbero farne uso per cancellare o modificare il registro chiamate."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"accesso ai sensori (come il cardiofrequenzimetro)"</string> <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Consente all\'app di accedere ai dati relativi ai sensori che monitorano le tue condizioni fisiche, ad esempio la frequenza cardiaca."</string> - <string name="permlab_readCalendar" msgid="6716116972752441641">"Leggi eventi di calendario e dettagli"</string> + <string name="permlab_readCalendar" msgid="6716116972752441641">"lettura di eventi di calendario e dettagli"</string> <string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"Questa app può leggere tutti gli eventi di calendario memorizzati sul tablet e condividere o salvare i dati di calendario."</string> <string name="permdesc_readCalendar" product="tv" msgid="8837931557573064315">"Questa app può leggere tutti gli eventi di calendario memorizzati sulla TV e condividere o salvare i dati di calendario."</string> <string name="permdesc_readCalendar" product="default" msgid="4373978642145196715">"Questa app può leggere tutti gli eventi di calendario memorizzati sul telefono e condividere o salvare i dati di calendario."</string> @@ -415,9 +415,9 @@ <string name="permdesc_writeCalendar" product="default" msgid="7592791790516943173">"Questa app può aggiungere, rimuovere o modificare eventi di calendario sul telefono. Può inviare messaggi che possono sembrare inviati dai proprietari del calendario o modificare eventi senza notificare i proprietari."</string> <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"accesso a comandi aggiuntivi provider di geolocalizz."</string> <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Consente all\'app di accedere a ulteriori comandi del fornitore di posizione. Ciò potrebbe consentire all\'app di interferire con il funzionamento del GPS o di altre fonti di geolocalizzazione."</string> - <string name="permlab_accessFineLocation" msgid="6265109654698562427">"Accesso alla posizione esatta solo in primo piano"</string> + <string name="permlab_accessFineLocation" msgid="6265109654698562427">"accesso alla posizione esatta solo in primo piano"</string> <string name="permdesc_accessFineLocation" msgid="3520508381065331098">"Questa app può recuperare la tua posizione esatta solo quando è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli. Potrebbe aumentare il consumo della batteria."</string> - <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"Accesso alla posizione approssimativa (in base alla rete) solo in primo piano"</string> + <string name="permlab_accessCoarseLocation" msgid="3707180371693213469">"accesso alla posizione approssimativa (in base alla rete) solo in primo piano"</string> <string name="permdesc_accessCoarseLocation" product="tablet" msgid="8594719010575779120">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul tablet affinché l\'app possa usarli."</string> <string name="permdesc_accessCoarseLocation" product="tv" msgid="3027871910200890806">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sulla TV affinché l\'app possa usarli."</string> <string name="permdesc_accessCoarseLocation" product="default" msgid="854896049371048754">"Questa app può recuperare la tua posizione tramite fonti di rete quali ripetitori di telefonia mobile e reti Wi-Fi, ma soltanto quando l\'app è in primo piano. Questi servizi di geolocalizzazione devono essere attivi e disponibili sul telefono affinché l\'app possa usarli."</string> @@ -425,7 +425,7 @@ <string name="permdesc_accessBackgroundLocation" msgid="1096394429579210251">"Se concedi l\'autorizzazione insieme all\'accesso alla posizione precisa o approssimativa, l\'app potrà accedere alla posizione mentre viene eseguita in background."</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"modifica impostazioni audio"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Consente all\'applicazione di modificare le impostazioni audio globali, come il volume e quale altoparlante viene utilizzato per l\'uscita."</string> - <string name="permlab_recordAudio" msgid="3876049771427466323">"registrare audio"</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"registrazione audio"</string> <string name="permdesc_recordAudio" msgid="4245930455135321433">"Questa app può registrare audio tramite il microfono in qualsiasi momento."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"invio di comandi alla SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Consente all\'app di inviare comandi alla SIM. Questo è molto pericoloso."</string> @@ -437,7 +437,7 @@ <string name="permdesc_vibrate" msgid="6284989245902300945">"Consente all\'applicazione di controllare la vibrazione."</string> <string name="permlab_callPhone" msgid="3925836347681847954">"chiamata diretta n. telefono"</string> <string name="permdesc_callPhone" msgid="3740797576113760827">"Consente all\'applicazione di chiamare numeri di telefono senza il tuo intervento. Ciò può comportare chiamate o addebiti imprevisti. Tieni presente che ciò non consente all\'applicazione di chiamare numeri di emergenza. Applicazioni dannose potrebbero generare dei costi effettuando chiamate senza la tua conferma."</string> - <string name="permlab_accessImsCallService" msgid="3574943847181793918">"Accesso al servizio di chiamata IMS"</string> + <string name="permlab_accessImsCallService" msgid="3574943847181793918">"accesso al servizio di chiamata IMS"</string> <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Consente all\'app di utilizzare il servizio IMS per fare chiamate senza il tuo intervento."</string> <string name="permlab_readPhoneState" msgid="9178228524507610486">"lettura stato e identità telefono"</string> <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Consente all\'applicazione di accedere alle funzioni telefoniche del dispositivo. Questa autorizzazione consente all\'applicazione di determinare il numero di telefono e gli ID dei dispositivi, se una chiamata è attiva e il numero remoto connesso da una chiamata."</string> @@ -445,12 +445,12 @@ <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Consente all\'app di indirizzare le proprie chiamate tramite il sistema al fine di migliorare l\'esperienza di chiamata."</string> <string name="permlab_callCompanionApp" msgid="3599252979411970473">"visualizzazione e controllo delle chiamate tramite il sistema."</string> <string name="permdesc_callCompanionApp" msgid="4567344683275099090">"Consente all\'app di visualizzare e controllare le chiamate in corso sul dispositivo. Sono incluse informazioni quali i numeri e lo stato relativi alle chiamate."</string> - <string name="permlab_acceptHandover" msgid="2661534649736022409">"Continuazione di una chiamata da un\'altra app"</string> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuazione di una chiamata da un\'altra app"</string> <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Consente all\'app di continuare una chiamata che è stata iniziata in un\'altra app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lettura dei numeri di telefono"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Consente all\'app di accedere ai numeri di telefono del dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"disattivazione stand-by del tablet"</string> - <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"divieto di attivazione della modalità di sospensione della TV"</string> + <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"disattivazione della modalità di sospensione della TV"</string> <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"disattivazione stand-by del telefono"</string> <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Consente all\'applicazione di impedire lo stand-by del tablet."</string> <string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"Consente all\'app di impedire l\'attivazione della modalità di sospensione della TV."</string> @@ -483,7 +483,7 @@ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Consente all\'applicazione di visualizzare informazioni sulle reti Wi-Fi, ad esempio di rilevare se il Wi-Fi è abilitato e il nome dei dispositivi Wi-Fi connessi."</string> <string name="permlab_changeWifiState" msgid="6550641188749128035">"connessione e disconnessione dal Wi-Fi"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Consente all\'applicazione di connettersi/disconnettersi da punti di accesso Wi-Fi e di apportare modifiche alla configurazione del dispositivo per le reti Wi-Fi."</string> - <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"consenti ricezione multicast Wi-Fi"</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"ricezione multicast Wi-Fi"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Consente all\'applicazione di ricevere pacchetti inviati a tutti i dispositivi su una rete Wi-Fi utilizzando indirizzi multicast, non solo il tuo tablet. Viene consumata più batteria rispetto alla modalità non multicast."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Consente all\'app di ricevere pacchetti inviati a tutti i dispositivi tramite una rete Wi-Fi utilizzando indirizzi multicast, non soltanto la TV. Questa modalità consuma più energia della modalità non multicast."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Consente all\'applicazione di ricevere pacchetti inviati a tutti i dispositivi su una rete Wi-Fi utilizzando indirizzi multicast, non solo il tuo telefono. Viene consumata più batteria rispetto alla modalità non multicast."</string> @@ -505,21 +505,21 @@ <string name="permdesc_nfc" msgid="7120611819401789907">"Consente all\'applicazione di comunicare con tag, schede e lettori NFC (Near Field Communication)."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"disattivazione blocco schermo"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Consente all\'applicazione di disattivare il blocco tastiera ed eventuali protezioni tramite password associate. Ad esempio, il telefono disattiva il blocco tastiera quando riceve una telefonata in arrivo e lo riattiva al termine della chiamata."</string> - <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"richiedi complessità del blocco schermo"</string> + <string name="permlab_requestPasswordComplexity" msgid="202650535669249674">"richiesta di complessità del blocco schermo"</string> <string name="permdesc_requestPasswordComplexity" msgid="4730994229754212347">"Consente all\'app di conoscere il livello di complessità del blocco schermo (alto, medio, basso o nessuno), che indica l\'intervallo di caratteri possibile e il tipo di blocco schermo. L\'app può inoltre suggerire agli utenti di aggiornare il blocco schermo a un livello specifico di complessità, ma gli utenti possono ignorare liberamente il suggerimento e uscire. Tieni presente che il blocco schermo non viene memorizzato come testo non crittografato, quindi l\'app non conosce la password esatta."</string> - <string name="permlab_useBiometric" msgid="8837753668509919318">"Utilizzo di hardware biometrico"</string> + <string name="permlab_useBiometric" msgid="8837753668509919318">"utilizzo di hardware biometrico"</string> <string name="permdesc_useBiometric" msgid="8389855232721612926">"Consente all\'app di utilizzare hardware biometrico per eseguire l\'autenticazione"</string> - <string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestisci hardware per il riconoscimento delle impronte digitali"</string> + <string name="permlab_manageFingerprint" msgid="5640858826254575638">"gestione di hardware per il riconoscimento delle impronte digitali"</string> <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Consente all\'app di richiamare metodi per aggiungere e rimuovere modelli di impronte digitali da utilizzare."</string> <string name="permlab_useFingerprint" msgid="3150478619915124905">"utilizzo di hardware per il riconoscimento delle impronte digitali"</string> <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Consente all\'app di utilizzare l\'hardware per il riconoscimento delle impronte digitali per eseguire l\'autenticazione"</string> - <string name="permlab_audioWrite" msgid="2661772059799779292">"Modifica della tua raccolta musicale"</string> + <string name="permlab_audioWrite" msgid="2661772059799779292">"modifica della tua raccolta musicale"</string> <string name="permdesc_audioWrite" msgid="8888544708166230494">"Consente all\'app di modificare la tua raccolta musicale."</string> - <string name="permlab_videoWrite" msgid="128769316366746446">"Modifica della tua raccolta di video"</string> + <string name="permlab_videoWrite" msgid="128769316366746446">"modifica della tua raccolta di video"</string> <string name="permdesc_videoWrite" msgid="5448565757490640841">"Consente all\'app di modificare la tua raccolta di video."</string> - <string name="permlab_imagesWrite" msgid="3391306186247235510">"Modifica della tua raccolta di foto"</string> + <string name="permlab_imagesWrite" msgid="3391306186247235510">"modifica della tua raccolta di foto"</string> <string name="permdesc_imagesWrite" msgid="7073662756617474375">"Consente all\'app di modificare la tua raccolta di foto."</string> - <string name="permlab_mediaLocation" msgid="8675148183726247864">"Lettura delle posizioni dalla tua raccolta multimediale"</string> + <string name="permlab_mediaLocation" msgid="8675148183726247864">"lettura delle posizioni dalla tua raccolta multimediale"</string> <string name="permdesc_mediaLocation" msgid="2237023389178865130">"Consente all\'app di leggere le posizioni dalla tua raccolta multimediale."</string> <string name="biometric_dialog_default_title" msgid="881952973720613213">"Verifica la tua identità"</string> <string name="biometric_error_hw_unavailable" msgid="645781226537551036">"Hardware biometrico non disponibile"</string> @@ -551,9 +551,9 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona dell\'impronta digitale"</string> - <string name="permlab_manageFace" msgid="7262837876352591553">"gestisci l\'hardware per Sblocco col sorriso"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gestione dell\'hardware per Sblocco col sorriso"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string> - <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizza l\'hardware per Sblocco col sorriso"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizzo dell\'hardware per Sblocco col sorriso"</string> <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso"</string> <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Sblocco col sorriso"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registra di nuovo il volto"</string> @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sposta il telefono verso sinistra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sposta il telefono verso destra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Guarda più direttamente verso il dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Impossibile vedere il volto. Guarda il telefono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posiziona il viso davanti al telefono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Troppo movimento. Tieni fermo il telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ripeti l\'acquisizione del volto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Non è più possibile riconoscere il volto. Riprova."</string> @@ -600,21 +600,21 @@ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Consente a un\'applicazione di modificare le impostazioni di sincronizzazione per un account. Ad esempio, può servire per attivare la sincronizzazione dell\'applicazione Persone con un account."</string> <string name="permlab_readSyncStats" msgid="7396577451360202448">"lettura statistiche di sincronizz."</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Consente a un\'applicazione di leggere le statistiche di sincronizzazione per un account, incluse la cronologia degli eventi di sincronizzazione e la quantità di dati sincronizzati."</string> - <string name="permlab_sdcardRead" msgid="1438933556581438863">"leggere i contenuti dell\'archivio condiviso"</string> + <string name="permlab_sdcardRead" msgid="1438933556581438863">"lettura dei contenuti dell\'archivio condiviso"</string> <string name="permdesc_sdcardRead" msgid="1804941689051236391">"Consente all\'app di leggere i contenuti del tuo archivio condiviso."</string> - <string name="permlab_sdcardWrite" msgid="9220937740184960897">"modificare/eliminare i contenuti dell\'archivio condiviso"</string> + <string name="permlab_sdcardWrite" msgid="9220937740184960897">"modifica/eliminazione dei contenuti dell\'archivio condiviso"</string> <string name="permdesc_sdcardWrite" msgid="2834431057338203959">"Consente all\'app di modificare i contenuti del tuo archivio condiviso."</string> - <string name="permlab_use_sip" msgid="2052499390128979920">"fare/ricevere chiamate SIP"</string> + <string name="permlab_use_sip" msgid="2052499390128979920">"invio/ricezione di chiamate SIP"</string> <string name="permdesc_use_sip" msgid="2297804849860225257">"Consente all\'app di effettuare e ricevere chiamate SIP."</string> <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"registrazione di nuove connessioni SIM di telecomunicazione"</string> <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Consente all\'app di registrare nuove connessioni SIM di telecomunicazione."</string> <string name="permlab_register_call_provider" msgid="108102120289029841">"registrazione di nuove connessioni di telecomunicazione"</string> <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Consente all\'app di registrare nuove connessioni di telecomunicazione."</string> - <string name="permlab_connection_manager" msgid="1116193254522105375">"gestisci connessioni di telecomunicazione"</string> + <string name="permlab_connection_manager" msgid="1116193254522105375">"gestione di connessioni di telecomunicazione"</string> <string name="permdesc_connection_manager" msgid="5925480810356483565">"Consente all\'app di gestire connessioni di telecomunicazione."</string> <string name="permlab_bind_incall_service" msgid="6773648341975287125">"interazione con lo schermo durante una chiamata"</string> <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Consente all\'app di stabilire quando e come l\'utente vede lo schermo durante una chiamata."</string> - <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interagire con i servizi di telefonia"</string> + <string name="permlab_bind_connection_service" msgid="3557341439297014940">"interazione con i servizi di telefonia"</string> <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Consente all\'app di interagire con i servizi di telefonia per effettuare/ricevere chiamate."</string> <string name="permlab_control_incall_experience" msgid="9061024437607777619">"offerta di un\'esperienza utente durante le chiamate"</string> <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Consente all\'app di offrire un\'esperienza utente durante le chiamate."</string> @@ -630,7 +630,7 @@ <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Consente al titolare di vincolarsi all\'interfaccia di primo livello di un servizio listener di notifica. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"collegamento a un servizio provider di condizioni"</string> <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Consente al titolare di collegarsi all\'interfaccia di primo livello di un servizio provider di condizioni. Non dovrebbe essere mai necessaria per le normali app."</string> - <string name="permlab_bindDreamService" msgid="4153646965978563462">"associa a servizio dream"</string> + <string name="permlab_bindDreamService" msgid="4153646965978563462">"associazione a servizio dream"</string> <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Consente all\'utente di associare l\'interfaccia di primo livello di un servizio dream. Questa impostazione non è mai necessaria per le app normali."</string> <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"richiamo dell\'app di configurazione operatore-provider"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Consente al titolare di richiamare l\'app di configurazione dell\'operatore-provider. Non dovrebbe essere mai necessaria per le normali applicazioni."</string> @@ -646,7 +646,7 @@ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Consente a un\'applicazione di rimuovere certificati DRM. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"associazione a un servizio di messaggi dell\'operatore"</string> <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Consente l\'associazione di un servizio di messaggi dell\'operatore all\'interfaccia principale. Non dovrebbe mai essere necessaria per le normali applicazioni."</string> - <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"Collegamento a servizi dell\'operatore"</string> + <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"associazione a servizi dell\'operatore"</string> <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Consente al titolare di collegarsi a servizi dell\'operatore. Non dovrebbe mai essere necessaria per le normali app."</string> <string name="permlab_access_notification_policy" msgid="4247510821662059671">"accesso alla funzione Non disturbare"</string> <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Consente all\'app di leggere e modificare la configurazione della funzione Non disturbare."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Apri con"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Apri con %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Apri"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Apri i link <xliff:g id="HOST">%1$s</xliff:g> con"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Apri i link con"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Apri i link con <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Apri i link <xliff:g id="HOST">%1$s</xliff:g> con <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Fornisci accesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Modifica con"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Modifica con %1$s"</string> @@ -1434,7 +1430,7 @@ <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"Consente a un\'applicazione di richiedere l\'installazione di pacchetti."</string> <string name="permlab_requestDeletePackages" msgid="1703686454657781242">"richiesta di eliminazione dei pacchetti"</string> <string name="permdesc_requestDeletePackages" msgid="3406172963097595270">"Consente a un\'applicazione di richiedere l\'eliminazione di pacchetti."</string> - <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"chiedi di ignorare le ottimizzazioni della batteria"</string> + <string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"richiesta di ignorare le ottimizzazioni della batteria"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"Consente a un\'app di chiedere l\'autorizzazione a ignorare le ottimizzazioni della batteria per quell\'app."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Tocca due volte per il comando dello zoom"</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Aggiunta del widget non riuscita."</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Avviare l\'applicazione Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Accettare la chiamata?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Imposta per aprire sempre"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una volta"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Impostazioni"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s non supporta il profilo di lavoro"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 8add3d75c638..437b31b652bb 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"צריך להזיז את הטלפון שמאלה."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"צריך להזיז את הטלפון ימינה."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"יש להביט ישירות אל המכשיר."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"אי אפשר לראות את הפנים שלך. צריך להביט אל הטלפון."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"עליך למקם את הפנים ישירות מול הטלפון."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"יש לרשום מחדש את הפנים."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"כבר לא ניתן לזהות פנים. יש לנסות שוב."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"פתח באמצעות"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"פתח באמצעות %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"פתח"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"פתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"פתיחת קישורים באמצעות"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"פתיחת קישורים באמצעות <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"פתיחת קישורים של <xliff:g id="HOST">%1$s</xliff:g> באמצעות <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"הענקת גישה"</string> <string name="whichEditApplication" msgid="144727838241402655">"ערוך באמצעות"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ערוך באמצעות %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"להפעיל את הדפדפן?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"האם לקבל את השיחה?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"תמיד"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"הגדרה כברירת מחדל לפתיחה"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"רק פעם אחת"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"הגדרות"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s אינו תומך בפרופיל עבודה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 2d09d67df392..b558a318aa1e 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"スマートフォンを左に動かしてください。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"スマートフォンを右に動かしてください。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"もっとまっすぐデバイスに顔を向けてください。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"顔を確認できません。スマートフォンを見てください。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"顔をスマートフォンの真正面に向けてください。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"あまり動かさないでください。安定させてください。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"顔を登録し直してください。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"顔を認識できなくなりました。もう一度お試しください。"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"アプリで開く"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sで開く"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開く"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> のリンクを開くブラウザ / アプリの選択"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"リンクを開くブラウザの選択"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> でリンクを開く"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> で <xliff:g id="HOST">%1$s</xliff:g> のリンクを開く"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"アクセス権を付与"</string> <string name="whichEditApplication" msgid="144727838241402655">"編集に使用"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sで編集"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ブラウザを起動しますか?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"通話を受けますか?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"常時"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"[常に開く] に設定"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"1回のみ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$sは仕事用プロファイルをサポートしていません"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index f81067837733..3570d4ccecfd 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"გადაანაცვლეთ ტელეფონი მარცხნივ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"გადაანაცვლეთ ტელეფონი მარჯვნივ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"თქვენი სახე არ ჩანს. შეხედეთ ტელეფონს."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"დაიჭირეთ სახე უშუალოდ ტელეფონის წინ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"სახის ამოცნობა ვეღარ ხერხდება. ცადეთ ხელახლა."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"გახსნა აპით"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s-ით გახსნა"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"გახსნა"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების გახსნა შემდეგით:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ბმულების გახსნა შემდეგით:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"ბმულების გახსნა <xliff:g id="APPLICATION">%1$s</xliff:g>-ით"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> ბმულების <xliff:g id="APPLICATION">%2$s</xliff:g>-ით გახსნა"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"წვდომის მინიჭება"</string> <string name="whichEditApplication" msgid="144727838241402655">"რედაქტირება აპით:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"რედაქტირება %1$s-ით"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"გსურთ ბრაუზერის გაშვება?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"უპასუხებთ ზარს?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ყოველთვის"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ყოველთვის გახსნის დაყენება"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"მხოლოდ ერთხელ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"პარამეტრები"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s მხარს არ უჭერს სამუშაო პროფილს"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 3c429865e063..2ed1e5bf5541 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонды солға жылжытыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонды оңға жылжытыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Құрылғының камерасына тура қараңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Бетіңіз көрінбейді. Телефонға қараңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Бетіңізді телефонға тура қаратыңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Қозғалыс тым көп. Телефонды қозғалтпаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Қайта тіркеліңіз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Басқаша ашу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s қолданбасымен ашу"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ашу"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін келесімен ашу:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Сілтемелерді келесімен ашу:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Сілтемелерді <xliff:g id="APPLICATION">%1$s</xliff:g> браузерімен ашу"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> сілтемелерін <xliff:g id="APPLICATION">%2$s</xliff:g> браузерімен ашу"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Рұқсат беру"</string> <string name="whichEditApplication" msgid="144727838241402655">"Келесімен өңдеу"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s көмегімен өңдеу"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Браузер қосылсын ба?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Қоңырауды қабылдау?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Үнемі"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Әрдайым ашық күйге орнату"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Бір рет қана"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Параметрлер"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жұмыс профилін қолдамайды"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index b088f4e811d6..02c6ba8cc233 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ផ្លាស់ទីទូរសព្ទទៅខាងឆ្វេង។"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"សូមមើលឱ្យចំឧបករណ៍របស់អ្នកជាងមុន។"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"មើលមិនឃើញមុខរបស់អ្នកទេ។ សូមសម្លឹងមើលទូរសព្ទ។"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"បែរមុខរបស់អ្នកឱ្យចំពីមុខទូរសព្ទផ្ទាល់។"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"មានចលនាខ្លាំងពេក។ សូមកាន់ទូរសព្ទឱ្យនឹង។"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត។"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"មិនអាចសម្គាល់មុខបានទៀតទេ។ សូមព្យាយាមម្ដងទៀត។"</string> @@ -1133,14 +1133,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"បើកជាមួយ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"បើកជាមួយ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"បើក"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ជាមួយ"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"បើកតំណជាមួយ"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"បើកតំណជាមួយ <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"បើកតំណ <xliff:g id="HOST">%1$s</xliff:g> ជាមួយ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ផ្តល់សិទ្ធិចូលប្រើ"</string> <string name="whichEditApplication" msgid="144727838241402655">"កែសម្រួលជាមួយ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"កែសម្រួលជាមួយ %1$s"</string> @@ -1592,8 +1588,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ចាប់ផ្ដើមកម្មវិធីអ៊ីនធឺណិត?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ទទួលការហៅ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ជានិច្ច"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"កំណត់ឱ្យបើកជានិច្ច"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"តែម្ដង"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ការកំណត់"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s មិនគាំទ្រប្រវត្តិរូបការងារ"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 6da7eec48161..875ecd41eb4a 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ಫೋನ್ ಕಡೆಗೆ ನೋಡಿ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ನಿಮ್ಮ ಮುಖವನ್ನು ಫೋನ್ಗೆ ನೇರವಾಗಿ ಇರಿಸಿ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ಮುಖ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ಜೊತೆಗೆ ತೆರೆಯಿರಿ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ತೆರೆ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"ಇವುಗಳ ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ಇವುಗಳ ಮೂಲಕ ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> ಮೂಲಕ ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> ಮೂಲಕ <xliff:g id="HOST">%1$s</xliff:g> ಲಿಂಕ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ಪ್ರವೇಶ ಅನುಮತಿಸಿ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ಇವರ ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ಜೊತೆಗೆ ಎಡಿಟ್ ಮಾಡಿ"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ಬ್ರೌಸರ್ ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ಕರೆ ಸ್ವೀಕರಿಸುವುದೇ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ಯಾವಾಗಲೂ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ಯಾವಾಗಲೂ ತೆರೆಯುವುದಕ್ಕೆ ಹೊಂದಿಸಿ"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ಒಮ್ಮೆ ಮಾತ್ರ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 853ccff84648..90771451866a 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"휴대전화를 왼쪽으로 이동하세요."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"휴대전화를 오른쪽으로 이동하세요."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"기기에서 더 똑바로 바라보세요."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"얼굴이 보이지 않습니다. 휴대전화를 바라보세요."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"휴대전화가 얼굴 정면을 향하도록 두세요."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"얼굴을 다시 등록해 주세요."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"더 이상 얼굴을 인식할 수 없습니다. 다시 시도하세요."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"연결 프로그램"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s(으)로 열기"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"열기"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> 링크를 열 때 사용할 앱"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"링크를 열 때 사용할 앱"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> 앱으로 링크 열기"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> 앱으로 <xliff:g id="HOST">%1$s</xliff:g> 링크 열기"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"권한 부여"</string> <string name="whichEditApplication" msgid="144727838241402655">"편집 프로그램:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s(으)로 수정"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"항상 열도록 설정"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"한 번만"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"설정"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s에서 직장 프로필을 지원하지 않습니다."</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index e5b11ba96753..8cac3638ae28 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонду солго жылдырыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонду оңго жылдырыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Түзмөгүңүзгө түз караңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Жүзүңүз көрүнбөй жатат. Телефонду караңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Телефонду жүзүңүздүн маңдайында кармаңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Кыймылдап жибердиңиз. Телефонду түз кармаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Жүз таанылган жок. Кайра аракет кылыңыз."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Төмөнкү менен ачуу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s менен ачуу"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ачуу"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> шилтемелерин төмөнкү колдонмодо ачуу:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Шилтемелерди төмөнкү колдонмодо ачуу:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Шилтемелерди <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосунда ачуу"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> шилтемелерин <xliff:g id="APPLICATION">%2$s</xliff:g> колдонмосунда ачуу"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Мүмкүнчүлүк берүү"</string> <string name="whichEditApplication" msgid="144727838241402655">"Төмөнкү менен түзөтүү"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s менен түзөтүү"</string> @@ -1592,8 +1588,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Серепчи иштетилсинби?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Чалуу кабыл алынсынбы?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Дайыма"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Ар дайым ачылсын деп жөндөө"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Бир жолу гана"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Жөндөөлөр"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s жумуш профилин колдоого албайт"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 74b311a09432..47b0fe49796e 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ຍ້າຍໂທລະສັບໄປທາງຂວາ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ບໍ່ສາມາດເບິ່ງເຫັນໜ້າຂອງທ່ານໄດ້. ກະລຸນາເບິ່ງໂທລະສັບ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ຫັນໜ້າຂອງທ່ານໄປໃສ່ໜ້າໂທລະສັບໂດຍກົງ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ເປີດໂດຍໃຊ້"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"ເປີດໂດຍໃຊ້ %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ເປີດ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"ເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ໂດຍໃຊ້"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ເປີດລິ້ງໂດຍໃຊ້"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"ເປີດລິ້ງໂດຍໃຊ້ <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"ເປີດລິ້ງ <xliff:g id="HOST">%1$s</xliff:g> ໂດຍໃຊ້ <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ໃຫ້ສິດອະນຸຍາດ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ແກ້ໄຂໃນ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"ແກ້ໄຂໃນ %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ເປີດໂປຣແກຣມທ່ອງເວັບ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ຮັບການໂທບໍ່?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ທຸກຄັ້ງ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ຕັ້ງໃຫ້ເປັນເປີດທຸກເທື່ອ"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ຄັ້ງດຽວ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ການຕັ້ງຄ່າ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ບໍ່ຮອງຮັບໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 191108a0b73b..6f8e2df08241 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pasukite telefoną kairėn."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pasukite telefoną dešinėn."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Žiūrėkite tiesiai į įrenginį."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nematau jūsų veido. Žiūrėkite į telefoną."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Veidas turi būti prieš telefoną."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Įrenginys per daug judinamas. Nejudink. telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Užregistruokite veidą iš naujo."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nebegalima atpažinti veido. Bandykite dar kartą."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Atidaryti naudojant"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atidaryti naudojant %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atidaryti"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Atidaryti nuorodas naudojant"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Atidaryti nuorodas naudojant „<xliff:g id="APPLICATION">%1$s</xliff:g>“"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Atidaryti <xliff:g id="HOST">%1$s</xliff:g> nuorodas naudojant „<xliff:g id="APPLICATION">%2$s</xliff:g>“"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Suteikti prieigą"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redaguoti naudojant"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redaguoti naudojant %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Nustatyti parinktį „Visada atidaryti“"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tik kartą"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nustatymai"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nepalaiko darbo profilio"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 94f14891eec7..253ff722ffda 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pārvietojiet tālruni pa kreisi."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pārvietojiet tālruni pa labi."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lūdzu, tiešāk skatieties uz savu ierīci."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Jūsu seja nav redzama. Paskatieties uz tālruni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Novietojiet savu seju tieši pretī tālrunim."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Pārāk daudz kustību. Nekustīgi turiet tālruni."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lūdzu, atkārtoti reģistrējiet savu seju."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Seju vairs nevar atpazīt. Mēģiniet vēlreiz."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Atvērt, izmantojot"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Atvērt, izmantojot %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Atvērt"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> saišu atvēršana, izmantojot:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Saišu atvēršana, izmantojot:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Saišu atvēršana, izmantojot pārlūku <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> saišu atvēršana, izmantojot pārlūku <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Atļaut piekļuvi"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediģēt, izmantojot"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediģēt, izmantojot %1$s"</string> @@ -1613,8 +1609,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Iestatīt uz “Vienmēr atvērt”"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tikai vienreiz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Iestatījumi"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Programma %1$s neatbalsta darba profilus"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 71d695ab7f02..19c1c85c28d7 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Поместете го телефонот налево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Поместете го телефонот надесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Погледнете подиректно во уредот."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не ви се гледа ликот. Гледајте во телефонот."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Наместете го лицето директно пред телефонот."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Премногу движење. Држете го телефонот стабилно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно регистрирајте го лицето."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ликот не се препознава. Обидете се повторно."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отвори со"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отвори со %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Отворајте врски на <xliff:g id="HOST">%1$s</xliff:g> со"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Отворајте врски со"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Отворајте врски со <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Отворајте врски на <xliff:g id="HOST">%1$s</xliff:g> со <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи пристап"</string> <string name="whichEditApplication" msgid="144727838241402655">"Измени со"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измени со %1$s"</string> @@ -1593,8 +1589,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Стартувај прелистувач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прифати повик?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Секогаш"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Поставете на секогаш отворај"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само еднаш"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Поставки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддржува работен профил"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index b58f19502c91..b2e9b643366c 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ഫോൺ ഇടത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ഫോൺ വലത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"നിങ്ങളുടെ മുഖം കാണാനാവുന്നില്ല. ഫോണിലേക്ക് നോക്കൂ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"നിങ്ങളുടെ മുഖം ക്യാമറയ്ക്ക് നേരെയാക്കുക."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ഇനി മുഖം തിരിച്ചറിയാനാവില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ഇത് ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"തുറക്കുക"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"ഇനിപ്പറയുന്നത് ഉപയോഗിച്ച് <xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ തുറക്കുക"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ഇനിപ്പറയുന്നത് ഉപയോഗിച്ച് ലിങ്കുകൾ തുറക്കുക"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> ഉപയോഗിച്ച് ലിങ്കുകൾ തുറക്കുക"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> ലിങ്കുകൾ <xliff:g id="APPLICATION">%2$s</xliff:g> ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ആക്സസ് നൽകുക"</string> <string name="whichEditApplication" msgid="144727838241402655">"ഇത് ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ഉപയോഗിച്ച് എഡിറ്റുചെയ്യുക"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ബ്രൗസർ സമാരംഭിക്കണോ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"കോൾ സ്വീകരിക്കണോ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"എല്ലായ്പ്പോഴും"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\'എല്ലായ്പ്പോഴും തുറക്കുക\' എന്നതിലേക്കാക്കുക"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ഒരിക്കൽ മാത്രം"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ക്രമീകരണം"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, ഔദ്യോഗിക പ്രൊഫൈലിനെ പിന്തുണയ്ക്കുന്നില്ല"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 9f1de468a100..a229713fd61e 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Утсаа зүүн тийш болгоно уу."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Утсаа баруун тийш болгоно уу."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Төхөөрөмж рүүгээ аль болох эгц харна уу."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Таны царайг харахгүй байна. Утас руу харна уу."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Царайгаа утасны урд эгц байрлуулна уу"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Нүүрээ дахин бүртгүүлнэ үү."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Царайг таних боломжгүй боллоо. Дахин оролдоно уу."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Нээх"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ашиглан нээх"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Нээх"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосуудыг дараахаар нээх"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Холбоосуудыг дараахаар нээх"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Холбоосуудыг <xliff:g id="APPLICATION">%1$s</xliff:g>-р нээх"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g>-н холбоосуудыг <xliff:g id="APPLICATION">%2$s</xliff:g>-р нээх"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Хандалт өгөх"</string> <string name="whichEditApplication" msgid="144727838241402655">"Засварлах"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ашиглан засварлах"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Дуудлагыг зөвшөөрөх үү?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Байнга"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Тогтмол нээлттэй гэж тохируулах"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Нэг удаа"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Тохиргоо"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ажлын профайлыг дэмждэггүй"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index f2111e7ebcda..a86caa5c0fc8 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन डावीकडे हलवा."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन उजवीकडे हलवा."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया तुमच्या डिव्हाइसकडे थेट पाहा"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तुमचा चेहरा दिसत नाही. फोनकडे पहा."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"तुमचा चेहरा थेट फोन समोर आणा."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"खूप हलत आहे. फोन स्थिर धरून ठेवा."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"यासह उघडा"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s सह उघडा"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"उघडा"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"वापरून <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडा"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"वापरून लिंक उघडा"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> वापरून लिंक उघडा"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> वापरून <xliff:g id="HOST">%1$s</xliff:g> लिंक उघडा"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"अॅक्सेस द्या"</string> <string name="whichEditApplication" msgid="144727838241402655">"सह संपादित करा"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s सह संपादित करा"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउझर लाँच करायचा?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकारायचा?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"नेहमी"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"नेहमी उघडावर सेट करा"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"फक्त एकदाच"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिंग्ज"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाईलचे समर्थन करीत नाही"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 49a55782a3dd..c18e07879512 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Alihkan telefon ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Alihkan telefon ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sila lihat terus pada peranti anda."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gagal mengesan wajah anda. Lihat telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Letakkan wajah anda betul-betul di depan telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu bnyk gerakan. Pegang telefon dgn stabil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sila daftarkan semula wajah anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengecam wajah. Cuba lagi."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buka dengan"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buka dengan %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buka"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Buka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Buka pautan dengan"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Buka pautan dengan <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Buka pautan <xliff:g id="HOST">%1$s</xliff:g> dengan <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Berikan akses"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edit dengan"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edit dengan %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Tetapkan agar sentiasa dibuka"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Tetapan"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s tidak menyokong profil kerja"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index bbe115feb5f9..55e7b015fe00 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကိုကြည့်ပါ။"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"မျက်နှာကို ဖုန်းရှေ့တွင် တည့်အောင်ထားပါ။"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"မျက်နှာ မမှတ်သားနိုင်တော့ပါ။ ထပ်စမ်းကြည့်ပါ။"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"...ဖြင့် ဖွင့်မည်"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ဖြင့် ဖွင့်မည်"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ဖွင့်ပါ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို အောက်ပါဖြင့် ဖွင့်ရန်−"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"လင့်ခ်များကို အောက်ပါဖြင့် ဖွင့်ရန်−"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"လင့်ခ်ကို <xliff:g id="APPLICATION">%1$s</xliff:g> ဖြင့် ဖွင့်ရန်"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> လင့်ခ်များကို <xliff:g id="APPLICATION">%2$s</xliff:g> ဖြင့် ဖွင့်ရန်"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ဖွင့်ခွင့်ပေးရန်"</string> <string name="whichEditApplication" msgid="144727838241402655">"...နှင့် တည်းဖြတ်ရန်"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s နှင့် တည်းဖြတ်ရန်"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ဘရောက်ဇာ ဖွင့်မည်လား။"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ဖုန်းခေါ်ဆိုမှုကို လက်ခံမလား?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"အမြဲတမ်း"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"အမြဲဖွင့်မည်အဖြစ် သတ်မှတ်ရန်"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"တစ်ခါတည်း"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ဆက်တင်များ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s က အလုပ်ပရိုဖိုင်ကို မပံ့ပိုးပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 34275dff32e7..a5893892bc70 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytt telefonen til høyre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Se mer direkte på enheten din."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan ikke se ansiktet ditt. Se på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hold ansiktet ditt rett foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"For mye bevegelse. Hold telefonen stødig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer ansiktet ditt på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan ikke gjenkjenne ansiktet lenger. Prøv igjen."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Åpne med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Åpne med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Åpne"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Åpne linker med"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Åpne linker med <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Åpne <xliff:g id="HOST">%1$s</xliff:g>-linker med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Gi tilgang"</string> <string name="whichEditApplication" msgid="144727838241402655">"Rediger med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Rediger med %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Angi som alltid åpen"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bare én gang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Innstillinger"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s støtter ikke arbeidsprofiler"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 80bd83a6016b..89e75b4257ac 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन बायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन दायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तपाईंको अनुहार देखिएन। फोनमा हेर्नुहोस्।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"आफ्नो अनुहार फोनको सीधा अगाडि पार्नुहोस्।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब उप्रान्त अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> @@ -1135,14 +1135,10 @@ <!-- no translation found for whichViewApplicationNamed (2286418824011249620) --> <skip /> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"खोल्नुहोस्"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"निम्नमार्फत <xliff:g id="HOST">%1$s</xliff:g> का लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"निम्नमार्फत लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> मार्फत लिंकहरू खोल्नुहोस्"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> मार्फत <xliff:g id="HOST">%1$s</xliff:g> का लिंकहरू खोल्नुहोस्"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"पहुँच दिनुहोस्"</string> <string name="whichEditApplication" msgid="144727838241402655">"सँग सम्पादन गर्नुहोस्"</string> <!-- String.format failed for translation --> @@ -1596,8 +1592,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैँ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"सधैँ खुला राख्ने गरी सेट गर्नुहोस्"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"एक पटक मात्र"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"सेटिङहरू"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाइल समर्थन गर्दैन"</string> @@ -1975,7 +1970,7 @@ <string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"तटीय क्षेत्र र नदीछेउका ठाउँहरू छाडी उच्च सतहमा अवस्थित कुनै अझ सुरक्षित ठाउँमा जानुहोस्।"</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"शान्त रहनुहोस् र नजिकै आश्रयस्थल खोज्नुहोस्।"</string> <string name="etws_primary_default_message_test" msgid="2709597093560037455">"आपतकालीन सन्देशहरूको परीक्षण"</string> - <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"जवाफ दिनुहोस्"</string> + <string name="notification_reply_button_accessibility" msgid="3621714652387814344">"जवाफ दिनु…"</string> <string name="etws_primary_default_message_others" msgid="6293148756130398971"></string> <string name="mmcc_authentication_reject" msgid="5767701075994754356">"SIM मार्फत भ्वाइस कल गर्न मिल्दैन"</string> <string name="mmcc_imsi_unknown_in_hlr" msgid="5316658473301462825">"SIM मार्फत भ्वाइस कल गर्ने प्रावधान छैन"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 7c23e2c1131b..4194eb15b6af 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg je telefoon meer naar links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg je telefoon meer naar rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kijk rechter naar je apparaat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Je gezicht is niet te zien. Kijk naar de telefoon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Houd je gezicht recht voor de telefoon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Houd je telefoon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreer je gezicht opnieuw."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Herkent gezicht niet meer. Probeer het nog eens."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Openen met"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Openen met %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Openen"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Links van <xliff:g id="HOST">%1$s</xliff:g> openen met"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Links openen met"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Links openen met <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Links van <xliff:g id="HOST">%1$s</xliff:g> openen met <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Toegang geven"</string> <string name="whichEditApplication" msgid="144727838241402655">"Bewerken met"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Bewerken met %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Gesprek accepteren?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altijd"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Instellen op altijd openen"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Één keer"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Instellingen"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ondersteunt werkprofielen niet"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 257dd065fe3e..0f3472c10fb5 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ଆପଣଙ୍କର ମୁହଁ ଦେଖି ପାରୁନାହିଁ। ଫୋନ୍କୁ ଦେଖନ୍ତୁ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ଆପଣଙ୍କ ମୁହଁକୁ ଫୋନ୍ ସାମ୍ନାରେ ସିଧାସଳଖ ରଖନ୍ତୁ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ଆଉ ମୁହଁ ଚିହ୍ନଟ କରିହେଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ସହିତ ଖୋଲନ୍ତୁ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ସହିତ ଖୋଲନ୍ତୁ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ଖୋଲନ୍ତୁ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"ଏଥିରେ <xliff:g id="HOST">%1$s</xliff:g> ଲିଙ୍କ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ଏଥିରେ ଲିଙ୍କ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> ମାଧ୍ୟମରେ ଲିଙ୍କ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> ମାଧ୍ୟମରେ <xliff:g id="HOST">%1$s</xliff:g> ଲିଙ୍କ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ସହିତ ଏଡିଟ୍ କରନ୍ତୁ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sରେ ସଂଶୋଧନ କରନ୍ତୁ"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ବ୍ରାଉଜର୍ ଲଞ୍ଚ କରିବେ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"କଲ୍ ସ୍ୱୀକାର କରିବେ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ସର୍ବଦା"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"\'ସର୍ବଦା ଖୋଲା\' ଭାବରେ ସେଟ୍ କରନ୍ତୁ"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ଥରେ ମାତ୍ର"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ସେଟିଂସ୍"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ୱର୍କ ପ୍ରୋଫାଇଲ୍କୁ ସପୋର୍ଟ କରୁନାହିଁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 104fb40115f3..8245546a4436 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ਆਪਣਾ ਚਿਹਰਾ ਫ਼ੋਨ ਦੇ ਬਿਲਕੁਲ ਸਾਹਮਣੇ ਰੱਖੋ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ਹੁਣ ਚਿਹਰਾ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"ਖੋਲ੍ਹੋ"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ ਇਸ ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"ਲਿੰਕਾਂ ਨੂੰ ਇਸ ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"ਲਿੰਕਾਂ ਨੂੰ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਖੋਲ੍ਹੋ"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> ਲਿੰਕਾਂ ਨੂੰ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਖੋਲ੍ਹੋ"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ਪਹੁੰਚ ਦਿਓ"</string> <string name="whichEditApplication" msgid="144727838241402655">"ਇਸ ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ਨਾਲ ਸੰਪਾਦਨ ਕਰੋ"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ਕੀ ਬ੍ਰਾਊਜ਼ਰ ਲਾਂਚ ਕਰਨਾ ਹੈ?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ਕੀ ਕਾਲ ਸਵੀਕਾਰ ਕਰਨੀ ਹੈ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ਹਮੇਸ਼ਾਂ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ਹਮੇਸ਼ਾਂ ਖੁੱਲ੍ਹਾ \'ਤੇ ਸੈੱਟ ਕਰੋ"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ਕੇਵਲ ਇੱਕ ਵਾਰ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ਸੈਟਿੰਗਾਂ"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index a61555b3f652..a90acface07c 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Przesuń telefon w lewo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Przesuń telefon w prawo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Patrz prosto na urządzenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie widzę Twojej twarzy. Spójrz na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ustaw twarz dokładnie na wprost telefonu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Telefon się porusza. Trzymaj go nieruchomo."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zarejestruj swoją twarz ponownie."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nie można już rozpoznać twarzy. Spróbuj ponownie."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otwórz w aplikacji"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otwórz w aplikacji %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otwórz"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otwieraj linki z: <xliff:g id="HOST">%1$s</xliff:g> w"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otwieraj linki w"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otwieraj linki w aplikacji <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otwieraj linki z: <xliff:g id="HOST">%1$s</xliff:g> w aplikacji <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udziel uprawnień"</string> <string name="whichEditApplication" msgid="144727838241402655">"Edytuj w aplikacji"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Edytuj w aplikacji %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Zawsze otwieraj"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tylko raz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ustawienia"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nie obsługuje profilu do pracy"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 11c6a2880d1e..742fa81d0e25 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abrir links com"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Definir como \"Sempre abrir\""</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index ed26c2d7c927..85fb7fddc5d8 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o telemóvel para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o telemóvel para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não consigo ver o rosto. Olhe para o telemóvel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posicione o rosto em frente ao telemóvel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movimento. Mantenha o telemóvel firme."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volte a inscrever o rosto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossível reconhecer o rosto. Tente novamente."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abra os links de <xliff:g id="HOST">%1$s</xliff:g> com:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abra os links com:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abra os links com a aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abra os links de <xliff:g id="HOST">%1$s</xliff:g> com a aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Definir como abrir sempre"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Apenas uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Definições"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não suporta o perfil de trabalho"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 11c6a2880d1e..742fa81d0e25 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Abrir com"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Abrir com %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Abrir"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Abrir links com"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Abrir links com <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Abrir links do domínio <xliff:g id="HOST">%1$s</xliff:g> com <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Conceder acesso"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editar com"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editar com %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Definir como \"Sempre abrir\""</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Configurações"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s não aceita perfis de trabalho"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index edbc2a4a427a..2f464e93920a 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mutați telefonul spre stânga."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mutați telefonul spre dreapta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Priviți mai direct spre dispozitiv."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nu vi se vede fața. Uitați-vă la telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Stați cu capul direct în fața telefonului."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Prea multă mișcare. Țineți telefonul nemișcat."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Reînregistrați-vă chipul."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nu se mai poate recunoaște fața. Încercați din nou."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Deschideți cu"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Deschideți cu %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Deschideți"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Deschideți linkurile <xliff:g id="HOST">%1$s</xliff:g> cu"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Deschideți linkurile cu"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Deschideți linkurile cu <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Deschideți linkurile <xliff:g id="HOST">%1$s</xliff:g> cu <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Permiteți accesul"</string> <string name="whichEditApplication" msgid="144727838241402655">"Editați cu"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Editați cu %1$s"</string> @@ -1613,8 +1609,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansați browserul?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptați apelul?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Schimbați la „Deschideți întotdeauna”"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Numai o dată"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Setări"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nu acceptă profilul de serviciu"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index a7c5c7a68e62..c4b61b2f9216 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Переместите телефон влево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Переместите телефон вправо."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Смотрите прямо на устройство."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Вашего лица не видно. Смотрите на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Держите телефон прямо перед лицом."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Не перемещайте устройство. Держите его неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторите попытку."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не удалось распознать лицо. Повторите попытку."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Открыть с помощью приложения:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Открыть с помощью приложения \"%1$s\""</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Открыть"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Открывать ссылки вида <xliff:g id="HOST">%1$s</xliff:g> с помощью:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Открывать ссылки с помощью:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Открывать ссылки в браузере <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Открывать ссылки вида <xliff:g id="HOST">%1$s</xliff:g> в браузере <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Открыть доступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редактировать с помощью приложения:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редактировать с помощью приложения \"%1$s\""</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Всегда"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Всегда открывать"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Только сейчас"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Настройки"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не поддерживает рабочие профили"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index c23728e66a5c..ddeb94ba9ec0 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"දුරකථනය වමට ගෙන යන්න."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"දුරකථනය දකුණට ගෙන යන්න."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ඔබේ මුහුණ දැකිය නොහැක. දුරකථනය වෙත බලන්න."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ඔබේ මුහුණ දුරකථනයට සෘජුවම ඉදිරියෙන් ස්ථානගත කරන්න."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"තවදුරටත් මුහුණ හඳුනාගත නොහැක. නැවත උත්සාහ කරන්න."</string> @@ -1133,14 +1133,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"සමඟ විවෘත කරන්න"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s සමඟ විවෘත කරන්න"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"විවෘත කරන්න"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"සමග <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කරන්න"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"සමඟ සබැඳි විවෘත කරන්න"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> සමඟ සබැඳි විවෘත කරන්න"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="APPLICATION">%2$s</xliff:g> සමග <xliff:g id="HOST">%1$s</xliff:g> සබැඳි විවෘත කරන්න"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ප්රවේශය දෙන්න"</string> <string name="whichEditApplication" msgid="144727838241402655">"සමඟ සංස්කරණය කරන්න"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s සමඟ සංස්කරණය කරන්න"</string> @@ -1592,8 +1588,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"බ්රවුසරය දියත් කරන්නද?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"ඇමතුම පිළිගන්නවාද?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"සැම විටම"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"සැම විට විවෘත ලෙස සකසන්න"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"එක් වාරයයි"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"සැකසීම්"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s කාර්යාල පැතිකඩ සඳහා සහාය ලබනොදේ."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 76b211aac953..4d19308c15e1 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Posuňte telefón doľava."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Posuňte telefón doprava."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Pozrite sa priamejšie na zariadenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie je vidieť vašu tvár. Pozrite sa na telefón."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umiestnite svoju tvár priamo pred telefón."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Priveľa pohybu. Nehýbte telefónom."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova zaregistrujte svoju tvár."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tvár už nie je možné rozpoznať. Skúste to znova."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Otvoriť v aplikácii"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Otvoriť v aplikácii %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Otvoriť"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Otvárajte odkazy z webu <xliff:g id="HOST">%1$s</xliff:g> v prehliadači alebo aplikácii"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Otvárajte odkazy v prehliadači"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Otvárajte odkazy v prehliadači <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Otvárajte odkazy z webu <xliff:g id="HOST">%1$s</xliff:g> v prehliadači <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Udeliť prístup"</string> <string name="whichEditApplication" msgid="144727838241402655">"Upraviť pomocou"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Upraviť v aplikácii %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Nastaviť na Vždy otvárať"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Len raz"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavenia"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Spúšťač %1$s nepodporuje pracovné profily"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 943e9e260a89..b2b3109b2b60 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefon premaknite v levo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefon premaknite v desno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Glejte bolj naravnost v napravo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obraz ni viden. Poglejte v telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Obraz nastavite naravnost pred telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Preveč se premikate. Držite telefon pri miru."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova prijavite svoj obraz."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obraza ni več mogoče prepoznati. Poskusite znova."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Odpiranje z aplikacijo"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Odpiranje z aplikacijo %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Odpiranje"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Odpiranje povezav z"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Odpiranje povezav z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Odpiranje povezav <xliff:g id="HOST">%1$s</xliff:g> z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Omogoči dostop"</string> <string name="whichEditApplication" msgid="144727838241402655">"Urejanje z aplikacijo"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Urejanje z aplikacijo %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Ali želite odpreti brskalnik?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Ali želite sprejeti klic?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vedno"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Nastavi na »vedno odpri«"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Samo tokrat"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Nastavitve"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ne podpira delovnega profila"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 28f6062b16fb..afed336078a2 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Lëvize telefonin majtas."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Lëvize telefonin djathtas"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Shiko më drejt në pajisjen tënde."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Fytyra jote nuk shfaqet. Shiko te telefoni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Pozicionoje fytyrën tënde direkt përpara telefonit."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ka shumë lëvizje. Mbaje telefonin të palëvizur."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Regjistroje përsëri fytyrën tënde."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Fytyra nuk mund të njihet më. Provo përsëri."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Hap me"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Hap me %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Hap"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Hapi lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Hapi lidhjet me"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Hapi lidhjet me <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Hapi lidhjet e <xliff:g id="HOST">%1$s</xliff:g> me <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Jep qasje"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redakto me"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redakto me %1$s"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Të hapet shfletuesi?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Dëshiron ta pranosh telefonatën?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Gjithmonë"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Caktoje si gjithmonë të hapur"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Vetëm një herë"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cilësimet"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s nuk e mbështet profilin e punës"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 4fdf30145741..110b31d68b97 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -571,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Померите телефон улево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Померите телефон удесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Гледајте право у уређај."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не види се лице. Гледајте у телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Поставите лице директно испред телефона"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Много се померате. Држите телефон мирно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Поново региструјте лице."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Више не може да се препозна лице. Пробајте поново."</string> @@ -1151,14 +1151,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Отворите помоћу"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Отворите помоћу апликације %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Отвори"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Отварајте <xliff:g id="HOST">%1$s</xliff:g> линкове помоћу"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Отваратеј линкове помоћу"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Отварајте линкове помоћу апликације <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Отварајте <xliff:g id="HOST">%1$s</xliff:g> линкове помоћу апликације <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволи приступ"</string> <string name="whichEditApplication" msgid="144727838241402655">"Измените помоћу"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Измените помоћу апликације %1$s"</string> @@ -1613,8 +1609,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Подеси на „увек отварај“"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Само једном"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Подешавања"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не подржава пословни профил"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index ff82a14db19c..bc1752e7135d 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytta mobilen åt vänster."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytta mobilen åt höger."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Titta rakt på enheten."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ansiktet syns inte. Titta på mobilen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ha ansiktet direkt framför telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"För mycket rörelse. Håll mobilen stilla."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrera ansiktet på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansiktet kan inte längre kännas igen. Försök igen."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Öppna med"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Öppna med %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Öppna"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Öppna länkar på <xliff:g id="HOST">%1$s</xliff:g> med"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Öppna länkar med"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Öppna länkar med <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Öppna länkar på <xliff:g id="HOST">%1$s</xliff:g> med <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ge åtkomst"</string> <string name="whichEditApplication" msgid="144727838241402655">"Redigera med"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Redigera med %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Vill du öppna webbläsaren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vill du ta emot samtal?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Ställ in på att alltid öppnas"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara en gång"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Inställningar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s har inte stöd för arbetsprofil"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 528d5d7a159c..92510ea79f7f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sogeza simu upande wa kushoto."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sogeza simu upande wa kulia."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tafadhali angalia kifaa chako moja kwa moja."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Uso wako hauonekani. Angalia simu."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Weka uso wako moja kwa moja mbele ya simu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Inatikisika sana. Ishike simu iwe thabiti."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Tafadhali sajili uso wako tena."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Haiwezi tena kutambua uso. Jaribu tena."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Fungua ukitumia"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Fungua ukitumia %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Fungua"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Fungua viungo vya <xliff:g id="HOST">%1$s</xliff:g> ukitumia"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Fungua viungo ukitumia"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Fungua viungo ukitumia <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Fungua viungo vya <xliff:g id="HOST">%1$s</xliff:g> ukitumia <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Idhinisha ufikiaji"</string> <string name="whichEditApplication" msgid="144727838241402655">"Badilisha kwa"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Badilisha kwa %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Zindua Kivinjari?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Kubali simu?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Kila mara"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Weka ifunguke kila wakati"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Mara moja tu"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mipangilio"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s haitumii wasifu wa kazini"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 39cd685c4aee..8ddcfe6f5048 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"மொபைலை இடப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"மொபைலை வலப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"முகம் சரியாகத் தெரியவில்லை. மொபைலைப் பார்க்கவும்."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"முகத்தை மொபைலுக்கு நேராக வைக்கவும்."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"இதன்மூலம் திற"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s மூலம் திற"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"திற"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளை இதன் மூலம் திற:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"இணைப்புகளை இதன் மூலம் திற:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"இணைப்புகளை <xliff:g id="APPLICATION">%1$s</xliff:g> ஆப்ஸில் திறத்தல்"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> இணைப்புகளை <xliff:g id="APPLICATION">%2$s</xliff:g> ஆப்ஸில் திறத்தல்"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"அணுகலை வழங்கு"</string> <string name="whichEditApplication" msgid="144727838241402655">"இதன் மூலம் திருத்து"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s மூலம் திருத்து"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"உலாவியைத் துவக்கவா?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"அழைப்பை ஏற்கவா?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"எப்போதும்"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"எப்போதும் திறக்குமாறு அமைத்தல்"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"இப்போது மட்டும்"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"அமைப்புகள்"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s பணிக் கணக்கை ஆதரிக்காது"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 3ba794a60017..649e17c4229d 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ఫోన్ను ఎడమవైపునకు జరపండి."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ఫోన్ను కుడివైపునకు జరపండి."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"మీ ముఖం కనిపించడం లేదు. ఫోన్ వైపు చూడండి."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"మీ ముఖాన్ని ఫోన్కు ఎదురుగా ఉంచండి."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"బాగా కదుపుతున్నారు. ఫోన్ను స్థిరంగా పట్టుకోండి"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ఇక ముఖం గుర్తించలేదు. మళ్లీ ప్రయత్నించండి."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"దీనితో తెరువు"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$sతో తెరువు"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"తెరువు"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"దీనితో <xliff:g id="HOST">%1$s</xliff:g> లింక్లను తెరవండి"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"దీనితో లింక్లను తెరవండి"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g>తో లింక్లను తెరవండి"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> లింక్లను <xliff:g id="APPLICATION">%2$s</xliff:g>తో తెరవండి"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"యాక్సెస్ ఇవ్వండి"</string> <string name="whichEditApplication" msgid="144727838241402655">"దీనితో సవరించు"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$sతో సవరించు"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"బ్రౌజర్ను ప్రారంభించాలా?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"కాల్ను ఆమోదించాలా?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ఎల్లప్పుడూ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ఎల్లప్పుడూ తెరవడానికి సెట్ చేయి"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"ఒకసారి మాత్రమే"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"సెట్టింగ్లు"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s కార్యాలయ ప్రొఫైల్కు మద్దతు ఇవ్వదు"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 437d89eaaa05..4e6943011d33 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"เลื่อนโทรศัพท์ไปทางซ้าย"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"เลื่อนโทรศัพท์ไปทางขวา"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"โปรดมองตรงมาที่อุปกรณ์"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ไม่เห็นหน้าเลย ลองมองที่โทรศัพท์"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"หันหน้าให้ตรงกับโทรศัพท์"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"โปรดลงทะเบียนใบหน้าอีกครั้ง"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"จำใบหน้าไม่ได้แล้ว ลองอีกครั้ง"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"เปิดด้วย"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"เปิดด้วย %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"เปิด"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"เปิดลิงก์ <xliff:g id="HOST">%1$s</xliff:g> ด้วย"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"เปิดลิงก์ด้วย"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"เปิดลิงก์ด้วย <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"เปิดลิงก์ <xliff:g id="HOST">%1$s</xliff:g> ด้วย <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"ให้สิทธิ์"</string> <string name="whichEditApplication" msgid="144727838241402655">"แก้ไขด้วย"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"แก้ไขด้วย %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ทุกครั้ง"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ตั้งค่าให้เปิดทุกครั้ง"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"เฉพาะครั้งนี้"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"การตั้งค่า"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ไม่สนับสนุนโปรไฟล์งาน"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 8469e7ba1d6e..68435284b9a5 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Igalaw ang telepono pakaliwa."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Igalaw ang telepono pakanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tumingin nang mas direkta sa iyong device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hindi makita ang mukha mo. Tumingin sa telepono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Itapat ang mukha mo sa mismong harap ng telepono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Masyadong magalaw. Hawakang mabuti ang telepono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Paki-enroll muli ang iyong mukha."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Hindi na makilala ang mukha. Subukang muli."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Buksan gamit ang"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Buksan gamit ang %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Buksan"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> gamit ang"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Buksan ang mga link gamit ang"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Buksan ang mga link gamit ang <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Buksan ang mga link ng <xliff:g id="HOST">%1$s</xliff:g> gamit ang <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Bigyan ng access"</string> <string name="whichEditApplication" msgid="144727838241402655">"I-edit gamit ang"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"I-edit gamit ang %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Itakda sa palaging buksan"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Isang beses lang"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Mga Setting"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"Hindi sinusuportahan ng %1$s ang profile sa trabaho"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 8a28a0d2b415..3592df9abe34 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hareket ettirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hareket ettirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lütfen cihazınıza daha doğrudan bakın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yüzünüz görülmüyor. Telefona bakın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Yüzünüz telefonun tam karşısına gelmelidir."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Çok fazla hareket ediyorsunuz. Telefonu sabit tutun."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lütfen yüzünüzü yeniden kaydedin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yüz artık tanınamıyor. Tekrar deneyin."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Şununla aç:"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ile aç"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Aç"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> bağlantılarını şununla aç:"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Bağlantıları şununla aç:"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Bağlantıları <xliff:g id="APPLICATION">%1$s</xliff:g> ile aç"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> bağlantılarını <xliff:g id="APPLICATION">%2$s</xliff:g> ile aç"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Erişim ver"</string> <string name="whichEditApplication" msgid="144727838241402655">"Şununla düzenle:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s ile düzenle"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Her zaman"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Her zaman açılmak üzere ayarla"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Yalnızca bir defa"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Ayarlar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s, iş profilini desteklemiyor"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index b02208fc47e0..347c81f3af42 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -574,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Тримайте телефон лівіше."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Тримайте телефон правіше."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Дивіться просто на пристрій."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Обличчя не видно. Дивіться на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Тримайте телефон просто перед обличчям."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Забагато рухів. Тримайте телефон нерухомо."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно проскануйте обличчя."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Розпізнати обличчя вже не вдається. Повторіть спробу."</string> @@ -1171,14 +1171,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Відкрити за допомогою"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Відкрити за допомогою %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Відкрити"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Відкривати посилання <xliff:g id="HOST">%1$s</xliff:g> за допомогою"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Відкривати посилання за допомогою"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Відкривати посилання за допомогою додатка <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Відкривати посилання <xliff:g id="HOST">%1$s</xliff:g> за допомогою додатка <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Дозволити"</string> <string name="whichEditApplication" msgid="144727838241402655">"Редагувати за допомогою"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Редагувати за допомогою %1$s"</string> @@ -1636,8 +1632,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Вибрати додаток для відкривання посилань"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Лише цього разу"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Налаштування"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s не підтримує робочий профіль"</string> @@ -2076,7 +2071,7 @@ <string name="notification_appops_overlay_active" msgid="633813008357934729">"показ поверх інших додатків на екрані"</string> <string name="dynamic_mode_notification_channel_name" msgid="2348803891571320452">"Сповіщення про послідовнсть дій"</string> <string name="dynamic_mode_notification_title" msgid="508815255807182035">"Акумулятор може розрядитися раніше ніж зазвичай"</string> - <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режим економії заряду акумулятора активовано для збільшення часу його роботи"</string> + <string name="dynamic_mode_notification_summary" msgid="2541166298550402690">"Режим енергозбереження активовано для збільшення часу роботи акумулятора"</string> <string name="battery_saver_notification_channel_name" msgid="2083316159716201806">"Режим енергозбереження"</string> <string name="battery_saver_sticky_disabled_notification_title" msgid="6376147579378764641">"Режим енергозбереження не ввімкнеться, доки рівень заряду знову не знизиться"</string> <string name="battery_saver_sticky_disabled_notification_summary" msgid="8090192609249817945">"Акумулятор заряджено достатньо. Режим енергозбереження буде знову ввімкнено, коли рівень заряду знизиться."</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 5adf84e0f2d9..3fd6fe757bbf 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"فون کو بائیں جانب لے جائيں۔"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"فون کو دائیں جانب لے جائیں۔"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"آپ کا چہرہ دکھائی نہیں دے رہا۔ فون کی طرف دیکھیں۔"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"اپنے چہرے کو براہ راست فون کے سامنے رکھیں۔"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"اب چہرے کی شناخت نہیں کر سکتے۔ پھر آزمائيں۔"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"اس کے ساتھ کھولیں"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s کے ساتھ کھولیں"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"کھولیں"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> لنکس کے ساتھ کھولیں"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"لنکس کے ساتھ کھولیں"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"<xliff:g id="APPLICATION">%1$s</xliff:g> کے ذریعے لنکس کھولیں"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> لنکس کو <xliff:g id="APPLICATION">%2$s</xliff:g> کے ذریعے کھولیں"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"رسائی دیں"</string> <string name="whichEditApplication" msgid="144727838241402655">"اس کے ساتھ ترمیم کریں"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s کے ساتھ ترمیم کریں"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"براؤزر شروع کریں؟"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"کال قبول کریں؟"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"ہمیشہ"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"ہمیشہ کھلا ہوا ہونے پر سیٹ کریں"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"بس ایک مرتبہ"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"ترتیبات"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s دفتری پروفائل کا تعاون نہیں کرتا ہے"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 1452573b12e0..85ebe0035a49 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonni chapga suring."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonni oʻngga suring."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Qurilmaga tik qarang."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yuzingiz koʻrinmayapti. Telefonga qarang."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Telefoningizga yuzingizni tik tuting."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Yuzingizni qaytadan qayd qildiring."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yuz tanilmadi. Qaytadan urining."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Ochish…"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s bilan ochish"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Ochish"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini quyidagi orqali ochish"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Havolalarni quyidagi orqali ochish"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Havolalarni <xliff:g id="APPLICATION">%1$s</xliff:g> orqali ochish"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"<xliff:g id="HOST">%1$s</xliff:g> havolalarini <xliff:g id="APPLICATION">%2$s</xliff:g> orqali ochish"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Ruxsat berish"</string> <string name="whichEditApplication" msgid="144727838241402655">"Tahrirlash…"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"“%1$s” yordamida tahrirlash"</string> @@ -1591,8 +1587,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer ishga tushirilsinmi?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Qo‘ng‘iroqni qabul qilasizmi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Har doim"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Doim ochish"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Faqat hozir"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Sozlamalar"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"“%1$s” ishchi profilni qo‘llab-quvvatlamaydi"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index b27e38963589..f2eb9d4ecb51 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Đưa điện thoại sang bên trái."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Đưa điện thoại sang bên phải."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vui lòng nhìn thẳng vào thiết bị."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hệ thống không phát hiện được khuôn mặt bạn. Hãy nhìn vào điện thoại."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hướng thẳng khuôn mặt về phía trước điện thoại."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Thiết bị di chuyển quá nhiều. Giữ yên thiết bị."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vui lòng đăng ký lại khuôn mặt của bạn."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Không nhận ra khuôn mặt. Hãy thử lại."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Mở bằng"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Mở bằng %1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Mở"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Mở đường dẫn liên kết bằng"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Mở đường dẫn liên kết bằng <xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Mở đường dẫn liên kết <xliff:g id="HOST">%1$s</xliff:g> bằng <xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Cấp quyền truy cập"</string> <string name="whichEditApplication" msgid="144727838241402655">"Chỉnh sửa bằng"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Chỉnh sửa bằng %1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Chạy trình duyệt?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn chọn"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Đặt thành luôn mở"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Chỉ một lần"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Cài đặt"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s không hỗ trợ hồ sơ công việc"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 162b8807bc41..1012337bc466 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"请将手机向左移动。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"请将手机向右移动。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"请直视您的设备。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的脸部,请直视手机。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"请将你的面部正对手机。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"摄像头过于晃动。请将手机拿稳。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"请重新注册您的面孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已无法识别人脸,请重试。"</string> @@ -661,8 +661,8 @@ <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="4280246270601044505">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定平板电脑或清空此用户的所有数据。"</string> <string name="policydesc_watchLogin_secondaryUser" product="TV" msgid="3484832653564483250">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定电视或清空此用户的所有数据。"</string> <string name="policydesc_watchLogin_secondaryUser" product="default" msgid="2185480427217127147">"监控在解锁屏幕时输错密码的次数,并在输错次数过多时锁定手机或清空此用户的所有数据。"</string> - <string name="policylab_resetPassword" msgid="4934707632423915395">"更改锁屏密码"</string> - <string name="policydesc_resetPassword" msgid="1278323891710619128">"更改锁屏密码。"</string> + <string name="policylab_resetPassword" msgid="4934707632423915395">"更改锁屏方式"</string> + <string name="policydesc_resetPassword" msgid="1278323891710619128">"更改锁屏方式。"</string> <string name="policylab_forceLock" msgid="2274085384704248431">"锁定屏幕"</string> <string name="policydesc_forceLock" msgid="1141797588403827138">"控制屏幕锁定的方式和时间。"</string> <string name="policylab_wipeData" msgid="3910545446758639713">"清除所有数据"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"打开方式"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用%1$s打开"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"打开"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"<xliff:g id="HOST">%1$s</xliff:g> 链接打开方式"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"链接打开方式"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"使用<xliff:g id="APPLICATION">%1$s</xliff:g>打开链接"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"使用<xliff:g id="APPLICATION">%2$s</xliff:g>打开 <xliff:g id="HOST">%1$s</xliff:g> 链接"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予访问权限"</string> <string name="whichEditApplication" msgid="144727838241402655">"编辑方式"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用%1$s编辑"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"设置为始终打开"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"仅此一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"设置"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s不支持工作资料"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index f4ec4d050f6b..9ac4582fca26 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請以更直視的角度看著裝置。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的臉。請看著手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將手機對準您的臉孔正面。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"裝置不夠穩定。請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"無法再識別臉孔。請再試一次。"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"選擇開啟方式"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"使用 %1$s 開啟"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結的方式"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"開啟連結的方式"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"使用 <xliff:g id="APPLICATION">%1$s</xliff:g> 開啟連結"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"使用 <xliff:g id="APPLICATION">%2$s</xliff:g> 開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string> <string name="whichEditApplication" msgid="144727838241402655">"使用以下選擇器編輯:"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"要啟動「瀏覽器」嗎?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"設為一律開啟"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"只此一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援公司檔案"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 547736a0d26c..580a1dc6b2b1 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移動。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移動。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請儘可能直視裝置正面。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"無法偵測你的臉孔,請直視手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將你的臉孔正對手機。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"鏡頭過度晃動,請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊你的臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已無法辨識臉孔,請再試一次。"</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"選擇開啟工具"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"透過 %1$s 開啟"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"開啟"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結時使用的瀏覽器/應用程式"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"開啟連結時使用的瀏覽器"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"使用「<xliff:g id="APPLICATION">%1$s</xliff:g>」開啟連結"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"使用「<xliff:g id="APPLICATION">%2$s</xliff:g>」開啟 <xliff:g id="HOST">%1$s</xliff:g> 連結"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"授予存取權"</string> <string name="whichEditApplication" msgid="144727838241402655">"選擇編輯工具"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"使用 %1$s 編輯"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"啟動「瀏覽器」嗎?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"設為一律開啟"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"僅限一次"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"設定"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s 不支援工作設定檔"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index fa8eff327280..c4f8823b1714 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -568,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Hambisa ifoni ngakwesokunxele."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Hambisa ifoni ngakwesokudla."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sicela ubheke ngokuqondile kakhulu kudivayisi yakho."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ayikwazi ukubona ubuso bakho. Bheka ifoni"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Beka ubuso bakho ngqo phambi kwefoni."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ukunyakaza okuningi kakhulu. Bamba ifoni iqine."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sicela uphinde ubhalise ubuso bakho."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ayisakwazi ukubona ubuso. Zama futhi."</string> @@ -1131,14 +1131,10 @@ <string name="whichViewApplication" msgid="3272778576700572102">"Vula nge-"</string> <string name="whichViewApplicationNamed" msgid="2286418824011249620">"Vula nge-%1$s"</string> <string name="whichViewApplicationLabel" msgid="2666774233008808473">"Kuvuliwe"</string> - <!-- no translation found for whichOpenHostLinksWith (3788174881117226583) --> - <skip /> - <!-- no translation found for whichOpenLinksWith (6392123355599572804) --> - <skip /> - <!-- no translation found for whichOpenLinksWithApp (8225991685366651614) --> - <skip /> - <!-- no translation found for whichOpenHostLinksWithApp (3464470639011045589) --> - <skip /> + <string name="whichOpenHostLinksWith" msgid="3788174881117226583">"Vula izixhumanisi ze-<xliff:g id="HOST">%1$s</xliff:g> nge"</string> + <string name="whichOpenLinksWith" msgid="6392123355599572804">"Vula izixhumanisi nge"</string> + <string name="whichOpenLinksWithApp" msgid="8225991685366651614">"Vula izixhumanisi nge-<xliff:g id="APPLICATION">%1$s</xliff:g>"</string> + <string name="whichOpenHostLinksWithApp" msgid="3464470639011045589">"Vula izixhumanisi ze-<xliff:g id="HOST">%1$s</xliff:g> nge-<xliff:g id="APPLICATION">%2$s</xliff:g>"</string> <string name="whichGiveAccessToApplicationLabel" msgid="6142688895536868827">"Nikeza ukufinyel"</string> <string name="whichEditApplication" msgid="144727838241402655">"Hlela nge-"</string> <string name="whichEditApplicationNamed" msgid="1775815530156447790">"Hlela nge-%1$s"</string> @@ -1590,8 +1586,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Njalo"</string> - <!-- no translation found for activity_resolver_set_always (1422574191056490585) --> - <skip /> + <string name="activity_resolver_set_always" msgid="1422574191056490585">"Setha ukuthi kuhlale kuvuliwe"</string> <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kanye nje"</string> <string name="activity_resolver_app_settings" msgid="8965806928986509855">"Izilungiselelo"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s ayisekeli iphrofayela yomsebenzi"</string> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5363ef920886..039bc4d925a1 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -90,6 +90,24 @@ orientation. If zero, the value of rounded_corner_radius is used. --> <dimen name="rounded_corner_radius_bottom">0dp</dimen> + <!-- Default adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius to more accurately provide a "radius" for the rounded corner. --> + <dimen name="rounded_corner_radius_adjustment">0px</dimen> + <!-- Top adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the top rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_top to more accurately provide a "radius" for the top rounded corners. + --> + <dimen name="rounded_corner_radius_top_adjustment">0px</dimen> + <!-- Bottom adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the bottom rounded corner in + cases where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_bottom to more accurately provide a "radius" for the bottom rounded + corners. --> + <dimen name="rounded_corner_radius_bottom_adjustment">0px</dimen> + <!-- Width of the window of the divider bar used to resize docked stacks. --> <dimen name="docked_stack_divider_thickness">48dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 498e60e0405b..b3b1b9fc01f2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3708,6 +3708,9 @@ <java-symbol type="dimen" name="rounded_corner_radius" /> <java-symbol type="dimen" name="rounded_corner_radius_top" /> <java-symbol type="dimen" name="rounded_corner_radius_bottom" /> + <java-symbol type="dimen" name="rounded_corner_radius_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_top_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_bottom_adjustment" /> <java-symbol type="bool" name="config_supportsRoundedCornersOnWindows" /> <java-symbol type="string" name="config_defaultModuleMetadataProvider" /> diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml deleted file mode 100644 index 6503f3ee6d57..000000000000 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ /dev/null @@ -1,86 +0,0 @@ -<!-- - Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- overlayable_icons references all of the drawables in this package - that are being overlayed by resource overlays. If you remove/rename - any of these resources, you must also change the resource overlay icons.--> - <array name="overlayable_icons"> - <item>@*android:drawable/ic_audio_alarm</item> - <item>@*android:drawable/ic_audio_alarm_mute</item> - <item>@*android:drawable/ic_battery_80_24dp</item> - <item>@*android:drawable/ic_bluetooth_share_icon</item> - <item>@*android:drawable/ic_bt_headphones_a2dp</item> - <item>@*android:drawable/ic_bt_headset_hfp</item> - <item>@*android:drawable/ic_bt_hearing_aid</item> - <item>@*android:drawable/ic_bt_laptop</item> - <item>@*android:drawable/ic_bt_misc_hid</item> - <item>@*android:drawable/ic_bt_network_pan</item> - <item>@*android:drawable/ic_bt_pointing_hid</item> - <item>@*android:drawable/ic_corp_badge</item> - <item>@*android:drawable/ic_expand_more</item> - <item>@*android:drawable/ic_faster_emergency</item> - <item>@*android:drawable/ic_file_copy</item> - <item>@*android:drawable/ic_lock</item> - <item>@*android:drawable/ic_lock_bugreport</item> - <item>@*android:drawable/ic_lock_open</item> - <item>@*android:drawable/ic_lock_power_off</item> - <item>@*android:drawable/ic_lockscreen_ime</item> - <item>@*android:drawable/ic_mode_edit</item> - <item>@*android:drawable/ic_notifications_alerted</item> - <item>@*android:drawable/ic_phone</item> - <item>@*android:drawable/ic_qs_airplane</item> - <item>@*android:drawable/ic_qs_auto_rotate</item> - <item>@*android:drawable/ic_qs_battery_saver</item> - <item>@*android:drawable/ic_qs_bluetooth</item> - <item>@*android:drawable/ic_qs_dnd</item> - <item>@*android:drawable/ic_qs_flashlight</item> - <item>@*android:drawable/ic_qs_night_display_on</item> - <item>@*android:drawable/ic_qs_ui_mode_night</item> - <item>@*android:drawable/ic_restart</item> - <item>@*android:drawable/ic_screenshot</item> - <item>@*android:drawable/ic_settings_bluetooth</item> - <item>@*android:drawable/ic_signal_cellular_0_4_bar</item> - <item>@*android:drawable/ic_signal_cellular_0_5_bar</item> - <item>@*android:drawable/ic_signal_cellular_1_4_bar</item> - <item>@*android:drawable/ic_signal_cellular_1_5_bar</item> - <item>@*android:drawable/ic_signal_cellular_2_4_bar</item> - <item>@*android:drawable/ic_signal_cellular_2_5_bar</item> - <item>@*android:drawable/ic_signal_cellular_3_4_bar</item> - <item>@*android:drawable/ic_signal_cellular_3_5_bar</item> - <item>@*android:drawable/ic_signal_cellular_4_4_bar</item> - <item>@*android:drawable/ic_signal_cellular_4_5_bar</item> - <item>@*android:drawable/ic_signal_cellular_5_5_bar</item> - <item>@*android:drawable/ic_signal_location</item> - <item>@*android:drawable/ic_wifi_signal_0</item> - <item>@*android:drawable/ic_wifi_signal_1</item> - <item>@*android:drawable/ic_wifi_signal_2</item> - <item>@*android:drawable/ic_wifi_signal_3</item> - <item>@*android:drawable/ic_wifi_signal_4</item> - <item>@*android:drawable/perm_group_activity_recognition</item> - <item>@*android:drawable/perm_group_aural</item> - <item>@*android:drawable/perm_group_calendar</item> - <item>@*android:drawable/perm_group_call_log</item> - <item>@*android:drawable/perm_group_camera</item> - <item>@*android:drawable/perm_group_contacts</item> - <item>@*android:drawable/perm_group_location</item> - <item>@*android:drawable/perm_group_microphone</item> - <item>@*android:drawable/perm_group_phone_calls</item> - <item>@*android:drawable/perm_group_sensors</item> - <item>@*android:drawable/perm_group_sms</item> - <item>@*android:drawable/perm_group_storage</item> - <item>@*android:drawable/perm_group_visual</item> - </array> -</resources> diff --git a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java index d5163e193510..eff4826040f4 100644 --- a/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java +++ b/core/tests/coretests/src/android/os/RedactingFileDescriptorTest.java @@ -64,7 +64,7 @@ public class RedactingFileDescriptorTest { @Test public void testSingleByte() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 10, 11 }).getFileDescriptor(); + new long[] { 10, 11 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[1_000]; assertEquals(buf.length, Os.read(fd, buf, 0, buf.length)); @@ -80,7 +80,7 @@ public class RedactingFileDescriptorTest { @Test public void testRanges() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); final byte[] buf = new byte[10]; assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 90)); @@ -102,7 +102,7 @@ public class RedactingFileDescriptorTest { @Test public void testEntireFile() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_ONLY, - new long[] { 0, 5_000_000 }).getFileDescriptor(); + new long[] { 0, 5_000_000 }, new long[] {}).getFileDescriptor(); try (FileInputStream in = new FileInputStream(fd)) { int val; @@ -115,7 +115,7 @@ public class RedactingFileDescriptorTest { @Test public void testReadWrite() throws Exception { final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, - new long[] { 100, 200, 300, 400 }).getFileDescriptor(); + new long[] { 100, 200, 300, 400 }, new long[] {}).getFileDescriptor(); // Redacted at first final byte[] buf = new byte[10]; @@ -168,4 +168,76 @@ public class RedactingFileDescriptorTest { assertArrayEquals(new long[] { 100, 200 }, removeRange(new long[] { 100, 200 }, 150, 150)); } + + @Test + public void testFreeAtStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {1}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAtOffset() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {3}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, (byte) 'f', (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionStart() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 10 }, new long[] {0}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', (byte) 'e', (byte) 'e', 0, 0, 0, 0, 0, 0 }, + buf); + } + + @Test + public void testFreeAcrossRedactionEnd() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 3 }, new long[] {2}).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, (byte) 'f', 64, 64, 64, 64, 64, 64, 64 }, + buf); + } + + @Test + public void testFreeOutsideRedaction() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 8 }, new long[] { 8 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, 0, 0, 0, 0, 0, 0, 0, 64, 64 }, + buf); + } + + @Test + public void testFreeMultipleRedactions() throws Exception { + final FileDescriptor fd = RedactingFileDescriptor.open(mContext, mFile, MODE_READ_WRITE, + new long[] { 1, 2, 3, 4 }, new long[] { 0 }).getFileDescriptor(); + + final byte[] buf = new byte[10]; + assertEquals(buf.length, Os.pread(fd, buf, 0, 10, 0)); + assertArrayEquals( + new byte[] { 64, (byte) 'r', 64, (byte) 'e', 64, 64, 64, 64, 64, 64 }, + buf); + } } diff --git a/media/java/android/media/IMediaRoute2Provider.aidl b/media/java/android/media/IMediaRoute2Provider.aidl index 4bd57106febe..f132cefbfdc7 100644 --- a/media/java/android/media/IMediaRoute2Provider.aidl +++ b/media/java/android/media/IMediaRoute2Provider.aidl @@ -23,7 +23,8 @@ import android.media.IMediaRoute2ProviderClient; * {@hide} */ oneway interface IMediaRoute2Provider { - void registerClient(IMediaRoute2ProviderClient client); - void selectRoute(IMediaRoute2ProviderClient client, int uid, String id); - void notifyControlRequestSent(IMediaRoute2ProviderClient client, String id, in Intent request); + void setClient(IMediaRoute2ProviderClient client); + void selectRoute(String packageName, String id); + void unselectRoute(String packageName, String id); + void notifyControlRequestSent(String id, in Intent request); } diff --git a/media/java/android/media/IMediaRoute2ProviderClient.aidl b/media/java/android/media/IMediaRoute2ProviderClient.aidl index e849e190e8b8..8d08beb4a72c 100644 --- a/media/java/android/media/IMediaRoute2ProviderClient.aidl +++ b/media/java/android/media/IMediaRoute2ProviderClient.aidl @@ -22,6 +22,5 @@ import android.media.MediaRoute2ProviderInfo; * @hide */ oneway interface IMediaRoute2ProviderClient { - void notifyRouteSelected(int uid, String routeId); void notifyProviderInfoUpdated(in MediaRoute2ProviderInfo info); } diff --git a/media/java/android/media/IMediaRouter2Manager.aidl b/media/java/android/media/IMediaRouter2Manager.aidl index b8c00a335d13..b059bd3cec91 100644 --- a/media/java/android/media/IMediaRouter2Manager.aidl +++ b/media/java/android/media/IMediaRouter2Manager.aidl @@ -23,7 +23,7 @@ import android.media.MediaRoute2Info; * {@hide} */ oneway interface IMediaRouter2Manager { - void notifyRouteSelected(int uid, in MediaRoute2Info route); - void notifyControlCategoriesChanged(int uid, in List<String> categories); + void notifyRouteSelected(String packageName, in MediaRoute2Info route); + void notifyControlCategoriesChanged(String packageName, in List<String> categories); void notifyProviderInfosUpdated(in List<MediaRoute2ProviderInfo> providers); } diff --git a/media/java/android/media/IMediaRouterService.aidl b/media/java/android/media/IMediaRouterService.aidl index fb108b4a85ec..08266a5a2051 100644 --- a/media/java/android/media/IMediaRouterService.aidl +++ b/media/java/android/media/IMediaRouterService.aidl @@ -48,8 +48,8 @@ interface IMediaRouterService { /** * Changes the selected route of the client. * - * @param client Client to change it's selected route. - * @param route Route to be selected. + * @param client the client that changes it's selected route + * @param route the route to be selected */ void selectRoute2(IMediaRouter2Client client, in @nullable MediaRoute2Info route); void setControlCategories(IMediaRouter2Client client, in List<String> categories); @@ -60,10 +60,10 @@ interface IMediaRouterService { /** * Changes the selected route of an application. * - * @param manager Manager that calls the method - * @param uid UID of the client that will change the selected route. - * @param route Route to be selected. + * @param manager the manager that calls the method + * @param packageName the package name of the client that will change the selected route + * @param route the route to be selected */ - void selectClientRoute2(IMediaRouter2Manager manager, int clientUid, + void selectClientRoute2(IMediaRouter2Manager manager, String packageName, in @nullable MediaRoute2Info route); } diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 855cd77f019e..f13a64c1520b 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -52,6 +52,8 @@ public final class MediaRoute2Info implements Parcelable { @Nullable final String mDescription; @Nullable + final String mClientPackageName; + @Nullable final Bundle mExtras; MediaRoute2Info(@NonNull Builder builder) { @@ -59,6 +61,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = builder.mProviderId; mName = builder.mName; mDescription = builder.mDescription; + mClientPackageName = builder.mClientPackageName; mExtras = builder.mExtras; } @@ -67,6 +70,7 @@ public final class MediaRoute2Info implements Parcelable { mProviderId = in.readString(); mName = in.readString(); mDescription = in.readString(); + mClientPackageName = in.readString(); mExtras = in.readBundle(); } @@ -98,6 +102,7 @@ public final class MediaRoute2Info implements Parcelable { && Objects.equals(mProviderId, other.mProviderId) && Objects.equals(mName, other.mName) && Objects.equals(mDescription, other.mDescription) + && Objects.equals(mClientPackageName, other.mClientPackageName) //TODO: This will be evaluated as false in most cases. Try not to. && Objects.equals(mExtras, other.mExtras); } @@ -131,6 +136,16 @@ public final class MediaRoute2Info implements Parcelable { return mDescription; } + /** + * Gets the package name of the client that uses the route. + * Returns null if no clients use this. + * @hide + */ + @Nullable + public String getClientPackageName() { + return mClientPackageName; + } + @Nullable public Bundle getExtras() { return mExtras; @@ -147,6 +162,7 @@ public final class MediaRoute2Info implements Parcelable { dest.writeString(mProviderId); dest.writeString(mName); dest.writeString(mDescription); + dest.writeString(mClientPackageName); dest.writeBundle(mExtras); } @@ -170,6 +186,7 @@ public final class MediaRoute2Info implements Parcelable { String mProviderId; String mName; String mDescription; + String mClientPackageName; Bundle mExtras; public Builder(@NonNull String id, @NonNull String name) { @@ -194,6 +211,7 @@ public final class MediaRoute2Info implements Parcelable { } setName(routeInfo.mName); mDescription = routeInfo.mDescription; + setClientPackageName(routeInfo.mClientPackageName); if (routeInfo.mExtras != null) { mExtras = new Bundle(routeInfo.mExtras); } @@ -246,6 +264,15 @@ public final class MediaRoute2Info implements Parcelable { } /** + * Sets the package name of the app using the route. + */ + @NonNull + public Builder setClientPackageName(@Nullable String packageName) { + mClientPackageName = packageName; + return this; + } + + /** * Sets a bundle of extras for the route. */ @NonNull diff --git a/media/java/android/media/MediaRoute2ProviderService.java b/media/java/android/media/MediaRoute2ProviderService.java index 30e0ef1fc182..b89b0b1a5f02 100644 --- a/media/java/android/media/MediaRoute2ProviderService.java +++ b/media/java/android/media/MediaRoute2ProviderService.java @@ -36,7 +36,6 @@ public abstract class MediaRoute2ProviderService extends Service { private final Handler mHandler; private ProviderStub mStub; - //TODO: Should allow multiple clients private IMediaRoute2ProviderClient mClient; private MediaRoute2ProviderInfo mProviderInfo; @@ -46,6 +45,7 @@ public abstract class MediaRoute2ProviderService extends Service { @Override public IBinder onBind(Intent intent) { + //TODO: Allow binding from media router service only? if (SERVICE_INTERFACE.equals(intent.getAction())) { if (mStub == null) { mStub = new ProviderStub(); @@ -58,49 +58,37 @@ public abstract class MediaRoute2ProviderService extends Service { /** * Called when selectRoute is called on a route of the provider. * - * @param uid The target application uid - * @param routeId The id of the target route + * @param packageName the package name of the application that selected the route + * @param routeId the id of the route being selected */ - public abstract void onSelect(int uid, String routeId); + public abstract void onSelectRoute(String packageName, String routeId); /** - * Called when sendControlRequest is called on a route of the provider. + * Called when unselectRoute is called on a route of the provider. * - * @param routeId The id of the target route - * @param request The media control request intent + * @param packageName the package name of the application that has selected the route. + * @param routeId the id of the route being unselected */ - //TODO: Discuss what to use for request (e.g., Intent? Request class?) - public abstract void onControlRequest(String routeId, Intent request); + public abstract void onUnselectRoute(String packageName, String routeId); /** - * Updates provider info from selected route and application. - * - * TODO: When provider descriptor is defined, this should update the descriptor correctly. + * Called when sendControlRequest is called on a route of the provider * - * @param uid - * @param routeId + * @param routeId the id of the target route + * @param request the media control request intent */ - public void updateProvider(int uid, String routeId) { - if (mClient != null) { - try { - //TODO: After publishState() is fully implemented, delete this. - mClient.notifyRouteSelected(uid, routeId); - } catch (RemoteException ex) { - Log.d(TAG, "Failed to update provider"); - } - } - publishState(); - } + //TODO: Discuss what to use for request (e.g., Intent? Request class?) + public abstract void onControlRequest(String routeId, Intent request); /** - * Updates provider info and publish routes + * Updates provider info and publishes routes */ public final void setProviderInfo(MediaRoute2ProviderInfo info) { mProviderInfo = info; publishState(); } - void registerClient(IMediaRoute2ProviderClient client) { + void setClient(IMediaRoute2ProviderClient client) { mClient = client; publishState(); } @@ -120,20 +108,25 @@ public abstract class MediaRoute2ProviderService extends Service { ProviderStub() { } @Override - public void registerClient(IMediaRoute2ProviderClient client) { - mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::registerClient, + public void setClient(IMediaRoute2ProviderClient client) { + mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::setClient, MediaRoute2ProviderService.this, client)); } @Override - public void selectRoute(IMediaRoute2ProviderClient client, int uid, String id) { - mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSelect, - MediaRoute2ProviderService.this, uid, id)); + public void selectRoute(String packageName, String id) { + mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onSelectRoute, + MediaRoute2ProviderService.this, packageName, id)); + } + + @Override + public void unselectRoute(String packageName, String id) { + mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onUnselectRoute, + MediaRoute2ProviderService.this, packageName, id)); } @Override - public void notifyControlRequestSent(IMediaRoute2ProviderClient client, String id, - Intent request) { + public void notifyControlRequestSent(String id, Intent request) { mHandler.sendMessage(obtainMessage(MediaRoute2ProviderService::onControlRequest, MediaRoute2ProviderService.this, id, request)); } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 2d7dc56339e1..5fc37a579d92 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -38,6 +38,7 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; /** @@ -58,11 +59,13 @@ public class MediaRouter2Manager { final Handler mHandler; @GuardedBy("sLock") - final ArrayList<CallbackRecord> mCallbacks = new ArrayList<>(); + final List<CallbackRecord> mCallbacks = new CopyOnWriteArrayList<>(); @SuppressWarnings("WeakerAccess") /* synthetic access */ @NonNull List<MediaRoute2ProviderInfo> mProviders = Collections.emptyList(); + @NonNull + List<MediaRoute2Info> mRoutes = Collections.emptyList(); /** * Gets an instance of media router manager that controls media route of other applications. @@ -158,15 +161,26 @@ public class MediaRouter2Manager { } /** - * Selects media route for the specified application uid. + * Gets available routes for an application. + * + * @param packageName the package name of the application + */ + @NonNull + public List<MediaRoute2Info> getAvailableRoutes(@NonNull String packageName) { + //TODO: filter irrelevant routes. + return Collections.unmodifiableList(mRoutes); + } + + /** + * Selects media route for the specified package name. * - * @param uid The uid of the application that should change it's media route. - * @param route The route to select + * @param packageName the package name of the application that should change it's media route + * @param route the route to be selected */ - public void selectRoute(int uid, MediaRoute2Info route) { + public void selectRoute(@NonNull String packageName, @NonNull MediaRoute2Info route) { if (mClient != null) { try { - mMediaRouterService.selectClientRoute2(mClient, uid, route); + mMediaRouterService.selectClientRoute2(mClient, packageName, route); } catch (RemoteException ex) { Log.e(TAG, "Unable to select media route", ex); } @@ -174,14 +188,14 @@ public class MediaRouter2Manager { } /** - * Unselects media route for the specified application uid. + * Unselects media route for the specified package name. * - * @param uid The uid of the application that should stop routing. + * @param packageName the package name of the application that should stop routing */ - public void unselectRoute(int uid) { + public void unselectRoute(@NonNull String packageName) { if (mClient != null) { try { - mMediaRouterService.selectClientRoute2(mClient, uid, null); + mMediaRouterService.selectClientRoute2(mClient, packageName, null); } catch (RemoteException ex) { Log.e(TAG, "Unable to select media route", ex); } @@ -260,31 +274,46 @@ public class MediaRouter2Manager { } } + void notifyRouteListChanged() { + for (CallbackRecord record: mCallbacks) { + record.mExecutor.execute( + () -> record.mCallback.onRouteListChanged(mRoutes)); + } + } + void notifyProviderInfosUpdated(List<MediaRoute2ProviderInfo> providers) { if (providers == null) { Log.w(TAG, "Providers info is null."); return; } + ArrayList<MediaRoute2Info> routes = new ArrayList<>(); + for (MediaRoute2ProviderInfo provider : providers) { updateProvider(provider); + //TODO: Should we do this in updateProvider()? + routes.addAll(provider.getRoutes()); } //TODO: Call notifyRouteRemoved for the routes of the removed providers. - //TODO: Filter invalid providers. + //TODO: Filter invalid providers and invalid routes. mProviders = providers; + mRoutes = routes; + + //TODO: Call this when only the list is modified. + notifyRouteListChanged(); } - void notifyRouteSelected(int uid, MediaRoute2Info route) { + void notifyRouteSelected(String packageName, MediaRoute2Info route) { for (CallbackRecord record : mCallbacks) { - record.mExecutor.execute(() -> record.mCallback.onRouteSelected(uid, route)); + record.mExecutor.execute(() -> record.mCallback.onRouteSelected(packageName, route)); } } - void notifyControlCategoriesChanged(int uid, List<String> categories) { + void notifyControlCategoriesChanged(String packageName, List<String> categories) { for (CallbackRecord record : mCallbacks) { record.mExecutor.execute( - () -> record.mCallback.onControlCategoriesChanged(uid, categories)); + () -> record.mCallback.onControlCategoriesChanged(packageName, categories)); } } @@ -309,17 +338,27 @@ public class MediaRouter2Manager { /** * Called when a route is selected for an application. - * @param uid uid of the application - * @param route selected route of the application. + * + * @param packageName the package name of the application + * @param route the selected route of the application. + * It is null if the application has no selected route. */ - public void onRouteSelected(int uid, @Nullable MediaRoute2Info route) {} + public void onRouteSelected(@NonNull String packageName, @Nullable MediaRoute2Info route) {} /** * Called when the control categories of an application is changed. - * @param uid the uid of the app that changed control categories + * + * @param packageName the package name of the app that changed control categories * @param categories the changed categories */ - public void onControlCategoriesChanged(int uid, @NonNull List<String> categories) {} + public void onControlCategoriesChanged(@NonNull String packageName, + @NonNull List<String> categories) {} + + /** + * Called when the list of routes are changed. + * A client may refresh available routes for each application. + */ + public void onRouteListChanged(@NonNull List<MediaRoute2Info> routes) {} } final class CallbackRecord { @@ -343,15 +382,15 @@ public class MediaRouter2Manager { class Client extends IMediaRouter2Manager.Stub { @Override - public void notifyRouteSelected(int uid, MediaRoute2Info route) { + public void notifyRouteSelected(String packageName, MediaRoute2Info route) { mHandler.sendMessage(obtainMessage(MediaRouter2Manager::notifyRouteSelected, - MediaRouter2Manager.this, uid, route)); + MediaRouter2Manager.this, packageName, route)); } @Override - public void notifyControlCategoriesChanged(int uid, List<String> categories) { + public void notifyControlCategoriesChanged(String packageName, List<String> categories) { mHandler.sendMessage(obtainMessage(MediaRouter2Manager::notifyControlCategoriesChanged, - MediaRouter2Manager.this, uid, categories)); + MediaRouter2Manager.this, packageName, categories)); } @Override diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index a67a37eedd27..01e6ed5e9f35 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -62,7 +62,8 @@ interface ISessionManager { // For PhoneWindowManager to precheck media keys boolean isGlobalPriorityActive(); - void setCallback(in ICallback callback); + void registerCallback(in ICallback callback); + void unregisterCallback(in ICallback callback); void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener); void setOnMediaKeyListener(in IOnMediaKeyListener listener); diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index dec0140c0d5c..1f2283c6381f 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -46,7 +46,9 @@ import android.view.KeyEvent; import com.android.internal.annotations.GuardedBy; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; /** @@ -72,6 +74,7 @@ public final class MediaSessionManager { * @hide */ public static final int RESULT_MEDIA_KEY_HANDLED = 1; + private final ISessionManager mService; private final Object mLock = new Object(); @GuardedBy("mLock") @@ -80,13 +83,21 @@ public final class MediaSessionManager { @GuardedBy("mLock") private final ArrayMap<OnSession2TokensChangedListener, Session2TokensChangedWrapper> mSession2TokensListeners = new ArrayMap<>(); - private final ISessionManager mService; + @GuardedBy("mLock") + private final CallbackStub mCbStub = new CallbackStub(); + @GuardedBy("mLock") + private final Map<Callback, Handler> mCallbacks = new HashMap<>(); + @GuardedBy("mLock") + private MediaSession.Token mCurMediaButtonSession; + @GuardedBy("mLock") + private ComponentName mCurMediaButtonReceiver; private Context mContext; - - private CallbackImpl mCallback; private OnVolumeKeyLongPressListenerImpl mOnVolumeKeyLongPressListener; private OnMediaKeyListenerImpl mOnMediaKeyListener; + // TODO: Remove mLegacyCallback once Bluetooth app stop calling setCallback() method. + @GuardedBy("mLock") + private Callback mLegacyCallback; /** * @hide @@ -752,18 +763,71 @@ public final class MediaSessionManager { * if the callback should be invoked on the calling thread's looper. * @hide */ + // TODO: Remove this method once Bluetooth app stop calling it. public void setCallback(@Nullable Callback callback, @Nullable Handler handler) { synchronized (mLock) { + if (mLegacyCallback != null) { + unregisterCallback(mLegacyCallback); + } + mLegacyCallback = callback; + if (callback != null) { + registerCallback(callback, handler); + } + } + } + + /** + * Register a {@link Callback}. + * + * @param callback A {@link Callback}. + * @param handler The handler on which the callback should be invoked, or {@code null} + * if the callback should be invoked on the calling thread's looper. + * @hide + */ + @SystemApi + @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL) + public void registerCallback(@NonNull Callback callback, @Nullable Handler handler) { + if (callback == null) { + throw new NullPointerException("callback shouldn't be null"); + } + synchronized (mLock) { try { - if (callback == null) { - mCallback = null; - mService.setCallback(null); - } else { - if (handler == null) { - handler = new Handler(); - } - mCallback = new CallbackImpl(callback, handler); - mService.setCallback(mCallback); + if (handler == null) { + handler = new Handler(); + } + mCallbacks.put(callback, handler); + if (mCurMediaButtonSession != null) { + handler.post(() -> callback.onAddressedPlayerChanged(mCurMediaButtonSession)); + } else if (mCurMediaButtonReceiver != null) { + handler.post(() -> callback.onAddressedPlayerChanged(mCurMediaButtonReceiver)); + } + + if (mCallbacks.size() == 1) { + mService.registerCallback(mCbStub); + } + } catch (RemoteException e) { + Log.e(TAG, "Failed to set media key callback", e); + } + } + } + + /** + * Unregister a {@link Callback}. + * + * @param callback A {@link Callback}. + * @hide + */ + @SystemApi + @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL) + public void unregisterCallback(@NonNull Callback callback) { + if (callback == null) { + throw new NullPointerException("callback shouldn't be null"); + } + synchronized (mLock) { + try { + mCallbacks.remove(callback); + if (mCallbacks.size() == 0) { + mService.unregisterCallback(mCbStub); } } catch (RemoteException e) { Log.e(TAG, "Failed to set media key callback", e); @@ -835,6 +899,7 @@ public final class MediaSessionManager { * receive media key events. * @hide */ + @SystemApi public static abstract class Callback { /** * Called when a media key event is dispatched to the media session @@ -861,7 +926,7 @@ public final class MediaSessionManager { /** * Called when the addressed player is changed to a media session. * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after - * {@link #setCallback} if the addressed player exists. + * {@link #registerCallback} if the addressed player exists. * * @param sessionToken The media session's token. */ @@ -870,7 +935,7 @@ public final class MediaSessionManager { /** * Called when the addressed player is changed to the media button receiver. * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after - * {@link #setCallback} if the addressed player exists. + * {@link #registerCallback} if the addressed player exists. * * @param mediaButtonReceiver The media button receiver. */ @@ -1076,56 +1141,52 @@ public final class MediaSessionManager { } } - private static final class CallbackImpl extends ICallback.Stub { - private final Callback mCallback; - private final Handler mHandler; - - public CallbackImpl(@NonNull Callback callback, @NonNull Handler handler) { - mCallback = callback; - mHandler = handler; - } + private final class CallbackStub extends ICallback.Stub { @Override public void onMediaKeyEventDispatchedToMediaSession(KeyEvent event, MediaSession.Token sessionToken) { - mHandler.post(new Runnable() { - @Override - public void run() { - mCallback.onMediaKeyEventDispatched(event, sessionToken); + synchronized (mLock) { + for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { + e.getValue().post( + () -> e.getKey().onMediaKeyEventDispatched(event, sessionToken)); } - }); + } } @Override public void onMediaKeyEventDispatchedToMediaButtonReceiver(KeyEvent event, ComponentName mediaButtonReceiver) { - mHandler.post(new Runnable() { - @Override - public void run() { - mCallback.onMediaKeyEventDispatched(event, mediaButtonReceiver); + synchronized (mLock) { + for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { + e.getValue().post( + () -> e.getKey().onMediaKeyEventDispatched(event, mediaButtonReceiver)); } - }); + } } @Override public void onAddressedPlayerChangedToMediaSession(MediaSession.Token sessionToken) { - mHandler.post(new Runnable() { - @Override - public void run() { - mCallback.onAddressedPlayerChanged(sessionToken); + synchronized (mLock) { + mCurMediaButtonSession = sessionToken; + mCurMediaButtonReceiver = null; + for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { + e.getValue().post(() -> e.getKey().onAddressedPlayerChanged(sessionToken)); } - }); + } } @Override public void onAddressedPlayerChangedToMediaButtonReceiver( ComponentName mediaButtonReceiver) { - mHandler.post(new Runnable() { - @Override - public void run() { - mCallback.onAddressedPlayerChanged(mediaButtonReceiver); + synchronized (mLock) { + mCurMediaButtonSession = null; + mCurMediaButtonReceiver = mediaButtonReceiver; + for (Map.Entry<Callback, Handler> e : mCallbacks.entrySet()) { + e.getValue().post(() -> e.getKey().onAddressedPlayerChanged( + mediaButtonReceiver)); } - }); + } } } } diff --git a/media/tests/MediaRouteProvider/src/com/android/mediarouteprovider/example/SampleMediaRoute2ProviderService.java b/media/tests/MediaRouteProvider/src/com/android/mediarouteprovider/example/SampleMediaRoute2ProviderService.java index 21cb93d4f12e..2cdc6a8101d7 100644 --- a/media/tests/MediaRouteProvider/src/com/android/mediarouteprovider/example/SampleMediaRoute2ProviderService.java +++ b/media/tests/MediaRouteProvider/src/com/android/mediarouteprovider/example/SampleMediaRoute2ProviderService.java @@ -59,8 +59,26 @@ public class SampleMediaRoute2ProviderService extends MediaRoute2ProviderService } @Override - public void onSelect(int uid, String routeId) { - updateProvider(uid, routeId); + public void onSelectRoute(String packageName, String routeId) { + MediaRoute2Info route = mRoutes.get(routeId); + if (route == null) { + return; + } + mRoutes.put(routeId, new MediaRoute2Info.Builder(route) + .setClientPackageName(packageName) + .build()); + publishRoutes(); + } + + @Override + public void onUnselectRoute(String packageName, String routeId) { + MediaRoute2Info route = mRoutes.get(routeId); + if (route == null) { + return; + } + mRoutes.put(routeId, new MediaRoute2Info.Builder(route) + .setClientPackageName(null) + .build()); publishRoutes(); } diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java index aa062cd996ae..03b43e215c25 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java @@ -16,6 +16,8 @@ package com.android.mediaroutertest; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.timeout; @@ -37,7 +39,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.SynchronousQueue; @@ -49,8 +53,6 @@ import java.util.concurrent.TimeUnit; public class MediaRouterManagerTest { private static final String TAG = "MediaRouterManagerTest"; - private static final int TARGET_UID = 109992; - // Must be the same as SampleMediaRoute2ProviderService public static final String ROUTE_ID1 = "route_id1"; public static final String ROUTE_NAME1 = "Sample Route 1"; @@ -59,13 +61,13 @@ public class MediaRouterManagerTest { public static final String ACTION_REMOVE_ROUTE = "com.android.mediarouteprovider.action_remove_route"; - private static final int AWAIT_MS = 1000; private static final int TIMEOUT_MS = 5000; private Context mContext; private MediaRouter2Manager mManager; private MediaRouter2 mRouter; private Executor mExecutor; + private String mPackageName; private static final List<String> TEST_CONTROL_CATEGORIES = new ArrayList(); private static final String CONTROL_CATEGORY_1 = "android.media.mediarouter.MEDIA1"; @@ -83,6 +85,20 @@ public class MediaRouterManagerTest { mExecutor = new ThreadPoolExecutor( 1, 20, 3, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); + mPackageName = mContext.getPackageName(); + } + + @Test + public void testMediaRoute2Info() { + MediaRoute2Info routeInfo1 = new MediaRoute2Info.Builder("id", "name") + .build(); + MediaRoute2Info routeInfo2 = new MediaRoute2Info.Builder(routeInfo1).build(); + + MediaRoute2Info routeInfo3 = new MediaRoute2Info.Builder(routeInfo1) + .setClientPackageName(mPackageName).build(); + + assertEquals(routeInfo1, routeInfo2); + assertNotEquals(routeInfo1, routeInfo3); } //TODO: Test onRouteChanged when it's properly implemented. @@ -124,34 +140,30 @@ public class MediaRouterManagerTest { @Test public void controlCategoryTest() throws Exception { - final int uid = android.os.Process.myUid(); - MediaRouter2Manager.Callback mockCallback = mock(MediaRouter2Manager.Callback.class); mManager.addCallback(mExecutor, mockCallback); MediaRouter2.Callback mockRouterCallback = mock(MediaRouter2.Callback.class); InstrumentationRegistry.getInstrumentation().runOnMainSync( - (Runnable) () -> { + () -> { mRouter.addCallback(TEST_CONTROL_CATEGORIES, mExecutor, mockRouterCallback); mRouter.removeCallback(mockRouterCallback); } ); verify(mockCallback, timeout(TIMEOUT_MS).atLeastOnce()) - .onControlCategoriesChanged(uid, TEST_CONTROL_CATEGORIES); + .onControlCategoriesChanged(mPackageName, TEST_CONTROL_CATEGORIES); mManager.removeCallback(mockCallback); } @Test - public void selectRouteTest() throws Exception { - final int uid = android.os.Process.myUid(); - + public void onRouteSelectedTest() throws Exception { CountDownLatch latch = new CountDownLatch(1); MediaRouter2.Callback mockRouterCallback = mock(MediaRouter2.Callback.class); InstrumentationRegistry.getInstrumentation().runOnMainSync( - (Runnable) () -> { + () -> { mRouter.addCallback(TEST_CONTROL_CATEGORIES, mExecutor, mockRouterCallback); } ); @@ -163,22 +175,19 @@ public class MediaRouterManagerTest { public void onRouteAdded(MediaRoute2Info routeInfo) { if (mSelectedRoute == null) { mSelectedRoute = routeInfo; - mManager.selectRoute(uid, mSelectedRoute); + mManager.selectRoute(mPackageName, mSelectedRoute); } } @Override - public void onRouteSelected(int uid, MediaRoute2Info route) { - if (mSelectedRoute != null && route != null + public void onRouteSelected(String packageName, MediaRoute2Info route) { + if (TextUtils.equals(packageName, mPackageName) + && mSelectedRoute != null + && route != null && TextUtils.equals(route.getId(), mSelectedRoute.getId())) { latch.countDown(); } } - - @Override - public void onControlCategoriesChanged(int uid, List<String> categories) { - - } }; mManager.addCallback(mExecutor, managerCallback); @@ -187,4 +196,55 @@ public class MediaRouterManagerTest { mManager.removeCallback(managerCallback); } + + @Test + /** + * Tests selecting and unselecting routes of a single provider. + */ + public void testSingleProviderSelect() { + MediaRouter2Manager.Callback managerCallback = mock(MediaRouter2Manager.Callback.class); + MediaRouter2.Callback routerCallback = mock(MediaRouter2.Callback.class); + + mManager.addCallback(mExecutor, managerCallback); + InstrumentationRegistry.getInstrumentation().runOnMainSync( + () -> { + mRouter.addCallback(TEST_CONTROL_CATEGORIES, mExecutor, routerCallback); + } + ); + verify(managerCallback, timeout(TIMEOUT_MS)) + .onRouteListChanged(argThat(routes -> routes.size() > 0)); + + Map<String, MediaRoute2Info> routes = + createRouteMap(mManager.getAvailableRoutes(mPackageName)); + + mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)); + verify(managerCallback, timeout(TIMEOUT_MS)) + .onRouteChanged(argThat(routeInfo -> TextUtils.equals(ROUTE_ID1, routeInfo.getId()) + && TextUtils.equals(routeInfo.getClientPackageName(), mPackageName))); + + mManager.selectRoute(mPackageName, routes.get(ROUTE_ID2)); + verify(managerCallback, timeout(TIMEOUT_MS)) + .onRouteChanged(argThat(routeInfo -> TextUtils.equals(ROUTE_ID2, routeInfo.getId()) + && TextUtils.equals(routeInfo.getClientPackageName(), mPackageName))); + + mManager.unselectRoute(mPackageName); + verify(managerCallback, timeout(TIMEOUT_MS)) + .onRouteChanged(argThat(routeInfo -> TextUtils.equals(ROUTE_ID2, routeInfo.getId()) + && TextUtils.equals(routeInfo.getClientPackageName(), null))); + + InstrumentationRegistry.getInstrumentation().runOnMainSync( + () -> { + mRouter.removeCallback(routerCallback); + } + ); + mManager.removeCallback(managerCallback); + } + + Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { + Map<String, MediaRoute2Info> routeMap = new HashMap<>(); + for (MediaRoute2Info route : routes) { + routeMap.put(route.getId(), route); + } + return routeMap; + } } diff --git a/packages/CarSystemUI/res/values-night/colors.xml b/packages/CarSystemUI/res/values-night/colors.xml index dad94a894603..a2edd7dc5b4e 100644 --- a/packages/CarSystemUI/res/values-night/colors.xml +++ b/packages/CarSystemUI/res/values-night/colors.xml @@ -19,6 +19,9 @@ <color name="status_bar_background_color">#ff000000</color> <color name="system_bar_background_opaque">#ff0c1013</color> + <!-- The background color of the notification shade --> + <color name="notification_shade_background_color">#E0000000</color> + <!-- The color of the ripples on the untinted notifications --> <color name="notification_ripple_untinted_color">@color/ripple_material_dark</color> </resources> diff --git a/packages/CarSystemUI/res/values/colors.xml b/packages/CarSystemUI/res/values/colors.xml index e13c94052281..e0ae45662390 100644 --- a/packages/CarSystemUI/res/values/colors.xml +++ b/packages/CarSystemUI/res/values/colors.xml @@ -35,7 +35,7 @@ <drawable name="system_bar_background">@android:color/transparent</drawable> <!-- The background color of the notification shade --> - <color name="notification_shade_background_color">#DD000000</color> + <color name="notification_shade_background_color">#D6000000</color> <!-- The background color of the car volume dialog --> <color name="car_volume_dialog_background_color">@color/system_bar_background_opaque</color> diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 812adf94b8bc..71b9dc3e923f 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -27,6 +27,7 @@ import android.car.drivingstate.CarDrivingStateEvent; import android.car.drivingstate.CarUxRestrictionsManager; import android.car.hardware.power.CarPowerManager.CarPowerStateListener; import android.content.Context; +import android.content.res.Configuration; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -1078,6 +1079,21 @@ public class CarStatusBar extends StatusBar implements } } + @Override + public void onConfigChanged(Configuration newConfig) { + super.onConfigChanged(newConfig); + + int uiModeNightMask = (newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK); + + boolean dayNightModeChanged = uiModeNightMask == Configuration.UI_MODE_NIGHT_YES + || uiModeNightMask == Configuration.UI_MODE_NIGHT_NO; + + if (dayNightModeChanged) { + mNotificationView.setBackgroundColor( + mContext.getColor(R.color.notification_shade_background_color)); + } + } + private void calculatePercentageFromBottom(float height) { if (mNotificationView.getHeight() > 0) { mPercentageFromBottom = (int) Math.abs( diff --git a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml index 96046ad5f3df..35de8ef46508 100644 --- a/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml +++ b/packages/ExternalStorageProvider/res/values-pt-rPT/strings.xml @@ -19,5 +19,5 @@ <string name="app_label" msgid="7123375275748530234">"Armazenamento externo"</string> <string name="storage_description" msgid="8541974407321172792">"Armazenamento local"</string> <string name="root_internal_storage" msgid="827844243068584127">"Armazenamento interno"</string> - <string name="root_documents" msgid="4051252304075469250">"Documentos"</string> + <string name="root_documents" msgid="4051252304075469250">"Docs"</string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 932e40c77af0..a5857df8ba5a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -282,6 +282,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (mRestoredState == null) { updateState(STATE_AUTHENTICATING); + mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); final int hint = getHintStringResourceId(); if (hint != 0) { mErrorText.setText(hint); @@ -319,8 +320,6 @@ public abstract class BiometricDialogView extends LinearLayout { mDescriptionText.setText(descriptionText); } - mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); - if (requiresConfirmation() && mRestoredState == null) { mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(false); @@ -474,6 +473,8 @@ public abstract class BiometricDialogView extends LinearLayout { mHandler.removeMessages(MSG_RESET_MESSAGE); mErrorText.setTextColor(mTextColor); mErrorText.setText(R.string.biometric_dialog_tap_confirm); + mErrorText.setContentDescription( + getResources().getString(R.string.biometric_dialog_tap_confirm)); mErrorText.setVisibility(View.VISIBLE); announceAccessibilityEvent(); mPositiveButton.setVisibility(View.VISIBLE); @@ -487,6 +488,7 @@ public abstract class BiometricDialogView extends LinearLayout { if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { mNegativeButton.setText(R.string.cancel); + mNegativeButton.setContentDescription(getResources().getString(R.string.cancel)); } updateIcon(mState, newState); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 819ce5f317e8..6b2721a8440e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -210,6 +210,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mBootCompleted; private boolean mBootSendUserPresent; private boolean mShuttingDown; + private boolean mDozing; /** High level access to the power manager for WakeLocks */ private PowerManager mPM; @@ -713,11 +714,10 @@ public class KeyguardViewMediator extends SystemUI { com.android.keyguard.R.bool.config_enableKeyguardService)) { setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled( - KeyguardUpdateMonitor.getCurrentUser()), - mAodShowing, true /* forceCallbacks */); + KeyguardUpdateMonitor.getCurrentUser()), true /* forceCallbacks */); } else { // The system's keyguard is disabled or missing. - setShowingLocked(false, mAodShowing, true); + setShowingLocked(false /* showing */, true /* forceCallbacks */); } mStatusBarKeyguardViewManager = @@ -1326,7 +1326,7 @@ public class KeyguardViewMediator extends SystemUI { if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) { if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); // Without this, settings is not enabled until the lock screen first appears - setShowingLocked(false, mAodShowing); + setShowingLocked(false); hideLocked(); return; } @@ -1742,6 +1742,9 @@ public class KeyguardViewMediator extends SystemUI { private void updateActivityLockScreenState(boolean showing, boolean aodShowing) { mUiOffloadThread.submit(() -> { + if (DEBUG) { + Log.d(TAG, "updateActivityLockScreenState(" + showing + ", " + aodShowing + ")"); + } try { ActivityTaskManager.getService().setLockScreenShown(showing, aodShowing); } catch (RemoteException e) { @@ -1767,10 +1770,10 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "handleShow"); } - setShowingLocked(true, mAodShowing); - mStatusBarKeyguardViewManager.show(options); mHiding = false; mWakeAndUnlocking = false; + setShowingLocked(true); + mStatusBarKeyguardViewManager.show(options); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; adjustStatusBarLocked(); @@ -1877,7 +1880,7 @@ public class KeyguardViewMediator extends SystemUI { if (!mHiding) { // Tell ActivityManager that we canceled the keyguardExitAnimation. - setShowingLocked(mShowing, mAodShowing, true /* force */); + setShowingLocked(mShowing, true /* force */); return; } mHiding = false; @@ -1898,8 +1901,8 @@ public class KeyguardViewMediator extends SystemUI { playSounds(false); } + setShowingLocked(false); mWakeAndUnlocking = false; - setShowingLocked(false, mAodShowing); mDismissCallbackRegistry.notifyDismissSucceeded(); mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); resetKeyguardDonePendingLocked(); @@ -1959,7 +1962,7 @@ public class KeyguardViewMediator extends SystemUI { Trace.beginSection("KeyguardViewMediator#handleVerifyUnlock"); synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); - setShowingLocked(true, mAodShowing); + setShowingLocked(true); mStatusBarKeyguardViewManager.dismissAndCollapse(); } Trace.endSection(); @@ -2107,6 +2110,8 @@ public class KeyguardViewMediator extends SystemUI { pw.print(" mDeviceInteractive: "); pw.println(mDeviceInteractive); pw.print(" mGoingToSleep: "); pw.println(mGoingToSleep); pw.print(" mHiding: "); pw.println(mHiding); + pw.print(" mDozing: "); pw.println(mDozing); + pw.print(" mAodShowing: "); pw.println(mAodShowing); pw.print(" mWaitingUntilKeyguardVisible: "); pw.println(mWaitingUntilKeyguardVisible); pw.print(" mKeyguardDonePending: "); pw.println(mKeyguardDonePending); pw.print(" mHideAnimationRun: "); pw.println(mHideAnimationRun); @@ -2117,10 +2122,14 @@ public class KeyguardViewMediator extends SystemUI { } /** - * @param aodShowing true when AOD - or ambient mode - is showing. + * @param dozing true when AOD - or ambient mode - is showing. */ - public void setAodShowing(boolean aodShowing) { - setShowingLocked(mShowing, aodShowing); + public void setDozing(boolean dozing) { + if (dozing == mDozing) { + return; + } + mDozing = dozing; + setShowingLocked(mShowing); } /** @@ -2141,19 +2150,18 @@ public class KeyguardViewMediator extends SystemUI { } } - private void setShowingLocked(boolean showing, boolean aodShowing) { - setShowingLocked(showing, aodShowing, false /* forceCallbacks */); + private void setShowingLocked(boolean showing) { + setShowingLocked(showing, false /* forceCallbacks */); } - private void setShowingLocked(boolean showing, boolean aodShowing, boolean forceCallbacks) { + private void setShowingLocked(boolean showing, boolean forceCallbacks) { + final boolean aodShowing = mDozing && !mWakeAndUnlocking; final boolean notifyDefaultDisplayCallbacks = showing != mShowing || aodShowing != mAodShowing || forceCallbacks; + mShowing = showing; + mAodShowing = aodShowing; if (notifyDefaultDisplayCallbacks) { - mShowing = showing; - mAodShowing = aodShowing; - if (notifyDefaultDisplayCallbacks) { - notifyDefaultDisplayCallbacks(showing); - } + notifyDefaultDisplayCallbacks(showing); updateActivityLockScreenState(showing, aodShowing); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index c44f953615e3..cbaf85c511dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; +import android.graphics.Region; import android.util.Log; import android.util.Pools; import android.view.DisplayCutout; @@ -88,7 +89,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private int[] mTmpTwoArray = new int[2]; private boolean mHeadsUpGoingAway; private int mStatusBarState; - private Rect mTouchableRegion = new Rect(); + private Region mTouchableRegion = new Region(); private AnimationStateHandler mAnimationStateHandler; @@ -365,10 +366,11 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, info.touchableRegion.set(calculateTouchableRegion()); } - public Rect calculateTouchableRegion() { + public Region calculateTouchableRegion() { if (!hasPinnedHeadsUp()) { mTouchableRegion.set(0, 0, mStatusBarWindowView.getWidth(), mStatusBarHeight); updateRegionForNotch(mTouchableRegion); + } else { NotificationEntry topEntry = getTopEntry(); if (topEntry.isChildInGroup()) { @@ -388,7 +390,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, return mTouchableRegion; } - private void updateRegionForNotch(Rect region) { + private void updateRegionForNotch(Region region) { DisplayCutout cutout = mStatusBarWindowView.getRootWindowInsets().getDisplayCutout(); if (cutout == null) { return; @@ -460,6 +462,8 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, super.dumpInternal(fd, pw, args); pw.print(" mBarState="); pw.println(mStatusBarState); + pw.print(" mTouchableRegion="); + pw.println(mTouchableRegion); } /////////////////////////////////////////////////////////////////////////////////////////////// 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 f64fc81f37ef..971a7eeaca12 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -38,6 +38,7 @@ import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; +import android.graphics.Region; import android.os.PowerManager; import android.util.AttributeSet; import android.util.Log; @@ -676,9 +677,10 @@ public class NotificationPanelView extends PanelView implements private Rect calculateGestureExclusionRect() { Rect exclusionRect = null; - if (isFullyCollapsed()) { + Region touchableRegion = mHeadsUpManager.calculateTouchableRegion(); + if (isFullyCollapsed() && touchableRegion != null) { // Note: The heads up manager also calculates the non-pinned touchable region - exclusionRect = mHeadsUpManager.calculateTouchableRegion(); + exclusionRect = touchableRegion.getBounds(); } return exclusionRect != null ? exclusionRect 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 0970f2a7ae67..aebf1c8e2169 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1937,6 +1937,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (start) { mNotificationPanel.startWaitingForOpenPanelGesture(); + setPanelExpanded(true); } else { mNotificationPanel.stopWaitingForOpenPanelGesture(velocity); } @@ -3434,7 +3435,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.resetViews(dozingAnimated); updateQsExpansionEnabled(); - mKeyguardViewMediator.setAodShowing(mDozing); + mKeyguardViewMediator.setDozing(mDozing); mEntryManager.updateNotifications(); updateDozingState(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index b21ba096c361..45627631efe1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -163,7 +163,8 @@ public class MobileSignalController extends SignalController< | PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_DATA_ACTIVITY - | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE); + | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE + | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA), true, mObserver); mContext.getContentResolver().registerContentObserver(Global.getUriFor( @@ -636,6 +637,13 @@ public class MobileSignalController extends SignalController< updateTelephony(); } + + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + if (DEBUG) Log.d(mTag, "onActiveDataSubscriptionIdChanged: subId=" + subId); + updateDataSim(); + updateTelephony(); + } }; static class MobileIconGroup extends SignalController.IconGroup { diff --git a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml b/packages/SystemUI/tests/res/values/overlayable_icons_test.xml deleted file mode 100644 index 24cd8cb23ed8..000000000000 --- a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml +++ /dev/null @@ -1,72 +0,0 @@ -<!-- - Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- overlayable_icons references all of the drawables in this package - that are being overlayed by resource overlays. If you remove/rename - any of these resources, you must also change the resource overlay icons.--> - <array name="overlayable_icons"> - <item>@drawable/ic_alarm</item> - <item>@drawable/ic_alarm_dim</item> - <item>@drawable/ic_arrow_back</item> - <item>@drawable/ic_bluetooth_connected</item> - <item>@drawable/ic_brightness_thumb</item> - <item>@drawable/ic_camera</item> - <item>@drawable/ic_cast</item> - <item>@drawable/ic_cast_connected</item> - <item>@drawable/ic_close_white</item> - <item>@drawable/ic_data_saver</item> - <item>@drawable/ic_data_saver_off</item> - <item>@drawable/ic_drag_handle</item> - <item>@drawable/ic_headset</item> - <item>@drawable/ic_headset_mic</item> - <item>@drawable/ic_hotspot</item> - <item>@drawable/ic_info</item> - <item>@drawable/ic_info_outline</item> - <item>@drawable/ic_invert_colors</item> - <item>@drawable/ic_location</item> - <item>@drawable/ic_lockscreen_ime</item> - <item>@drawable/ic_notifications_alert</item> - <item>@drawable/ic_notifications_silence</item> - <item>@drawable/ic_power_low</item> - <item>@drawable/ic_power_saver</item> - <item>@drawable/ic_qs_bluetooth_connecting</item> - <item>@drawable/ic_qs_cancel</item> - <item>@drawable/ic_qs_no_sim</item> - <item>@drawable/ic_qs_wifi_0</item> - <item>@drawable/ic_qs_wifi_1</item> - <item>@drawable/ic_qs_wifi_2</item> - <item>@drawable/ic_qs_wifi_3</item> - <item>@drawable/ic_qs_wifi_4</item> - <item>@drawable/ic_qs_wifi_disconnected</item> - <item>@drawable/ic_screenshot_delete</item> - <item>@drawable/ic_settings</item> - <item>@drawable/ic_swap_vert</item> - <item>@drawable/ic_tune_black_16dp</item> - <item>@drawable/ic_volume_alarm_mute</item> - <item>@drawable/ic_volume_bt_sco</item> - <item>@drawable/ic_volume_media</item> - <item>@drawable/ic_volume_media_mute</item> - <item>@drawable/ic_volume_odi_captions</item> - <item>@drawable/ic_volume_odi_captions_disabled</item> - <item>@drawable/ic_volume_ringer</item> - <item>@drawable/ic_volume_ringer_mute</item> - <item>@drawable/ic_volume_ringer_vibrate</item> - <item>@drawable/ic_volume_voice</item> - <item>@drawable/stat_sys_managed_profile_status</item> - <item>@drawable/stat_sys_mic_none</item> - <item>@drawable/stat_sys_vpn_ic</item> - </array> -</resources> diff --git a/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java b/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java deleted file mode 100644 index ccc9afcd4296..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2019 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; - -import static junit.framework.Assert.fail; - -import static org.junit.Assert.assertEquals; - -import android.annotation.DrawableRes; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.text.TextUtils; -import android.util.TypedValue; - -import androidx.test.filters.MediumTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.XmlUtils; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.IOException; - -@RunWith(AndroidJUnit4.class) -@MediumTest -public class IconPackOverlayTest extends SysuiTestCase { - - private static final String[] ICON_PACK_OVERLAY_PACKAGES = { - "com.android.theme.icon_pack.circular.systemui", - "com.android.theme.icon_pack.rounded.systemui", - "com.android.theme.icon_pack.filled.systemui", - }; - - private static final int[] VECTOR_ATTRIBUTES = { - android.R.attr.tint, - android.R.attr.height, - android.R.attr.width, - android.R.attr.alpha, - android.R.attr.autoMirrored, - }; - - private final TypedValue mTargetTypedValue = new TypedValue(); - private final TypedValue mOverlayTypedValue = new TypedValue(); - - private Resources mResources; - private TypedArray mOverlayableIcons; - - @Before - public void setup() { - mResources = mContext.getResources(); - mOverlayableIcons = mResources.obtainTypedArray(R.array.overlayable_icons); - } - - @After - public void teardown() { - mOverlayableIcons.recycle(); - } - - /** - * Ensure that all icons contained in overlayable_icons_test.xml exist in all 3 overlay icon - * packs for systemui. This test fails if you remove or rename an overlaid icon. If so, - * make the same change to the corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. - */ - @Test - public void testIconPack_containAllOverlayedIcons() { - StringBuilder errors = new StringBuilder(); - - for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { - Resources overlayResources; - try { - overlayResources = mContext.getPackageManager() - .getResourcesForApplication(overlayPackage); - } catch (PackageManager.NameNotFoundException e) { - continue; // No need to test overlay resources if apk is not on the system. - } - - for (int i = 0; i < mOverlayableIcons.length(); i++) { - int sysuiRid = mOverlayableIcons.getResourceId(i, 0); - String sysuiResourceName = mResources.getResourceName(sysuiRid); - String overlayResourceName = sysuiResourceName - .replace(mContext.getPackageName(), overlayPackage); - if (overlayResources.getIdentifier(overlayResourceName, null, null) - == Resources.ID_NULL) { - errors.append(String.format("[%s] is not contained in overlay package [%s]", - overlayResourceName, overlayPackage)); - } - } - } - - if (!TextUtils.isEmpty(errors)) { - fail(errors.toString()); - } - } - - /** - * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the - * underlying drawable in systemui. To fix this test, make the attribute change to all of the - * corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. - */ - @Test - public void testIconPacks_haveEqualVectorDrawableAttributes() { - StringBuilder errors = new StringBuilder(); - - for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { - Resources overlayResources; - try { - overlayResources = mContext.getPackageManager() - .getResourcesForApplication(overlayPackage); - } catch (PackageManager.NameNotFoundException e) { - continue; // No need to test overlay resources if apk is not on the system. - } - - for (int i = 0; i < mOverlayableIcons.length(); i++) { - int sysuiRid = mOverlayableIcons.getResourceId(i, 0); - String sysuiResourceName = mResources.getResourceName(sysuiRid); - TypedArray sysuiAttrs = getAVDAttributes(mResources, sysuiRid); - if (sysuiAttrs == null) { - errors.append(String.format("[%s] does not exist or is not a valid AVD.", - sysuiResourceName)); - continue; - } - - String overlayResourceName = sysuiResourceName - .replace(mContext.getPackageName(), overlayPackage); - int overlayRid = overlayResources.getIdentifier(overlayResourceName, null, null); - TypedArray overlayAttrs = getAVDAttributes(overlayResources, overlayRid); - if (overlayAttrs == null) { - errors.append(String.format("[%s] does not exist or is not a valid AVD.", - overlayResourceName)); - continue; - } - - if (!attributesEquals(sysuiAttrs, overlayAttrs)) { - errors.append(String.format("[%s] AVD attributes do not match [%s]\n", - sysuiResourceName, overlayResourceName)); - } - sysuiAttrs.recycle(); - overlayAttrs.recycle(); - } - } - - if (!TextUtils.isEmpty(errors)) { - fail(errors.toString()); - } - } - - private TypedArray getAVDAttributes(Resources resources, @DrawableRes int rid) { - try { - XmlResourceParser parser = resources.getXml(rid); - XmlUtils.nextElement(parser); - return resources.obtainAttributes(parser, VECTOR_ATTRIBUTES); - } catch (XmlPullParserException | IOException | Resources.NotFoundException e) { - return null; - } - } - - private boolean attributesEquals(TypedArray target, TypedArray overlay) { - assertEquals(target.length(), overlay.length()); - for (int i = 0; i < target.length(); i++) { - target.getValue(i, mTargetTypedValue); - overlay.getValue(i, mOverlayTypedValue); - if (!attributesEquals(mTargetTypedValue, mOverlayTypedValue)) { - return false; - } - } - return true; - } - - private boolean attributesEquals(TypedValue target, TypedValue overlay) { - return target.type == overlay.type && target.data == overlay.data; - } -} diff --git a/packages/overlays/tests/Android.bp b/packages/overlays/tests/Android.bp new file mode 100644 index 000000000000..343367a3cd11 --- /dev/null +++ b/packages/overlays/tests/Android.bp @@ -0,0 +1,37 @@ +// Copyright (C) 2019 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. + +android_test { + name: "OverlayTests", + + certificate: "platform", + + srcs: ["src/**/*.java"], + + libs: [ + "android.test.runner", + "android.test.base", + ], + + platform_apis: true, + + static_libs: [ + "androidx.test.rules", + "androidx.test.espresso.core", + "mockito-target-minus-junit4", + "truth-prebuilt", + ], + + dxflags: ["--multi-dex"], +} diff --git a/packages/overlays/tests/AndroidManifest.xml b/packages/overlays/tests/AndroidManifest.xml new file mode 100644 index 000000000000..6ebc5551e11e --- /dev/null +++ b/packages/overlays/tests/AndroidManifest.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 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 + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.overlays"> + + <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> + <uses-permission android:name="android.permission.MANAGE_USERS" /> + <uses-permission android:name="android.permission.MANAGE_NETWORK_POLICY"/> + <uses-permission android:name="android.permission.SET_TIME_ZONE" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> + <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.systemui" + android:label="Tests for Overlays"> + </instrumentation> +</manifest> diff --git a/packages/overlays/tests/AndroidTest.xml b/packages/overlays/tests/AndroidTest.xml new file mode 100644 index 000000000000..8843d6286c05 --- /dev/null +++ b/packages/overlays/tests/AndroidTest.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 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 + --> +<configuration description="Runs Tests for Overlays."> + <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> + <option name="test-file-name" value="OverlayTests.apk" /> + </target_preparer> + + <option name="test-suite-tag" value="apct" /> + <option name="test-tag" value="OverlayTests" /> + <test class="com.android.tradefed.testtype.AndroidJUnitTest" > + <option name="package" value="com.android.overlays" /> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> + <option name="hidden-api-checks" value="false"/> + </test> +</configuration> diff --git a/packages/overlays/tests/src/com/android/theme/icon/IconPackOverlayTest.java b/packages/overlays/tests/src/com/android/theme/icon/IconPackOverlayTest.java new file mode 100644 index 000000000000..6bc56bafa7d0 --- /dev/null +++ b/packages/overlays/tests/src/com/android/theme/icon/IconPackOverlayTest.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2019 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.theme.icon; + +import static junit.framework.Assert.fail; + +import static org.junit.Assert.assertEquals; + +import android.annotation.DrawableRes; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.text.TextUtils; +import android.util.TypedValue; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.util.XmlUtils; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class IconPackOverlayTest { + private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; + private static final String[] SYSTEMUI_ICON_PACK_OVERLAY_PACKAGES = { + "com.android.theme.icon_pack.circular.systemui", + "com.android.theme.icon_pack.rounded.systemui", + "com.android.theme.icon_pack.filled.systemui", + }; + private static final String ANDROID_PACKAGE = "android"; + private static final String[] ANDROID_ICON_PACK_OVERLAY_PACKAGES = { + "com.android.theme.icon_pack.circular.android", + "com.android.theme.icon_pack.rounded.android", + "com.android.theme.icon_pack.filled.android", + }; + private static final String SETTINGS_PACKAGE = "com.android.settings"; + private static final String[] SETTINGS_ICON_PACK_OVERLAY_PACKAGES = { + "com.android.theme.icon_pack.circular.settings", + "com.android.theme.icon_pack.rounded.settings", + "com.android.theme.icon_pack.filled.settings", + }; + + private static final int[] VECTOR_ATTRIBUTES = { + android.R.attr.tint, + android.R.attr.height, + android.R.attr.width, + android.R.attr.alpha, + android.R.attr.autoMirrored, + }; + + private final TypedValue mTargetTypedValue = new TypedValue(); + private final TypedValue mOverlayTypedValue = new TypedValue(); + private Context mContext; + + @Before + public void setup() { + mContext = InstrumentationRegistry.getContext(); + } + + /** + * Ensure that drawable icons in icon packs targeting android have corresponding underlying + * drawables in android. This test fails if you remove/rename an overlaid icon in android. + * If so, make the same change to the corresponding drawables in the overlay packages. + */ + @Test + public void testAndroidFramework_containsAllOverlayedIcons() { + containsAllOverlayedIcons(ANDROID_PACKAGE, ANDROID_ICON_PACK_OVERLAY_PACKAGES); + } + + /** + * Ensure that drawable icons in icon packs targeting settings have corresponding underlying + * drawables in settings. This test fails if you remove/rename an overlaid icon in settings. + * If so, make the same change to the corresponding drawables in the overlay packages. + */ + @Test + public void testSettings_containsAllOverlayedIcons() { + containsAllOverlayedIcons(SETTINGS_PACKAGE, SETTINGS_ICON_PACK_OVERLAY_PACKAGES); + } + + /** + * Ensure that drawable icons in icon packs targeting systemui have corresponding underlying + * drawables in systemui. This test fails if you remove/rename an overlaid icon in systemui. + * If so, make the same change to the corresponding drawables in the overlay packages. + */ + @Test + public void testSystemUI_containAllOverlayedIcons() { + containsAllOverlayedIcons(SYSTEMUI_PACKAGE, SYSTEMUI_ICON_PACK_OVERLAY_PACKAGES); + } + + /** + * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the + * underlying drawable in android. To fix this test, make the attribute change to all of the + * corresponding drawables in the overlay packages. + */ + @Test + public void testAndroidFramework_hasEqualVectorDrawableAttributes() { + hasEqualVectorDrawableAttributes(ANDROID_PACKAGE, ANDROID_ICON_PACK_OVERLAY_PACKAGES); + } + + /** + * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the + * underlying drawable in settings. To fix this test, make the attribute change to all of the + * corresponding drawables in the overlay packages. + */ + @Test + public void testSettings_hasEqualVectorDrawableAttributes() { + hasEqualVectorDrawableAttributes(SETTINGS_PACKAGE, SETTINGS_ICON_PACK_OVERLAY_PACKAGES); + } + + /** + * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the + * underlying drawable in systemui. To fix this test, make the attribute change to all of the + * corresponding drawables in the overlay packages. + */ + @Test + public void testSystemUI_hasEqualVectorDrawableAttributes() { + hasEqualVectorDrawableAttributes(SYSTEMUI_PACKAGE, SYSTEMUI_ICON_PACK_OVERLAY_PACKAGES); + } + + private void containsAllOverlayedIcons(String targetPkg, String[] overlayPkgs) { + final Resources targetResources; + try { + targetResources = mContext.getPackageManager() + .getResourcesForApplication(targetPkg); + } catch (PackageManager.NameNotFoundException e) { + return; // No need to test overlays if target package does not exist on the system. + } + + StringBuilder errors = new StringBuilder(); + for (String overlayPackage : overlayPkgs) { + final ApplicationInfo info; + try { + info = mContext.getPackageManager().getApplicationInfo(overlayPackage, 0); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + final List<String> iconPackDrawables = getDrawablesFromOverlay(info); + for (int i = 0; i < iconPackDrawables.size(); i++) { + String resourceName = iconPackDrawables.get(i); + int targetRid = targetResources.getIdentifier(resourceName, "drawable", targetPkg); + if (targetRid == Resources.ID_NULL) { + errors.append(String.format("[%s] is not contained in the target package [%s]", + resourceName, targetPkg)); + } + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + private void hasEqualVectorDrawableAttributes(String targetPkg, String[] overlayPackages) { + final Resources targetRes; + try { + targetRes = mContext.getPackageManager().getResourcesForApplication(targetPkg); + } catch (PackageManager.NameNotFoundException e) { + return; // No need to test overlays if target package does not exist on the system. + } + + StringBuilder errors = new StringBuilder(); + + for (String overlayPkg : overlayPackages) { + final ApplicationInfo info; + try { + info = mContext.getPackageManager().getApplicationInfo(overlayPkg, 0); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + final List<String> iconPackDrawables = getDrawablesFromOverlay(info); + final Resources overlayRes; + try { + overlayRes = mContext.getPackageManager().getResourcesForApplication(overlayPkg); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + + for (int i = 0; i < iconPackDrawables.size(); i++) { + String resourceName = iconPackDrawables.get(i); + int targetRid = targetRes.getIdentifier(resourceName, "drawable", targetPkg); + int overlayRid = overlayRes.getIdentifier(resourceName, "drawable", overlayPkg); + TypedArray targetAttrs = getAVDAttributes(targetRes, targetRid); + if (targetAttrs == null) { + errors.append(String.format( + "[%s] in pkg [%s] does not exist or is not a valid vector drawable.\n", + resourceName, targetPkg)); + continue; + } + + TypedArray overlayAttrs = getAVDAttributes(overlayRes, overlayRid); + if (overlayAttrs == null) { + errors.append(String.format( + "[%s] in pkg [%s] does not exist or is not a valid vector drawable.\n", + resourceName, overlayPkg)); + continue; + } + + if (!attributesEquals(targetAttrs, overlayAttrs)) { + errors.append(String.format("[drawable/%s] in [%s] does not have the same " + + "attributes as the corresponding drawable from [%s]\n", + resourceName, targetPkg, overlayPkg)); + } + targetAttrs.recycle(); + overlayAttrs.recycle(); + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + private TypedArray getAVDAttributes(Resources resources, @DrawableRes int rid) { + try { + XmlResourceParser parser = resources.getXml(rid); + XmlUtils.nextElement(parser); + // Always use the the test apk theme to resolve attributes. + return mContext.getTheme().obtainStyledAttributes(parser, VECTOR_ATTRIBUTES, 0, 0); + } catch (XmlPullParserException | IOException | Resources.NotFoundException e) { + return null; + } + } + + private boolean attributesEquals(TypedArray target, TypedArray overlay) { + assertEquals(target.length(), overlay.length()); + for (int i = 0; i < target.length(); i++) { + target.getValue(i, mTargetTypedValue); + overlay.getValue(i, mOverlayTypedValue); + if (!attributesEquals(mTargetTypedValue, mOverlayTypedValue)) { + return false; + } + } + return true; + } + + private static boolean attributesEquals(TypedValue target, TypedValue overlay) { + return target.type == overlay.type && target.data == overlay.data; + } + + private static List<String> getDrawablesFromOverlay(ApplicationInfo applicationInfo) { + try { + final ArrayList<String> drawables = new ArrayList<>(); + ZipFile file = new ZipFile(applicationInfo.sourceDir); + Enumeration<? extends ZipEntry> entries = file.entries(); + while (entries.hasMoreElements()) { + ZipEntry element = entries.nextElement(); + String name = element.getName(); + if (name.contains("/drawable/")) { + name = name.substring(name.lastIndexOf('/') + 1); + if (name.contains(".")) { + name = name.substring(0, name.indexOf('.')); + } + drawables.add(name); + } + } + return drawables; + } catch (IOException e) { + fail(String.format("Failed to retrieve drawables from package [%s] with message [%s]", + applicationInfo.packageName, e.getMessage())); + return null; + } + } +} diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index bc7da3fe2edc..30a356325ada 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -413,15 +413,15 @@ final class UiModeManagerService extends SystemService { try { synchronized (mLock) { if (mNightMode != mode) { - if (UserManager.get(getContext()).isPrimaryUser()) { - SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, - Integer.toString(mode)); - } - // Only persist setting if not in car mode if (!mCarModeEnabled) { Secure.putIntForUser(getContext().getContentResolver(), Secure.UI_NIGHT_MODE, mode, user); + + if (UserManager.get(getContext()).isPrimaryUser()) { + SystemProperties.set(SYSTEM_PROPERTY_DEVICE_THEME, + Integer.toString(mode)); + } } mNightMode = mode; diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 89e97d2419d8..6c57be8bbadf 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -54,8 +54,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.res.Configuration; -import android.content.res.Resources; -import android.content.res.XmlResourceParser; import android.database.ContentObserver; import android.hardware.hdmi.HdmiAudioSystemClient; import android.hardware.hdmi.HdmiControlManager; @@ -82,11 +80,7 @@ import android.media.IRingtonePlayer; import android.media.IVolumeController; import android.media.MediaExtractor; import android.media.MediaFormat; -import android.media.MediaPlayer; -import android.media.MediaPlayer.OnCompletionListener; -import android.media.MediaPlayer.OnErrorListener; import android.media.PlayerBase; -import android.media.SoundPool; import android.media.VolumePolicy; import android.media.audiofx.AudioEffect; import android.media.audiopolicy.AudioMix; @@ -102,7 +96,6 @@ import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -137,7 +130,6 @@ import android.widget.Toast; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.DumpUtils; import com.android.internal.util.Preconditions; -import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.SystemService; @@ -146,15 +138,11 @@ import com.android.server.audio.AudioServiceEvents.VolumeEvent; import com.android.server.pm.UserManagerService; import com.android.server.wm.ActivityTaskManagerInternal; -import org.xmlpull.v1.XmlPullParserException; - -import java.io.File; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -294,19 +282,6 @@ public class AudioService extends IAudioService.Stub // protects mRingerMode private final Object mSettingsLock = new Object(); - private SoundPool mSoundPool; - private final Object mSoundEffectsLock = new Object(); - private static final int NUM_SOUNDPOOL_CHANNELS = 4; - - /* Sound effect file names */ - private static final String SOUND_EFFECTS_PATH = "/media/audio/ui/"; - private static final List<String> SOUND_EFFECT_FILES = new ArrayList<String>(); - - /* Sound effect file name mapping sound effect id (AudioManager.FX_xxx) to - * file index in SOUND_EFFECT_FILES[] (first column) and indicating if effect - * uses soundpool (second column) */ - private final int[][] SOUND_EFFECT_FILES_MAP = new int[AudioManager.NUM_SOUND_EFFECTS][2]; - /** Maximum volume index values for audio streams */ protected static int[] MAX_STREAM_VOLUME = new int[] { 5, // STREAM_VOICE_CALL @@ -453,6 +428,9 @@ public class AudioService extends IAudioService.Stub * @see System#MUTE_STREAMS_AFFECTED */ private int mMuteAffectedStreams; + @NonNull + private SoundEffectsHelper mSfxHelper; + /** * NOTE: setVibrateSetting(), getVibrateSetting(), shouldVibrate() are deprecated. * mVibrateSetting is just maintained during deprecation period but vibration policy is @@ -493,14 +471,6 @@ public class AudioService extends IAudioService.Stub private boolean mSystemReady; // true if Intent.ACTION_USER_SWITCHED has ever been received private boolean mUserSwitchedReceived; - // listener for SoundPool sample load completion indication - private SoundPoolCallback mSoundPoolCallBack; - // thread for SoundPool listener - private SoundPoolListenerThread mSoundPoolListenerThread; - // message looper for SoundPool listener - private Looper mSoundPoolLooper = null; - // volume applied to sound played with playSoundEffect() - private static int sSoundEffectVolumeDb; // previous volume adjustment direction received by checkForRingerModeChange() private int mPrevVolDirection = AudioManager.ADJUST_SAME; // mVolumeControlStream is set by VolumePanel to temporarily force the stream type which volume @@ -642,6 +612,8 @@ public class AudioService extends IAudioService.Stub PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent"); + mSfxHelper = new SoundEffectsHelper(mContext); + mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator(); @@ -732,9 +704,6 @@ public class AudioService extends IAudioService.Stub MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM]; } - sSoundEffectVolumeDb = context.getResources().getInteger( - com.android.internal.R.integer.config_soundEffectVolumeDb); - createAudioSystemThread(); AudioSystem.setErrorCallback(mAudioSystemCallback); @@ -3369,104 +3338,30 @@ public class AudioService extends IAudioService.Stub //========================================================================================== // Sound Effects //========================================================================================== + private static final class LoadSoundEffectReply + implements SoundEffectsHelper.OnEffectsLoadCompleteHandler { + private static final int SOUND_EFFECTS_LOADING = 1; + private static final int SOUND_EFFECTS_LOADED = 0; + private static final int SOUND_EFFECTS_ERROR = -1; + private static final int SOUND_EFFECTS_LOAD_TIMEOUT_MS = 5000; - private static final String TAG_AUDIO_ASSETS = "audio_assets"; - private static final String ATTR_VERSION = "version"; - private static final String TAG_GROUP = "group"; - private static final String ATTR_GROUP_NAME = "name"; - private static final String TAG_ASSET = "asset"; - private static final String ATTR_ASSET_ID = "id"; - private static final String ATTR_ASSET_FILE = "file"; - - private static final String ASSET_FILE_VERSION = "1.0"; - private static final String GROUP_TOUCH_SOUNDS = "touch_sounds"; - - private static final int SOUND_EFFECTS_LOAD_TIMEOUT_MS = 5000; + private int mStatus = SOUND_EFFECTS_LOADING; - class LoadSoundEffectReply { - public int mStatus = 1; - }; - - private void loadTouchSoundAssetDefaults() { - SOUND_EFFECT_FILES.add("Effect_Tick.ogg"); - for (int i = 0; i < AudioManager.NUM_SOUND_EFFECTS; i++) { - SOUND_EFFECT_FILES_MAP[i][0] = 0; - SOUND_EFFECT_FILES_MAP[i][1] = -1; - } - } - - private void loadTouchSoundAssets() { - XmlResourceParser parser = null; - - // only load assets once. - if (!SOUND_EFFECT_FILES.isEmpty()) { - return; + @Override + public synchronized void run(boolean success) { + mStatus = success ? SOUND_EFFECTS_LOADED : SOUND_EFFECTS_ERROR; + notify(); } - loadTouchSoundAssetDefaults(); - - try { - parser = mContext.getResources().getXml(com.android.internal.R.xml.audio_assets); - - XmlUtils.beginDocument(parser, TAG_AUDIO_ASSETS); - String version = parser.getAttributeValue(null, ATTR_VERSION); - boolean inTouchSoundsGroup = false; - - if (ASSET_FILE_VERSION.equals(version)) { - while (true) { - XmlUtils.nextElement(parser); - String element = parser.getName(); - if (element == null) { - break; - } - if (element.equals(TAG_GROUP)) { - String name = parser.getAttributeValue(null, ATTR_GROUP_NAME); - if (GROUP_TOUCH_SOUNDS.equals(name)) { - inTouchSoundsGroup = true; - break; - } - } - } - while (inTouchSoundsGroup) { - XmlUtils.nextElement(parser); - String element = parser.getName(); - if (element == null) { - break; - } - if (element.equals(TAG_ASSET)) { - String id = parser.getAttributeValue(null, ATTR_ASSET_ID); - String file = parser.getAttributeValue(null, ATTR_ASSET_FILE); - int fx; - - try { - Field field = AudioManager.class.getField(id); - fx = field.getInt(null); - } catch (Exception e) { - Log.w(TAG, "Invalid touch sound ID: "+id); - continue; - } - - int i = SOUND_EFFECT_FILES.indexOf(file); - if (i == -1) { - i = SOUND_EFFECT_FILES.size(); - SOUND_EFFECT_FILES.add(file); - } - SOUND_EFFECT_FILES_MAP[fx][0] = i; - } else { - break; - } + public synchronized boolean waitForLoaded(int attempts) { + while ((mStatus == SOUND_EFFECTS_LOADING) && (attempts-- > 0)) { + try { + wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); + } catch (InterruptedException e) { + Log.w(TAG, "Interrupted while waiting sound pool loaded."); } } - } catch (Resources.NotFoundException e) { - Log.w(TAG, "audio assets file not found", e); - } catch (XmlPullParserException e) { - Log.w(TAG, "XML parser exception reading touch sound assets", e); - } catch (IOException e) { - Log.w(TAG, "I/O exception reading touch sound assets", e); - } finally { - if (parser != null) { - parser.close(); - } + return mStatus == SOUND_EFFECTS_LOADED; } } @@ -3496,20 +3391,9 @@ public class AudioService extends IAudioService.Stub * This method must be called at first when sound effects are enabled */ public boolean loadSoundEffects() { - int attempts = 3; LoadSoundEffectReply reply = new LoadSoundEffectReply(); - - synchronized (reply) { - sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SENDMSG_QUEUE, 0, 0, reply, 0); - while ((reply.mStatus == 1) && (attempts-- > 0)) { - try { - reply.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); - } catch (InterruptedException e) { - Log.w(TAG, "loadSoundEffects Interrupted while waiting sound pool loaded."); - } - } - } - return (reply.mStatus == 0); + sendMsg(mAudioHandler, MSG_LOAD_SOUND_EFFECTS, SENDMSG_QUEUE, 0, 0, reply, 0); + return reply.waitForLoaded(3 /*attempts*/); } /** @@ -3529,61 +3413,6 @@ public class AudioService extends IAudioService.Stub sendMsg(mAudioHandler, MSG_UNLOAD_SOUND_EFFECTS, SENDMSG_QUEUE, 0, 0, null, 0); } - class SoundPoolListenerThread extends Thread { - public SoundPoolListenerThread() { - super("SoundPoolListenerThread"); - } - - @Override - public void run() { - - Looper.prepare(); - mSoundPoolLooper = Looper.myLooper(); - - synchronized (mSoundEffectsLock) { - if (mSoundPool != null) { - mSoundPoolCallBack = new SoundPoolCallback(); - mSoundPool.setOnLoadCompleteListener(mSoundPoolCallBack); - } - mSoundEffectsLock.notify(); - } - Looper.loop(); - } - } - - private final class SoundPoolCallback implements - android.media.SoundPool.OnLoadCompleteListener { - - int mStatus = 1; // 1 means neither error nor last sample loaded yet - List<Integer> mSamples = new ArrayList<Integer>(); - - public int status() { - return mStatus; - } - - public void setSamples(int[] samples) { - for (int i = 0; i < samples.length; i++) { - // do not wait ack for samples rejected upfront by SoundPool - if (samples[i] > 0) { - mSamples.add(samples[i]); - } - } - } - - public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { - synchronized (mSoundEffectsLock) { - int i = mSamples.indexOf(sampleId); - if (i >= 0) { - mSamples.remove(i); - } - if ((status != 0) || mSamples. isEmpty()) { - mStatus = status; - mSoundEffectsLock.notify(); - } - } - } - } - /** @see AudioManager#reloadAudioSettings() */ public void reloadAudioSettings() { readAudioSettings(false /*userSwitch*/); @@ -5104,230 +4933,6 @@ public class AudioService extends IAudioService.Stub Settings.Global.putInt(mContentResolver, Settings.Global.MODE_RINGER, ringerMode); } - private String getSoundEffectFilePath(int effectType) { - String filePath = Environment.getProductDirectory() + SOUND_EFFECTS_PATH - + SOUND_EFFECT_FILES.get(SOUND_EFFECT_FILES_MAP[effectType][0]); - if (!new File(filePath).isFile()) { - filePath = Environment.getRootDirectory() + SOUND_EFFECTS_PATH - + SOUND_EFFECT_FILES.get(SOUND_EFFECT_FILES_MAP[effectType][0]); - } - return filePath; - } - - private boolean onLoadSoundEffects() { - int status; - - synchronized (mSoundEffectsLock) { - if (!mSystemReady) { - Log.w(TAG, "onLoadSoundEffects() called before boot complete"); - return false; - } - - if (mSoundPool != null) { - return true; - } - - loadTouchSoundAssets(); - - mSoundPool = new SoundPool.Builder() - .setMaxStreams(NUM_SOUNDPOOL_CHANNELS) - .setAudioAttributes(new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .build()) - .build(); - mSoundPoolCallBack = null; - mSoundPoolListenerThread = new SoundPoolListenerThread(); - mSoundPoolListenerThread.start(); - int attempts = 3; - while ((mSoundPoolCallBack == null) && (attempts-- > 0)) { - try { - // Wait for mSoundPoolCallBack to be set by the other thread - mSoundEffectsLock.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); - } catch (InterruptedException e) { - Log.w(TAG, "Interrupted while waiting sound pool listener thread."); - } - } - - if (mSoundPoolCallBack == null) { - Log.w(TAG, "onLoadSoundEffects() SoundPool listener or thread creation error"); - if (mSoundPoolLooper != null) { - mSoundPoolLooper.quit(); - mSoundPoolLooper = null; - } - mSoundPoolListenerThread = null; - mSoundPool.release(); - mSoundPool = null; - return false; - } - /* - * poolId table: The value -1 in this table indicates that corresponding - * file (same index in SOUND_EFFECT_FILES[] has not been loaded. - * Once loaded, the value in poolId is the sample ID and the same - * sample can be reused for another effect using the same file. - */ - int[] poolId = new int[SOUND_EFFECT_FILES.size()]; - for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.size(); fileIdx++) { - poolId[fileIdx] = -1; - } - /* - * Effects whose value in SOUND_EFFECT_FILES_MAP[effect][1] is -1 must be loaded. - * If load succeeds, value in SOUND_EFFECT_FILES_MAP[effect][1] is > 0: - * this indicates we have a valid sample loaded for this effect. - */ - - int numSamples = 0; - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - // Do not load sample if this effect uses the MediaPlayer - if (SOUND_EFFECT_FILES_MAP[effect][1] == 0) { - continue; - } - if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == -1) { - String filePath = getSoundEffectFilePath(effect); - int sampleId = mSoundPool.load(filePath, 0); - if (sampleId <= 0) { - Log.w(TAG, "Soundpool could not load file: "+filePath); - } else { - SOUND_EFFECT_FILES_MAP[effect][1] = sampleId; - poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = sampleId; - numSamples++; - } - } else { - SOUND_EFFECT_FILES_MAP[effect][1] = - poolId[SOUND_EFFECT_FILES_MAP[effect][0]]; - } - } - // wait for all samples to be loaded - if (numSamples > 0) { - mSoundPoolCallBack.setSamples(poolId); - - attempts = 3; - status = 1; - while ((status == 1) && (attempts-- > 0)) { - try { - mSoundEffectsLock.wait(SOUND_EFFECTS_LOAD_TIMEOUT_MS); - status = mSoundPoolCallBack.status(); - } catch (InterruptedException e) { - Log.w(TAG, "Interrupted while waiting sound pool callback."); - } - } - } else { - status = -1; - } - - if (mSoundPoolLooper != null) { - mSoundPoolLooper.quit(); - mSoundPoolLooper = null; - } - mSoundPoolListenerThread = null; - if (status != 0) { - Log.w(TAG, - "onLoadSoundEffects(), Error "+status+ " while loading samples"); - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - if (SOUND_EFFECT_FILES_MAP[effect][1] > 0) { - SOUND_EFFECT_FILES_MAP[effect][1] = -1; - } - } - - mSoundPool.release(); - mSoundPool = null; - } - } - return (status == 0); - } - - /** - * Unloads samples from the sound pool. - * This method can be called to free some memory when - * sound effects are disabled. - */ - private void onUnloadSoundEffects() { - synchronized (mSoundEffectsLock) { - if (mSoundPool == null) { - return; - } - - int[] poolId = new int[SOUND_EFFECT_FILES.size()]; - for (int fileIdx = 0; fileIdx < SOUND_EFFECT_FILES.size(); fileIdx++) { - poolId[fileIdx] = 0; - } - - for (int effect = 0; effect < AudioManager.NUM_SOUND_EFFECTS; effect++) { - if (SOUND_EFFECT_FILES_MAP[effect][1] <= 0) { - continue; - } - if (poolId[SOUND_EFFECT_FILES_MAP[effect][0]] == 0) { - mSoundPool.unload(SOUND_EFFECT_FILES_MAP[effect][1]); - SOUND_EFFECT_FILES_MAP[effect][1] = -1; - poolId[SOUND_EFFECT_FILES_MAP[effect][0]] = -1; - } - } - mSoundPool.release(); - mSoundPool = null; - } - } - - private void onPlaySoundEffect(int effectType, int volume) { - synchronized (mSoundEffectsLock) { - - onLoadSoundEffects(); - - if (mSoundPool == null) { - return; - } - float volFloat; - // use default if volume is not specified by caller - if (volume < 0) { - volFloat = (float)Math.pow(10, (float)sSoundEffectVolumeDb/20); - } else { - volFloat = volume / 1000.0f; - } - - if (SOUND_EFFECT_FILES_MAP[effectType][1] > 0) { - mSoundPool.play(SOUND_EFFECT_FILES_MAP[effectType][1], - volFloat, volFloat, 0, 0, 1.0f); - } else { - MediaPlayer mediaPlayer = new MediaPlayer(); - try { - String filePath = getSoundEffectFilePath(effectType); - mediaPlayer.setDataSource(filePath); - mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); - mediaPlayer.prepare(); - mediaPlayer.setVolume(volFloat); - mediaPlayer.setOnCompletionListener(new OnCompletionListener() { - public void onCompletion(MediaPlayer mp) { - cleanupPlayer(mp); - } - }); - mediaPlayer.setOnErrorListener(new OnErrorListener() { - public boolean onError(MediaPlayer mp, int what, int extra) { - cleanupPlayer(mp); - return true; - } - }); - mediaPlayer.start(); - } catch (IOException ex) { - Log.w(TAG, "MediaPlayer IOException: "+ex); - } catch (IllegalArgumentException ex) { - Log.w(TAG, "MediaPlayer IllegalArgumentException: "+ex); - } catch (IllegalStateException ex) { - Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); - } - } - } - } - - private void cleanupPlayer(MediaPlayer mp) { - if (mp != null) { - try { - mp.stop(); - mp.release(); - } catch (IllegalStateException ex) { - Log.w(TAG, "MediaPlayer IllegalStateException: "+ex); - } - } - } - private void onPersistSafeVolumeState(int state) { Settings.Global.putInt(mContentResolver, Settings.Global.AUDIO_SAFE_VOLUME_STATE, @@ -5374,24 +4979,25 @@ public class AudioService extends IAudioService.Stub break; case MSG_UNLOAD_SOUND_EFFECTS: - onUnloadSoundEffects(); + mSfxHelper.unloadSoundEffects(); break; case MSG_LOAD_SOUND_EFFECTS: - //FIXME: onLoadSoundEffects() should be executed in a separate thread as it - // can take several dozens of milliseconds to complete - boolean loaded = onLoadSoundEffects(); - if (msg.obj != null) { - LoadSoundEffectReply reply = (LoadSoundEffectReply)msg.obj; - synchronized (reply) { - reply.mStatus = loaded ? 0 : -1; - reply.notify(); + { + LoadSoundEffectReply reply = (LoadSoundEffectReply) msg.obj; + if (mSystemReady) { + mSfxHelper.loadSoundEffects(reply); + } else { + Log.w(TAG, "[schedule]loadSoundEffects() called before boot complete"); + if (reply != null) { + reply.run(false); } } + } break; case MSG_PLAY_SOUND_EFFECT: - onPlaySoundEffect(msg.arg1, msg.arg2); + mSfxHelper.playSoundEffect(msg.arg1, msg.arg2); break; case MSG_SET_FORCE_USE: @@ -6422,6 +6028,8 @@ public class AudioService extends IAudioService.Stub pw.println("\nAudioDeviceBroker:"); mDeviceBroker.dump(pw, " "); + pw.println("\nSoundEffects:"); + mSfxHelper.dump(pw, " "); pw.println("\n"); pw.println("\nEvent logs:"); diff --git a/services/core/java/com/android/server/audio/SoundEffectsHelper.java b/services/core/java/com/android/server/audio/SoundEffectsHelper.java new file mode 100644 index 000000000000..cf5bc8d88c73 --- /dev/null +++ b/services/core/java/com/android/server/audio/SoundEffectsHelper.java @@ -0,0 +1,521 @@ +/* + * Copyright (C) 2019 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.audio; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.XmlResourceParser; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.media.MediaPlayer; +import android.media.MediaPlayer.OnCompletionListener; +import android.media.MediaPlayer.OnErrorListener; +import android.media.SoundPool; +import android.os.Environment; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +import android.util.PrintWriterPrinter; + +import com.android.internal.util.XmlUtils; + +import org.xmlpull.v1.XmlPullParserException; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * A helper class for managing sound effects loading / unloading + * used by AudioService. As its methods are called on the message handler thread + * of AudioService, the actual work is offloaded to a dedicated thread. + * This helps keeping AudioService responsive. + * @hide + */ +class SoundEffectsHelper { + private static final String TAG = "AS.SfxHelper"; + + private static final int NUM_SOUNDPOOL_CHANNELS = 4; + + /* Sound effect file names */ + private static final String SOUND_EFFECTS_PATH = "/media/audio/ui/"; + + private static final int EFFECT_NOT_IN_SOUND_POOL = 0; // SoundPool sample IDs > 0 + + private static final int MSG_LOAD_EFFECTS = 0; + private static final int MSG_UNLOAD_EFFECTS = 1; + private static final int MSG_PLAY_EFFECT = 2; + private static final int MSG_LOAD_EFFECTS_TIMEOUT = 3; + + interface OnEffectsLoadCompleteHandler { + void run(boolean success); + } + + private final AudioEventLogger mSfxLogger = new AudioEventLogger( + AudioManager.NUM_SOUND_EFFECTS + 10, "Sound Effects Loading"); + + private final Context mContext; + // default attenuation applied to sound played with playSoundEffect() + private final int mSfxAttenuationDb; + + // thread for doing all work + private SfxWorker mSfxWorker; + // thread's message handler + private SfxHandler mSfxHandler; + + private static final class Resource { + final String mFileName; + int mSampleId; + boolean mLoaded; // for effects in SoundPool + Resource(String fileName) { + mFileName = fileName; + mSampleId = EFFECT_NOT_IN_SOUND_POOL; + } + } + // All the fields below are accessed by the worker thread exclusively + private final List<Resource> mResources = new ArrayList<Resource>(); + private final int[] mEffects = new int[AudioManager.NUM_SOUND_EFFECTS]; // indexes in mResources + private SoundPool mSoundPool; + private SoundPoolLoader mSoundPoolLoader; + + SoundEffectsHelper(Context context) { + mContext = context; + mSfxAttenuationDb = mContext.getResources().getInteger( + com.android.internal.R.integer.config_soundEffectVolumeDb); + startWorker(); + } + + /*package*/ void loadSoundEffects(OnEffectsLoadCompleteHandler onComplete) { + sendMsg(MSG_LOAD_EFFECTS, 0, 0, onComplete, 0); + } + + /** + * Unloads samples from the sound pool. + * This method can be called to free some memory when + * sound effects are disabled. + */ + /*package*/ void unloadSoundEffects() { + sendMsg(MSG_UNLOAD_EFFECTS, 0, 0, null, 0); + } + + /*package*/ void playSoundEffect(int effect, int volume) { + sendMsg(MSG_PLAY_EFFECT, effect, volume, null, 0); + } + + /*package*/ void dump(PrintWriter pw, String prefix) { + if (mSfxHandler != null) { + pw.println(prefix + "Message handler (watch for unhandled messages):"); + mSfxHandler.dump(new PrintWriterPrinter(pw), " "); + } else { + pw.println(prefix + "Message handler is null"); + } + pw.println(prefix + "Default attenuation (dB): " + mSfxAttenuationDb); + mSfxLogger.dump(pw); + } + + private void startWorker() { + mSfxWorker = new SfxWorker(); + mSfxWorker.start(); + synchronized (this) { + while (mSfxHandler == null) { + try { + wait(); + } catch (InterruptedException e) { + Log.w(TAG, "Interrupted while waiting " + mSfxWorker.getName() + " to start"); + } + } + } + } + + private void sendMsg(int msg, int arg1, int arg2, Object obj, int delayMs) { + mSfxHandler.sendMessageDelayed(mSfxHandler.obtainMessage(msg, arg1, arg2, obj), delayMs); + } + + private void logEvent(String msg) { + mSfxLogger.log(new AudioEventLogger.StringEvent(msg)); + } + + // All the methods below run on the worker thread + private void onLoadSoundEffects(OnEffectsLoadCompleteHandler onComplete) { + if (mSoundPoolLoader != null) { + // Loading is ongoing. + mSoundPoolLoader.addHandler(onComplete); + return; + } + if (mSoundPool != null) { + if (onComplete != null) { + onComplete.run(true /*success*/); + } + return; + } + + logEvent("effects loading started"); + mSoundPool = new SoundPool.Builder() + .setMaxStreams(NUM_SOUNDPOOL_CHANNELS) + .setAudioAttributes(new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build()) + .build(); + loadTouchSoundAssets(); + + mSoundPoolLoader = new SoundPoolLoader(); + mSoundPoolLoader.addHandler(new OnEffectsLoadCompleteHandler() { + @Override + public void run(boolean success) { + mSoundPoolLoader = null; + if (!success) { + Log.w(TAG, "onLoadSoundEffects(), Error while loading samples"); + onUnloadSoundEffects(); + } + } + }); + mSoundPoolLoader.addHandler(onComplete); + + int resourcesToLoad = 0; + for (Resource res : mResources) { + String filePath = getResourceFilePath(res); + int sampleId = mSoundPool.load(filePath, 0); + if (sampleId > 0) { + res.mSampleId = sampleId; + res.mLoaded = false; + resourcesToLoad++; + } else { + logEvent("effect " + filePath + " rejected by SoundPool"); + Log.w(TAG, "SoundPool could not load file: " + filePath); + } + } + + if (resourcesToLoad > 0) { + sendMsg(MSG_LOAD_EFFECTS_TIMEOUT, 0, 0, null, SOUND_EFFECTS_LOAD_TIMEOUT_MS); + } else { + logEvent("effects loading completed, no effects to load"); + mSoundPoolLoader.onComplete(true /*success*/); + } + } + + void onUnloadSoundEffects() { + if (mSoundPool == null) { + return; + } + if (mSoundPoolLoader != null) { + mSoundPoolLoader.addHandler(new OnEffectsLoadCompleteHandler() { + @Override + public void run(boolean success) { + onUnloadSoundEffects(); + } + }); + } + + logEvent("effects unloading started"); + for (Resource res : mResources) { + if (res.mSampleId != EFFECT_NOT_IN_SOUND_POOL) { + mSoundPool.unload(res.mSampleId); + } + } + mSoundPool.release(); + mSoundPool = null; + logEvent("effects unloading completed"); + } + + void onPlaySoundEffect(int effect, int volume) { + float volFloat; + // use default if volume is not specified by caller + if (volume < 0) { + volFloat = (float) Math.pow(10, (float) mSfxAttenuationDb / 20); + } else { + volFloat = volume / 1000.0f; + } + + Resource res = mResources.get(mEffects[effect]); + if (res.mSampleId != EFFECT_NOT_IN_SOUND_POOL && res.mLoaded) { + mSoundPool.play(res.mSampleId, volFloat, volFloat, 0, 0, 1.0f); + } else { + MediaPlayer mediaPlayer = new MediaPlayer(); + try { + String filePath = getResourceFilePath(res); + mediaPlayer.setDataSource(filePath); + mediaPlayer.setAudioStreamType(AudioSystem.STREAM_SYSTEM); + mediaPlayer.prepare(); + mediaPlayer.setVolume(volFloat); + mediaPlayer.setOnCompletionListener(new OnCompletionListener() { + public void onCompletion(MediaPlayer mp) { + cleanupPlayer(mp); + } + }); + mediaPlayer.setOnErrorListener(new OnErrorListener() { + public boolean onError(MediaPlayer mp, int what, int extra) { + cleanupPlayer(mp); + return true; + } + }); + mediaPlayer.start(); + } catch (IOException ex) { + Log.w(TAG, "MediaPlayer IOException: " + ex); + } catch (IllegalArgumentException ex) { + Log.w(TAG, "MediaPlayer IllegalArgumentException: " + ex); + } catch (IllegalStateException ex) { + Log.w(TAG, "MediaPlayer IllegalStateException: " + ex); + } + } + } + + private static void cleanupPlayer(MediaPlayer mp) { + if (mp != null) { + try { + mp.stop(); + mp.release(); + } catch (IllegalStateException ex) { + Log.w(TAG, "MediaPlayer IllegalStateException: " + ex); + } + } + } + + private static final String TAG_AUDIO_ASSETS = "audio_assets"; + private static final String ATTR_VERSION = "version"; + private static final String TAG_GROUP = "group"; + private static final String ATTR_GROUP_NAME = "name"; + private static final String TAG_ASSET = "asset"; + private static final String ATTR_ASSET_ID = "id"; + private static final String ATTR_ASSET_FILE = "file"; + + private static final String ASSET_FILE_VERSION = "1.0"; + private static final String GROUP_TOUCH_SOUNDS = "touch_sounds"; + + private static final int SOUND_EFFECTS_LOAD_TIMEOUT_MS = 15000; + + private String getResourceFilePath(Resource res) { + String filePath = Environment.getProductDirectory() + SOUND_EFFECTS_PATH + res.mFileName; + if (!new File(filePath).isFile()) { + filePath = Environment.getRootDirectory() + SOUND_EFFECTS_PATH + res.mFileName; + } + return filePath; + } + + private void loadTouchSoundAssetDefaults() { + int defaultResourceIdx = mResources.size(); + mResources.add(new Resource("Effect_Tick.ogg")); + for (int i = 0; i < mEffects.length; i++) { + mEffects[i] = defaultResourceIdx; + } + } + + private void loadTouchSoundAssets() { + XmlResourceParser parser = null; + + // only load assets once. + if (!mResources.isEmpty()) { + return; + } + + loadTouchSoundAssetDefaults(); + + try { + parser = mContext.getResources().getXml(com.android.internal.R.xml.audio_assets); + + XmlUtils.beginDocument(parser, TAG_AUDIO_ASSETS); + String version = parser.getAttributeValue(null, ATTR_VERSION); + boolean inTouchSoundsGroup = false; + + if (ASSET_FILE_VERSION.equals(version)) { + while (true) { + XmlUtils.nextElement(parser); + String element = parser.getName(); + if (element == null) { + break; + } + if (element.equals(TAG_GROUP)) { + String name = parser.getAttributeValue(null, ATTR_GROUP_NAME); + if (GROUP_TOUCH_SOUNDS.equals(name)) { + inTouchSoundsGroup = true; + break; + } + } + } + while (inTouchSoundsGroup) { + XmlUtils.nextElement(parser); + String element = parser.getName(); + if (element == null) { + break; + } + if (element.equals(TAG_ASSET)) { + String id = parser.getAttributeValue(null, ATTR_ASSET_ID); + String file = parser.getAttributeValue(null, ATTR_ASSET_FILE); + int fx; + + try { + Field field = AudioManager.class.getField(id); + fx = field.getInt(null); + } catch (Exception e) { + Log.w(TAG, "Invalid touch sound ID: " + id); + continue; + } + + mEffects[fx] = findOrAddResourceByFileName(file); + } else { + break; + } + } + } + } catch (Resources.NotFoundException e) { + Log.w(TAG, "audio assets file not found", e); + } catch (XmlPullParserException e) { + Log.w(TAG, "XML parser exception reading touch sound assets", e); + } catch (IOException e) { + Log.w(TAG, "I/O exception reading touch sound assets", e); + } finally { + if (parser != null) { + parser.close(); + } + } + } + + private int findOrAddResourceByFileName(String fileName) { + for (int i = 0; i < mResources.size(); i++) { + if (mResources.get(i).mFileName.equals(fileName)) { + return i; + } + } + int result = mResources.size(); + mResources.add(new Resource(fileName)); + return result; + } + + private Resource findResourceBySampleId(int sampleId) { + for (Resource res : mResources) { + if (res.mSampleId == sampleId) { + return res; + } + } + return null; + } + + private class SfxWorker extends Thread { + SfxWorker() { + super("AS.SfxWorker"); + } + + @Override + public void run() { + Looper.prepare(); + synchronized (SoundEffectsHelper.this) { + mSfxHandler = new SfxHandler(); + SoundEffectsHelper.this.notify(); + } + Looper.loop(); + } + } + + private class SfxHandler extends Handler { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_LOAD_EFFECTS: + onLoadSoundEffects((OnEffectsLoadCompleteHandler) msg.obj); + break; + case MSG_UNLOAD_EFFECTS: + onUnloadSoundEffects(); + break; + case MSG_PLAY_EFFECT: + onLoadSoundEffects(new OnEffectsLoadCompleteHandler() { + @Override + public void run(boolean success) { + if (success) { + onPlaySoundEffect(msg.arg1 /*effect*/, msg.arg2 /*volume*/); + } + } + }); + break; + case MSG_LOAD_EFFECTS_TIMEOUT: + if (mSoundPoolLoader != null) { + mSoundPoolLoader.onTimeout(); + } + break; + } + } + } + + private class SoundPoolLoader implements + android.media.SoundPool.OnLoadCompleteListener { + + private List<OnEffectsLoadCompleteHandler> mLoadCompleteHandlers = + new ArrayList<OnEffectsLoadCompleteHandler>(); + + SoundPoolLoader() { + // SoundPool use the current Looper when creating its message handler. + // Since SoundPoolLoader is created on the SfxWorker thread, SoundPool's + // message handler ends up running on it (it's OK to have multiple + // handlers on the same Looper). Thus, onLoadComplete gets executed + // on the worker thread. + mSoundPool.setOnLoadCompleteListener(this); + } + + void addHandler(OnEffectsLoadCompleteHandler handler) { + if (handler != null) { + mLoadCompleteHandlers.add(handler); + } + } + + @Override + public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { + if (status == 0) { + int remainingToLoad = 0; + for (Resource res : mResources) { + if (res.mSampleId == sampleId && !res.mLoaded) { + logEvent("effect " + res.mFileName + " loaded"); + res.mLoaded = true; + } + if (res.mSampleId != EFFECT_NOT_IN_SOUND_POOL && !res.mLoaded) { + remainingToLoad++; + } + } + if (remainingToLoad == 0) { + onComplete(true); + } + } else { + Resource res = findResourceBySampleId(sampleId); + String filePath; + if (res != null) { + filePath = getResourceFilePath(res); + } else { + filePath = "with unknown sample ID " + sampleId; + } + logEvent("effect " + filePath + " loading failed, status " + status); + Log.w(TAG, "onLoadSoundEffects(), Error " + status + " while loading sample " + + filePath); + onComplete(false); + } + } + + void onTimeout() { + onComplete(false); + } + + void onComplete(boolean success) { + mSoundPool.setOnLoadCompleteListener(null); + for (OnEffectsLoadCompleteHandler handler : mLoadCompleteHandlers) { + handler.run(success); + } + logEvent("effects loading " + (success ? "completed" : "failed")); + } + } +} diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java index c13fcd61eeab..9e3401882f45 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java @@ -85,9 +85,16 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { mCallback = callback; } - public void setSelectedRoute(int uid, String routeId) { + public void selectRoute(String packageName, String routeId) { if (mConnectionReady) { - mActiveConnection.selectRoute(uid, routeId); + mActiveConnection.selectRoute(packageName, routeId); + updateBinding(); + } + } + + public void unselectRoute(String packageName, String routeId) { + if (mConnectionReady) { + mActiveConnection.unselectRotue(packageName, routeId); updateBinding(); } } @@ -235,17 +242,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } - private void onRouteSelected(Connection connection, int uid, String routeId) { - if (mActiveConnection != connection) { - return; - } - - if (DEBUG) { - Slog.d(TAG, this + ": State changed "); - } - mHandler.post(mStateChanged); - } - private void onProviderInfoUpdated(Connection connection, MediaRoute2ProviderInfo info) { if (mActiveConnection != connection) { return; @@ -298,8 +294,8 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { public boolean register() { try { mProvider.asBinder().linkToDeath(this, 0); - mProvider.registerClient(mClient); - mHandler.post((Runnable) () -> onConnectionReady(Connection.this)); + mProvider.setClient(mClient); + mHandler.post(() -> onConnectionReady(Connection.this)); return true; } catch (RemoteException ex) { binderDied(); @@ -312,23 +308,25 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { mClient.dispose(); } - public void selectRoute(int uid, String id) { - if (mClient == null) { - return; - } + public void selectRoute(String packageName, String routeId) { try { - mProvider.selectRoute(mClient, uid, id); + mProvider.selectRoute(packageName, routeId); } catch (RemoteException ex) { Slog.e(TAG, "Failed to deliver request to set discovery mode.", ex); } } - public void sendControlRequest(String id, Intent request) { - if (mClient == null) { - return; + public void unselectRotue(String packageName, String routeId) { + try { + mProvider.unselectRoute(packageName, routeId); + } catch (RemoteException ex) { + Slog.e(TAG, "Failed to deliver request to set discovery mode.", ex); } + } + + public void sendControlRequest(String routeId, Intent request) { try { - mProvider.notifyControlRequestSent(mClient, id, request); + mProvider.notifyControlRequestSent(routeId, request); } catch (RemoteException ex) { Slog.e(TAG, "Failed to deliver request to send control request.", ex); } @@ -339,10 +337,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { mHandler.post(() -> onConnectionDied(Connection.this)); } - void postRouteSelected(int uid, String routeId) { - mHandler.post(() -> onRouteSelected(Connection.this, uid, routeId)); - } - void postProviderUpdated(MediaRoute2ProviderInfo info) { mHandler.post(() -> onProviderInfoUpdated(Connection.this, info)); } @@ -360,14 +354,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } @Override - public void notifyRouteSelected(int uid, String routeId) throws RemoteException { - Connection connection = mConnectionRef.get(); - if (connection != null) { - connection.postRouteSelected(uid, routeId); - } - } - - @Override public void notifyProviderInfoUpdated(MediaRoute2ProviderInfo info) { Connection connection = mConnectionRef.get(); if (connection != null) { diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 0398658f18cd..01936c9159dd 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -183,11 +183,11 @@ class MediaRouter2ServiceImpl { } public void selectClientRoute2(@NonNull IMediaRouter2Manager manager, - int clientUid, @Nullable MediaRoute2Info route) { + String packageName, @Nullable MediaRoute2Info route) { final long token = Binder.clearCallingIdentity(); try { synchronized (mLock) { - selectClientRoute2Locked(manager, clientUid, route); + selectClientRoute2Locked(manager, packageName, route); } } finally { Binder.restoreCallingIdentity(token); @@ -267,8 +267,7 @@ class MediaRouter2ServiceImpl { } } - private void selectRoute2Locked(IMediaRouter2Client client, - MediaRoute2Info route) { + private void selectRoute2Locked(IMediaRouter2Client client, MediaRoute2Info route) { ClientRecord clientRecord = mAllClientRecords.get(client.asBinder()); if (clientRecord != null) { MediaRoute2Info oldRoute = clientRecord.mSelectedRoute; @@ -364,10 +363,10 @@ class MediaRouter2ServiceImpl { } private void selectClientRoute2Locked(IMediaRouter2Manager manager, - int clientUid, MediaRoute2Info route) { + String packageName, MediaRoute2Info route) { ManagerRecord managerRecord = mAllManagerRecords.get(manager.asBinder()); if (managerRecord != null) { - ClientRecord clientRecord = managerRecord.mUserRecord.findClientRecordByUid(clientUid); + ClientRecord clientRecord = managerRecord.mUserRecord.findClientRecord(packageName); if (clientRecord == null) { Slog.w(TAG, "Ignoring route selection for unknown client."); } @@ -413,9 +412,11 @@ class MediaRouter2ServiceImpl { mHandler = new UserHandler(MediaRouter2ServiceImpl.this, this); } - ClientRecord findClientRecordByUid(int uid) { + ClientRecord findClientRecord(String packageName) { for (ClientRecord clientRecord : mClientRecords) { - if (clientRecord.mUid == uid) return clientRecord; + if (TextUtils.equals(clientRecord.mPackageName, packageName)) { + return clientRecord; + } } return null; } @@ -501,8 +502,7 @@ class MediaRouter2ServiceImpl { static final int MSG_STOP = 2; static final int MSG_UPDATE_CLIENT_USAGE = 11; - static final int MSG_UPDATE_MANAGER_STATE = 12; - static final int MSG_SEND_CONTROL_REQUEST = 13; + static final int MSG_SEND_CONTROL_REQUEST = 12; private final WeakReference<MediaRouter2ServiceImpl> mServiceRef; private final UserRecord mUserRecord; @@ -539,10 +539,6 @@ class MediaRouter2ServiceImpl { updateClientUsage((ClientRecord) msg.obj); break; } - case MSG_UPDATE_MANAGER_STATE: { - updateManagerState(); - break; - } case MSG_SEND_CONTROL_REQUEST: { Pair<MediaRoute2Info, Intent> obj = (Pair<MediaRoute2Info, Intent>) msg.obj; sendControlRequest(obj.first, obj.second); @@ -585,20 +581,24 @@ class MediaRouter2ServiceImpl { scheduleUpdateManagerState(); } - private void unselectRoute(ClientRecord clientRecord, MediaRoute2Info route) { + private void selectRoute(ClientRecord clientRecord, MediaRoute2Info route) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); - if (provider != null) { - provider.setSelectedRoute(clientRecord.mUid, null); + if (provider == null) { + Log.w(TAG, "Ignoring to select route of unknown provider " + route); + } else { + provider.selectRoute(clientRecord.mPackageName, route.getId()); } } } - private void selectRoute(ClientRecord clientRecord, MediaRoute2Info route) { + private void unselectRoute(ClientRecord clientRecord, MediaRoute2Info route) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); - if (provider != null) { - provider.setSelectedRoute(clientRecord.mUid, route.getId()); + if (provider == null) { + Log.w(TAG, "Ignoring to unselect route of unknown provider " + route); + } else { + provider.unselectRoute(clientRecord.mPackageName, route.getId()); } } } @@ -613,7 +613,7 @@ class MediaRouter2ServiceImpl { private void scheduleUpdateManagerState() { if (!mManagerStateUpdateScheduled) { mManagerStateUpdateScheduled = true; - sendEmptyMessage(MSG_UPDATE_MANAGER_STATE); + post(this::updateManagerState); } } @@ -670,8 +670,9 @@ class MediaRouter2ServiceImpl { } for (IMediaRouter2Manager manager : managers) { try { - manager.notifyRouteSelected(clientRecord.mUid, clientRecord.mSelectedRoute); - manager.notifyControlCategoriesChanged(clientRecord.mUid, + manager.notifyRouteSelected(clientRecord.mPackageName, + clientRecord.mSelectedRoute); + manager.notifyControlCategoriesChanged(clientRecord.mPackageName, clientRecord.mControlCategories); } catch (RemoteException ex) { Slog.w(TAG, "Failed to update client usage. Manager probably died.", ex); diff --git a/services/core/java/com/android/server/media/MediaRouterService.java b/services/core/java/com/android/server/media/MediaRouterService.java index 4577365b6c3a..a43068b87c06 100644 --- a/services/core/java/com/android/server/media/MediaRouterService.java +++ b/services/core/java/com/android/server/media/MediaRouterService.java @@ -482,8 +482,8 @@ public final class MediaRouterService extends IMediaRouterService.Stub // Binder call @Override public void selectClientRoute2(IMediaRouter2Manager manager, - int clientUid, MediaRoute2Info route) { - mService2.selectClientRoute2(manager, clientUid, route); + String packageName, MediaRoute2Info route) { + mService2.selectClientRoute2(manager, packageName, route); } // Binder call diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 5bd4b2029e7b..c05655a6a5de 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -92,6 +92,7 @@ import com.android.server.Watchdog.Monitor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -748,6 +749,8 @@ public class MediaSessionService extends SystemService implements Monitor { private final int mFullUserId; private final MediaSessionStack mPriorityStack; + private final HashMap<IBinder, CallbackRecord> mCallbacks = new HashMap<>(); + private PendingIntent mLastMediaButtonReceiver; private ComponentName mRestoredMediaButtonReceiver; private int mRestoredMediaButtonReceiverComponentType; @@ -761,7 +764,6 @@ public class MediaSessionService extends SystemService implements Monitor { private IOnMediaKeyListener mOnMediaKeyListener; private int mOnMediaKeyListenerUid; - private ICallback mCallback; FullUserRecord(int fullUserId) { mFullUserId = fullUserId; @@ -793,6 +795,24 @@ public class MediaSessionService extends SystemService implements Monitor { } } + public void registerCallbackLocked(ICallback callback, int uid) { + IBinder cbBinder = callback.asBinder(); + CallbackRecord cr = new CallbackRecord(callback, uid); + mCallbacks.put(cbBinder, cr); + try { + cbBinder.linkToDeath(cr, 0); + } catch (RemoteException e) { + Log.w(TAG, "Failed to register callback", e); + mCallbacks.remove(cbBinder); + } + } + + public void unregisterCallbackLocked(ICallback callback) { + IBinder cbBinder = callback.asBinder(); + CallbackRecord cr = mCallbacks.remove(cbBinder); + cbBinder.unlinkToDeath(cr, 0); + } + public void dumpLocked(PrintWriter pw, String prefix) { pw.print(prefix + "Record for full_user=" + mFullUserId); // Dump managed profile user ids associated with this user. @@ -811,7 +831,10 @@ public class MediaSessionService extends SystemService implements Monitor { pw.println(indent + "Media key listener: " + mOnMediaKeyListener); pw.println(indent + "Media key listener package: " + getCallingPackageName(mOnMediaKeyListenerUid)); - pw.println(indent + "Callback: " + mCallback); + pw.println(indent + "Callbacks: registered " + mCallbacks.size() + " callback(s)"); + for (CallbackRecord cr : mCallbacks.values()) { + pw.println(indent + " from " + getCallingPackageName(cr.uid)); + } pw.println(indent + "Last MediaButtonReceiver: " + mLastMediaButtonReceiver); pw.println(indent + "Restored MediaButtonReceiver: " + mRestoredMediaButtonReceiver); pw.println(indent + "Restored MediaButtonReceiverComponentType: " @@ -871,21 +894,18 @@ public class MediaSessionService extends SystemService implements Monitor { mFullUserId); } - private void pushAddressedPlayerChangedLocked() { - if (mCallback == null) { - return; - } + private void pushAddressedPlayerChangedLocked(ICallback callback) { try { MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked(); if (mediaButtonSession != null) { - mCallback.onAddressedPlayerChangedToMediaSession( + callback.onAddressedPlayerChangedToMediaSession( mediaButtonSession.getSessionToken()); } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) { - mCallback.onAddressedPlayerChangedToMediaButtonReceiver( + callback.onAddressedPlayerChangedToMediaButtonReceiver( mCurrentFullUserRecord.mLastMediaButtonReceiver .getIntent().getComponent()); } else if (mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) { - mCallback.onAddressedPlayerChangedToMediaButtonReceiver( + callback.onAddressedPlayerChangedToMediaButtonReceiver( mCurrentFullUserRecord.mRestoredMediaButtonReceiver); } } catch (RemoteException e) { @@ -893,6 +913,12 @@ public class MediaSessionService extends SystemService implements Monitor { } } + private void pushAddressedPlayerChangedLocked() { + for (CallbackRecord cr : mCallbacks.values()) { + pushAddressedPlayerChangedLocked(cr.callback); + } + } + private MediaSessionRecord getMediaButtonSessionLocked() { return isGlobalPriorityActiveLocked() ? mGlobalPrioritySession : mPriorityStack.getMediaButtonSession(); @@ -926,6 +952,23 @@ public class MediaSessionService extends SystemService implements Monitor { // Pick legacy behavior for BroadcastReceiver or unknown. return COMPONENT_TYPE_BROADCAST; } + + final class CallbackRecord implements IBinder.DeathRecipient { + public final ICallback callback; + public final int uid; + + CallbackRecord(ICallback callback, int uid) { + this.callback = callback; + this.uid = uid; + } + + @Override + public void binderDied() { + synchronized (mLock) { + mCallbacks.remove(callback.asBinder()); + } + } + } } final class SessionsListenerRecord implements IBinder.DeathRecipient { @@ -1305,44 +1348,53 @@ public class MediaSessionService extends SystemService implements Monitor { } @Override - public void setCallback(ICallback callback) { + public void registerCallback(final ICallback callback) { final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(uid); final long token = Binder.clearCallingIdentity(); try { - if (!UserHandle.isSameApp(uid, Process.BLUETOOTH_UID)) { - throw new SecurityException("Only Bluetooth service processes can set" - + " Callback"); + if (!hasMediaControlPermission(pid, uid)) { + throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to" + + " register Callback"); } synchronized (mLock) { - int userId = UserHandle.getUserId(uid); FullUserRecord user = getFullUserRecordLocked(userId); if (user == null || user.mFullUserId != userId) { - Log.w(TAG, "Only the full user can set the callback" + Log.w(TAG, "Only the full user can register the callback" + ", userId=" + userId); return; } - user.mCallback = callback; - Log.d(TAG, "The callback " + user.mCallback - + " is set by " + getCallingPackageName(uid)); - if (user.mCallback == null) { + user.registerCallbackLocked(callback, uid); + Log.d(TAG, "The callback (" + callback.asBinder() + + ") is registered by " + getCallingPackageName(uid)); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void unregisterCallback(final ICallback callback) { + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(uid); + final long token = Binder.clearCallingIdentity(); + try { + if (!hasMediaControlPermission(pid, uid)) { + throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to" + + " unregister Callback"); + } + synchronized (mLock) { + FullUserRecord user = getFullUserRecordLocked(userId); + if (user == null || user.mFullUserId != userId) { + Log.w(TAG, "Only the full user can unregister the callback" + + ", userId=" + userId); return; } - try { - user.mCallback.asBinder().linkToDeath( - new IBinder.DeathRecipient() { - @Override - public void binderDied() { - synchronized (mLock) { - user.mCallback = null; - } - } - }, 0); - user.pushAddressedPlayerChangedLocked(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to set callback", e); - user.mCallback = null; - } + user.unregisterCallbackLocked(callback); + Log.d(TAG, "The callback (" + callback.asBinder() + + ") is unregistered by " + getCallingPackageName(uid)); } } finally { Binder.restoreCallingIdentity(token); @@ -1771,6 +1823,7 @@ public class MediaSessionService extends SystemService implements Monitor { public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid) throws RemoteException { final int uid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(uid); final long token = Binder.clearCallingIdentity(); try { // Don't perform sanity check between controllerPackageName and controllerUid. @@ -1781,8 +1834,8 @@ public class MediaSessionService extends SystemService implements Monitor { // Note that we can use Context#getOpPackageName() instead of // Context#getPackageName() for getting package name that matches with the PID/UID, // but it doesn't tell which package has created the MediaController, so useless. - return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName, - controllerPid, controllerUid); + return hasMediaControlPermission(controllerPid, controllerUid) + || hasEnabledNotificationListener(userId, controllerPackageName); } finally { Binder.restoreCallingIdentity(token); } @@ -1808,13 +1861,7 @@ public class MediaSessionService extends SystemService implements Monitor { return resolvedUserId; } - private boolean hasMediaControlPermission(int resolvedUserId, String packageName, - int pid, int uid) throws RemoteException { - // Allow API calls from the System UI and Settings - if (hasStatusBarServicePermission(pid, uid)) { - return true; - } - + private boolean hasMediaControlPermission(int pid, int uid) { // Check if it's system server or has MEDIA_CONTENT_CONTROL. // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra // check here. @@ -1823,11 +1870,15 @@ public class MediaSessionService extends SystemService implements Monitor { == PackageManager.PERMISSION_GRANTED) { return true; } else if (DEBUG) { - Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL"); + Log.d(TAG, "uid(" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL"); } + return false; + } + private boolean hasEnabledNotificationListener(int resolvedUserId, String packageName) + throws RemoteException { // You may not access another user's content as an enabled listener. - final int userId = UserHandle.getUserId(uid); + final int userId = UserHandle.getUserId(resolvedUserId); if (resolvedUserId != userId) { return false; } @@ -1845,7 +1896,7 @@ public class MediaSessionService extends SystemService implements Monitor { } } if (DEBUG) { - Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled " + Log.d(TAG, packageName + " (uid=" + resolvedUserId + ") doesn't have an enabled " + "notification listener"); } return false; @@ -1950,13 +2001,14 @@ public class MediaSessionService extends SystemService implements Monitor { session.sendMediaButton(packageName, pid, uid, asSystemService, keyEvent, needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mKeyEventReceiver); - if (mCurrentFullUserRecord.mCallback != null) { - try { - mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession( + try { + for (FullUserRecord.CallbackRecord cr + : mCurrentFullUserRecord.mCallbacks.values()) { + cr.callback.onMediaKeyEventDispatchedToMediaSession( keyEvent, session.getSessionToken()); - } catch (RemoteException e) { - Log.w(TAG, "Failed to send callback", e); } + } catch (RemoteException e) { + Log.w(TAG, "Failed to send callback", e); } } else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null || mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) { @@ -1980,12 +2032,12 @@ public class MediaSessionService extends SystemService implements Monitor { receiver.send(mContext, needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mediaButtonIntent, mKeyEventReceiver, mHandler); - if (mCurrentFullUserRecord.mCallback != null) { - ComponentName componentName = mCurrentFullUserRecord - .mLastMediaButtonReceiver.getIntent().getComponent(); - if (componentName != null) { - mCurrentFullUserRecord.mCallback - .onMediaKeyEventDispatchedToMediaButtonReceiver( + ComponentName componentName = mCurrentFullUserRecord + .mLastMediaButtonReceiver.getIntent().getComponent(); + if (componentName != null) { + for (FullUserRecord.CallbackRecord cr + : mCurrentFullUserRecord.mCallbacks.values()) { + cr.callback.onMediaKeyEventDispatchedToMediaButtonReceiver( keyEvent, componentName); } } @@ -2018,9 +2070,9 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "Error sending media button to the restored intent " + receiver + ", type=" + componentType, e); } - if (mCurrentFullUserRecord.mCallback != null) { - mCurrentFullUserRecord.mCallback - .onMediaKeyEventDispatchedToMediaButtonReceiver( + for (FullUserRecord.CallbackRecord cr + : mCurrentFullUserRecord.mCallbacks.values()) { + cr.callback.onMediaKeyEventDispatchedToMediaButtonReceiver( keyEvent, receiver); } } diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 2301e3fb093d..dd099b15a464 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -158,9 +158,9 @@ abstract class ApexManager { * applied at next reboot. * * @param sessionId the identifier of the {@link PackageInstallerSession} being marked as ready. - * @return true upon success, false if the session is unknown. + * @throws PackageManagerException if call to apexd fails */ - abstract boolean markStagedSessionReady(int sessionId); + abstract void markStagedSessionReady(int sessionId) throws PackageManagerException; /** * Marks a staged session as successful. @@ -402,12 +402,16 @@ abstract class ApexManager { } @Override - boolean markStagedSessionReady(int sessionId) { + void markStagedSessionReady(int sessionId) throws PackageManagerException { try { - return mApexService.markStagedSessionReady(sessionId); + mApexService.markStagedSessionReady(sessionId); } catch (RemoteException re) { Slog.e(TAG, "Unable to contact apexservice", re); throw new RuntimeException(re); + } catch (Exception e) { + throw new PackageManagerException( + PackageInstaller.SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, + "Failed to mark apexd session as ready : " + e.getMessage()); } } @@ -576,7 +580,7 @@ abstract class ApexManager { } @Override - boolean markStagedSessionReady(int sessionId) { + void markStagedSessionReady(int sessionId) { throw new UnsupportedOperationException(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5ab8ec3b04ab..540ef2ee3ce0 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4569,55 +4569,6 @@ public class PackageManagerService extends IPackageManager.Stub return -1; } - /** - * Check if any package sharing/holding a uid has a low enough target SDK. - * - * @param uid The uid of the packages - * @param higherTargetSDK The target SDK that might be higher than the searched package - * - * @return {@code true} if there is a package sharing/holding the uid with - * {@code package.targetSDK < higherTargetSDK} - */ - private boolean hasTargetSdkInUidLowerThan(int uid, int higherTargetSDK) { - int userId = UserHandle.getUserId(uid); - - synchronized (mPackages) { - Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid)); - if (obj == null) { - return false; - } - - if (obj instanceof PackageSetting) { - final PackageSetting ps = (PackageSetting) obj; - - if (!ps.getInstalled(userId)) { - return false; - } - - return ps.pkg.applicationInfo.targetSdkVersion < higherTargetSDK; - } else if (obj instanceof SharedUserSetting) { - final SharedUserSetting sus = (SharedUserSetting) obj; - - final int numPkgs = sus.packages.size(); - for (int i = 0; i < numPkgs; i++) { - final PackageSetting ps = sus.packages.valueAt(i); - - if (!ps.getInstalled(userId)) { - continue; - } - - if (ps.pkg.applicationInfo.targetSdkVersion < higherTargetSDK) { - return true; - } - } - - return false; - } else { - return false; - } - } - } - @Override public int[] getPackageGids(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; @@ -5695,7 +5646,8 @@ public class PackageManagerService extends IPackageManager.Stub final long identity = Binder.clearCallingIdentity(); try { - final int flags = getPermissionFlags(permission, packageName, userId); + final int flags = mPermissionManager + .getPermissionFlags(permission, packageName, Binder.getCallingUid(), userId); return (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0; } finally { Binder.restoreCallingIdentity(identity); @@ -5799,63 +5751,6 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public int getPermissionFlags(String permName, String packageName, int userId) { - return mPermissionManager.getPermissionFlags( - permName, packageName, getCallingUid(), userId); - } - - @Override - public void updatePermissionFlags(String permName, String packageName, int flagMask, - int flagValues, boolean checkAdjustPolicyFlagPermission, int userId) { - int callingUid = getCallingUid(); - boolean overridePolicy = false; - - if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID) { - long callingIdentity = Binder.clearCallingIdentity(); - try { - if ((flagMask & FLAG_PERMISSION_POLICY_FIXED) != 0) { - if (checkAdjustPolicyFlagPermission) { - mContext.enforceCallingOrSelfPermission( - Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, - "Need " + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY - + " to change policy flags"); - } else if (!hasTargetSdkInUidLowerThan(callingUid, Build.VERSION_CODES.Q)) { - throw new IllegalArgumentException( - Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY + " needs " - + " to be checked for packages targeting " - + Build.VERSION_CODES.Q + " or later when changing policy " - + "flags"); - } - - overridePolicy = true; - } - } finally { - Binder.restoreCallingIdentity(callingIdentity); - } - } - - mPermissionManager.updatePermissionFlags( - permName, packageName, flagMask, flagValues, callingUid, userId, - overridePolicy, mPermissionCallback); - } - - /** - * Update the permission flags for all packages and runtime permissions of a user in order - * to allow device or profile owner to remove POLICY_FIXED. - */ - @Override - public void updatePermissionFlagsForAllApps(int flagMask, int flagValues, int userId) { - synchronized (mPackages) { - final boolean changed = mPermissionManager.updatePermissionFlagsForAllApps( - flagMask, flagValues, getCallingUid(), userId, mPackages.values(), - mPermissionCallback); - if (changed) { - mSettings.writeRuntimePermissionsForUserLPr(userId, false); - } - } - } - - @Override public @Nullable List<String> getWhitelistedRestrictedPermissions(@NonNull String packageName, @PermissionWhitelistFlags int whitelistFlags, @UserIdInt int userId) { Preconditions.checkNotNull(packageName); @@ -6078,7 +5973,7 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public boolean shouldShowRequestPermissionRationale(String permissionName, + public boolean shouldShowRequestPermissionRationale(String permName, String packageName, int userId) { if (UserHandle.getCallingUserId() != userId) { mContext.enforceCallingPermission( @@ -6091,7 +5986,7 @@ public class PackageManagerService extends IPackageManager.Stub return false; } - if (checkPermission(permissionName, packageName, userId) + if (checkPermission(permName, packageName, userId) == PackageManager.PERMISSION_GRANTED) { return false; } @@ -6100,8 +5995,8 @@ public class PackageManagerService extends IPackageManager.Stub final long identity = Binder.clearCallingIdentity(); try { - flags = getPermissionFlags(permissionName, - packageName, userId); + flags = mPermissionManager + .getPermissionFlags(permName, packageName, Binder.getCallingUid(), userId); } finally { Binder.restoreCallingIdentity(identity); } @@ -24171,13 +24066,6 @@ public class PackageManagerService extends IPackageManager.Stub private class PackageManagerInternalImpl extends PackageManagerInternal { @Override - public void updatePermissionFlagsTEMP(String permName, String packageName, int flagMask, - int flagValues, int userId) { - PackageManagerService.this.updatePermissionFlags( - permName, packageName, flagMask, flagValues, true, userId); - } - - @Override public List<ApplicationInfo> getInstalledApplications(int flags, int userId, int callingUid) { return PackageManagerService.this.getInstalledApplicationsListInternal(flags, userId, @@ -24258,11 +24146,6 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public int getPermissionFlagsTEMP(String permName, String packageName, int userId) { - return PackageManagerService.this.getPermissionFlags(permName, packageName, userId); - } - - @Override public boolean isInstantApp(String packageName, int userId) { return PackageManagerService.this.isInstantApp(packageName, userId); } @@ -25036,6 +24919,52 @@ public class PackageManagerService extends IPackageManager.Stub } } } + + @Override + public void writePermissionSettings(int[] userIds, boolean async) { + synchronized (mPackages) { + for (int userId : userIds) { + mSettings.writeRuntimePermissionsForUserLPr(userId, !async); + } + } + } + + @Override + public void onPermissionsChangedTEMP(int uid) { + mOnPermissionChangeListeners.onPermissionsChanged(uid); + } + + @Override + public int getTargetSdk(int uid) { + int userId = UserHandle.getUserId(uid); + + synchronized (mPackages) { + final Object obj = mSettings.getSettingLPr(UserHandle.getAppId(uid)); + if (obj instanceof PackageSetting) { + final PackageSetting ps = (PackageSetting) obj; + if (!ps.getInstalled(userId)) { + return 0; + } + return ps.pkg.applicationInfo.targetSdkVersion; + } else if (obj instanceof SharedUserSetting) { + int maxTargetSdk = 0; + final SharedUserSetting sus = (SharedUserSetting) obj; + final int numPkgs = sus.packages.size(); + for (int i = 0; i < numPkgs; i++) { + final PackageSetting ps = sus.packages.valueAt(i); + if (!ps.getInstalled(userId)) { + continue; + } + if (ps.pkg.applicationInfo.targetSdkVersion < maxTargetSdk) { + continue; + } + maxTargetSdk = ps.pkg.applicationInfo.targetSdkVersion; + } + return maxTargetSdk; + } + return 0; + } + } } @GuardedBy("mPackages") diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 404b515e233e..42b65c357959 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -278,10 +278,14 @@ public class StagingManager { // session as ready), then if a device gets rebooted right after the call to apexd, only // apex part of the train will be applied, leaving device in an inconsistent state. session.setStagedSessionReady(); - if (hasApex && !mApexManager.markStagedSessionReady(session.sessionId)) { - session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, - "APEX staging failed, check logcat messages from apexd for more " - + "details."); + if (!hasApex) { + // Session doesn't contain apex, nothing to do. + return; + } + try { + mApexManager.markStagedSessionReady(session.sessionId); + } catch (PackageManagerException e) { + session.setStagedSessionFailed(e.error, e.getMessage()); } } diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING index 15dc6ae36656..e375fa44cb3f 100644 --- a/services/core/java/com/android/server/pm/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/TEST_MAPPING @@ -8,6 +8,14 @@ }, { "name": "CtsCompilationTestCases" + }, + { + "name": "CtsPermissionTestCases", + "options": [ + { + "include-filter": "android.permission.cts.PermissionUpdateListenerTest" + } + ] } ], "imports": [ diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 9b00dcaee1d7..74b09b07f26e 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -123,6 +123,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; /** * Manages all permissions and handles permissions related tasks. @@ -229,6 +230,56 @@ public class PermissionManagerService extends IPermissionManager.Stub { final private ArrayList<OnRuntimePermissionStateChangedListener> mRuntimePermissionStateChangedListeners = new ArrayList<>(); + // TODO: Take a look at the methods defined in the callback. + // The callback was initially created to support the split between permission + // manager and the package manager. However, it's started to be used for other + // purposes. It may make sense to keep as an abstraction, but, the methods + // necessary to be overridden may be different than what was initially needed + // for the split. + private PermissionCallback mDefaultPermissionCallback = new PermissionCallback() { + @Override + public void onGidsChanged(int appId, int userId) { + // TODO: implement when methods have been fully migrated + } + @Override + public void onPermissionGranted(int uid, int userId) { + // TODO: implement when methods have been fully migrated + } + @Override + public void onInstallPermissionGranted() { + mPackageManagerInt.writeSettings(true); + } + @Override + public void onPermissionRevoked(int uid, int userId) { + // TODO: implement when methods have been fully migrated + } + @Override + public void onInstallPermissionRevoked() { + mPackageManagerInt.writeSettings(true); + } + @Override + public void onPermissionUpdated(int[] userIds, boolean sync) { + mPackageManagerInt.writePermissionSettings(userIds, !sync); + } + @Override + public void onInstallPermissionUpdated() { + mPackageManagerInt.writeSettings(true); + } + @Override + public void onPermissionRemoved() { + mPackageManagerInt.writeSettings(false); + } + public void onPermissionUpdatedNotifyListener(@UserIdInt int[] updatedUserIds, boolean sync, + int uid) { + onPermissionUpdated(updatedUserIds, sync); + mPackageManagerInt.onPermissionsChangedTEMP(uid); + } + public void onInstallPermissionUpdatedNotifyListener(int uid) { + onInstallPermissionUpdated(); + mPackageManagerInt.onPermissionsChangedTEMP(uid); + } + }; + PermissionManagerService(Context context, @NonNull Object externalLock) { mContext = context; @@ -456,6 +507,209 @@ public class PermissionManagerService extends IPermissionManager.Stub { } } + @Override + public int getPermissionFlags(String permName, String packageName, int userId) { + final int callingUid = getCallingUid(); + return getPermissionFlagsInternal(permName, packageName, callingUid, userId); + } + + private int getPermissionFlagsInternal( + String permName, String packageName, int callingUid, int userId) { + if (!mUserManagerInt.exists(userId)) { + return 0; + } + + enforceGrantRevokeGetRuntimePermissionPermissions("getPermissionFlags"); + enforceCrossUserPermission(callingUid, userId, + true, // requireFullPermission + false, // checkShell + false, // requirePermissionWhenSameUser + "getPermissionFlags"); + + final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); + if (pkg == null || pkg.mExtras == null) { + return 0; + } + synchronized (mLock) { + if (mSettings.getPermissionLocked(permName) == null) { + return 0; + } + } + if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) { + return 0; + } + final PackageSetting ps = (PackageSetting) pkg.mExtras; + PermissionsState permissionsState = ps.getPermissionsState(); + return permissionsState.getPermissionFlags(permName, userId); + } + + @Override + public void updatePermissionFlags(String permName, String packageName, int flagMask, + int flagValues, boolean checkAdjustPolicyFlagPermission, int userId) { + final int callingUid = getCallingUid(); + boolean overridePolicy = false; + + if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID) { + long callingIdentity = Binder.clearCallingIdentity(); + try { + if ((flagMask & FLAG_PERMISSION_POLICY_FIXED) != 0) { + if (checkAdjustPolicyFlagPermission) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, + "Need " + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY + + " to change policy flags"); + } else if (mPackageManagerInt.getTargetSdk(callingUid) + >= Build.VERSION_CODES.Q) { + throw new IllegalArgumentException( + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY + " needs " + + " to be checked for packages targeting " + + Build.VERSION_CODES.Q + " or later when changing policy " + + "flags"); + } + overridePolicy = true; + } + } finally { + Binder.restoreCallingIdentity(callingIdentity); + } + } + + updatePermissionFlagsInternal( + permName, packageName, flagMask, flagValues, callingUid, userId, + overridePolicy, mDefaultPermissionCallback); + } + + private void updatePermissionFlagsInternal(String permName, String packageName, int flagMask, + int flagValues, int callingUid, int userId, boolean overridePolicy, + PermissionCallback callback) { + if (ApplicationPackageManager.DEBUG_TRACE_GRANTS + && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) { + Log.i(TAG, "System is updating flags for " + + permName + " for user " + userId + " " + + DebugUtils.flagsToString( + PackageManager.class, "FLAG_PERMISSION_", flagMask) + + " := " + + DebugUtils.flagsToString( + PackageManager.class, "FLAG_PERMISSION_", flagValues) + + " on behalf of uid " + callingUid + + " " + mPackageManagerInt.getNameForUid(callingUid), + new RuntimeException()); + } + + if (!mUserManagerInt.exists(userId)) { + return; + } + + enforceGrantRevokeRuntimePermissionPermissions("updatePermissionFlags"); + + enforceCrossUserPermission(callingUid, userId, + true, // requireFullPermission + true, // checkShell + false, // requirePermissionWhenSameUser + "updatePermissionFlags"); + + if ((flagMask & FLAG_PERMISSION_POLICY_FIXED) != 0 && !overridePolicy) { + throw new SecurityException("updatePermissionFlags requires " + + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY); + } + + // Only the system can change these flags and nothing else. + if (callingUid != Process.SYSTEM_UID) { + flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + flagMask &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; + flagValues &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; + flagValues &= ~PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; + flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT; + flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT; + flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT; + flagValues &= ~PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; + } + + final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); + if (pkg == null || pkg.mExtras == null) { + Log.e(TAG, "Unknown package: " + packageName); + return; + } + if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + + final BasePermission bp; + synchronized (mLock) { + bp = mSettings.getPermissionLocked(permName); + } + if (bp == null) { + throw new IllegalArgumentException("Unknown permission: " + permName); + } + + final PackageSetting ps = (PackageSetting) pkg.mExtras; + final PermissionsState permissionsState = ps.getPermissionsState(); + final boolean hadState = + permissionsState.getRuntimePermissionState(permName, userId) != null; + final boolean permissionUpdated = + permissionsState.updatePermissionFlags(bp, userId, flagMask, flagValues); + if (permissionUpdated && bp.isRuntime()) { + notifyRuntimePermissionStateChanged(packageName, userId); + } + if (permissionUpdated && callback != null) { + // Install and runtime permissions are stored in different places, + // so figure out what permission changed and persist the change. + if (permissionsState.getInstallPermissionState(permName) != null) { + callback.onInstallPermissionUpdatedNotifyListener(pkg.applicationInfo.uid); + } else if (permissionsState.getRuntimePermissionState(permName, userId) != null + || hadState) { + callback.onPermissionUpdatedNotifyListener(new int[] { userId }, false, + pkg.applicationInfo.uid); + } + } + } + + /** + * Update the permission flags for all packages and runtime permissions of a user in order + * to allow device or profile owner to remove POLICY_FIXED. + */ + @Override + public void updatePermissionFlagsForAllApps(int flagMask, int flagValues, + final int userId) { + final int callingUid = getCallingUid(); + if (!mUserManagerInt.exists(userId)) { + return; + } + + enforceGrantRevokeRuntimePermissionPermissions( + "updatePermissionFlagsForAllApps"); + enforceCrossUserPermission(callingUid, userId, + true, // requireFullPermission + true, // checkShell + false, // requirePermissionWhenSameUser + "updatePermissionFlagsForAllApps"); + + // Only the system can change system fixed flags. + final int effectiveFlagMask = (callingUid != Process.SYSTEM_UID) + ? flagMask : flagMask & ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + final int effectiveFlagValues = (callingUid != Process.SYSTEM_UID) + ? flagValues : flagValues & ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; + + final boolean[] changed = new boolean[1]; + mPackageManagerInt.forEachPackage(new Consumer<PackageParser.Package>() { + @Override + public void accept(Package pkg) { + final PackageSetting ps = (PackageSetting) pkg.mExtras; + if (ps == null) { + return; + } + final PermissionsState permissionsState = ps.getPermissionsState(); + changed[0] |= permissionsState.updatePermissionFlagsForAllPermissions( + userId, effectiveFlagMask, effectiveFlagValues); + mPackageManagerInt.onPermissionsChangedTEMP(pkg.applicationInfo.uid); + } + }); + + if (changed[0]) { + mPackageManagerInt.writePermissionSettings(new int[] { userId }, true); + } + } + private int checkPermission(String permName, String pkgName, int callingUid, int userId) { if (!mUserManagerInt.exists(userId)) { return PackageManager.PERMISSION_DENIED; @@ -2102,7 +2356,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { // In permission review mode we clear the review flag when we // are asked to install the app with all permissions granted. if ((flags & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0) { - updatePermissionFlags(permission, pkg.packageName, + updatePermissionFlagsInternal(permission, pkg.packageName, PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED, 0, callingUid, userId, false, callback); } @@ -2454,7 +2708,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { newFlags |= PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; } - updatePermissionFlags(permissionName, pkg.packageName, mask, newFlags, + updatePermissionFlagsInternal(permissionName, pkg.packageName, mask, newFlags, callingUid, userId, false, null /*callback*/); } @@ -2541,37 +2795,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { return runtimePermissionChangedUserIds; } - private int getPermissionFlags( - String permName, String packageName, int callingUid, int userId) { - if (!mUserManagerInt.exists(userId)) { - return 0; - } - - enforceGrantRevokeGetRuntimePermissionPermissions("getPermissionFlags"); - - enforceCrossUserPermission(callingUid, userId, - true, // requireFullPermission - false, // checkShell - false, // requirePermissionWhenSameUser - "getPermissionFlags"); - - final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); - if (pkg == null || pkg.mExtras == null) { - return 0; - } - synchronized (mLock) { - if (mSettings.getPermissionLocked(permName) == null) { - return 0; - } - } - if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) { - return 0; - } - final PackageSetting ps = (PackageSetting) pkg.mExtras; - PermissionsState permissionsState = ps.getPermissionsState(); - return permissionsState.getPermissionFlags(permName, userId); - } - /** * Update permissions when a package changed. * @@ -2880,127 +3103,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { return changed; } - private void updatePermissionFlags(String permName, String packageName, int flagMask, - int flagValues, int callingUid, int userId, boolean overridePolicy, - PermissionCallback callback) { - if (ApplicationPackageManager.DEBUG_TRACE_GRANTS - && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) { - Log.i(TAG, "System is updating flags for " - + permName + " for user " + userId + " " - + DebugUtils.flagsToString( - PackageManager.class, "FLAG_PERMISSION_", flagMask) - + " := " - + DebugUtils.flagsToString( - PackageManager.class, "FLAG_PERMISSION_", flagValues) - + " on behalf of uid " + callingUid - + " " + mPackageManagerInt.getNameForUid(callingUid), - new RuntimeException()); - } - - if (!mUserManagerInt.exists(userId)) { - return; - } - - enforceGrantRevokeRuntimePermissionPermissions("updatePermissionFlags"); - - enforceCrossUserPermission(callingUid, userId, - true, // requireFullPermission - true, // checkShell - false, // requirePermissionWhenSameUser - "updatePermissionFlags"); - - if ((flagMask & FLAG_PERMISSION_POLICY_FIXED) != 0 && !overridePolicy) { - throw new SecurityException("updatePermissionFlags requires " - + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY); - } - - // Only the system can change these flags and nothing else. - if (callingUid != Process.SYSTEM_UID) { - flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - flagMask &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; - flagValues &= ~PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT; - flagValues &= ~PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; - flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT; - flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT; - flagValues &= ~PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT; - flagValues &= ~PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION; - } - - final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); - if (pkg == null || pkg.mExtras == null) { - Log.e(TAG, "Unknown package: " + packageName); - return; - } - if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) { - throw new IllegalArgumentException("Unknown package: " + packageName); - } - - final BasePermission bp; - synchronized (mLock) { - bp = mSettings.getPermissionLocked(permName); - } - if (bp == null) { - throw new IllegalArgumentException("Unknown permission: " + permName); - } - - final PackageSetting ps = (PackageSetting) pkg.mExtras; - final PermissionsState permissionsState = ps.getPermissionsState(); - final boolean hadState = - permissionsState.getRuntimePermissionState(permName, userId) != null; - final boolean permissionUpdated = - permissionsState.updatePermissionFlags(bp, userId, flagMask, flagValues); - if (permissionUpdated && bp.isRuntime()) { - notifyRuntimePermissionStateChanged(packageName, userId); - } - if (permissionUpdated && callback != null) { - // Install and runtime permissions are stored in different places, - // so figure out what permission changed and persist the change. - if (permissionsState.getInstallPermissionState(permName) != null) { - callback.onInstallPermissionUpdatedNotifyListener(pkg.applicationInfo.uid); - } else if (permissionsState.getRuntimePermissionState(permName, userId) != null - || hadState) { - callback.onPermissionUpdatedNotifyListener(new int[] { userId }, false, - pkg.applicationInfo.uid); - } - } - } - - private boolean updatePermissionFlagsForAllApps(int flagMask, int flagValues, int callingUid, - int userId, Collection<Package> packages, PermissionCallback callback) { - if (!mUserManagerInt.exists(userId)) { - return false; - } - - enforceGrantRevokeRuntimePermissionPermissions( - "updatePermissionFlagsForAllApps"); - enforceCrossUserPermission(callingUid, userId, - true, // requireFullPermission - true, // checkShell - false, // requirePermissionWhenSameUser - "updatePermissionFlagsForAllApps"); - - // Only the system can change system fixed flags. - if (callingUid != Process.SYSTEM_UID) { - flagMask &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - flagValues &= ~PackageManager.FLAG_PERMISSION_SYSTEM_FIXED; - } - - boolean changed = false; - for (PackageParser.Package pkg : packages) { - final PackageSetting ps = (PackageSetting) pkg.mExtras; - if (ps == null) { - continue; - } - PermissionsState permissionsState = ps.getPermissionsState(); - changed |= permissionsState.updatePermissionFlagsForAllPermissions( - userId, flagMask, flagValues); - callback.onPermissionUpdatedNotifyListener(new int[] { userId }, false, - pkg.applicationInfo.uid); - } - return changed; - } - private void enforceGrantRevokeRuntimePermissionPermissions(String message) { if (mContext.checkCallingOrSelfPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS) != PackageManager.PERMISSION_GRANTED @@ -3231,24 +3333,18 @@ public class PermissionManagerService extends IPermissionManager.Stub { @Override public int getPermissionFlags(String permName, String packageName, int callingUid, int userId) { - return PermissionManagerService.this.getPermissionFlags(permName, packageName, - callingUid, userId); + return PermissionManagerService.this + .getPermissionFlagsInternal(permName, packageName, callingUid, userId); } @Override public void updatePermissionFlags(String permName, String packageName, int flagMask, int flagValues, int callingUid, int userId, boolean overridePolicy, PermissionCallback callback) { - PermissionManagerService.this.updatePermissionFlags( + PermissionManagerService.this.updatePermissionFlagsInternal( permName, packageName, flagMask, flagValues, callingUid, userId, overridePolicy, callback); } @Override - public boolean updatePermissionFlagsForAllApps(int flagMask, int flagValues, int callingUid, - int userId, Collection<Package> packages, PermissionCallback callback) { - return PermissionManagerService.this.updatePermissionFlagsForAllApps( - flagMask, flagValues, callingUid, userId, packages, callback); - } - @Override public void enforceCrossUserPermission(int callingUid, int userId, boolean requireFullPermission, boolean checkShell, String message) { PermissionManagerService.this.enforceCrossUserPermission(callingUid, userId, diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index a78557523345..01a206ff5e3e 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -169,13 +169,6 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager public abstract void updatePermissionFlags(@NonNull String permName, @NonNull String packageName, int flagMask, int flagValues, int callingUid, int userId, boolean overridePolicy, @Nullable PermissionCallback callback); - /** - * Updates the flags for all applications by replacing the flags in the specified mask - * with the provided flag values. - */ - public abstract boolean updatePermissionFlagsForAllApps(int flagMask, int flagValues, - int callingUid, int userId, @NonNull Collection<PackageParser.Package> packages, - @Nullable PermissionCallback callback); public abstract int checkPermission(@NonNull String permName, @NonNull String packageName, int callingUid, int userId); diff --git a/services/core/java/com/android/server/pm/permission/TEST_MAPPING b/services/core/java/com/android/server/pm/permission/TEST_MAPPING index 3f9eb2d7fd8c..ee7a098b167b 100644 --- a/services/core/java/com/android/server/pm/permission/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/permission/TEST_MAPPING @@ -14,6 +14,9 @@ }, { "include-filter": "android.permission.cts.SharedUidPermissionsTest" + }, + { + "include-filter": "android.permission.cts.PermissionUpdateListenerTest" } ] }, diff --git a/services/core/java/com/android/server/updates/CertificateTransparencyLogInstallReceiver.java b/services/core/java/com/android/server/updates/CertificateTransparencyLogInstallReceiver.java index ec65f8dafe52..bf32045146f6 100644 --- a/services/core/java/com/android/server/updates/CertificateTransparencyLogInstallReceiver.java +++ b/services/core/java/com/android/server/updates/CertificateTransparencyLogInstallReceiver.java @@ -16,25 +16,30 @@ package com.android.server.updates; -import com.android.internal.util.HexDump; import android.os.FileUtils; -import android.system.Os; import android.system.ErrnoException; +import android.system.Os; import android.util.Base64; import android.util.Slog; + +import com.android.internal.util.HexDump; + +import libcore.io.Streams; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileFilter; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStreamWriter; -import java.io.StringBufferInputStream; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; -import java.security.PublicKey; import java.security.NoSuchAlgorithmException; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; public class CertificateTransparencyLogInstallReceiver extends ConfigUpdateInstallReceiver { @@ -46,14 +51,13 @@ public class CertificateTransparencyLogInstallReceiver extends ConfigUpdateInsta } @Override - protected void install(byte[] content, int version) throws IOException { + protected void install(InputStream inputStream, int version) throws IOException { /* Install is complicated here because we translate the input, which is a JSON file * containing log information to a directory with a file per log. To support atomically * replacing the old configuration directory with the new there's a bunch of steps. We * create a new directory with the logs and then do an atomic update of the current symlink * to point to the new directory. */ - // 1. Ensure that the update dir exists and is readable updateDir.mkdir(); if (!updateDir.isDirectory()) { @@ -72,7 +76,8 @@ public class CertificateTransparencyLogInstallReceiver extends ConfigUpdateInsta // and so we cannot delete the directory since its in use. Instead just bump the version // and return. if (newVersion.getCanonicalPath().equals(currentSymlink.getCanonicalPath())) { - writeUpdate(updateDir, updateVersion, Long.toString(version).getBytes()); + writeUpdate(updateDir, updateVersion, + new ByteArrayInputStream(Long.toString(version).getBytes())); deleteOldLogDirectories(); return; } else { @@ -92,6 +97,7 @@ public class CertificateTransparencyLogInstallReceiver extends ConfigUpdateInsta // 4. For each log in the log file create the corresponding file in <new_version>/ . try { + byte[] content = Streams.readFullyNoClose(inputStream); JSONObject json = new JSONObject(new String(content, StandardCharsets.UTF_8)); JSONArray logs = json.getJSONArray("logs"); for (int i = 0; i < logs.length(); i++) { @@ -119,7 +125,8 @@ public class CertificateTransparencyLogInstallReceiver extends ConfigUpdateInsta } Slog.i(TAG, "CT log directory updated to " + newVersion.getAbsolutePath()); // 7. Update the current version information - writeUpdate(updateDir, updateVersion, Long.toString(version).getBytes()); + writeUpdate(updateDir, updateVersion, + new ByteArrayInputStream(Long.toString(version).getBytes())); // 8. Cleanup deleteOldLogDirectories(); } diff --git a/services/core/java/com/android/server/updates/ConfigUpdateInstallReceiver.java b/services/core/java/com/android/server/updates/ConfigUpdateInstallReceiver.java index c3c841c73ca9..73bb4bf956c3 100644 --- a/services/core/java/com/android/server/updates/ConfigUpdateInstallReceiver.java +++ b/services/core/java/com/android/server/updates/ConfigUpdateInstallReceiver.java @@ -16,9 +16,6 @@ package com.android.server.updates; -import com.android.server.EventLogTags; -import com.android.internal.util.HexDump; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -26,6 +23,14 @@ import android.net.Uri; import android.util.EventLog; import android.util.Slog; +import com.android.internal.util.HexDump; +import com.android.server.EventLogTags; + +import libcore.io.IoUtils; +import libcore.io.Streams; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -33,9 +38,6 @@ import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import libcore.io.IoUtils; -import libcore.io.Streams; - public class ConfigUpdateInstallReceiver extends BroadcastReceiver { private static final String TAG = "ConfigUpdateInstallReceiver"; @@ -61,8 +63,6 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { @Override public void run() { try { - // get the content path from the extras - byte[] altContent = getAltContent(context, intent); // get the version from the extras int altVersion = getVersionFromIntent(intent); // get the previous value from the extras @@ -75,11 +75,13 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { Slog.i(TAG, "Not installing, new version is <= current version"); } else if (!verifyPreviousHash(currentHash, altRequiredHash)) { EventLog.writeEvent(EventLogTags.CONFIG_INSTALL_FAILED, - "Current hash did not match required value"); + "Current hash did not match required value"); } else { // install the new content Slog.i(TAG, "Found new update, installing..."); - install(altContent, altVersion); + try (BufferedInputStream altContent = getAltContent(context, intent)) { + install(altContent, altVersion); + } Slog.i(TAG, "Installation successful"); postInstall(context, intent); } @@ -130,14 +132,9 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { } } - private byte[] getAltContent(Context c, Intent i) throws IOException { + private BufferedInputStream getAltContent(Context c, Intent i) throws IOException { Uri content = getContentFromIntent(i); - InputStream is = c.getContentResolver().openInputStream(content); - try { - return Streams.readFullyNoClose(is); - } finally { - is.close(); - } + return new BufferedInputStream(c.getContentResolver().openInputStream(content)); } private byte[] getCurrentContent() { @@ -175,7 +172,7 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { return current.equals(required); } - protected void writeUpdate(File dir, File file, byte[] content) throws IOException { + protected void writeUpdate(File dir, File file, InputStream inputStream) throws IOException { FileOutputStream out = null; File tmp = null; try { @@ -192,7 +189,7 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { tmp.setReadable(true, false); // write to it out = new FileOutputStream(tmp); - out.write(content); + Streams.copy(inputStream, out); // sync to disk out.getFD().sync(); // atomic rename @@ -207,9 +204,10 @@ public class ConfigUpdateInstallReceiver extends BroadcastReceiver { } } - protected void install(byte[] content, int version) throws IOException { - writeUpdate(updateDir, updateContent, content); - writeUpdate(updateDir, updateVersion, Long.toString(version).getBytes()); + protected void install(InputStream inputStream, int version) throws IOException { + writeUpdate(updateDir, updateContent, inputStream); + writeUpdate(updateDir, updateVersion, + new ByteArrayInputStream(Long.toString(version).getBytes())); } protected void postInstall(Context context, Intent intent) { diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java index af729317392b..ef0049b068f4 100644 --- a/services/core/java/com/android/server/wm/PinnedStackController.java +++ b/services/core/java/com/android/server/wm/PinnedStackController.java @@ -350,7 +350,7 @@ class PinnedStackController { // Calculate the stack bounds in the new orientation to the same same fraction along the // rotated movement bounds. final Rect postChangeMovementBounds = getMovementBounds(postChangeStackBounds, - false /* adjustForIme */, false /* adjustForShelf */); + false /* adjustForIme */); mSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds, snapFraction); if (mIsMinimized) { @@ -540,8 +540,7 @@ class PinnedStackController { */ private Rect getMovementBounds(Rect stackBounds) { synchronized (mService.mGlobalLock) { - return getMovementBounds(stackBounds, true /* adjustForIme */, - true /* adjustForShelf */); + return getMovementBounds(stackBounds, true /* adjustForIme */); } } @@ -549,15 +548,16 @@ class PinnedStackController { * @return the movement bounds for the given {@param stackBounds} and the current state of the * controller. */ - private Rect getMovementBounds(Rect stackBounds, boolean adjustForIme, boolean adjustForShelf) { + private Rect getMovementBounds(Rect stackBounds, boolean adjustForIme) { synchronized (mService.mGlobalLock) { final Rect movementBounds = new Rect(); getInsetBounds(movementBounds); - // Apply the movement bounds adjustments based on the current state + // Apply the movement bounds adjustments based on the current state. + // Note that shelf offset does not affect the movement bounds here + // since it's been taken care of in system UI. mSnapAlgorithm.getMovementBounds(stackBounds, movementBounds, movementBounds, - Math.max((adjustForIme && mIsImeShowing) ? mImeHeight : 0, - (adjustForShelf && mIsShelfShowing) ? mShelfHeight : 0)); + (adjustForIme && mIsImeShowing) ? mImeHeight : 0); return movementBounds; } } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index fb3076ba9ddd..1c8c46c74002 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -826,18 +826,19 @@ void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleO } } - uint32_t changes = 0; + bool pointerGesturesEnabledChanged = false; { // acquire lock AutoMutex _l(mLock); if (mLocked.pointerGesturesEnabled != newPointerGesturesEnabled) { mLocked.pointerGesturesEnabled = newPointerGesturesEnabled; - changes |= InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT; + pointerGesturesEnabledChanged = true; } } // release lock - if (changes) { - mInputManager->getReader()->requestRefreshConfiguration(changes); + if (pointerGesturesEnabledChanged) { + mInputManager->getReader()->requestRefreshConfiguration( + InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT); } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index de8612aba81b..68c9bada6fad 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -196,6 +196,7 @@ import android.os.UserManager; import android.os.UserManagerInternal; import android.os.UserManagerInternal.UserRestrictionsListener; import android.os.storage.StorageManager; +import android.permission.IPermissionManager; import android.permission.PermissionControllerManager; import android.provider.CalendarContract; import android.provider.ContactsContract.QuickContact; @@ -492,6 +493,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final Context mContext; final Injector mInjector; final IPackageManager mIPackageManager; + final IPermissionManager mIPermissionManager; final UserManager mUserManager; final UserManagerInternal mUserManagerInternal; final UsageStatsManagerInternal mUsageStatsManagerInternal; @@ -1974,6 +1976,10 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return AppGlobals.getPackageManager(); } + IPermissionManager getIPermissionManager() { + return AppGlobals.getPermissionManager(); + } + IBackupManager getIBackupManager() { return IBackupManager.Stub.asInterface( ServiceManager.getService(Context.BACKUP_SERVICE)); @@ -2217,6 +2223,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mUsageStatsManagerInternal = Preconditions.checkNotNull( injector.getUsageStatsManagerInternal()); mIPackageManager = Preconditions.checkNotNull(injector.getIPackageManager()); + mIPermissionManager = Preconditions.checkNotNull(injector.getIPermissionManager()); mTelephonyManager = Preconditions.checkNotNull(injector.getTelephonyManager()); mLocalService = new LocalService(); @@ -8217,7 +8224,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { saveSettingsLocked(userId); try { - mIPackageManager.updatePermissionFlagsForAllApps( + mIPermissionManager.updatePermissionFlagsForAllApps( PackageManager.FLAG_PERMISSION_POLICY_FIXED, 0 /* flagValues */, userId); pushUserRestrictions(userId); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java index 2ce4c54a932b..ce83df702b2a 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceTestable.java @@ -37,6 +37,7 @@ import android.os.PowerManagerInternal; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; +import android.permission.IPermissionManager; import android.security.KeyChain; import android.telephony.TelephonyManager; import android.util.ArrayMap; @@ -199,6 +200,11 @@ public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerServi } @Override + IPermissionManager getIPermissionManager() { + return services.ipermissionManager; + } + + @Override IBackupManager getIBackupManager() { return services.ibackupManager; } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java index 8f0aeea3dbf8..f6f365ec1494 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java @@ -52,6 +52,7 @@ import android.os.PowerManagerInternal; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; +import android.permission.IPermissionManager; import android.provider.Settings; import android.security.KeyChain; import android.telephony.TelephonyManager; @@ -97,6 +98,7 @@ public class MockSystemServices { public ActivityManagerInternal activityManagerInternal; public ActivityTaskManagerInternal activityTaskManagerInternal; public final IPackageManager ipackageManager; + public final IPermissionManager ipermissionManager; public final IBackupManager ibackupManager; public final IAudioService iaudioService; public final LockPatternUtils lockPatternUtils; @@ -137,6 +139,7 @@ public class MockSystemServices { activityManagerInternal = mock(ActivityManagerInternal.class); activityTaskManagerInternal = mock(ActivityTaskManagerInternal.class); ipackageManager = mock(IPackageManager.class); + ipermissionManager = mock(IPermissionManager.class); ibackupManager = mock(IBackupManager.class); iaudioService = mock(IAudioService.class); lockPatternUtils = mock(LockPatternUtils.class); diff --git a/startop/scripts/app_startup/app_startup_runner.py b/startop/scripts/app_startup/app_startup_runner.py index 9a608af346d0..7cba7805903d 100755 --- a/startop/scripts/app_startup/app_startup_runner.py +++ b/startop/scripts/app_startup/app_startup_runner.py @@ -27,28 +27,40 @@ # import argparse -import asyncio import csv import itertools import os import sys import tempfile -import time -from typing import Any, Callable, Dict, Generic, Iterable, List, NamedTuple, TextIO, Tuple, TypeVar, Optional, Union +from typing import Any, Callable, Iterable, List, NamedTuple, TextIO, Tuple, \ + TypeVar, Union + +# local import +DIR = os.path.abspath(os.path.dirname(__file__)) +sys.path.append(os.path.dirname(DIR)) +import app_startup.run_app_with_prefetch as run_app_with_prefetch +import app_startup.lib.args_utils as args_utils +from app_startup.lib.data_frame import DataFrame +import lib.cmd_utils as cmd_utils +import lib.print_utils as print_utils # The following command line options participate in the combinatorial generation. # All other arguments have a global effect. -_COMBINATORIAL_OPTIONS=['packages', 'readaheads', 'compiler_filters'] -_TRACING_READAHEADS=['mlock', 'fadvise'] -_FORWARD_OPTIONS={'loop_count': '--count'} -_RUN_SCRIPT=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'run_app_with_prefetch') - -RunCommandArgs = NamedTuple('RunCommandArgs', [('package', str), ('readahead', str), ('compiler_filter', Optional[str])]) -CollectorPackageInfo = NamedTuple('CollectorPackageInfo', [('package', str), ('compiler_filter', str)]) -_COLLECTOR_SCRIPT=os.path.join(os.path.dirname(os.path.realpath(__file__)), '../iorap/collector') -_COLLECTOR_TIMEOUT_MULTIPLIER = 2 # take the regular --timeout and multiply by 2; systrace starts up slowly. - -_UNLOCK_SCREEN_SCRIPT=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'unlock_screen') +_COMBINATORIAL_OPTIONS = ['package', 'readahead', 'compiler_filter', 'activity'] +_TRACING_READAHEADS = ['mlock', 'fadvise'] +_FORWARD_OPTIONS = {'loop_count': '--count'} +_RUN_SCRIPT = os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'run_app_with_prefetch.py') + +CollectorPackageInfo = NamedTuple('CollectorPackageInfo', + [('package', str), ('compiler_filter', str)]) +_COLLECTOR_SCRIPT = os.path.join(os.path.dirname(os.path.realpath(__file__)), + '../iorap/collector') +_COLLECTOR_TIMEOUT_MULTIPLIER = 10 # take the regular --timeout and multiply +# by 2; systrace starts up slowly. + +_UNLOCK_SCREEN_SCRIPT = os.path.join( + os.path.dirname(os.path.realpath(__file__)), 'unlock_screen') # This must be the only mutable global variable. All other global variables are constants to avoid magic literals. _debug = False # See -d/--debug flag. @@ -56,105 +68,70 @@ _DEBUG_FORCE = None # Ignore -d/--debug if this is not none. # Type hinting names. T = TypeVar('T') -NamedTupleMeta = Callable[..., T] # approximation of a (S : NamedTuple<T> where S() == T) metatype. +NamedTupleMeta = Callable[ + ..., T] # approximation of a (S : NamedTuple<T> where S() == T) metatype. def parse_options(argv: List[str] = None): """Parse command line arguments and return an argparse Namespace object.""" - parser = argparse.ArgumentParser(description="Run one or more Android applications under various settings in order to measure startup time.") + parser = argparse.ArgumentParser(description="Run one or more Android " + "applications under various " + "settings in order to measure " + "startup time.") # argparse considers args starting with - and -- optional in --help, even though required=True. # by using a named argument group --help will clearly say that it's required instead of optional. required_named = parser.add_argument_group('required named arguments') - required_named.add_argument('-p', '--package', action='append', dest='packages', help='package of the application', required=True) - required_named.add_argument('-r', '--readahead', action='append', dest='readaheads', help='which readahead mode to use', choices=('warm', 'cold', 'mlock', 'fadvise'), required=True) + required_named.add_argument('-p', '--package', action='append', + dest='packages', + help='package of the application', required=True) + required_named.add_argument('-r', '--readahead', action='append', + dest='readaheads', + help='which readahead mode to use', + choices=('warm', 'cold', 'mlock', 'fadvise'), + required=True) # optional arguments # use a group here to get the required arguments to appear 'above' the optional arguments in help. optional_named = parser.add_argument_group('optional named arguments') - optional_named.add_argument('-c', '--compiler-filter', action='append', dest='compiler_filters', help='which compiler filter to use. if omitted it does not enforce the app\'s compiler filter', choices=('speed', 'speed-profile', 'quicken')) - optional_named.add_argument('-s', '--simulate', dest='simulate', action='store_true', help='Print which commands will run, but don\'t run the apps') - optional_named.add_argument('-d', '--debug', dest='debug', action='store_true', help='Add extra debugging output') - optional_named.add_argument('-o', '--output', dest='output', action='store', help='Write CSV output to file.') - optional_named.add_argument('-t', '--timeout', dest='timeout', action='store', type=int, help='Timeout after this many seconds when executing a single run.') - optional_named.add_argument('-lc', '--loop-count', dest='loop_count', default=1, type=int, action='store', help='How many times to loop a single run.') - optional_named.add_argument('-in', '--inodes', dest='inodes', type=str, action='store', help='Path to inodes file (system/extras/pagecache/pagecache.py -d inodes)') + optional_named.add_argument('-c', '--compiler-filter', action='append', + dest='compiler_filters', + help='which compiler filter to use. if omitted it does not enforce the app\'s compiler filter', + choices=('speed', 'speed-profile', 'quicken')) + optional_named.add_argument('-s', '--simulate', dest='simulate', + action='store_true', + help='Print which commands will run, but don\'t run the apps') + optional_named.add_argument('-d', '--debug', dest='debug', + action='store_true', + help='Add extra debugging output') + optional_named.add_argument('-o', '--output', dest='output', action='store', + help='Write CSV output to file.') + optional_named.add_argument('-t', '--timeout', dest='timeout', action='store', + type=int, default=10, + help='Timeout after this many seconds when executing a single run.') + optional_named.add_argument('-lc', '--loop-count', dest='loop_count', + default=1, type=int, action='store', + help='How many times to loop a single run.') + optional_named.add_argument('-in', '--inodes', dest='inodes', type=str, + action='store', + help='Path to inodes file (system/extras/pagecache/pagecache.py -d inodes)') return parser.parse_args(argv) -# TODO: refactor this with a common library file with analyze_metrics.py -def _debug_print(*args, **kwargs): - """Print the args to sys.stderr if the --debug/-d flag was passed in.""" - if _debug: - print(*args, **kwargs, file=sys.stderr) - -def _expand_gen_repr(args): - """Like repr but any generator-like object has its iterator consumed - and then called repr on.""" - new_args_list = [] - for i in args: - # detect iterable objects that do not have their own override of __str__ - if hasattr(i, '__iter__'): - to_str = getattr(i, '__str__') - if to_str.__objclass__ == object: - # the repr for a generator is just type+address, expand it out instead. - new_args_list.append([_expand_gen_repr([j])[0] for j in i]) - continue - # normal case: uses the built-in to-string - new_args_list.append(i) - return new_args_list - -def _debug_print_gen(*args, **kwargs): - """Like _debug_print but will turn any iterable args into a list.""" - if not _debug: - return - - new_args_list = _expand_gen_repr(args) - _debug_print(*new_args_list, **kwargs) - -def _debug_print_nd(*args, **kwargs): - """Like _debug_print but will turn any NamedTuple-type args into a string.""" - if not _debug: - return - - new_args_list = [] - for i in args: - if hasattr(i, '_field_types'): - new_args_list.append("%s: %s" %(i.__name__, i._field_types)) - else: - new_args_list.append(i) - - _debug_print(*new_args_list, **kwargs) - -def dict_lookup_any_key(dictionary: dict, *keys: List[Any]): - for k in keys: - if k in dictionary: - return dictionary[k] - raise KeyError("None of the keys %s were in the dictionary" %(keys)) - -def generate_run_combinations(named_tuple: NamedTupleMeta[T], opts_dict: Dict[str, List[Optional[str]]])\ - -> Iterable[T]: +def make_script_command_with_temp_output(script: str, + args: List[str], + **kwargs) -> Tuple[str, TextIO]: """ - Create all possible combinations given the values in opts_dict[named_tuple._fields]. - - :type T: type annotation for the named_tuple type. - :param named_tuple: named tuple type, whose fields are used to make combinations for - :param opts_dict: dictionary of keys to value list. keys correspond to the named_tuple fields. - :return: an iterable over named_tuple instances. + Create a command to run a script given the args. + Appends --count <loop_count> --output <tmp-file-name>. + Returns a tuple (cmd, tmp_file) """ - combinations_list = [] - for k in named_tuple._fields: - # the key can be either singular or plural , e.g. 'package' or 'packages' - val = dict_lookup_any_key(opts_dict, k, k + "s") - - # treat {'x': None} key value pairs as if it was [None] - # otherwise itertools.product throws an exception about not being able to iterate None. - combinations_list.append(val or [None]) - - _debug_print("opts_dict: ", opts_dict) - _debug_print_nd("named_tuple: ", named_tuple) - _debug_print("combinations_list: ", combinations_list) - - for combo in itertools.product(*combinations_list): - yield named_tuple(*combo) + tmp_output_file = tempfile.NamedTemporaryFile(mode='r') + cmd = [script] + args + for key, value in kwargs.items(): + cmd += ['--%s' % (key), "%s" % (value)] + if _debug: + cmd += ['--verbose'] + cmd = cmd + ["--output", tmp_output_file.name] + return cmd, tmp_output_file def key_to_cmdline_flag(key: str) -> str: """Convert key into a command line flag, e.g. 'foo-bars' -> '--foo-bar' """ @@ -176,230 +153,26 @@ def as_run_command(tpl: NamedTuple) -> List[Union[str, Any]]: args.append(value) return args -def generate_group_run_combinations(run_combinations: Iterable[NamedTuple], dst_nt: NamedTupleMeta[T])\ - -> Iterable[Tuple[T, Iterable[NamedTuple]]]: - - def group_by_keys(src_nt): - src_d = src_nt._asdict() - # now remove the keys that aren't legal in dst. - for illegal_key in set(src_d.keys()) - set(dst_nt._fields): - if illegal_key in src_d: - del src_d[illegal_key] - - return dst_nt(**src_d) - - for args_list_it in itertools.groupby(run_combinations, group_by_keys): - (group_key_value, args_it) = args_list_it - yield (group_key_value, args_it) - -class DataFrame: - """Table-like class for storing a 2D cells table with named columns.""" - def __init__(self, data: Dict[str, List[object]] = {}): - """ - Create a new DataFrame from a dictionary (keys = headers, - values = columns). - """ - self._headers = [i for i in data.keys()] - self._rows = [] - - row_num = 0 - - def get_data_row(idx): - r = {} - for header, header_data in data.items(): - - if not len(header_data) > idx: - continue - - r[header] = header_data[idx] - - return r - - while True: - row_dict = get_data_row(row_num) - if len(row_dict) == 0: - break - - self._append_row(row_dict.keys(), row_dict.values()) - row_num = row_num + 1 - - def concat_rows(self, other: 'DataFrame') -> None: - """ - In-place concatenate rows of other into the rows of the - current DataFrame. - - None is added in pre-existing cells if new headers - are introduced. - """ - other_datas = other._data_only() - - other_headers = other.headers - - for d in other_datas: - self._append_row(other_headers, d) - - def _append_row(self, headers: List[str], data: List[object]): - new_row = {k:v for k,v in zip(headers, data)} - self._rows.append(new_row) - - for header in headers: - if not header in self._headers: - self._headers.append(header) - - def __repr__(self): -# return repr(self._rows) - repr = "" - - header_list = self._headers_only() - - row_format = u"" - for header in header_list: - row_format = row_format + u"{:>%d}" %(len(header) + 1) - - repr = row_format.format(*header_list) + "\n" - - for v in self._data_only(): - repr = repr + row_format.format(*v) + "\n" - - return repr - - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.headers == other.headers and self.data_table == other.data_table - else: - print("wrong instance", other.__class__) - return False - - @property - def headers(self) -> List[str]: - return [i for i in self._headers_only()] - - @property - def data_table(self) -> List[List[object]]: - return list(self._data_only()) - - @property - def data_table_transposed(self) -> List[List[object]]: - return list(self._transposed_data()) - - @property - def data_row_len(self) -> int: - return len(self._rows) - - def data_row_at(self, idx) -> List[object]: - """ - Return a single data row at the specified index (0th based). - - Accepts negative indices, e.g. -1 is last row. - """ - row_dict = self._rows[idx] - l = [] - - for h in self._headers_only(): - l.append(row_dict.get(h)) # Adds None in blank spots. - - return l - - def copy(self) -> 'DataFrame': - """ - Shallow copy of this DataFrame. - """ - return self.repeat(count=0) - - def repeat(self, count: int) -> 'DataFrame': - """ - Returns a new DataFrame where each row of this dataframe is repeated count times. - A repeat of a row is adjacent to other repeats of that same row. - """ - df = DataFrame() - df._headers = self._headers.copy() - - rows = [] - for row in self._rows: - for i in range(count): - rows.append(row.copy()) - - df._rows = rows - - return df - - def merge_data_columns(self, other: 'DataFrame'): - """ - Merge self and another DataFrame by adding the data from other column-wise. - For any headers that are the same, data from 'other' is preferred. - """ - for h in other._headers: - if not h in self._headers: - self._headers.append(h) - - append_rows = [] - - for self_dict, other_dict in itertools.zip_longest(self._rows, other._rows): - if not self_dict: - d = {} - append_rows.append(d) - else: - d = self_dict - - d_other = other_dict - if d_other: - for k,v in d_other.items(): - d[k] = v - - for r in append_rows: - self._rows.append(r) - - def data_row_reduce(self, fnc) -> 'DataFrame': - """ - Reduces the data row-wise by applying the fnc to each row (column-wise). - Empty cells are skipped. - - fnc(Iterable[object]) -> object - fnc is applied over every non-empty cell in that column (descending row-wise). - - Example: - DataFrame({'a':[1,2,3]}).data_row_reduce(sum) == DataFrame({'a':[6]}) - - Returns a new single-row DataFrame. - """ - df = DataFrame() - df._headers = self._headers.copy() - - def yield_by_column(header_key): - for row_dict in self._rows: - val = row_dict.get(header_key) - if val: - yield val - - new_row_dict = {} - for h in df._headers: - cell_value = fnc(yield_by_column(h)) - new_row_dict[h] = cell_value - - df._rows = [new_row_dict] - return df - - def _headers_only(self): - return self._headers - - def _data_only(self): - row_len = len(self._rows) - - for i in range(row_len): - yield self.data_row_at(i) - - def _transposed_data(self): - return zip(*self._data_only()) - -def parse_run_script_csv_file_flat(csv_file: TextIO) -> List[int]: - """Parse a CSV file full of integers into a flat int list.""" - csv_reader = csv.reader(csv_file) - arr = [] - for row in csv_reader: - for i in row: - if i: - arr.append(int(i)) - return arr +def run_collector_script(collector_info: CollectorPackageInfo, + inodes_path: str, + timeout: int, + simulate: bool) -> Tuple[bool, TextIO]: + """Run collector to collect prefetching trace. """ + # collector_args = ["--package", package_name] + collector_args = as_run_command(collector_info) + # TODO: forward --wait_time for how long systrace runs? + # TODO: forward --trace_buffer_size for size of systrace buffer size? + collector_cmd, collector_tmp_output_file = make_script_command_with_temp_output( + _COLLECTOR_SCRIPT, collector_args, inodes=inodes_path) + + collector_timeout = timeout and _COLLECTOR_TIMEOUT_MULTIPLIER * timeout + (collector_passed, collector_script_output) = \ + cmd_utils.execute_arbitrary_command(collector_cmd, + collector_timeout, + shell=False, + simulate=simulate) + + return collector_passed, collector_tmp_output_file def parse_run_script_csv_file(csv_file: TextIO) -> DataFrame: """Parse a CSV file full of integers into a DataFrame.""" @@ -433,160 +206,52 @@ def parse_run_script_csv_file(csv_file: TextIO) -> DataFrame: return DataFrame(d) -def make_script_command_with_temp_output(script: str, args: List[str], **kwargs)\ - -> Tuple[str, TextIO]: - """ - Create a command to run a script given the args. - Appends --count <loop_count> --output <tmp-file-name>. - Returns a tuple (cmd, tmp_file) - """ - tmp_output_file = tempfile.NamedTemporaryFile(mode='r') - cmd = [script] + args - for key, value in kwargs.items(): - cmd += ['--%s' %(key), "%s" %(value)] - if _debug: - cmd += ['--verbose'] - cmd = cmd + ["--output", tmp_output_file.name] - return cmd, tmp_output_file - -async def _run_command(*args : List[str], timeout: Optional[int] = None) -> Tuple[int, bytes]: - # start child process - # NOTE: universal_newlines parameter is not supported - process = await asyncio.create_subprocess_exec(*args, - stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT) - - script_output = b"" - - _debug_print("[PID]", process.pid) - -#hack -# stdout, stderr = await process.communicate() -# return (process.returncode, stdout) - - timeout_remaining = timeout - time_started = time.time() - - # read line (sequence of bytes ending with b'\n') asynchronously - while True: - try: - line = await asyncio.wait_for(process.stdout.readline(), timeout_remaining) - _debug_print("[STDOUT]", line) - script_output += line - - if timeout_remaining: - time_elapsed = time.time() - time_started - timeout_remaining = timeout - time_elapsed - except asyncio.TimeoutError: - _debug_print("[TIMEDOUT] Process ", process.pid) - -# if process.returncode is not None: -# #_debug_print("[WTF] can-write-eof?", process.stdout.can_write_eof()) -# -# _debug_print("[TIMEDOUT] Process already terminated") -# (remaining_stdout, remaining_stderr) = await process.communicate() -# script_output += remaining_stdout -# -# code = await process.wait() -# return (code, script_output) - - _debug_print("[TIMEDOUT] Sending SIGTERM.") - process.terminate() - - # 1 second timeout for process to handle SIGTERM nicely. - try: - (remaining_stdout, remaining_stderr) = await asyncio.wait_for(process.communicate(), 5) - script_output += remaining_stdout - except asyncio.TimeoutError: - _debug_print("[TIMEDOUT] Sending SIGKILL.") - process.kill() - - # 1 second timeout to finish with SIGKILL. - try: - (remaining_stdout, remaining_stderr) = await asyncio.wait_for(process.communicate(), 5) - script_output += remaining_stdout - except asyncio.TimeoutError: - # give up, this will leave a zombie process. - _debug_print("[TIMEDOUT] SIGKILL failed for process ", process.pid) - time.sleep(100) - #await process.wait() - - return (-1, script_output) - else: - if not line: # EOF - break - - #if process.returncode is not None: - # _debug_print("[WTF] can-write-eof?", process.stdout.can_write_eof()) - # process.stdout.write_eof() - - #if process.stdout.at_eof(): - # break - - code = await process.wait() # wait for child process to exit - return (code, script_output) - -def execute_arbitrary_command(cmd: List[str], simulate: bool, timeout: Optional[int]) -> Tuple[bool, str]: - if simulate: - print(" ".join(cmd)) - return (True, "") - else: - _debug_print("[EXECUTE]", cmd) - - # block until either command finishes or the timeout occurs. - loop = asyncio.get_event_loop() - (return_code, script_output) = loop.run_until_complete(_run_command(*cmd, timeout=timeout)) - - script_output = script_output.decode() # convert bytes to str - - passed = (return_code == 0) - _debug_print("[$?]", return_code) - if not passed: - print("[FAILED, code:%s]" %(return_code), script_output, file=sys.stderr) - - return (passed, script_output) - -def execute_run_combos(grouped_run_combos: Iterable[Tuple[CollectorPackageInfo, Iterable[RunCommandArgs]]], simulate: bool, inodes_path: str, timeout: int, loop_count: int, need_trace: bool): +def execute_run_combos( + grouped_run_combos: Iterable[Tuple[CollectorPackageInfo, Iterable[ + run_app_with_prefetch.RunCommandArgs]]], + simulate: bool, + inodes_path: str, + timeout: int): # nothing will work if the screen isn't unlocked first. - execute_arbitrary_command([_UNLOCK_SCREEN_SCRIPT], simulate, timeout) + cmd_utils.execute_arbitrary_command([_UNLOCK_SCREEN_SCRIPT], + timeout, + simulate=simulate, + shell=False) for collector_info, run_combos in grouped_run_combos: - #collector_args = ["--package", package_name] - collector_args = as_run_command(collector_info) - # TODO: forward --wait_time for how long systrace runs? - # TODO: forward --trace_buffer_size for size of systrace buffer size? - collector_cmd, collector_tmp_output_file = make_script_command_with_temp_output(_COLLECTOR_SCRIPT, collector_args, inodes=inodes_path) - - with collector_tmp_output_file: - collector_passed = True - if need_trace: - collector_timeout = timeout and _COLLECTOR_TIMEOUT_MULTIPLIER * timeout - (collector_passed, collector_script_output) = execute_arbitrary_command(collector_cmd, simulate, collector_timeout) - # TODO: consider to print a ; collector wrote file to <...> into the CSV file so we know it was ran. - - for combos in run_combos: - args = as_run_command(combos) - - cmd, tmp_output_file = make_script_command_with_temp_output(_RUN_SCRIPT, args, count=loop_count, input=collector_tmp_output_file.name) - with tmp_output_file: - (passed, script_output) = execute_arbitrary_command(cmd, simulate, timeout) - parsed_output = simulate and DataFrame({'fake_ms':[1,2,3]}) or parse_run_script_csv_file(tmp_output_file) - yield (passed, script_output, parsed_output) - -def gather_results(commands: Iterable[Tuple[bool, str, DataFrame]], key_list: List[str], value_list: List[Tuple[str, ...]]): - _debug_print("gather_results: key_list = ", key_list) -# yield key_list + ["time(ms)"] - + for combos in run_combos: + args = as_run_command(combos) + if combos.readahead in _TRACING_READAHEADS: + passed, collector_tmp_output_file = run_collector_script(collector_info, + inodes_path, + timeout, + simulate) + combos = combos._replace(input=collector_tmp_output_file.name) + + print_utils.debug_print(combos) + output = run_app_with_prefetch.run_test(combos) + + yield DataFrame(dict((x, [y]) for x, y in output)) if output else None + +def gather_results(commands: Iterable[Tuple[DataFrame]], + key_list: List[str], value_list: List[Tuple[str, ...]]): + print_utils.debug_print("gather_results: key_list = ", key_list) stringify_none = lambda s: s is None and "<none>" or s + # yield key_list + ["time(ms)"] + for (run_result_list, values) in itertools.zip_longest(commands, value_list): + print_utils.debug_print("run_result_list = ", run_result_list) + print_utils.debug_print("values = ", values) - for ((passed, script_output, run_result_list), values) in itertools.zip_longest(commands, value_list): - _debug_print("run_result_list = ", run_result_list) - _debug_print("values = ", values) - if not passed: + if not run_result_list: continue # RunCommandArgs(package='com.whatever', readahead='warm', compiler_filter=None) # -> {'package':['com.whatever'], 'readahead':['warm'], 'compiler_filter':[None]} - values_dict = {k:[v] for k,v in values._asdict().items()} + values_dict = {} + for k, v in values._asdict().items(): + if not k in key_list: + continue + values_dict[k] = [stringify_none(v)] values_df = DataFrame(values_dict) # project 'values_df' to be same number of rows as run_result_list. @@ -598,7 +263,6 @@ def gather_results(commands: Iterable[Tuple[bool, str, DataFrame]], key_list: Li yield values_df def eval_and_save_to_csv(output, annotated_result_values): - printed_header = False csv_writer = csv.writer(output) @@ -610,9 +274,22 @@ def eval_and_save_to_csv(output, annotated_result_values): # TODO: what about when headers change? for data_row in row.data_table: + data_row = [d for d in data_row] csv_writer.writerow(data_row) - output.flush() # see the output live. + output.flush() # see the output live. + +def coerce_to_list(opts: dict): + """Tranform values of the dictionary to list. + For example: + 1 -> [1], None -> [None], [1,2,3] -> [1,2,3] + [[1],[2]] -> [[1],[2]], {1:1, 2:2} -> [{1:1, 2:2}] + """ + result = {} + for key in opts: + val = opts[key] + result[key] = val if issubclass(type(val), list) else [val] + return result def main(): global _debug @@ -621,26 +298,34 @@ def main(): _debug = opts.debug if _DEBUG_FORCE is not None: _debug = _DEBUG_FORCE - _debug_print("parsed options: ", opts) - need_trace = not not set(opts.readaheads).intersection(set(_TRACING_READAHEADS)) - if need_trace and not opts.inodes: - print("Error: Missing -in/--inodes, required when using a readahead of %s" %(_TRACING_READAHEADS), file=sys.stderr) - return 1 + + print_utils.DEBUG = _debug + cmd_utils.SIMULATE = opts.simulate + + print_utils.debug_print("parsed options: ", opts) output_file = opts.output and open(opts.output, 'w') or sys.stdout - combos = lambda: generate_run_combinations(RunCommandArgs, vars(opts)) - _debug_print_gen("run combinations: ", combos()) + combos = lambda: args_utils.generate_run_combinations( + run_app_with_prefetch.RunCommandArgs, + coerce_to_list(vars(opts)), + opts.loop_count) + print_utils.debug_print_gen("run combinations: ", combos()) - grouped_combos = lambda: generate_group_run_combinations(combos(), CollectorPackageInfo) - _debug_print_gen("grouped run combinations: ", grouped_combos()) + grouped_combos = lambda: args_utils.generate_group_run_combinations(combos(), + CollectorPackageInfo) + + print_utils.debug_print_gen("grouped run combinations: ", grouped_combos()) + exec = execute_run_combos(grouped_combos(), + opts.simulate, + opts.inodes, + opts.timeout) - exec = execute_run_combos(grouped_combos(), opts.simulate, opts.inodes, opts.timeout, opts.loop_count, need_trace) results = gather_results(exec, _COMBINATORIAL_OPTIONS, combos()) - eval_and_save_to_csv(output_file, results) - return 0 + eval_and_save_to_csv(output_file, results) + return 1 if __name__ == '__main__': sys.exit(main()) diff --git a/startop/scripts/app_startup/app_startup_runner_test.py b/startop/scripts/app_startup/app_startup_runner_test.py index fd81667fe26f..9aa7014d1912 100755 --- a/startop/scripts/app_startup/app_startup_runner_test.py +++ b/startop/scripts/app_startup/app_startup_runner_test.py @@ -31,18 +31,17 @@ Usage: See also https://docs.pytest.org/en/latest/usage.html """ -# global imports -from contextlib import contextmanager import io import shlex import sys import typing - -# pip imports -import pytest +# global imports +from contextlib import contextmanager # local imports import app_startup_runner as asr +# pip imports +import pytest # # Argument Parsing Helpers @@ -91,7 +90,8 @@ def default_dict_for_parsed_args(**kwargs): """ # Combine it with all of the "optional" parameters' default values. """ - d = {'compiler_filters': None, 'simulate': False, 'debug': False, 'output': None, 'timeout': None, 'loop_count': 1, 'inodes': None} + d = {'compiler_filters': None, 'simulate': False, 'debug': False, + 'output': None, 'timeout': 10, 'loop_count': 1, 'inodes': None} d.update(kwargs) return d @@ -111,7 +111,7 @@ def parse_optional_args(str): in default_mock_dict_for_parsed_args. """ req = "--package com.fake.package --readahead warm" - return parse_args("%s %s" %(req, str)) + return parse_args("%s %s" % (req, str)) def test_argparse(): # missing arguments @@ -124,15 +124,22 @@ def test_argparse(): # required arguments are parsed correctly ad = default_dict_for_parsed_args # assert dict - assert parse_args("--package xyz --readahead warm") == ad(packages=['xyz'], readaheads=['warm']) - assert parse_args("-p xyz -r warm") == ad(packages=['xyz'], readaheads=['warm']) + assert parse_args("--package xyz --readahead warm") == ad(packages=['xyz'], + readaheads=['warm']) + assert parse_args("-p xyz -r warm") == ad(packages=['xyz'], + readaheads=['warm']) - assert parse_args("-p xyz -r warm -s") == ad(packages=['xyz'], readaheads=['warm'], simulate=True) - assert parse_args("-p xyz -r warm --simulate") == ad(packages=['xyz'], readaheads=['warm'], simulate=True) + assert parse_args("-p xyz -r warm -s") == ad(packages=['xyz'], + readaheads=['warm'], + simulate=True) + assert parse_args("-p xyz -r warm --simulate") == ad(packages=['xyz'], + readaheads=['warm'], + simulate=True) # optional arguments are parsed correctly. mad = default_mock_dict_for_parsed_args # mock assert dict - assert parse_optional_args("--output filename.csv") == mad(output='filename.csv') + assert parse_optional_args("--output filename.csv") == mad( + output='filename.csv') assert parse_optional_args("-o filename.csv") == mad(output='filename.csv') assert parse_optional_args("--timeout 123") == mad(timeout=123) @@ -145,36 +152,6 @@ def test_argparse(): assert parse_optional_args("-in baz") == mad(inodes="baz") -def generate_run_combinations(*args): - # expand out the generator values so that assert x == y works properly. - return [i for i in asr.generate_run_combinations(*args)] - -def test_generate_run_combinations(): - blank_nd = typing.NamedTuple('Blank') - assert generate_run_combinations(blank_nd, {}) == [()], "empty" - assert generate_run_combinations(blank_nd, {'a' : ['a1', 'a2']}) == [()], "empty filter" - a_nd = typing.NamedTuple('A', [('a', str)]) - assert generate_run_combinations(a_nd, {'a': None}) == [(None,)], "None" - assert generate_run_combinations(a_nd, {'a': ['a1', 'a2']}) == [('a1',), ('a2',)], "one item" - assert generate_run_combinations(a_nd, - {'a' : ['a1', 'a2'], 'b': ['b1', 'b2']}) == [('a1',), ('a2',)],\ - "one item filter" - ab_nd = typing.NamedTuple('AB', [('a', str), ('b', str)]) - assert generate_run_combinations(ab_nd, - {'a': ['a1', 'a2'], - 'b': ['b1', 'b2']}) == [ab_nd('a1', 'b1'), - ab_nd('a1', 'b2'), - ab_nd('a2', 'b1'), - ab_nd('a2', 'b2')],\ - "two items" - - assert generate_run_combinations(ab_nd, - {'as': ['a1', 'a2'], - 'bs': ['b1', 'b2']}) == [ab_nd('a1', 'b1'), - ab_nd('a1', 'b2'), - ab_nd('a2', 'b1'), - ab_nd('a2', 'b2')],\ - "two items plural" def test_key_to_cmdline_flag(): assert asr.key_to_cmdline_flag("abc") == "--abc" @@ -182,138 +159,18 @@ def test_key_to_cmdline_flag(): assert asr.key_to_cmdline_flag("ba_r") == "--ba-r" assert asr.key_to_cmdline_flag("ba_zs") == "--ba-z" - def test_make_script_command_with_temp_output(): - cmd_str, tmp_file = asr.make_script_command_with_temp_output("fake_script", args=[], count=1) + cmd_str, tmp_file = asr.make_script_command_with_temp_output("fake_script", + args=[], count=1) with tmp_file: assert cmd_str == ["fake_script", "--count", "1", "--output", tmp_file.name] - cmd_str, tmp_file = asr.make_script_command_with_temp_output("fake_script", args=['a', 'b'], count=2) + cmd_str, tmp_file = asr.make_script_command_with_temp_output("fake_script", + args=['a', 'b'], + count=2) with tmp_file: - assert cmd_str == ["fake_script", "a", "b", "--count", "2", "--output", tmp_file.name] - -def test_parse_run_script_csv_file_flat(): - # empty file -> empty list - f = io.StringIO("") - assert asr.parse_run_script_csv_file_flat(f) == [] - - # common case - f = io.StringIO("1,2,3") - assert asr.parse_run_script_csv_file_flat(f) == [1,2,3] - - # ignore trailing comma - f = io.StringIO("1,2,3,4,5,") - assert asr.parse_run_script_csv_file_flat(f) == [1,2,3,4,5] - -def test_data_frame(): - # trivial empty data frame - df = asr.DataFrame() - assert df.headers == [] - assert df.data_table == [] - assert df.data_table_transposed == [] - - # common case, same number of values in each place. - df = asr.DataFrame({'TotalTime_ms':[1,2,3], 'Displayed_ms':[4,5,6]}) - assert df.headers == ['TotalTime_ms', 'Displayed_ms'] - assert df.data_table == [[1, 4], [2, 5], [3, 6]] - assert df.data_table_transposed == [(1, 2, 3), (4, 5, 6)] - - # varying num values. - df = asr.DataFrame({'many':[1,2], 'none': []}) - assert df.headers == ['many', 'none'] - assert df.data_table == [[1, None], [2, None]] - assert df.data_table_transposed == [(1, 2), (None, None)] - - df = asr.DataFrame({'many':[], 'none': [1,2]}) - assert df.headers == ['many', 'none'] - assert df.data_table == [[None, 1], [None, 2]] - assert df.data_table_transposed == [(None, None), (1, 2)] - - # merge multiple data frames - df = asr.DataFrame() - df.concat_rows(asr.DataFrame()) - assert df.headers == [] - assert df.data_table == [] - assert df.data_table_transposed == [] - - df = asr.DataFrame() - df2 = asr.DataFrame({'TotalTime_ms':[1,2,3], 'Displayed_ms':[4,5,6]}) - - df.concat_rows(df2) - assert df.headers == ['TotalTime_ms', 'Displayed_ms'] - assert df.data_table == [[1, 4], [2, 5], [3, 6]] - assert df.data_table_transposed == [(1, 2, 3), (4, 5, 6)] - - df = asr.DataFrame({'TotalTime_ms':[1,2]}) - df2 = asr.DataFrame({'Displayed_ms':[4,5]}) - - df.concat_rows(df2) - assert df.headers == ['TotalTime_ms', 'Displayed_ms'] - assert df.data_table == [[1, None], [2, None], [None, 4], [None, 5]] - - df = asr.DataFrame({'TotalTime_ms':[1,2]}) - df2 = asr.DataFrame({'TotalTime_ms': [3, 4], 'Displayed_ms':[5, 6]}) - - df.concat_rows(df2) - assert df.headers == ['TotalTime_ms', 'Displayed_ms'] - assert df.data_table == [[1, None], [2, None], [3, 5], [4, 6]] - - # data_row_at - df = asr.DataFrame({'TotalTime_ms':[1,2,3], 'Displayed_ms':[4,5,6]}) - assert df.data_row_at(-1) == [3,6] - assert df.data_row_at(2) == [3,6] - assert df.data_row_at(1) == [2,5] - - # repeat - df = asr.DataFrame({'TotalTime_ms':[1], 'Displayed_ms':[4]}) - df2 = asr.DataFrame({'TotalTime_ms':[1,1,1], 'Displayed_ms':[4,4,4]}) - assert df.repeat(3) == df2 - - # repeat - df = asr.DataFrame({'TotalTime_ms':[1,1,1], 'Displayed_ms':[4,4,4]}) - assert df.data_row_len == 3 - df = asr.DataFrame({'TotalTime_ms':[1,1]}) - assert df.data_row_len == 2 - - # repeat - df = asr.DataFrame({'TotalTime_ms':[1,1,1], 'Displayed_ms':[4,4,4]}) - assert df.data_row_len == 3 - df = asr.DataFrame({'TotalTime_ms':[1,1]}) - assert df.data_row_len == 2 - - # data_row_reduce - df = asr.DataFrame({'TotalTime_ms':[1,1,1], 'Displayed_ms':[4,4,4]}) - df_sum = asr.DataFrame({'TotalTime_ms':[3], 'Displayed_ms':[12]}) - assert df.data_row_reduce(sum) == df_sum - - # merge_data_columns - df = asr.DataFrame({'TotalTime_ms':[1,2,3]}) - df2 = asr.DataFrame({'Displayed_ms':[3,4,5,6]}) - - df.merge_data_columns(df2) - assert df == asr.DataFrame({'TotalTime_ms':[1,2,3], 'Displayed_ms':[3,4,5,6]}) - - df = asr.DataFrame({'TotalTime_ms':[1,2,3]}) - df2 = asr.DataFrame({'Displayed_ms':[3,4]}) - - df.merge_data_columns(df2) - assert df == asr.DataFrame({'TotalTime_ms':[1,2,3], 'Displayed_ms':[3,4]}) - - df = asr.DataFrame({'TotalTime_ms':[1,2,3]}) - df2 = asr.DataFrame({'TotalTime_ms':[10,11]}) - - df.merge_data_columns(df2) - assert df == asr.DataFrame({'TotalTime_ms':[10,11,3]}) - - df = asr.DataFrame({'TotalTime_ms':[]}) - df2 = asr.DataFrame({'TotalTime_ms':[10,11]}) - - df.merge_data_columns(df2) - assert df == asr.DataFrame({'TotalTime_ms':[10,11]}) - - - - + assert cmd_str == ["fake_script", "a", "b", "--count", "2", "--output", + tmp_file.name] def test_parse_run_script_csv_file(): # empty file -> empty list diff --git a/startop/scripts/app_startup/lib/args_utils.py b/startop/scripts/app_startup/lib/args_utils.py new file mode 100644 index 000000000000..080f3b53157b --- /dev/null +++ b/startop/scripts/app_startup/lib/args_utils.py @@ -0,0 +1,77 @@ +import itertools +import os +import sys +from typing import Any, Callable, Dict, Iterable, List, NamedTuple, Tuple, \ + TypeVar, Optional + +# local import +sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname( + os.path.abspath(__file__))))) +import lib.print_utils as print_utils + +T = TypeVar('T') +NamedTupleMeta = Callable[ + ..., T] # approximation of a (S : NamedTuple<T> where S() == T) metatype. +FilterFuncType = Callable[[NamedTuple], bool] + +def dict_lookup_any_key(dictionary: dict, *keys: List[Any]): + for k in keys: + if k in dictionary: + return dictionary[k] + + + print_utils.debug_print("None of the keys {} were in the dictionary".format( + keys)) + return [None] + +def generate_run_combinations(named_tuple: NamedTupleMeta[T], + opts_dict: Dict[str, List[Optional[object]]], + loop_count: int = 1) -> Iterable[T]: + """ + Create all possible combinations given the values in opts_dict[named_tuple._fields]. + + :type T: type annotation for the named_tuple type. + :param named_tuple: named tuple type, whose fields are used to make combinations for + :param opts_dict: dictionary of keys to value list. keys correspond to the named_tuple fields. + :param loop_count: number of repetitions. + :return: an iterable over named_tuple instances. + """ + combinations_list = [] + for k in named_tuple._fields: + # the key can be either singular or plural , e.g. 'package' or 'packages' + val = dict_lookup_any_key(opts_dict, k, k + "s") + + # treat {'x': None} key value pairs as if it was [None] + # otherwise itertools.product throws an exception about not being able to iterate None. + combinations_list.append(val or [None]) + + print_utils.debug_print("opts_dict: ", opts_dict) + print_utils.debug_print_nd("named_tuple: ", named_tuple) + print_utils.debug_print("combinations_list: ", combinations_list) + + for i in range(loop_count): + for combo in itertools.product(*combinations_list): + yield named_tuple(*combo) + +def filter_run_combinations(named_tuple: NamedTuple, + filters: List[FilterFuncType]) -> bool: + for filter in filters: + if filter(named_tuple): + return False + return True + +def generate_group_run_combinations(run_combinations: Iterable[NamedTuple], + dst_nt: NamedTupleMeta[T]) \ + -> Iterable[Tuple[T, Iterable[NamedTuple]]]: + def group_by_keys(src_nt): + src_d = src_nt._asdict() + # now remove the keys that aren't legal in dst. + for illegal_key in set(src_d.keys()) - set(dst_nt._fields): + if illegal_key in src_d: + del src_d[illegal_key] + + return dst_nt(**src_d) + + for args_list_it in itertools.groupby(run_combinations, group_by_keys): + (group_key_value, args_it) = args_list_it + yield (group_key_value, args_it) diff --git a/startop/scripts/app_startup/lib/args_utils_test.py b/startop/scripts/app_startup/lib/args_utils_test.py new file mode 100644 index 000000000000..4b7e0fa20627 --- /dev/null +++ b/startop/scripts/app_startup/lib/args_utils_test.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# +# Copyright 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. +# + +"""Unit tests for the args_utils.py script.""" + +import typing + +import args_utils + +def generate_run_combinations(*args): + # expand out the generator values so that assert x == y works properly. + return [i for i in args_utils.generate_run_combinations(*args)] + +def test_generate_run_combinations(): + blank_nd = typing.NamedTuple('Blank') + assert generate_run_combinations(blank_nd, {}, 1) == [()], "empty" + assert generate_run_combinations(blank_nd, {'a': ['a1', 'a2']}) == [ + ()], "empty filter" + a_nd = typing.NamedTuple('A', [('a', str)]) + assert generate_run_combinations(a_nd, {'a': None}) == [(None,)], "None" + assert generate_run_combinations(a_nd, {'a': ['a1', 'a2']}) == [('a1',), ( + 'a2',)], "one item" + assert generate_run_combinations(a_nd, + {'a': ['a1', 'a2'], 'b': ['b1', 'b2']}) == [ + ('a1',), ('a2',)], \ + "one item filter" + assert generate_run_combinations(a_nd, {'a': ['a1', 'a2']}, 2) == [('a1',), ( + 'a2',), ('a1',), ('a2',)], "one item" + ab_nd = typing.NamedTuple('AB', [('a', str), ('b', str)]) + assert generate_run_combinations(ab_nd, + {'a': ['a1', 'a2'], + 'b': ['b1', 'b2']}) == [ab_nd('a1', 'b1'), + ab_nd('a1', 'b2'), + ab_nd('a2', 'b1'), + ab_nd('a2', 'b2')], \ + "two items" + + assert generate_run_combinations(ab_nd, + {'as': ['a1', 'a2'], + 'bs': ['b1', 'b2']}) == [ab_nd('a1', 'b1'), + ab_nd('a1', 'b2'), + ab_nd('a2', 'b1'), + ab_nd('a2', 'b2')], \ + "two items plural" diff --git a/startop/scripts/app_startup/lib/data_frame.py b/startop/scripts/app_startup/lib/data_frame.py new file mode 100644 index 000000000000..20a2308637f2 --- /dev/null +++ b/startop/scripts/app_startup/lib/data_frame.py @@ -0,0 +1,201 @@ +import itertools +from typing import Dict, List + +class DataFrame: + """Table-like class for storing a 2D cells table with named columns.""" + def __init__(self, data: Dict[str, List[object]] = {}): + """ + Create a new DataFrame from a dictionary (keys = headers, + values = columns). + """ + self._headers = [i for i in data.keys()] + self._rows = [] + + row_num = 0 + + def get_data_row(idx): + r = {} + for header, header_data in data.items(): + + if not len(header_data) > idx: + continue + + r[header] = header_data[idx] + + return r + + while True: + row_dict = get_data_row(row_num) + if len(row_dict) == 0: + break + + self._append_row(row_dict.keys(), row_dict.values()) + row_num = row_num + 1 + + def concat_rows(self, other: 'DataFrame') -> None: + """ + In-place concatenate rows of other into the rows of the + current DataFrame. + + None is added in pre-existing cells if new headers + are introduced. + """ + other_datas = other._data_only() + + other_headers = other.headers + + for d in other_datas: + self._append_row(other_headers, d) + + def _append_row(self, headers: List[str], data: List[object]): + new_row = {k:v for k,v in zip(headers, data)} + self._rows.append(new_row) + + for header in headers: + if not header in self._headers: + self._headers.append(header) + + def __repr__(self): +# return repr(self._rows) + repr = "" + + header_list = self._headers_only() + + row_format = u"" + for header in header_list: + row_format = row_format + u"{:>%d}" %(len(header) + 1) + + repr = row_format.format(*header_list) + "\n" + + for v in self._data_only(): + repr = repr + row_format.format(*v) + "\n" + + return repr + + def __eq__(self, other): + if isinstance(other, self.__class__): + return self.headers == other.headers and self.data_table == other.data_table + else: + print("wrong instance", other.__class__) + return False + + @property + def headers(self) -> List[str]: + return [i for i in self._headers_only()] + + @property + def data_table(self) -> List[List[object]]: + return list(self._data_only()) + + @property + def data_table_transposed(self) -> List[List[object]]: + return list(self._transposed_data()) + + @property + def data_row_len(self) -> int: + return len(self._rows) + + def data_row_at(self, idx) -> List[object]: + """ + Return a single data row at the specified index (0th based). + + Accepts negative indices, e.g. -1 is last row. + """ + row_dict = self._rows[idx] + l = [] + + for h in self._headers_only(): + l.append(row_dict.get(h)) # Adds None in blank spots. + + return l + + def copy(self) -> 'DataFrame': + """ + Shallow copy of this DataFrame. + """ + return self.repeat(count=0) + + def repeat(self, count: int) -> 'DataFrame': + """ + Returns a new DataFrame where each row of this dataframe is repeated count times. + A repeat of a row is adjacent to other repeats of that same row. + """ + df = DataFrame() + df._headers = self._headers.copy() + + rows = [] + for row in self._rows: + for i in range(count): + rows.append(row.copy()) + + df._rows = rows + + return df + + def merge_data_columns(self, other: 'DataFrame'): + """ + Merge self and another DataFrame by adding the data from other column-wise. + For any headers that are the same, data from 'other' is preferred. + """ + for h in other._headers: + if not h in self._headers: + self._headers.append(h) + + append_rows = [] + + for self_dict, other_dict in itertools.zip_longest(self._rows, other._rows): + if not self_dict: + d = {} + append_rows.append(d) + else: + d = self_dict + + d_other = other_dict + if d_other: + for k,v in d_other.items(): + d[k] = v + + for r in append_rows: + self._rows.append(r) + + def data_row_reduce(self, fnc) -> 'DataFrame': + """ + Reduces the data row-wise by applying the fnc to each row (column-wise). + Empty cells are skipped. + + fnc(Iterable[object]) -> object + fnc is applied over every non-empty cell in that column (descending row-wise). + + Example: + DataFrame({'a':[1,2,3]}).data_row_reduce(sum) == DataFrame({'a':[6]}) + + Returns a new single-row DataFrame. + """ + df = DataFrame() + df._headers = self._headers.copy() + + def yield_by_column(header_key): + for row_dict in self._rows: + val = row_dict.get(header_key) + if val: + yield val + + new_row_dict = {} + for h in df._headers: + cell_value = fnc(yield_by_column(h)) + new_row_dict[h] = cell_value + + df._rows = [new_row_dict] + return df + + def _headers_only(self): + return self._headers + + def _data_only(self): + row_len = len(self._rows) + + for i in range(row_len): + yield self.data_row_at(i) + + def _transposed_data(self): + return zip(*self._data_only())
\ No newline at end of file diff --git a/startop/scripts/app_startup/lib/data_frame_test.py b/startop/scripts/app_startup/lib/data_frame_test.py new file mode 100644 index 000000000000..1cbc1cbe45cb --- /dev/null +++ b/startop/scripts/app_startup/lib/data_frame_test.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +# +# Copyright 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. +# + +"""Unit tests for the data_frame.py script.""" + +from data_frame import DataFrame + +def test_data_frame(): + # trivial empty data frame + df = DataFrame() + assert df.headers == [] + assert df.data_table == [] + assert df.data_table_transposed == [] + + # common case, same number of values in each place. + df = DataFrame({'TotalTime_ms': [1, 2, 3], 'Displayed_ms': [4, 5, 6]}) + assert df.headers == ['TotalTime_ms', 'Displayed_ms'] + assert df.data_table == [[1, 4], [2, 5], [3, 6]] + assert df.data_table_transposed == [(1, 2, 3), (4, 5, 6)] + + # varying num values. + df = DataFrame({'many': [1, 2], 'none': []}) + assert df.headers == ['many', 'none'] + assert df.data_table == [[1, None], [2, None]] + assert df.data_table_transposed == [(1, 2), (None, None)] + + df = DataFrame({'many': [], 'none': [1, 2]}) + assert df.headers == ['many', 'none'] + assert df.data_table == [[None, 1], [None, 2]] + assert df.data_table_transposed == [(None, None), (1, 2)] + + # merge multiple data frames + df = DataFrame() + df.concat_rows(DataFrame()) + assert df.headers == [] + assert df.data_table == [] + assert df.data_table_transposed == [] + + df = DataFrame() + df2 = DataFrame({'TotalTime_ms': [1, 2, 3], 'Displayed_ms': [4, 5, 6]}) + + df.concat_rows(df2) + assert df.headers == ['TotalTime_ms', 'Displayed_ms'] + assert df.data_table == [[1, 4], [2, 5], [3, 6]] + assert df.data_table_transposed == [(1, 2, 3), (4, 5, 6)] + + df = DataFrame({'TotalTime_ms': [1, 2]}) + df2 = DataFrame({'Displayed_ms': [4, 5]}) + + df.concat_rows(df2) + assert df.headers == ['TotalTime_ms', 'Displayed_ms'] + assert df.data_table == [[1, None], [2, None], [None, 4], [None, 5]] + + df = DataFrame({'TotalTime_ms': [1, 2]}) + df2 = DataFrame({'TotalTime_ms': [3, 4], 'Displayed_ms': [5, 6]}) + + df.concat_rows(df2) + assert df.headers == ['TotalTime_ms', 'Displayed_ms'] + assert df.data_table == [[1, None], [2, None], [3, 5], [4, 6]] + + # data_row_at + df = DataFrame({'TotalTime_ms': [1, 2, 3], 'Displayed_ms': [4, 5, 6]}) + assert df.data_row_at(-1) == [3, 6] + assert df.data_row_at(2) == [3, 6] + assert df.data_row_at(1) == [2, 5] + + # repeat + df = DataFrame({'TotalTime_ms': [1], 'Displayed_ms': [4]}) + df2 = DataFrame({'TotalTime_ms': [1, 1, 1], 'Displayed_ms': [4, 4, 4]}) + assert df.repeat(3) == df2 + + # repeat + df = DataFrame({'TotalTime_ms': [1, 1, 1], 'Displayed_ms': [4, 4, 4]}) + assert df.data_row_len == 3 + df = DataFrame({'TotalTime_ms': [1, 1]}) + assert df.data_row_len == 2 + + # repeat + df = DataFrame({'TotalTime_ms': [1, 1, 1], 'Displayed_ms': [4, 4, 4]}) + assert df.data_row_len == 3 + df = DataFrame({'TotalTime_ms': [1, 1]}) + assert df.data_row_len == 2 + + # data_row_reduce + df = DataFrame({'TotalTime_ms': [1, 1, 1], 'Displayed_ms': [4, 4, 4]}) + df_sum = DataFrame({'TotalTime_ms': [3], 'Displayed_ms': [12]}) + assert df.data_row_reduce(sum) == df_sum + + # merge_data_columns + df = DataFrame({'TotalTime_ms': [1, 2, 3]}) + df2 = DataFrame({'Displayed_ms': [3, 4, 5, 6]}) + + df.merge_data_columns(df2) + assert df == DataFrame( + {'TotalTime_ms': [1, 2, 3], 'Displayed_ms': [3, 4, 5, 6]}) + + df = DataFrame({'TotalTime_ms': [1, 2, 3]}) + df2 = DataFrame({'Displayed_ms': [3, 4]}) + + df.merge_data_columns(df2) + assert df == DataFrame( + {'TotalTime_ms': [1, 2, 3], 'Displayed_ms': [3, 4]}) + + df = DataFrame({'TotalTime_ms': [1, 2, 3]}) + df2 = DataFrame({'TotalTime_ms': [10, 11]}) + + df.merge_data_columns(df2) + assert df == DataFrame({'TotalTime_ms': [10, 11, 3]}) + + df = DataFrame({'TotalTime_ms': []}) + df2 = DataFrame({'TotalTime_ms': [10, 11]}) + + df.merge_data_columns(df2) + assert df == DataFrame({'TotalTime_ms': [10, 11]}) diff --git a/startop/scripts/app_startup/query_compiler_filter.py b/startop/scripts/app_startup/query_compiler_filter.py index dc97c6641f35..ea14264b4a1c 100755 --- a/startop/scripts/app_startup/query_compiler_filter.py +++ b/startop/scripts/app_startup/query_compiler_filter.py @@ -31,13 +31,15 @@ # import argparse -import sys +import os import re +import sys # TODO: refactor this with a common library file with analyze_metrics.py -import app_startup_runner -from app_startup_runner import _debug_print -from app_startup_runner import execute_arbitrary_command +DIR = os.path.abspath(os.path.dirname(__file__)) +sys.path.append(os.path.dirname(DIR)) +import lib.cmd_utils as cmd_utils +import lib.print_utils as print_utils from typing import List, NamedTuple, Iterable @@ -74,7 +76,11 @@ Dexopt state: x86: [status=quicken] [reason=install] """ %(package, package, package, package) - code, res = execute_arbitrary_command(['adb', 'shell', 'dumpsys', 'package', package], simulate=False, timeout=5) + code, res = cmd_utils.execute_arbitrary_command(['adb', 'shell', 'dumpsys', + 'package', package], + simulate=False, + timeout=5, + shell=False) if code: return res else: @@ -115,7 +121,7 @@ def parse_tab_subtree(label: str, str_lines: List[str], separator=' ', indent=-1 line = str_lines[line_num] current_indent = get_indent_level(line) - _debug_print("INDENT=%d, LINE=%s" %(current_indent, line)) + print_utils.debug_print("INDENT=%d, LINE=%s" %(current_indent, line)) current_label = line.lstrip() @@ -135,7 +141,7 @@ def parse_tab_subtree(label: str, str_lines: List[str], separator=' ', indent=-1 break new_remainder = str_lines[line_num::] - _debug_print("NEW REMAINDER: ", new_remainder) + print_utils.debug_print("NEW REMAINDER: ", new_remainder) parse_tree = ParseTree(label, children) return ParseResult(new_remainder, parse_tree) @@ -159,7 +165,7 @@ def parse_dexopt_state(dumpsys_tree: ParseTree) -> DexoptState: def find_first_compiler_filter(dexopt_state: DexoptState, package: str, instruction_set: str) -> str: lst = find_all_compiler_filters(dexopt_state, package) - _debug_print("all compiler filters: ", lst) + print_utils.debug_print("all compiler filters: ", lst) for compiler_filter_info in lst: if not instruction_set: @@ -180,10 +186,10 @@ def find_all_compiler_filters(dexopt_state: DexoptState, package: str) -> List[C if not package_tree: raise AssertionError("Could not find any package subtree for package %s" %(package)) - _debug_print("package tree: ", package_tree) + print_utils.debug_print("package tree: ", package_tree) for path_tree in find_parse_children(package_tree, "path: "): - _debug_print("path tree: ", path_tree) + print_utils.debug_print("path tree: ", path_tree) matchre = re.compile("([^:]+):\s+\[status=([^\]]+)\]\s+\[reason=([^\]]+)\]") @@ -198,16 +204,16 @@ def find_all_compiler_filters(dexopt_state: DexoptState, package: str) -> List[C def main() -> int: opts = parse_options() - app_startup_runner._debug = opts.debug + cmd_utils._debug = opts.debug if _DEBUG_FORCE is not None: - app_startup_runner._debug = _DEBUG_FORCE - _debug_print("parsed options: ", opts) + cmd_utils._debug = _DEBUG_FORCE + print_utils.debug_print("parsed options: ", opts) # Note: This can often 'fail' if the package isn't actually installed. package_dumpsys = remote_dumpsys_package(opts.package, opts.simulate) - _debug_print("package dumpsys: ", package_dumpsys) + print_utils.debug_print("package dumpsys: ", package_dumpsys) dumpsys_parse_tree = parse_tab_tree(package_dumpsys, package_dumpsys) - _debug_print("parse tree: ", dumpsys_parse_tree) + print_utils.debug_print("parse tree: ", dumpsys_parse_tree) dexopt_state = parse_dexopt_state(dumpsys_parse_tree) filter = find_first_compiler_filter(dexopt_state, opts.package, opts.instruction_set) diff --git a/startop/scripts/app_startup/run_app_with_prefetch.py b/startop/scripts/app_startup/run_app_with_prefetch.py index 052db9d6f5ea..8a9135bb3dea 100644 --- a/startop/scripts/app_startup/run_app_with_prefetch.py +++ b/startop/scripts/app_startup/run_app_with_prefetch.py @@ -30,7 +30,7 @@ import argparse import os import sys import time -from typing import List, Tuple, Optional +from typing import List, Tuple, Optional, NamedTuple # local imports import lib.adb_utils as adb_utils @@ -47,10 +47,20 @@ import lib.print_utils as print_utils import lib.cmd_utils as cmd_utils import iorap.lib.iorapd_utils as iorapd_utils +RunCommandArgs = NamedTuple('RunCommandArgs', + [('package', str), + ('readahead', str), + ('activity', Optional[str]), + ('compiler_filter', Optional[str]), + ('timeout', Optional[int]), + ('debug', bool), + ('simulate', bool), + ('input', Optional[str])]) + def parse_options(argv: List[str] = None): """Parses command line arguments and return an argparse Namespace object.""" parser = argparse.ArgumentParser( - description='Run an Android application once and measure startup time.' + description='Run an Android application once and measure startup time.' ) required_named = parser.add_argument_group('required named arguments') @@ -91,43 +101,44 @@ def parse_options(argv: List[str] = None): return parser.parse_args(argv) -def validate_options(opts: argparse.Namespace) -> bool: +def validate_options(args: argparse.Namespace) -> Tuple[bool, RunCommandArgs]: """Validates the activity and trace file if needed. Returns: A bool indicates whether the activity is valid and trace file exists if necessary. """ - needs_trace_file = (opts.readahead != 'cold' and opts.readahead != 'warm') - if needs_trace_file and (opts.input is None or - not os.path.exists(opts.input)): + needs_trace_file = (args.readahead != 'cold' and args.readahead != 'warm') + if needs_trace_file and (args.input is None or + not os.path.exists(args.input)): print_utils.error_print('--input not specified!') - return False + return False, args - if opts.simulate: - opts.activity = 'act' + if args.simulate: + args = args._replace(activity='act') - if not opts.activity: - _, opts.activity = cmd_utils.run_shell_func(IORAP_COMMON_BASH_SCRIPT, - 'get_activity_name', - [opts.package]) + if not args.activity: + _, activity = cmd_utils.run_shell_func(IORAP_COMMON_BASH_SCRIPT, + 'get_activity_name', + [args.package]) + args = args._replace(activity=activity) - if not opts.activity: + if not args.activity: print_utils.error_print('Activity name could not be found, ' - 'invalid package name?!') - return False + 'invalid package name?!') + return False, args # Install necessary trace file. This must be after the activity checking. if needs_trace_file: passed = iorapd_utils.iorapd_compiler_install_trace_file( - opts.package, opts.activity, opts.input) + args.package, args.activity, args.input) if not cmd_utils.SIMULATE and not passed: print_utils.error_print('Failed to install compiled TraceFile.pb for ' '"{}/{}"'. - format(opts.package, opts.activity)) - return False + format(args.package, args.activity)) + return False, args - return True + return True, args def set_up_adb_env(): """Sets up adb environment.""" @@ -149,17 +160,18 @@ def configure_compiler_filter(compiler_filter: str, package: str, passed, current_compiler_filter_info = \ cmd_utils.run_shell_command( - '{} --package {}'.format(os.path.join(DIR, 'query_compiler_filter.py'), - package)) + '{} --package {}'.format(os.path.join(DIR, 'query_compiler_filter.py'), + package)) if passed != 0: return passed # TODO: call query_compiler_filter directly as a python function instead of # these shell calls. - current_compiler_filter, current_reason, current_isa = current_compiler_filter_info.split(' ') + current_compiler_filter, current_reason, current_isa = \ + current_compiler_filter_info.split(' ') print_utils.debug_print('Compiler Filter={} Reason={} Isa={}'.format( - current_compiler_filter, current_reason, current_isa)) + current_compiler_filter, current_reason, current_isa)) # Don't trust reasons that aren't 'unknown' because that means # we didn't manually force the compilation filter. @@ -202,7 +214,7 @@ def parse_metrics_output(input: str, print_utils.debug_print('metric: "{metric_name}", ' 'value: "{metric_value}" '. format(metric_name=metric_name, - metric_value=metric_value)) + metric_value=metric_value)) all_metrics.append((metric_name, metric_value)) return all_metrics @@ -230,7 +242,7 @@ def blocking_parse_all_metrics(am_start_output: str, package: str, """ total_time = _parse_total_time(am_start_output) displayed_time = adb_utils.blocking_wait_for_logcat_displayed_time( - pre_launch_timestamp, package, timeout) + pre_launch_timestamp, package, timeout) return 'TotalTime={}\nDisplayedTime={}'.format(total_time, displayed_time) @@ -268,10 +280,10 @@ def run(readahead: str, '"{DIR}/launch_application" ' '"{package}" ' '"{activity}"' - .format(timeout=timeout, - DIR=DIR, - package=package, - activity=activity)) + .format(timeout=timeout, + DIR=DIR, + package=package, + activity=activity)) if not passed and not simulate: return None @@ -285,7 +297,7 @@ def run(readahead: str, results = parse_metrics_output(output, simulate) passed = perform_post_launch_cleanup( - readahead, package, activity, timeout, debug, pre_launch_timestamp) + readahead, package, activity, timeout, debug, pre_launch_timestamp) if not passed and not simulate: print_utils.error_print('Cannot perform post launch cleanup!') return None @@ -306,10 +318,10 @@ def perform_post_launch_cleanup(readahead: str, """ if readahead != 'warm' and readahead != 'cold': passed = iorapd_utils.wait_for_iorapd_finish(package, - activity, - timeout, - debug, - logcat_timestamp) + activity, + timeout, + debug, + logcat_timestamp) if not passed: return passed @@ -319,16 +331,16 @@ def perform_post_launch_cleanup(readahead: str, # Don't need to do anything for warm or cold. return True -def run_test(opts: argparse.Namespace) -> List[Tuple[str, str]]: +def run_test(args: RunCommandArgs) -> List[Tuple[str, str]]: """Runs one test using given options. Returns: - A list of tuples that including metric name, metric value and anything left. + A list of tuples that including metric name, metric value. """ - print_utils.DEBUG = opts.debug - cmd_utils.SIMULATE = opts.simulate + print_utils.DEBUG = args.debug + cmd_utils.SIMULATE = args.simulate - passed = validate_options(opts) + passed, args = validate_options(args) if not passed: return None @@ -337,15 +349,22 @@ def run_test(opts: argparse.Namespace) -> List[Tuple[str, str]]: # Ensure the APK is currently compiled with whatever we passed in # via --compiler-filter. # No-op if this option was not passed in. - if not configure_compiler_filter(opts.compiler_filter, opts.package, - opts.activity): + if not configure_compiler_filter(args.compiler_filter, args.package, + args.activity): return None - return run(opts.readahead, opts.package, opts.activity, opts.timeout, - opts.simulate, opts.debug) + return run(args.readahead, args.package, args.activity, args.timeout, + args.simulate, args.debug) + +def get_args_from_opts(opts: argparse.Namespace) -> RunCommandArgs: + kwargs = {} + for field in RunCommandArgs._fields: + kwargs[field] = getattr(opts, field) + return RunCommandArgs(**kwargs) def main(): - args = parse_options() + opts = parse_options() + args = get_args_from_opts(opts) result = run_test(args) if result is None: diff --git a/startop/scripts/lib/logcat_utils.py b/startop/scripts/lib/logcat_utils.py index 13b1c3a5cff7..8a3d00b46771 100644 --- a/startop/scripts/lib/logcat_utils.py +++ b/startop/scripts/lib/logcat_utils.py @@ -22,7 +22,7 @@ from datetime import datetime from typing import Optional, Pattern # local import -import print_utils +import lib.print_utils as print_utils def parse_logcat_datetime(timestamp: str) -> Optional[datetime]: """Parses the timestamp of logcat. @@ -61,7 +61,7 @@ async def _blocking_wait_for_logcat_pattern(timestamp: datetime, pattern: Pattern, timeout: datetime) -> Optional[str]: # Show the year in the timestampe. - logcat_cmd = 'adb logcat -v year -v threadtime -T'.split() + logcat_cmd = 'adb logcat -v UTC -v year -v threadtime -T'.split() logcat_cmd.append(str(timestamp)) print_utils.debug_print('[LOGCAT]:' + ' '.join(logcat_cmd)) diff --git a/startop/scripts/lib/print_utils.py b/startop/scripts/lib/print_utils.py index c33e0f979a0c..8c5999d99d6e 100644 --- a/startop/scripts/lib/print_utils.py +++ b/startop/scripts/lib/print_utils.py @@ -27,3 +27,41 @@ def debug_print(*args, **kwargs): def error_print(*args, **kwargs): print('[ERROR]:', *args, file=sys.stderr, **kwargs) + +def _expand_gen_repr(args): + """Like repr but any generator-like object has its iterator consumed + and then called repr on.""" + new_args_list = [] + for i in args: + # detect iterable objects that do not have their own override of __str__ + if hasattr(i, '__iter__'): + to_str = getattr(i, '__str__') + if to_str.__objclass__ == object: + # the repr for a generator is just type+address, expand it out instead. + new_args_list.append([_expand_gen_repr([j])[0] for j in i]) + continue + # normal case: uses the built-in to-string + new_args_list.append(i) + return new_args_list + +def debug_print_gen(*args, **kwargs): + """Like _debug_print but will turn any iterable args into a list.""" + if not DEBUG: + return + + new_args_list = _expand_gen_repr(args) + debug_print(*new_args_list, **kwargs) + +def debug_print_nd(*args, **kwargs): + """Like _debug_print but will turn any NamedTuple-type args into a string.""" + if not DEBUG: + return + + new_args_list = [] + for i in args: + if hasattr(i, '_field_types'): + new_args_list.append("%s: %s" % (i.__name__, i._field_types)) + else: + new_args_list.append(i) + + debug_print(*new_args_list, **kwargs) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index ed70a81e01d6..6cfec3c5fce3 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -4901,7 +4901,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_ACTIVITY_NONE; - return telephony.getDataActivity(); + return telephony.getDataActivityForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_ACTIVITY_NONE; @@ -4949,7 +4950,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_DISCONNECTED; - return telephony.getDataState(); + return telephony.getDataStateForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_DISCONNECTED; diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a27a0fb42e4..a2dcc78585eb 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -308,18 +308,46 @@ interface ITelephony { */ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); - @UnsupportedAppUsage - int getCallState(); + @UnsupportedAppUsage + int getCallState(); /** * Returns the call state for a slot. */ - int getCallStateForSlot(int slotIndex); + int getCallStateForSlot(int slotIndex); + + /** + * Replaced by getDataActivityForSubId. + */ + int getDataActivity(); + + /** + * Returns a constant indicating the type of activity on a data connection + * (cellular). + * + * @see #DATA_ACTIVITY_NONE + * @see #DATA_ACTIVITY_IN + * @see #DATA_ACTIVITY_OUT + * @see #DATA_ACTIVITY_INOUT + * @see #DATA_ACTIVITY_DORMANT + */ + int getDataActivityForSubId(int subId); + + /** + * Replaced by getDataStateForSubId. + */ + int getDataState(); - @UnsupportedAppUsage - int getDataActivity(); - @UnsupportedAppUsage - int getDataState(); + /** + * Returns a constant indicating the current data connection state + * (cellular). + * + * @see #DATA_DISCONNECTED + * @see #DATA_CONNECTING + * @see #DATA_CONNECTED + * @see #DATA_SUSPENDED + */ + int getDataStateForSubId(int subId); /** * Returns the current active phone type as integer. diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 9010f3c9943e..1829baac4c58 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -29,7 +29,6 @@ import android.net.wifi.INetworkRequestMatchCallback; import android.net.wifi.ISoftApCallback; import android.net.wifi.ITrafficStateCallback; import android.net.wifi.IOnWifiUsabilityStatsListener; -import android.net.wifi.PasspointManagementObjectDefinition; import android.net.wifi.ScanResult; import android.net.wifi.WifiActivityEnergyInfo; import android.net.wifi.WifiConfiguration; diff --git a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.aidl b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.aidl deleted file mode 100644 index eb7cc39d5e33..000000000000 --- a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2008, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi; - -parcelable PasspointManagementObjectDefinition; diff --git a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java b/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java deleted file mode 100644 index 70577b9695e5..000000000000 --- a/wifi/java/android/net/wifi/PasspointManagementObjectDefinition.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * This object describes a partial tree structure in the Hotspot 2.0 release 2 management object. - * The object is used during subscription remediation to modify parts of an existing PPS MO - * tree (Hotspot 2.0 specification section 9.1). - * @hide - */ -public class PasspointManagementObjectDefinition implements Parcelable { - private final String mBaseUri; - private final String mUrn; - private final String mMoTree; - - public PasspointManagementObjectDefinition(String baseUri, String urn, String moTree) { - mBaseUri = baseUri; - mUrn = urn; - mMoTree = moTree; - } - - public String getBaseUri() { - return mBaseUri; - } - - public String getUrn() { - return mUrn; - } - - public String getMoTree() { - return mMoTree; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mBaseUri); - dest.writeString(mUrn); - dest.writeString(mMoTree); - } - - /** - * Implement the Parcelable interface {@hide} - */ - public static final @android.annotation.NonNull Creator<PasspointManagementObjectDefinition> CREATOR = - new Creator<PasspointManagementObjectDefinition>() { - public PasspointManagementObjectDefinition createFromParcel(Parcel in) { - return new PasspointManagementObjectDefinition( - in.readString(), /* base URI */ - in.readString(), /* URN */ - in.readString() /* Tree XML */ - ); - } - - public PasspointManagementObjectDefinition[] newArray(int size) { - return new PasspointManagementObjectDefinition[size]; - } - }; -} - diff --git a/wifi/java/android/net/wifi/WpsResult.aidl b/wifi/java/android/net/wifi/WpsResult.aidl deleted file mode 100644 index eb4c4f5539ba..000000000000 --- a/wifi/java/android/net/wifi/WpsResult.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2010, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi; - -parcelable WpsResult; diff --git a/wifi/java/android/net/wifi/WpsResult.java b/wifi/java/android/net/wifi/WpsResult.java deleted file mode 100644 index f2ffb6f52520..000000000000 --- a/wifi/java/android/net/wifi/WpsResult.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * A class representing the result of a WPS request - * @hide - */ -public class WpsResult implements Parcelable { - - public enum Status { - SUCCESS, - FAILURE, - IN_PROGRESS, - } - - public Status status; - - public String pin; - - public WpsResult() { - status = Status.FAILURE; - pin = null; - } - - public WpsResult(Status s) { - status = s; - pin = null; - } - - public String toString() { - StringBuffer sbuf = new StringBuffer(); - sbuf.append(" status: ").append(status.toString()); - sbuf.append('\n'); - sbuf.append(" pin: ").append(pin); - sbuf.append("\n"); - return sbuf.toString(); - } - - /** Implement the Parcelable interface {@hide} */ - public int describeContents() { - return 0; - } - - /** copy constructor {@hide} */ - public WpsResult(WpsResult source) { - if (source != null) { - status = source.status; - pin = source.pin; - } - } - - /** Implement the Parcelable interface {@hide} */ - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(status.name()); - dest.writeString(pin); - } - - /** Implement the Parcelable interface {@hide} */ - public static final @android.annotation.NonNull Creator<WpsResult> CREATOR = - new Creator<WpsResult>() { - public WpsResult createFromParcel(Parcel in) { - WpsResult result = new WpsResult(); - result.status = Status.valueOf(in.readString()); - result.pin = in.readString(); - return result; - } - - public WpsResult[] newArray(int size) { - return new WpsResult[size]; - } - }; -} diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Policy.aidl b/wifi/java/android/net/wifi/hotspot2/pps/Policy.aidl deleted file mode 100644 index e923f1f0fee8..000000000000 --- a/wifi/java/android/net/wifi/hotspot2/pps/Policy.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2017, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.hotspot2.pps; - -parcelable Policy; diff --git a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.aidl b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.aidl deleted file mode 100644 index 701db479076a..000000000000 --- a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2017, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.hotspot2.pps; - -parcelable UpdateParameter; diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.aidl b/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.aidl deleted file mode 100644 index 3d8a47682f6e..000000000000 --- a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2012, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.p2p; - -parcelable WifiP2pGroupList;
\ No newline at end of file diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.aidl b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.aidl deleted file mode 100644 index c81d1f98422d..000000000000 --- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.wifi.p2p.servicediscovery; - -parcelable WifiP2pServiceResponse; |