diff --git a/Android.bp b/Android.bp index 052bb595a53a1944855638589d99f190427e0764..97fd3e7c0844fa30ec1d00f49bd6209225a8ccf7 100755 --- a/Android.bp +++ b/Android.bp @@ -1759,6 +1759,7 @@ droidstubs { last_released: { api_file: ":last-released-public-api", removed_api_file: "api/removed.txt", + baseline_file: ":public-api-incompatibilities-with-last-released", }, }, jdiff_enabled: true, @@ -1784,6 +1785,7 @@ droidstubs { last_released: { api_file: ":last-released-system-api", removed_api_file: "api/system-removed.txt", + baseline_file: ":system-api-incompatibilities-with-last-released" }, }, jdiff_enabled: true, diff --git a/api/test-current.txt b/api/test-current.txt index 6f0b6a809c9c7449ffc5523b1c62cf41e7726be0..d3bea18fb9447cdb904c5d4126d836c20875de06 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -54,6 +54,7 @@ package android.app { method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String); method public long getTotalRam(); method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int); + method public static boolean isHighEndGfx(); method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener); method public static void resumeAppSwitches() throws android.os.RemoteException; method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List, int); @@ -2343,6 +2344,7 @@ package android.provider { field public static final String LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST = "location_ignore_settings_package_whitelist"; field public static final String LOW_POWER_MODE = "low_power"; field public static final String LOW_POWER_MODE_STICKY = "low_power_sticky"; + field public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; field public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices"; field public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package"; } @@ -2366,7 +2368,7 @@ package android.provider { field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis"; field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis"; field public static final String NOTIFICATION_BADGING = "notification_badging"; - field public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; + field @Deprecated public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; field @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds"; field public static final String USER_SETUP_COMPLETE = "user_setup_complete"; field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service"; @@ -3255,10 +3257,13 @@ package android.view { } @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback { + method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture(); method public android.view.View getTooltipView(); method public boolean isAutofilled(); method public static boolean isDefaultFocusHighlightEnabled(); method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable); + method public final boolean isImportantForContentCapture(); + method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int); method protected void resetResolvedDrawables(); method public void resetResolvedLayoutDirection(); method public void resetResolvedPadding(); @@ -3269,7 +3274,13 @@ package android.view { method public boolean restoreFocusNotInCluster(); method public void setAutofilled(boolean); method public final void setFocusedInCluster(); + method public void setImportantForContentCapture(int); method public void setIsRootNamespace(boolean); + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0; // 0x0 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 2; // 0x2 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 8; // 0x8 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 1; // 0x1 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 4; // 0x4 } public class ViewConfiguration { diff --git a/cmds/bootanimation/bootanim.rc b/cmds/bootanimation/bootanim.rc index 469c9646a4aa8af3fca0d2154af48d32b33c6eac..9f4f314a4324d736c6f3049041891a7d01fea2ce 100644 --- a/cmds/bootanimation/bootanim.rc +++ b/cmds/bootanimation/bootanim.rc @@ -4,4 +4,5 @@ service bootanim /system/bin/bootanimation group graphics audio disabled oneshot + ioprio rt 0 writepid /dev/stune/top-app/tasks diff --git a/cmds/incidentd/src/WorkDirectory.cpp b/cmds/incidentd/src/WorkDirectory.cpp index 0570c3a039ae336d0938b7a3fba90d3c49c62b6f..8dcb8653748796971642c8e5ae45ee77461ca0d3 100644 --- a/cmds/incidentd/src/WorkDirectory.cpp +++ b/cmds/incidentd/src/WorkDirectory.cpp @@ -664,7 +664,7 @@ int64_t WorkDirectory::make_timestamp_ns_locked() { nanosleep(&spec, nullptr); } clock_gettime(CLOCK_REALTIME, &spec); - timestampNs = (spec.tv_sec) * 1000 + spec.tv_nsec; + timestampNs = int64_t(spec.tv_sec) * 1000 + spec.tv_nsec; } while (file_exists_locked(timestampNs)); return timestampNs; } diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index eed7f62eac348d62ba0f32d340a4a25f307b5aa5..1fd9caf6f7ab568f697e0685df218ada14b1711e 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -319,6 +319,8 @@ message Atom { 217 [(log_from_module) = "permissioncontroller"]; PermissionAppsFragmentViewed permission_apps_fragment_viewed = 218 [(log_from_module) = "permissioncontroller"]; + ExclusionRectStateChanged exclusion_rect_state_changed = 223; + BackGesture back_gesture_reported_reported = 224; } // Pulled events will start at field 10000. @@ -2500,6 +2502,41 @@ message PhoneStateChanged { optional State state = 1; } +message BackGesture { + enum BackType { + DEFAULT_BACK_TYPE = 0; + COMPLETED = 1; + COMPLETED_REJECTED = 2; // successful because coming from rejected area + INCOMPLETE_EXCLUDED = 3; // would have been successful but in the exclusion area + INCOMPLETE = 4; + } + optional BackType type = 1; + + optional int32 y_coordinate = 2; // y coordinate for ACTION_DOWN event + enum WindowHorizontalLocation { + DEFAULT_LOCATION = 0; + LEFT = 1; + RIGHT = 2; + } + optional WindowHorizontalLocation x_location = 3; +} + +message ExclusionRectStateChanged { + optional string component_name = 1; // if not available, simply packageName + optional int32 requested_height = 2; // px + optional int32 rejected_height = 3; // px + + enum WindowHorizontalLocation { + DEFAULT_LOCATION = 0; + LEFT = 1; + RIGHT = 2; + } + optional WindowHorizontalLocation x_location = 4; + optional bool landscape = 5; + optional bool splitscreen = 6; + optional int32 duration_millis = 7; +} + message LauncherUIChanged { optional android.stats.launcher.LauncherAction action = 1; optional android.stats.launcher.LauncherState src_state = 2; @@ -3291,6 +3328,8 @@ message BiometricErrorOccurred { optional int32 error_info_vendor = 7; // Dictates if this message should trigger additional debugging. optional bool debug = 8; + // Time spent during the authentication attempt. + optional int64 latency_millis = 9; } /** @@ -5299,7 +5338,7 @@ message NetworkDnsEventReported { // Only valid for event_type = EVENT_RESNSEND. optional int32 res_nsend_flags = 5; - optional android.stats.dnsresolver.Transport network_type = 6; + optional android.stats.dnsresolver.NetworkType network_type = 6; // The DNS over TLS mode on a specific netId. optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7; @@ -5307,6 +5346,9 @@ message NetworkDnsEventReported { // Additional pass-through fields opaque to statsd. // The DNS resolver Mainline module can add new fields here without requiring an OS update. optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES]; + + // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom. + optional int32 sampling_rate_denom = 9; } /** @@ -5882,7 +5924,8 @@ message BubbleUIChanged { optional bool is_ongoing = 10; // Whether the bubble is produced by an app running in foreground. - optional bool is_foreground = 11; + // This is deprecated and the value should be ignored. + optional bool is_foreground = 11 [deprecated = true]; } /** diff --git a/cmds/statsd/src/external/PowerStatsPuller.cpp b/cmds/statsd/src/external/PowerStatsPuller.cpp index c56f9a27086e39a7c57df1d90ae946261bc93177..b142caca3acce180f6b0d8bd70b07c63baa8da07 100644 --- a/cmds/statsd/src/external/PowerStatsPuller.cpp +++ b/cmds/statsd/src/external/PowerStatsPuller.cpp @@ -85,7 +85,6 @@ bool PowerStatsPuller::PullInternal(vector>* data) { std::lock_guard lock(gPowerStatsHalMutex); if (!getPowerStatsHalLocked()) { - ALOGE("power.stats Hal not loaded"); return false; } @@ -116,6 +115,7 @@ bool PowerStatsPuller::PullInternal(vector>* data) { if (gRailInfo.empty()) { ALOGE("power.stats has no rail information"); gPowerStatsExist = false; // No rail info, so never try again. + gPowerStatsHal = nullptr; return false; } } diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp index 68082c2dc4d2f42ec61db994a164be4f09e28e37..42132ee0daae61505e9fb3e3f30e2412d4892d31 100644 --- a/cmds/statsd/src/main.cpp +++ b/cmds/statsd/src/main.cpp @@ -78,7 +78,7 @@ int main(int /*argc*/, char** /*argv*/) { ps->giveThreadPoolName(); IPCThreadState::self()->disableBackgroundScheduling(true); - ::android::hardware::configureRpcThreadpool(1 /*threads*/, false /*willJoin*/); + ::android::hardware::configureRpcThreadpool(4 /*threads*/, false /*willJoin*/); std::shared_ptr eventQueue = std::make_shared(2000 /*buffer limit. Buffer is NOT pre-allocated*/); diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index 141e8e669dac4e280dc5b847426bb8c69ecf2662..25d45b0e65707b7206f5c11701142d54526156cf 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;->()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/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index cebe6e1211e07f7e312236422640cf7c4ec30f33..90b80e73c323062079073ba8fc3ce2d1def1899a 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -309,7 +309,7 @@ public abstract class AccessibilityService extends Service { * Name under which an AccessibilityService component publishes information * about itself. This meta-data must reference an XML resource containing an * <{@link android.R.styleable#AccessibilityService accessibility-service}> - * tag. This is a a sample XML file configuring an accessibility service: + * tag. This is a sample XML file configuring an accessibility service: *
 <accessibility-service
      *     android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
      *     android:packageNames="foo.bar, foo.baz"
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index dc52c52cca1fbfa688207e0ffd3ed891bba103ea..5bc0647159a3b84f5998b6bb72b30f737cae5457 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -146,6 +146,7 @@ import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -943,6 +944,10 @@ public class Activity extends ContextThemeWrapper
     /** @hide */
     boolean mEnterAnimationComplete;
 
+    /** Track last dispatched multi-window and PiP mode to client, internal debug purpose **/
+    private Boolean mLastDispatchedIsInMultiWindowMode;
+    private Boolean mLastDispatchedIsInPictureInPictureMode;
+
     private static native String getDlWarning();
 
     /** Return the intent that started this activity. */
@@ -1547,7 +1552,9 @@ public class Activity extends ContextThemeWrapper
      * had previously been frozen by {@link #onSaveInstanceState}.
      *
      * 

This method is called between {@link #onStart} and - * {@link #onPostCreate}. + * {@link #onPostCreate}. This method is called only when recreating + * an activity; the method isn't invoked if {@link #onStart} is called for + * any other reason.

* * @param savedInstanceState the data most recently supplied in {@link #onSaveInstanceState}. * @@ -3654,6 +3661,22 @@ public class Activity extends ContextThemeWrapper return false; } + private static final class RequestFinishCallback extends IRequestFinishCallback.Stub { + private final WeakReference mActivityRef; + + RequestFinishCallback(WeakReference activityRef) { + mActivityRef = activityRef; + } + + @Override + public void requestFinish() { + Activity activity = mActivityRef.get(); + if (activity != null) { + activity.mHandler.post(activity::finishAfterTransition); + } + } + } + /** * Called when the activity has detected the user's press of the back * key. The default implementation simply finishes the current activity, @@ -3679,11 +3702,7 @@ public class Activity extends ContextThemeWrapper // while at the root of the task. This call allows ActivityTaskManager // to intercept or defer finishing. ActivityTaskManager.getService().onBackPressedOnTaskRoot(mToken, - new IRequestFinishCallback.Stub() { - public void requestFinish() { - mHandler.post(() -> finishAfterTransition()); - } - }); + new RequestFinishCallback(new WeakReference<>(this))); } catch (RemoteException e) { finishAfterTransition(); } @@ -6984,6 +7003,10 @@ public class Activity extends ContextThemeWrapper writer.print(mResumed); writer.print(" mStopped="); writer.print(mStopped); writer.print(" mFinished="); writer.println(mFinished); + writer.print(innerPrefix); writer.print("mLastDispatchedIsInMultiWindowMode="); + writer.print(mLastDispatchedIsInMultiWindowMode); + writer.print(" mLastDispatchedIsInPictureInPictureMode="); + writer.println(mLastDispatchedIsInPictureInPictureMode); writer.print(innerPrefix); writer.print("mChangingConfigurations="); writer.println(mChangingConfigurations); writer.print(innerPrefix); writer.print("mCurrentConfig="); @@ -8063,6 +8086,7 @@ public class Activity extends ContextThemeWrapper if (mWindow != null) { mWindow.onMultiWindowModeChanged(); } + mLastDispatchedIsInMultiWindowMode = isInMultiWindowMode; onMultiWindowModeChanged(isInMultiWindowMode, newConfig); } @@ -8075,6 +8099,7 @@ public class Activity extends ContextThemeWrapper if (mWindow != null) { mWindow.onPictureInPictureModeChanged(isInPictureInPictureMode); } + mLastDispatchedIsInPictureInPictureMode = isInPictureInPictureMode; onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig); } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 17368b78964518a42317bcd5d811331ce49a060f..91b98c71a613b6888e5bd1e1ae982e5edc69a2a0 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -925,7 +925,7 @@ public class ActivityManager { * (which tends to consume a lot more RAM). * @hide */ - @UnsupportedAppUsage + @TestApi static public boolean isHighEndGfx() { return !isLowRamDeviceStatic() && !RoSystemProperties.CONFIG_AVOID_GFX_ACCEL diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index f4b1d5311728ea4b90025d81e0fecd11587521d8..c666bb257684023c94f11a5a926eb63214aabb15 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -119,17 +119,6 @@ public abstract class ActivityManagerInternal { */ public abstract void setHasOverlayUi(int pid, boolean hasOverlayUi); - /** - * Sets if the given pid is currently running a remote animation, which is taken a signal for - * determining oom adjustment and scheduling behavior. - * - * @param pid The pid we are setting overlay UI for. - * @param runningRemoteAnimation True if the process is running a remote animation, false - * otherwise. - * @see RemoteAnimationAdapter - */ - public abstract void setRunningRemoteAnimation(int pid, boolean runningRemoteAnimation); - /** * Called after the network policy rules are updated by * {@link com.android.server.net.NetworkPolicyManagerService} for a specific {@param uid} and diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 4771f9f6ad04974c16cc7a1dfc6530b8eff01990..2b4ff0111ab30866ce9db0c82d0e3b463963ed85 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -120,6 +120,10 @@ public class ActivityView extends ViewGroup { mActivityTaskManager = ActivityTaskManager.getService(); mSurfaceView = new SurfaceView(context); + // Since ActivityView#getAlpha has been overridden, we should use parent class's alpha + // as master to synchronize surface view's alpha value. + mSurfaceView.setAlpha(super.getAlpha()); + mSurfaceView.setUseAlpha(); mSurfaceCallback = new SurfaceCallback(); mSurfaceView.getHolder().addCallback(mSurfaceCallback); addView(mSurfaceView); @@ -346,6 +350,27 @@ public class ActivityView extends ViewGroup { mSurfaceView.layout(0 /* left */, 0 /* top */, r - l /* right */, b - t /* bottom */); } + /** + * Sets the alpha value when the content of {@link SurfaceView} needs to show or hide. + *

Note: The surface view may ignore the alpha value in some cases. Refer to + * {@link SurfaceView#setAlpha} for more details. + * + * @param alpha The opacity of the view. + */ + @Override + public void setAlpha(float alpha) { + super.setAlpha(alpha); + + if (mSurfaceView != null) { + mSurfaceView.setAlpha(alpha); + } + } + + @Override + public float getAlpha() { + return mSurfaceView.getAlpha(); + } + @Override public boolean gatherTransparentRegion(Region region) { // The tap exclude region may be affected by any view on top of it, so we detect the diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index fb72e651cebd427289c6896daf7b896e89be8200..77875354d732bc4bf8bbfbdd7117db034a027382 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -834,9 +834,12 @@ public class AppOpsManager { public static final int OP_ACCESS_ACCESSIBILITY = 88; /** @hide Read the device identifiers (IMEI / MEID, IMSI, SIM / Build serial) */ public static final int OP_READ_DEVICE_IDENTIFIERS = 89; + /** @hide Read location metadata from media */ + public static final int OP_ACCESS_MEDIA_LOCATION = 90; + /** @hide */ @UnsupportedAppUsage - public static final int _NUM_OP = 90; + public static final int _NUM_OP = 91; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -1107,6 +1110,9 @@ public class AppOpsManager { @TestApi @SystemApi public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage"; + /** @hide Read location metadata from media */ + public static final String OPSTR_ACCESS_MEDIA_LOCATION = "android:access_media_location"; + /** @hide Interact with accessibility. */ @SystemApi public static final String OPSTR_ACCESS_ACCESSIBILITY = "android:access_accessibility"; @@ -1134,6 +1140,7 @@ public class AppOpsManager { // Storage OP_READ_EXTERNAL_STORAGE, OP_WRITE_EXTERNAL_STORAGE, + OP_ACCESS_MEDIA_LOCATION, // Location OP_COARSE_LOCATION, OP_FINE_LOCATION, @@ -1273,6 +1280,7 @@ public class AppOpsManager { OP_LEGACY_STORAGE, // LEGACY_STORAGE OP_ACCESS_ACCESSIBILITY, // ACCESS_ACCESSIBILITY OP_READ_DEVICE_IDENTIFIERS, // READ_DEVICE_IDENTIFIERS + OP_ACCESS_MEDIA_LOCATION, // ACCESS_MEDIA_LOCATION }; /** @@ -1369,6 +1377,7 @@ public class AppOpsManager { OPSTR_LEGACY_STORAGE, OPSTR_ACCESS_ACCESSIBILITY, OPSTR_READ_DEVICE_IDENTIFIERS, + OPSTR_ACCESS_MEDIA_LOCATION, }; /** @@ -1466,6 +1475,7 @@ public class AppOpsManager { "LEGACY_STORAGE", "ACCESS_ACCESSIBILITY", "READ_DEVICE_IDENTIFIERS", + "ACCESS_MEDIA_LOCATION", }; /** @@ -1564,6 +1574,7 @@ public class AppOpsManager { null, // no permission for OP_LEGACY_STORAGE null, // no permission for OP_ACCESS_ACCESSIBILITY null, // no direct permission for OP_READ_DEVICE_IDENTIFIERS + Manifest.permission.ACCESS_MEDIA_LOCATION, }; /** @@ -1662,6 +1673,7 @@ public class AppOpsManager { null, // LEGACY_STORAGE null, // ACCESS_ACCESSIBILITY null, // READ_DEVICE_IDENTIFIERS + null, // ACCESS_MEDIA_LOCATION }; /** @@ -1759,6 +1771,7 @@ public class AppOpsManager { false, // LEGACY_STORAGE false, // ACCESS_ACCESSIBILITY false, // READ_DEVICE_IDENTIFIERS + false, // ACCESS_MEDIA_LOCATION }; /** @@ -1855,6 +1868,7 @@ public class AppOpsManager { AppOpsManager.MODE_DEFAULT, // LEGACY_STORAGE AppOpsManager.MODE_ALLOWED, // ACCESS_ACCESSIBILITY AppOpsManager.MODE_ERRORED, // READ_DEVICE_IDENTIFIERS + AppOpsManager.MODE_ALLOWED, // ALLOW_MEDIA_LOCATION }; /** @@ -1955,6 +1969,7 @@ public class AppOpsManager { false, // LEGACY_STORAGE false, // ACCESS_ACCESSIBILITY false, // READ_DEVICE_IDENTIFIERS + false, // ACCESS_MEDIA_LOCATION }; /** @@ -2587,7 +2602,7 @@ public class AppOpsManager { * @return The proxy UID. */ public int getProxyUid() { - return (int) findFirstNonNegativeForFlagsInStates(mDurations, + return (int) findFirstNonNegativeForFlagsInStates(mProxyUids, MAX_PRIORITY_UID_STATE, MIN_PRIORITY_UID_STATE, OP_FLAGS_ALL); } @@ -2609,7 +2624,7 @@ public class AppOpsManager { * @return The proxy UID. */ public int getProxyUid(@UidState int uidState, @OpFlags int flags) { - return (int) findFirstNonNegativeForFlagsInStates(mDurations, + return (int) findFirstNonNegativeForFlagsInStates(mProxyUids, uidState, uidState, flags); } @@ -4169,8 +4184,8 @@ public class AppOpsManager { * end UID states. * * @param counts The data array. - * @param beginUidState The beginning UID state (exclusive). - * @param endUidState The end UID state. + * @param beginUidState The beginning UID state (inclusive). + * @param endUidState The end UID state (inclusive). * @param flags The UID flags. * @return The sum. */ @@ -4199,13 +4214,13 @@ public class AppOpsManager { * end UID states. * * @param counts The data array. + * @param beginUidState The beginning UID state (inclusive). + * @param endUidState The end UID state (inclusive). * @param flags The UID flags. - * @param beginUidState The beginning UID state (exclusive). - * @param endUidState The end UID state. * @return The non-negative value or -1. */ private static long findFirstNonNegativeForFlagsInStates(@Nullable LongSparseLongArray counts, - @OpFlags int flags, @UidState int beginUidState, @UidState int endUidState) { + @UidState int beginUidState, @UidState int endUidState, @OpFlags int flags) { if (counts == null) { return -1; } @@ -4231,14 +4246,14 @@ public class AppOpsManager { * end UID states. * * @param counts The data array. + * @param beginUidState The beginning UID state (inclusive). + * @param endUidState The end UID state (inclusive). * @param flags The UID flags. - * @param beginUidState The beginning UID state (exclusive). - * @param endUidState The end UID state. * @return The non-negative value or -1. */ private static @Nullable String findFirstNonNullForFlagsInStates( - @Nullable LongSparseArray counts, @OpFlags int flags, - @UidState int beginUidState, @UidState int endUidState) { + @Nullable LongSparseArray counts, @UidState int beginUidState, + @UidState int endUidState, @OpFlags int flags) { if (counts == null) { return null; } diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index e57738fbbfdd2340164916f04b261bc50e96e5a6..9f51db88e7dc6315fd77dffdf8cde29ede6f6584 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -108,6 +108,8 @@ interface INotificationManager ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int userId); boolean isPackagePaused(String pkg); + void silenceNotificationSound(); + // TODO: Remove this when callers have been migrated to the equivalent // INotificationListener method. @UnsupportedAppUsage diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 0df3bbe42c7e082778637bb1f9902dd0b98e88e0..6fd43a61f2dd4daf2837cb2f29496126781a95d8 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -170,6 +170,21 @@ oneway interface ITaskStackListener { */ void onBackPressedOnTaskRoot(in ActivityManager.RunningTaskInfo taskInfo); + /* + * Called when contents are drawn for the first time on a display which can only contain one + * task. + * + * @param displayId the id of the display on which contents are drawn. + */ + void onSingleTaskDisplayDrawn(int displayId); + + /* + * Called when the last task is removed from a display which can only contain one task. + * + * @param displayId the id of the display from which the window is removed. + */ + void onSingleTaskDisplayEmpty(int displayId); + /** * Called when a task is reparented to a stack on a different display. * diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 789351e0d157680d3db00660b7399fd7460503c3..a4c98e88cbc7832b5574259dcc7a7f04e86ed3ee 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3386,11 +3386,7 @@ public class Notification implements Parcelable */ private int mCachedContrastColor = COLOR_INVALID; private int mCachedContrastColorIsFor = COLOR_INVALID; - /** - * Caches a ambient version of {@link #mCachedAmbientColorIsFor}. - */ - private int mCachedAmbientColor = COLOR_INVALID; - private int mCachedAmbientColorIsFor = COLOR_INVALID; + /** * A neutral color color that can be used for icons. */ @@ -5441,26 +5437,14 @@ public class Notification implements Parcelable /** * Construct a RemoteViews for the display in public contexts like on the lockscreen. * + * @param isLowPriority is this notification low priority * @hide */ @UnsupportedAppUsage - public RemoteViews makePublicContentView() { - return makePublicView(false /* ambient */); - } - - /** - * Construct a RemoteViews for the display in public contexts like on the lockscreen. - * - * @hide - */ - public RemoteViews makePublicAmbientNotification() { - return makePublicView(true /* ambient */); - } - - private RemoteViews makePublicView(boolean ambient) { + public RemoteViews makePublicContentView(boolean isLowPriority) { if (mN.publicVersion != null) { final Builder builder = recoverBuilder(mContext, mN.publicVersion); - return ambient ? builder.makeAmbientNotification() : builder.createContentView(); + return builder.createContentView(); } Bundle savedBundle = mN.extras; Style style = mStyle; @@ -5484,7 +5468,11 @@ public class Notification implements Parcelable } mN.extras = publicExtras; RemoteViews view; - view = makeNotificationHeader(); + StandardTemplateParams params = mParams.reset().fillTextsFrom(this); + if (isLowPriority) { + params.forceDefaultColor(); + } + view = makeNotificationHeader(params); view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true); mN.extras = savedBundle; mN.mLargeIcon = largeIcon; @@ -8118,8 +8106,7 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { - RemoteViews expanded = makeMediaBigContentView(); - return expanded != null ? expanded : makeMediaContentView(); + return makeMediaContentView(); } /** @hide */ @@ -8552,24 +8539,34 @@ public class Notification implements Parcelable * If set and the app creating the bubble is in the foreground, the bubble will be posted * in its expanded state, with the contents of {@link #getIntent()} in a floating window. * - *

If the app creating the bubble is not in the foreground this flag has no effect.

+ *

This flag has no effect if the app posting the bubble is not in the foreground. + * The app is considered foreground if it is visible and on the screen, note that + * a foreground service does not qualify. + *

* *

Generally this flag should only be set if the user has performed an action to request * or create a bubble.

+ * + * @hide */ - private static final int FLAG_AUTO_EXPAND_BUBBLE = 0x00000001; + public static final int FLAG_AUTO_EXPAND_BUBBLE = 0x00000001; /** * If set and the app posting the bubble is in the foreground, the bubble will * be posted without the associated notification in the notification shade. * - *

If the app posting the bubble is not in the foreground this flag has no effect.

+ *

This flag has no effect if the app posting the bubble is not in the foreground. + * The app is considered foreground if it is visible and on the screen, note that + * a foreground service does not qualify. + *

* *

Generally this flag should only be set if the user has performed an action to request * or create a bubble, or if the user has seen the content in the notification and the * notification is no longer relevant.

+ * + * @hide */ - private static final int FLAG_SUPPRESS_NOTIFICATION = 0x00000002; + public static final int FLAG_SUPPRESS_NOTIFICATION = 0x00000002; private BubbleMetadata(PendingIntent expandIntent, PendingIntent deleteIntent, Icon icon, int height, @DimenRes int heightResId) { @@ -8685,10 +8682,20 @@ public class Notification implements Parcelable out.writeInt(mDesiredHeightResId); } - private void setFlags(int flags) { + /** + * @hide + */ + public void setFlags(int flags) { mFlags = flags; } + /** + * @hide + */ + public int getFlags() { + return mFlags; + } + /** * Builder to construct a {@link BubbleMetadata} object. */ @@ -8805,6 +8812,8 @@ public class Notification implements Parcelable * {@link #getIntent()} in a floating window). * *

This flag has no effect if the app posting the bubble is not in the foreground. + * The app is considered foreground if it is visible and on the screen, note that + * a foreground service does not qualify. *

* *

Generally, this flag should only be set if the user has performed an action to @@ -8823,6 +8832,8 @@ public class Notification implements Parcelable * the notification shade. * *

This flag has no effect if the app posting the bubble is not in the foreground. + * The app is considered foreground if it is visible and on the screen, note that + * a foreground service does not qualify. *

* *

Generally, this flag should only be set if the user has performed an action to @@ -10497,12 +10508,7 @@ public class Notification implements Parcelable final StandardTemplateParams fillTextsFrom(Builder b) { Bundle extras = b.mN.extras; this.title = b.processLegacyText(extras.getCharSequence(EXTRA_TITLE)); - - CharSequence text = extras.getCharSequence(EXTRA_BIG_TEXT); - if (TextUtils.isEmpty(text)) { - text = extras.getCharSequence(EXTRA_TEXT); - } - this.text = b.processLegacyText(text); + this.text = b.processLegacyText(extras.getCharSequence(EXTRA_TEXT)); this.summaryText = extras.getCharSequence(EXTRA_SUB_TEXT); return this; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index dd39376f80caa43c7882810a8354b9b63f167131..b13a34faab6be11b1bd03a28dbc4043cf6b4b697 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -1094,6 +1094,25 @@ public class NotificationManager { } } + /** + * Silences the current notification sound, if ones currently playing. + *

+ * It is intended to handle use-cases such as silencing a ringing call + * when the user presses the volume button during ringing. + *

+ * If this method is called prior to when the notification begins playing, the sound will not be + * silenced. As such it is not intended as a means to avoid playing of a sound. + * @hide + */ + public void silenceNotificationSound() { + INotificationManager service = getService(); + try { + service.silenceNotificationSound(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Returns whether notifications from this package are temporarily hidden. This * could be done because the package was marked as distracting to the user via diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index af2d774508c42e41a791809a909beb5c1377f0cd..205e7a13092b785d831deaae7bf4337a919f0546 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -433,6 +433,9 @@ public class StatusBarManager { private boolean mNotificationPeeking; private boolean mRecents; private boolean mSearch; + private boolean mSystemIcons; + private boolean mClock; + private boolean mNotificationIcons; /** @hide */ public DisableInfo(int flags1, int flags2) { @@ -441,6 +444,9 @@ public class StatusBarManager { mNotificationPeeking = (flags1 & DISABLE_NOTIFICATION_ALERTS) != 0; mRecents = (flags1 & DISABLE_RECENT) != 0; mSearch = (flags1 & DISABLE_SEARCH) != 0; + mSystemIcons = (flags1 & DISABLE_SYSTEM_INFO) != 0; + mClock = (flags1 & DISABLE_CLOCK) != 0; + mNotificationIcons = (flags1 & DISABLE_NOTIFICATION_ICONS) != 0; } /** @hide */ @@ -526,6 +532,48 @@ public class StatusBarManager { mSearch = disabled; } + /** + * @return {@code true} if system icons are disabled + * + * @hide + */ + public boolean areSystemIconsDisabled() { + return mSystemIcons; + } + + /** * @hide */ + public void setSystemIconsDisabled(boolean disabled) { + mSystemIcons = disabled; + } + + /** + * @return {@code true} if the clock icon is disabled + * + * @hide + */ + public boolean isClockDisabled() { + return mClock; + } + + /** * @hide */ + public void setClockDisabled(boolean disabled) { + mClock = disabled; + } + + /** + * @return {@code true} if notification icons are disabled + * + * @hide + */ + public boolean areNotificationIconsDisabled() { + return mNotificationIcons; + } + + /** * @hide */ + public void setNotificationIconsDisabled(boolean disabled) { + mNotificationIcons = disabled; + } + /** * @return {@code true} if no components are disabled (default state) * @@ -535,7 +583,7 @@ public class StatusBarManager { @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents - && !mSearch; + && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons; } /** @hide */ @@ -545,6 +593,9 @@ public class StatusBarManager { mNotificationPeeking = false; mRecents = false; mSearch = false; + mSystemIcons = false; + mClock = false; + mNotificationIcons = false; } /** @@ -554,7 +605,7 @@ public class StatusBarManager { */ public boolean areAllComponentsDisabled() { return mStatusBarExpansion && mNavigateHome && mNotificationPeeking - && mRecents && mSearch; + && mRecents && mSearch && mSystemIcons && mClock && mNotificationIcons; } /** @hide */ @@ -564,6 +615,9 @@ public class StatusBarManager { mNotificationPeeking = true; mRecents = true; mSearch = true; + mSystemIcons = true; + mClock = true; + mNotificationIcons = true; } @Override @@ -576,6 +630,9 @@ public class StatusBarManager { .append(mNotificationPeeking ? "disabled" : "enabled"); sb.append(" mRecents=").append(mRecents ? "disabled" : "enabled"); sb.append(" mSearch=").append(mSearch ? "disabled" : "enabled"); + sb.append(" mSystemIcons=").append(mSystemIcons ? "disabled" : "enabled"); + sb.append(" mClock=").append(mClock ? "disabled" : "enabled"); + sb.append(" mNotificationIcons=").append(mNotificationIcons ? "disabled" : "enabled"); return sb.toString(); @@ -596,6 +653,9 @@ public class StatusBarManager { if (mNotificationPeeking) disable1 |= DISABLE_NOTIFICATION_ALERTS; if (mRecents) disable1 |= DISABLE_RECENT; if (mSearch) disable1 |= DISABLE_SEARCH; + if (mSystemIcons) disable1 |= DISABLE_SYSTEM_INFO; + if (mClock) disable1 |= DISABLE_CLOCK; + if (mNotificationIcons) disable1 |= DISABLE_NOTIFICATION_ICONS; return new Pair(disable1, disable2); } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index d32b6b516a7d88ca82e1497da1d684ca5c11f635..fe4b0d52b13372f12e1de35f026f1b79ec9fda08 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -1162,7 +1162,8 @@ final class SystemServiceRegistry { @Override public AppPredictionManager createService(ContextImpl ctx) throws ServiceNotFoundException { - return new AppPredictionManager(ctx); + IBinder b = ServiceManager.getService(Context.APP_PREDICTION_SERVICE); + return b == null ? null : new AppPredictionManager(ctx); } }); diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 73fc7a3db6c7ec38cc75d2212ec3fa5f80fdfefb..b4b7df970493fabe294eedb59e8326561822277f 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -175,6 +175,14 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { throws RemoteException { } + @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + } + + @Override + public void onSingleTaskDisplayEmpty(int displayId) throws RemoteException { + } + @Override public void onTaskDisplayChanged(int taskId, int newDisplayId) throws RemoteException { } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 441ff6ba4643b8f19290c1f058ed2c49e31e0ae8..a17b2ddd7215614261f7bc6ef93ce6b69c2b6d1d 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1551,7 +1551,8 @@ public class DevicePolicyManager { * scopes will be sent in an {@code ArrayList} extra identified by the * {@link #EXTRA_DELEGATION_SCOPES} key. * - *

Note: This is a protected intent that can only be sent by the system.

+ *

Note: This is a protected intent that can only be sent by the + * system.

*/ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = @@ -2610,6 +2611,7 @@ public class DevicePolicyManager { * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED}, + * {@link #PASSWORD_QUALITY_BIOMETRIC_WEAK}, * {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC}, * {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java index fb78789ba8adee3b3720486ede3fec003a64ba38..cfb363a0834c7bc2d7b23f776b6948bac10d474b 100644 --- a/core/java/android/bluetooth/BluetoothPan.java +++ b/core/java/android/bluetooth/BluetoothPan.java @@ -118,6 +118,8 @@ public final class BluetoothPan implements BluetoothProfile { */ public static final int PAN_OPERATION_SUCCESS = 1004; + private final Context mContext; + private BluetoothAdapter mAdapter; private final BluetoothProfileConnector mProfileConnector = new BluetoothProfileConnector(this, BluetoothProfile.PAN, @@ -136,6 +138,7 @@ public final class BluetoothPan implements BluetoothProfile { @UnsupportedAppUsage /*package*/ BluetoothPan(Context context, ServiceListener listener) { mAdapter = BluetoothAdapter.getDefaultAdapter(); + mContext = context; mProfileConnector.connect(context, listener); } @@ -287,11 +290,12 @@ public final class BluetoothPan implements BluetoothProfile { @UnsupportedAppUsage public void setBluetoothTethering(boolean value) { - if (DBG) log("setBluetoothTethering(" + value + ")"); + String pkgName = mContext.getOpPackageName(); + if (DBG) log("setBluetoothTethering(" + value + "), calling package:" + pkgName); final IBluetoothPan service = getService(); if (service != null && isEnabled()) { try { - service.setBluetoothTethering(value); + service.setBluetoothTethering(value, pkgName); } catch (RemoteException e) { Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index c3dd82729d6d3a5a386310888d705e1288bcf8b5..414cc39f53105e86822b475dbe4f12ff9c04e216 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -852,11 +852,16 @@ public abstract class Context { * to any callers for the same name, meaning they will see each other's * edits as soon as they are made. * - * This method is thead-safe. + *

This method is thread-safe. * - * @param name Desired preferences file. If a preferences file by this name - * does not exist, it will be created when you retrieve an - * editor (SharedPreferences.edit()) and then commit changes (Editor.commit()). + *

If the preferences directory does not already exist, it will be created when this method + * is called. + * + *

If a preferences file by this name does not exist, it will be created when you retrieve an + * editor ({@link SharedPreferences#edit()}) and then commit changes ({@link + * SharedPreferences.Editor#commit()} or {@link SharedPreferences.Editor#apply()}). + * + * @param name Desired preferences file. * @param mode Operating mode. * * @return The single {@link SharedPreferences} instance that can be used @@ -4106,6 +4111,9 @@ public abstract class Context { /** * Official published name of the app prediction service. * + *

NOTE: this service is optional; callers of + * {@code Context.getSystemServiceName(APP_PREDICTION_SERVICE)} should check for {@code null}. + * * @hide * @see #getSystemService(String) */ diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 9d523633feb6603e1923efae8b089aa4d2ae9ce5..099dea29eaf7f29cf17e823374fb798a4b1d8169 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -60,9 +60,7 @@ import java.util.Set; * multiple possible matching values (via {@link #addAction}, * {@link #addDataType}, {@link #addDataScheme}, {@link #addDataSchemeSpecificPart}, * {@link #addDataAuthority}, {@link #addDataPath}, and {@link #addCategory}, respectively). - * For actions, the field - * will not be tested if no values have been given (treating it as a wildcard); - * if no data characteristics are specified, however, then the filter will + * For actions, if no data characteristics are specified, then the filter will * only match intents that contain no data. * *

The data characteristic is diff --git a/core/java/android/content/PermissionChecker.java b/core/java/android/content/PermissionChecker.java index 6fe6e991fb1e72d4c6e7a72088bc0357e8762098..95286e4bc1dbf83263292f9128e97183ebcfdb8d 100644 --- a/core/java/android/content/PermissionChecker.java +++ b/core/java/android/content/PermissionChecker.java @@ -50,6 +50,19 @@ import java.lang.annotation.RetentionPolicy; * permission model for which the user had disabled the "permission" * which is achieved by disallowing the corresponding app op. *

+ *

+ * This class has two types of methods and you should be careful which + * type to call based on whether permission protected data is being + * passed to the app or you are just checking whether the app holds a + * permission. The reason is that a permission check requires checking + * the runtime permission and if it is granted checking the corresponding + * app op as for apps not supporting the runtime mode we never revoke + * permissions but disable app ops. Since there are two types of app op + * checks, one that does not leave a record an action was performed and + * another the does, one needs to call the preflight flavor of the checks + * named xxxForPreflight only if no private data is being delivered but + * a permission check is what is needed and the xxxForDataDelivery where + * the permission check is right before private data delivery. * * @hide */ @@ -63,6 +76,9 @@ public final class PermissionChecker { /** Permission result: The permission is denied because the app op is not allowed. */ public static final int PERMISSION_DENIED_APP_OP = PackageManager.PERMISSION_DENIED - 1; + /** Constant when the PID for which we check permissions is unknown. */ + public static final int PID_UNKNOWN = -1; + /** @hide */ @IntDef({PERMISSION_GRANTED, PERMISSION_DENIED, @@ -78,47 +94,127 @@ public final class PermissionChecker { * Checks whether a given package in a UID and PID has a given permission * and whether the app op that corresponds to this permission is allowed. * + * NOTE: Use this method only for permission checks at the + * point where you will deliver the permission protected data to clients. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use {@link #checkPermissionForPreflight(Context, String, int, int, String)} + * to determine if the app has or may have location permission (if app has only foreground + * location the grant state depends on the app's fg/gb state) and this check will not + * leave a trace that permission protected data was delivered. When you are about to + * deliver the location data to a registered listener you should use this method which + * will evaluate the permission access based on the current fg/bg state of the app and + * leave a record that the data was accessed. + * * @param context Context for accessing resources. * @param permission The permission to check. - * @param pid The process id for which to check. + * @param pid The process id for which to check. Use {@link #PID_UNKNOWN} if the PID + * is not known. * @param uid The uid for which to check. * @param packageName The package name for which to check. If null the * the first package for the calling UID will be used. * @return The permission check result which is either {@link #PERMISSION_GRANTED} * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkPermissionForPreflight(Context, String, int, int, String) */ @PermissionResult - public static int checkPermission(@NonNull Context context, @NonNull String permission, - int pid, int uid, @Nullable String packageName) { - if (context.checkPermission(permission, pid, uid) == PackageManager.PERMISSION_DENIED) { - return PERMISSION_DENIED; - } - - AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); - String op = appOpsManager.permissionToOp(permission); - if (op == null) { - return PERMISSION_GRANTED; - } - - if (packageName == null) { - String[] packageNames = context.getPackageManager().getPackagesForUid(uid); - if (packageNames == null || packageNames.length <= 0) { - return PERMISSION_DENIED; - } - packageName = packageNames[0]; - } + public static int checkPermissionForDataDelivery(@NonNull Context context, + @NonNull String permission, int pid, int uid, @Nullable String packageName) { + return checkPermissionCommon(context, permission, pid, uid, packageName, + true /*forDataDelivery*/); + } - if (appOpsManager.noteProxyOpNoThrow(op, packageName, uid) != AppOpsManager.MODE_ALLOWED) { - return PERMISSION_DENIED_APP_OP; - } + /** + * Checks whether a given package in a UID and PID has a given permission + * and whether the app op that corresponds to this permission is allowed. + * + * NOTE: Use this method only for permission checks at the + * preflight point where you will not deliver the permission protected data + * to clients but schedule permission data delivery, apps register listeners, + * etc. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use this method to determine if the app has or may have location + * permission (if app has only foreground location the grant state depends on the app's + * fg/gb state) and this check will not leave a trace that permission protected data + * was delivered. When you are about to deliver the location data to a registered + * listener you should use {@link #checkPermissionForDataDelivery(Context, String, + * int, int, String)} which will evaluate the permission access based on the current + * fg/bg state of the app and leave a record that the data was accessed. + * + * @param context Context for accessing resources. + * @param permission The permission to check. + * @param pid The process id for which to check. + * @param uid The uid for which to check. + * @param packageName The package name for which to check. If null the + * the first package for the calling UID will be used. + * @return The permission check result which is either {@link #PERMISSION_GRANTED} + * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkPermissionForDataDelivery(Context, String, int, int, String) + */ + @PermissionResult + public static int checkPermissionForPreflight(@NonNull Context context, + @NonNull String permission, int pid, int uid, @Nullable String packageName) { + return checkPermissionCommon(context, permission, pid, uid, packageName, + false /*forDataDelivery*/); + } - return PERMISSION_GRANTED; + /** + * Checks whether your app has a given permission and whether the app op + * that corresponds to this permission is allowed. + * + * NOTE: Use this method only for permission checks at the + * point where you will deliver the permission protected data to clients. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use {@link #checkSelfPermissionForPreflight(Context, String)} + * to determine if the app has or may have location permission (if app has only foreground + * location the grant state depends on the app's fg/gb state) and this check will not + * leave a trace that permission protected data was delivered. When you are about to + * deliver the location data to a registered listener you should use this method + * which will evaluate the permission access based on the current fg/bg state of the + * app and leave a record that the data was accessed. + * + *

This API assumes the the {@link Binder#getCallingUid()} is the same as + * {@link Process#myUid()}. + * + * @param context Context for accessing resources. + * @param permission The permission to check. + * @return The permission check result which is either {@link #PERMISSION_GRANTED} + * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkSelfPermissionForPreflight(Context, String) + */ + @PermissionResult + public static int checkSelfPermissionForDataDelivery(@NonNull Context context, + @NonNull String permission) { + return checkPermissionForDataDelivery(context, permission, Process.myPid(), + Process.myUid(), context.getPackageName()); } /** * Checks whether your app has a given permission and whether the app op * that corresponds to this permission is allowed. * + * NOTE: Use this method only for permission checks at the + * preflight point where you will not deliver the permission protected data + * to clients but schedule permission data delivery, apps register listeners, + * etc. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use this method to determine if the app has or may have location + * permission (if app has only foreground location the grant state depends on the + * app's fg/gb state) and this check will not leave a trace that permission protected + * data was delivered. When you are about to deliver the location data to a registered + * listener you should use this method which will evaluate the permission access based + * on the current fg/bg state of the app and leave a record that the data was accessed. + * *

This API assumes the the {@link Binder#getCallingUid()} is the same as * {@link Process#myUid()}. * @@ -126,11 +222,13 @@ public final class PermissionChecker { * @param permission The permission to check. * @return The permission check result which is either {@link #PERMISSION_GRANTED} * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkSelfPermissionForDataDelivery(Context, String) */ @PermissionResult - public static int checkSelfPermission(@NonNull Context context, + public static int checkSelfPermissionForPreflight(@NonNull Context context, @NonNull String permission) { - return checkPermission(context, permission, Process.myPid(), + return checkPermissionForPreflight(context, permission, Process.myPid(), Process.myUid(), context.getPackageName()); } @@ -138,20 +236,106 @@ public final class PermissionChecker { * Checks whether the IPC you are handling has a given permission and whether * the app op that corresponds to this permission is allowed. * + * NOTE: Use this method only for permission checks at the + * point where you will deliver the permission protected data to clients. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use {@link #checkCallingPermissionForPreflight(Context, String, String)} + * to determine if the app has or may have location permission (if app has only foreground + * location the grant state depends on the app's fg/gb state) and this check will not + * leave a trace that permission protected data was delivered. When you are about to + * deliver the location data to a registered listener you should use this method which + * will evaluate the permission access based on the current fg/bg state of the app and + * leave a record that the data was accessed. + * * @param context Context for accessing resources. * @param permission The permission to check. * @param packageName The package name making the IPC. If null the * the first package for the calling UID will be used. * @return The permission check result which is either {@link #PERMISSION_GRANTED} * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkCallingPermissionForPreflight(Context, String, String) */ @PermissionResult - public static int checkCallingPermission(@NonNull Context context, + public static int checkCallingPermissionForDataDelivery(@NonNull Context context, @NonNull String permission, @Nullable String packageName) { if (Binder.getCallingPid() == Process.myPid()) { return PERMISSION_DENIED; } - return checkPermission(context, permission, Binder.getCallingPid(), + return checkPermissionForDataDelivery(context, permission, Binder.getCallingPid(), + Binder.getCallingUid(), packageName); + } + + /** + * Checks whether the IPC you are handling has a given permission and whether + * the app op that corresponds to this permission is allowed. + * + * NOTE: Use this method only for permission checks at the + * preflight point where you will not deliver the permission protected data + * to clients but schedule permission data delivery, apps register listeners, + * etc. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use this method to determine if the app has or may have location + * permission (if app has only foreground location the grant state depends on the app's + * fg/gb state) and this check will not leave a trace that permission protected data + * was delivered. When you are about to deliver the location data to a registered + * listener you should use {@link #checkCallingOrSelfPermissionForDataDelivery(Context, + * String)} which will evaluate the permission access based on the current fg/bg state + * of the app and leave a record that the data was accessed. + * + * @param context Context for accessing resources. + * @param permission The permission to check. + * @param packageName The package name making the IPC. If null the + * the first package for the calling UID will be used. + * @return The permission check result which is either {@link #PERMISSION_GRANTED} + * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkCallingPermissionForDataDelivery(Context, String, String) + */ + @PermissionResult + public static int checkCallingPermissionForPreflight(@NonNull Context context, + @NonNull String permission, @Nullable String packageName) { + if (Binder.getCallingPid() == Process.myPid()) { + return PERMISSION_DENIED; + } + return checkPermissionForPreflight(context, permission, Binder.getCallingPid(), + Binder.getCallingUid(), packageName); + } + + /** + * Checks whether the IPC you are handling or your app has a given permission + * and whether the app op that corresponds to this permission is allowed. + * + * NOTE: Use this method only for permission checks at the + * point where you will deliver the permission protected data to clients. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use {@link #checkCallingOrSelfPermissionForPreflight(Context, String)} + * to determine if the app has or may have location permission (if app has only foreground + * location the grant state depends on the app's fg/gb state) and this check will not + * leave a trace that permission protected data was delivered. When you are about to + * deliver the location data to a registered listener you should use this method which + * will evaluate the permission access based on the current fg/bg state of the app and + * leave a record that the data was accessed. + * + * @param context Context for accessing resources. + * @param permission The permission to check. + * @return The permission check result which is either {@link #PERMISSION_GRANTED} + * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkCallingOrSelfPermissionForPreflight(Context, String) + */ + @PermissionResult + public static int checkCallingOrSelfPermissionForDataDelivery(@NonNull Context context, + @NonNull String permission) { + String packageName = (Binder.getCallingPid() == Process.myPid()) + ? context.getPackageName() : null; + return checkPermissionForDataDelivery(context, permission, Binder.getCallingPid(), Binder.getCallingUid(), packageName); } @@ -159,17 +343,69 @@ public final class PermissionChecker { * Checks whether the IPC you are handling or your app has a given permission * and whether the app op that corresponds to this permission is allowed. * + * NOTE: Use this method only for permission checks at the + * preflight point where you will not deliver the permission protected data + * to clients but schedule permission data delivery, apps register listeners, + * etc. + * + *

For example, if an app registers a location listener it should have the location + * permission but no data is actually sent to the app at the moment of registration + * and you should use this method to determine if the app has or may have location + * permission (if app has only foreground location the grant state depends on the + * app's fg/gb state) and this check will not leave a trace that permission protected + * data was delivered. When you are about to deliver the location data to a registered + * listener you should use {@link #checkCallingOrSelfPermissionForDataDelivery(Context, + * String)} which will evaluate the permission access based on the current fg/bg state + * of the app and leave a record that the data was accessed. + * * @param context Context for accessing resources. * @param permission The permission to check. * @return The permission check result which is either {@link #PERMISSION_GRANTED} * or {@link #PERMISSION_DENIED} or {@link #PERMISSION_DENIED_APP_OP}. + * + * @see #checkCallingOrSelfPermissionForDataDelivery(Context, String) */ @PermissionResult - public static int checkCallingOrSelfPermission(@NonNull Context context, + public static int checkCallingOrSelfPermissionForPreflight(@NonNull Context context, @NonNull String permission) { String packageName = (Binder.getCallingPid() == Process.myPid()) ? context.getPackageName() : null; - return checkPermission(context, permission, Binder.getCallingPid(), + return checkPermissionForPreflight(context, permission, Binder.getCallingPid(), Binder.getCallingUid(), packageName); } + + private static int checkPermissionCommon(@NonNull Context context, @NonNull String permission, + int pid, int uid, @Nullable String packageName, boolean forDataDelivery) { + if (context.checkPermission(permission, pid, uid) == PackageManager.PERMISSION_DENIED) { + return PERMISSION_DENIED; + } + + AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); + String op = appOpsManager.permissionToOp(permission); + if (op == null) { + return PERMISSION_GRANTED; + } + + if (packageName == null) { + String[] packageNames = context.getPackageManager().getPackagesForUid(uid); + if (packageNames == null || packageNames.length <= 0) { + return PERMISSION_DENIED; + } + packageName = packageNames[0]; + } + + if (forDataDelivery) { + if (appOpsManager.noteProxyOpNoThrow(op, packageName, uid) + != AppOpsManager.MODE_ALLOWED) { + return PERMISSION_DENIED_APP_OP; + } + } else { + final int mode = appOpsManager.unsafeCheckOpRawNoThrow(op, uid, packageName); + if (mode != AppOpsManager.MODE_ALLOWED && mode != AppOpsManager.MODE_FOREGROUND) { + return PERMISSION_DENIED_APP_OP; + } + } + + return PERMISSION_GRANTED; + } } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index a7eecd7f4306a8e2124b11e37f3871dfc5dd9437..abcf77b64b87df09d1ed2d6078c3e46f132ad460 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -44,6 +44,7 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; @@ -772,4 +773,6 @@ interface IPackageManager { void setRuntimePermissionsVersion(int version, int userId); void notifyPackagesReplacedReceived(in String[] packages); + + List getSplitPermissions(); } diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 037a149bfe37165dece0dc7effc9ae072523ace9..3933e81c732a08b93929fda368f80f51b32116d9 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -503,9 +503,38 @@ public class LauncherApps { } /** - * Retrieves a list of launchable activities that match {@link Intent#ACTION_MAIN} and - * {@link Intent#CATEGORY_LAUNCHER}, for a specified user. Result may include - * synthesized activities like app details Activity injected by system. + * Retrieves a list of activities that specify {@link Intent#ACTION_MAIN} and + * {@link Intent#CATEGORY_LAUNCHER}, across all apps, for a specified user. If an app doesn't + * have any activities that specify ACTION_MAIN or CATEGORY_LAUNCHER, + * the system adds a synthesized activity to the list. This synthesized activity represents the + * app's details page within system settings. + * + *

Note: It's possible for system apps, such as app stores, to prevent + * the system from adding synthesized activities to the returned list.

+ * + *

As of Android Q, at least + * one of the app's activities or synthesized activities appears in the returned list unless the + * app satisfies at least one of the following conditions:

+ *
    + *
  • The app is a system app.
  • + *
  • The app doesn't request any permissions. + *
  • + *
  • The app doesn't have a launcher activity that is enabled by default. A launcher + * activity has an intent containing the ACTION_MAIN action and the + * CATEGORY_LAUNCHER category.
  • + *
+ * + *

Additionally, the system hides synthesized activities for some or all apps in the + * following enterprise-related cases:

+ *
    + *
  • If the device is a + * fully + * managed device, no synthesized activities for any app appear in the returned list.
  • + *
  • If the current user has a + * work + * profile, no synthesized activities for the user's work apps appear in the returned + * list.
  • + *
* * @param packageName The specific package to query. If null, it checks all installed packages * in the profile. diff --git a/core/java/android/content/pm/PackageList.java b/core/java/android/content/pm/PackageList.java index f78175868860e28d7f985dd9ccf91caf9076b374..e3eb2c55a2bb526df8d76e904c7cb89dee1e929b 100644 --- a/core/java/android/content/pm/PackageList.java +++ b/core/java/android/content/pm/PackageList.java @@ -51,6 +51,13 @@ public class PackageList implements PackageListObserver, AutoCloseable { } } + @Override + public void onPackageChanged(String packageName, int uid) { + if (mWrappedObserver != null) { + mWrappedObserver.onPackageChanged(packageName, uid); + } + } + @Override public void onPackageRemoved(String packageName, int uid) { if (mWrappedObserver != null) { diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index b3776787cc2bd8d34ee0d5ca471c0c07e9d8e46a..535a8bc9db75492c5dc019704d517d44ba0fa10b 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -57,6 +57,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageParserCacheHelper.ReadHelper; import android.content.pm.PackageParserCacheHelper.WriteHelper; +import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.split.DefaultSplitAssetLoader; import android.content.pm.split.SplitAssetDependencyLoader; import android.content.pm.split.SplitAssetLoader; @@ -104,6 +105,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.ClassLoaderFactory; import com.android.internal.util.ArrayUtils; import com.android.internal.util.XmlUtils; +import com.android.server.SystemConfig; import libcore.io.IoUtils; import libcore.util.EmptyArray; @@ -2482,11 +2484,10 @@ public class PackageParser { Slog.i(TAG, newPermsMsg.toString()); } - - final int NS = PermissionManager.SPLIT_PERMISSIONS.size(); - for (int is=0; is splitPermissions = getSplitPermissions(); + final int listSize = splitPermissions.size(); + for (int is = 0; is < listSize; is++) { + final SplitPermissionInfoParcelable spi = splitPermissions.get(is); if (pkg.applicationInfo.targetSdkVersion >= spi.getTargetSdk() || !pkg.requestedPermissions.contains(spi.getSplitPermission())) { continue; @@ -2540,6 +2541,23 @@ public class PackageParser { return pkg; } + private List getSplitPermissions() { + // PackageManager runs this code during initialization prior to registering with + // ServiceManager, so we can't use the PackageManager API. Instead, just read from + // SystemConfig directly when in any SystemProcess and only use PackageManager when not in + // one. + if (ActivityThread.isSystem()) { + return PermissionManager.splitPermissionInfoListToParcelableList( + SystemConfig.getInstance().getSplitPermissions()); + } else { + try { + return ActivityThread.getPackageManager().getSplitPermissions(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + private boolean checkOverlayRequiredSystemProperty(String propName, String propValue) { if (TextUtils.isEmpty(propName) || TextUtils.isEmpty(propValue)) { diff --git a/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.aidl b/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.aidl new file mode 100644 index 0000000000000000000000000000000000000000..d84454ce744b1ac5739b3ef9dd1a51414cc95452 --- /dev/null +++ b/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.aidl @@ -0,0 +1,19 @@ +/** + * 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 android.content.pm.permission; + + parcelable SplitPermissionInfoParcelable; \ No newline at end of file diff --git a/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.java b/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.java new file mode 100644 index 0000000000000000000000000000000000000000..6537fbc373986deeeb78b5c2f72ad7e243f2af90 --- /dev/null +++ b/core/java/android/content/pm/permission/SplitPermissionInfoParcelable.java @@ -0,0 +1,178 @@ +/* + * 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 android.content.pm.permission; + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; + +import com.android.internal.util.Preconditions; + +import java.util.List; +import java.util.Objects; + +/** + * Parcelable version of {@link android.permission.PermissionManager.SplitPermissionInfo} + * @hide + */ +public class SplitPermissionInfoParcelable implements Parcelable { + + /** + * The permission that is split. + */ + @NonNull + private final String mSplitPermission; + + /** + * The permissions that are added. + */ + @NonNull + private final List mNewPermissions; + + /** + * The target API level when the permission was split. + */ + @IntRange(from = 0) + private final int mTargetSdk; + + private void onConstructed() { + Preconditions.checkCollectionElementsNotNull(mNewPermissions, "newPermissions"); + } + + + + // Code below generated by codegen v1.0.0. + // + // DO NOT MODIFY! + // + // To regenerate run: + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/content/pm/SplitPermissionInfoParcelable.java + // + // CHECKSTYLE:OFF Generated code + + /** + * Creates a new SplitPermissionInfoParcelable. + * + * @param splitPermission + * The permission that is split. + * @param newPermissions + * The permissions that are added. + * @param targetSdk + * The target API level when the permission was split. + */ + public SplitPermissionInfoParcelable( + @NonNull String splitPermission, + @NonNull List newPermissions, + @IntRange(from = 0) int targetSdk) { + this.mSplitPermission = splitPermission; + Preconditions.checkNotNull(mSplitPermission); + this.mNewPermissions = newPermissions; + Preconditions.checkNotNull(mNewPermissions); + this.mTargetSdk = targetSdk; + Preconditions.checkArgumentNonnegative(mTargetSdk); + + onConstructed(); + } + + /** + * The permission that is split. + */ + public @NonNull String getSplitPermission() { + return mSplitPermission; + } + + /** + * The permissions that are added. + */ + public @NonNull List getNewPermissions() { + return mNewPermissions; + } + + /** + * The target API level when the permission was split. + */ + public @IntRange(from = 0) int getTargetSdk() { + return mTargetSdk; + } + + @Override + public boolean equals(Object o) { + // You can override field equality logic by defining either of the methods like: + // boolean fieldNameEquals(SplitPermissionInfoParcelable other) { ... } + // boolean fieldNameEquals(FieldType otherValue) { ... } + + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + @SuppressWarnings("unchecked") + SplitPermissionInfoParcelable that = (SplitPermissionInfoParcelable) o; + //noinspection PointlessBooleanExpression + return true + && Objects.equals(mSplitPermission, that.mSplitPermission) + && Objects.equals(mNewPermissions, that.mNewPermissions) + && mTargetSdk == that.mTargetSdk; + } + + @Override + public int hashCode() { + // You can override field hashCode logic by defining methods like: + // int fieldNameHashCode() { ... } + + int _hash = 1; + _hash = 31 * _hash + Objects.hashCode(mSplitPermission); + _hash = 31 * _hash + Objects.hashCode(mNewPermissions); + _hash = 31 * _hash + mTargetSdk; + return _hash; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + // You can override field parcelling by defining methods like: + // void parcelFieldName(Parcel dest, int flags) { ... } + + dest.writeString(mSplitPermission); + dest.writeStringList(mNewPermissions); + dest.writeInt(mTargetSdk); + } + + @Override + public int describeContents() { return 0; } + + public static final @NonNull Parcelable.Creator CREATOR + = new Parcelable.Creator() { + @Override + public SplitPermissionInfoParcelable[] newArray(int size) { + return new SplitPermissionInfoParcelable[size]; + } + + @Override + @SuppressWarnings({"unchecked", "RedundantCast"}) + public SplitPermissionInfoParcelable createFromParcel(Parcel in) { + // You can override field unparcelling by defining methods like: + // static FieldType unparcelFieldName(Parcel in) { ... } + + String splitPermission = in.readString(); + List newPermissions = new java.util.ArrayList<>(); + in.readStringList(newPermissions); + int targetSdk = in.readInt(); + return new SplitPermissionInfoParcelable( + splitPermission, + newPermissions, + targetSdk); + } + }; +} diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java index 099ae291c8f4a5ecd4400069e46000a14b845373..e78fb7f00797559d2801672592c101696b41d617 100644 --- a/core/java/android/hardware/Sensor.java +++ b/core/java/android/hardware/Sensor.java @@ -339,6 +339,8 @@ public final class Sensor { * for {@link #TYPE_STEP_COUNTER} instead. It is defined as a * {@link Sensor#REPORTING_MODE_SPECIAL_TRIGGER} sensor. *

+ * This sensor requires permission {@code android.permission.ACTIVITY_RECOGNITION}. + *

* See {@link android.hardware.SensorEvent#values SensorEvent.values} for more details. */ public static final int TYPE_STEP_DETECTOR = 18; @@ -384,8 +386,6 @@ public final class Sensor { * gyroscope. This sensor uses lower power than the other rotation vectors, because it doesn't * use the gyroscope. However, it is more noisy and will work best outdoors. *

- * This sensor requires permission {@code android.permission.ACTIVITY_RECOGNITION}. - *

* See {@link android.hardware.SensorEvent#values SensorEvent.values} for more details. */ public static final int TYPE_GEOMAGNETIC_ROTATION_VECTOR = 20; diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index 6c497d47c645e3ddb0b883aa62f4b67580d63c33..d8110f33d72322a90187664703bcdb579863518b 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -104,9 +104,17 @@ public class BiometricManager { */ @RequiresPermission(USE_BIOMETRIC) public @BiometricError int canAuthenticate() { + return canAuthenticate(mContext.getUserId()); + } + + /** + * @hide + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public @BiometricError int canAuthenticate(int userId) { if (mService != null) { try { - return mService.canAuthenticate(mContext.getOpPackageName()); + return mService.canAuthenticate(mContext.getOpPackageName(), userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -120,6 +128,25 @@ public class BiometricManager { } } + /** + * @hide + * @param userId + * @return + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public boolean hasEnrolledBiometrics(int userId) { + if (mService != null) { + try { + return mService.hasEnrolledBiometrics(userId); + } catch (RemoteException e) { + Slog.w(TAG, "Remote exception in hasEnrolledBiometrics(): " + e); + return false; + } + } else { + return false; + } + } + /** * Listens for changes to biometric eligibility on keyguard from user settings. * @param callback diff --git a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl index d22e7e295b77447c9fe15f1b3364e9d0878e6652..62d727c080e318d158a8320aecbe523576d0b5de 100644 --- a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl +++ b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl @@ -22,5 +22,5 @@ import android.hardware.biometrics.BiometricSourceType; * @hide */ oneway interface IBiometricEnabledOnKeyguardCallback { - void onChanged(in BiometricSourceType type, boolean enabled); + void onChanged(in BiometricSourceType type, boolean enabled, int userId); } \ No newline at end of file diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 90d4921c3c189d6fe55ce9fb314800fbbf9a6944..f0a0b2f0235f20405fb4509a2a1398310551a819 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -40,7 +40,10 @@ interface IBiometricService { void cancelAuthentication(IBinder token, String opPackageName); // Checks if biometrics can be used. - int canAuthenticate(String opPackageName); + int canAuthenticate(String opPackageName, int userId); + + // Checks if any biometrics are enrolled. + boolean hasEnrolledBiometrics(int userId); // Register callback for when keyguard biometric eligibility changes. void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback); diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 5ac13d8a067d16bfdfbd3b325e689768eac71344..a0170dab9f04ddae169327758e942f7dc2560def 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -206,10 +206,16 @@ public abstract class CameraMetadata { continue; } - if (filterTags == null || Arrays.binarySearch(filterTags, - CameraMetadataNative.getTag(keyName, vendorId)) >= 0) { + + if (filterTags != null && Arrays.binarySearch(filterTags, + CameraMetadataNative.getTag(keyName, vendorId)) < 0) { + // ignore vendor keys not in filterTags + continue; + } + if (instance == null || instance.getProtected(k) != null) { keyList.add(k); } + } } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 7114c6dbba4eef06f76038305bb5e82397f04c7d..b2f3be17beaa979d5100ab90dc482583befd72e4 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -1038,34 +1038,35 @@ public class CameraDeviceImpl extends CameraDevice // callback is valid executor = checkExecutor(executor, callback); - // Make sure that there all requests have at least 1 surface; all surfaces are non-null; - // the surface isn't a physical stream surface for reprocessing request - for (CaptureRequest request : requestList) { - if (request.getTargets().isEmpty()) { - throw new IllegalArgumentException( - "Each request must have at least one Surface target"); - } + synchronized(mInterfaceLock) { + checkIfCameraClosedOrInError(); - for (Surface surface : request.getTargets()) { - if (surface == null) { - throw new IllegalArgumentException("Null Surface targets are not allowed"); + // Make sure that there all requests have at least 1 surface; all surfaces are non-null; + // the surface isn't a physical stream surface for reprocessing request + for (CaptureRequest request : requestList) { + if (request.getTargets().isEmpty()) { + throw new IllegalArgumentException( + "Each request must have at least one Surface target"); } - for (int i = 0; i < mConfiguredOutputs.size(); i++) { - OutputConfiguration configuration = mConfiguredOutputs.valueAt(i); - if (configuration.isForPhysicalCamera() - && configuration.getSurfaces().contains(surface)) { - if (request.isReprocess()) { - throw new IllegalArgumentException( - "Reprocess request on physical stream is not allowed"); + for (Surface surface : request.getTargets()) { + if (surface == null) { + throw new IllegalArgumentException("Null Surface targets are not allowed"); + } + + for (int i = 0; i < mConfiguredOutputs.size(); i++) { + OutputConfiguration configuration = mConfiguredOutputs.valueAt(i); + if (configuration.isForPhysicalCamera() + && configuration.getSurfaces().contains(surface)) { + if (request.isReprocess()) { + throw new IllegalArgumentException( + "Reprocess request on physical stream is not allowed"); + } } } } } - } - synchronized(mInterfaceLock) { - checkIfCameraClosedOrInError(); if (repeating) { stopRepeating(); } @@ -2379,20 +2380,33 @@ public class CameraDeviceImpl extends CameraDevice final CaptureCallbackHolder holder = CameraDeviceImpl.this.mCaptureCallbackMap.get(requestId); + if (holder == null) { + Log.e(TAG, String.format("Receive capture error on unknown request ID %d", + requestId)); + return; + } + final CaptureRequest request = holder.getRequest(subsequenceId); Runnable failureDispatch = null; if (errorCode == ERROR_CAMERA_BUFFER) { // Because 1 stream id could map to multiple surfaces, we need to specify both // streamId and surfaceId. - List surfaces = - mConfiguredOutputs.get(resultExtras.getErrorStreamId()).getSurfaces(); - for (Surface surface : surfaces) { + OutputConfiguration config = mConfiguredOutputs.get( + resultExtras.getErrorStreamId()); + if (config == null) { + Log.v(TAG, String.format( + "Stream %d has been removed. Skipping buffer lost callback", + resultExtras.getErrorStreamId())); + return; + } + for (Surface surface : config.getSurfaces()) { if (!request.containsTarget(surface)) { continue; } if (DEBUG) { - Log.v(TAG, String.format("Lost output buffer reported for frame %d, target %s", + Log.v(TAG, String.format( + "Lost output buffer reported for frame %d, target %s", frameNumber, surface)); } failureDispatch = new Runnable() { diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java index c45b8ed52187907f966a48a05b5ca4f898f0f8c8..3e995b6241123ed40fd1981049c5aff483b5824c 100644 --- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java +++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java @@ -48,7 +48,8 @@ public class AmbientDisplayConfiguration { return pulseOnNotificationEnabled(user) || pulseOnLongPressEnabled(user) || alwaysOnEnabled(user) - || wakeScreenGestureEnabled(user) + || wakeLockScreenGestureEnabled(user) + || wakeDisplayGestureEnabled(user) || pickupGestureEnabled(user) || tapGestureEnabled(user) || doubleTapGestureEnabled(user); @@ -105,8 +106,14 @@ public class AmbientDisplayConfiguration { } /** {@hide} */ - public boolean wakeScreenGestureEnabled(int user) { - return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, user) + public boolean wakeLockScreenGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, user) + && wakeScreenGestureAvailable(); + } + + /** {@hide} */ + public boolean wakeDisplayGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, user) && wakeScreenGestureAvailable(); } diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 8a0a9c7c9d9de75c38ed1ceba3ce6e49729cd638..0b25dbd78611fd12b771d396413e1fda2026f444 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -820,4 +820,64 @@ public final class DisplayManager { */ void onDisplayChanged(int displayId); } + + /** + * Interface for accessing keys belonging to {@link + * android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER}. + * @hide + */ + public interface DeviceConfig { + + /** + * Key for refresh rate in the zone defined by thresholds. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.integer#config_defaultZoneBehavior + */ + String KEY_REFRESH_RATE_IN_ZONE = "refresh_rate_in_zone"; + + /** + * Key for accessing the display brightness thresholds for the configured refresh rate zone. + * The value will be a pair of comma separated integers representing the minimum and maximum + * thresholds of the zone, respectively, in display backlight units (i.e. [0, 255]). + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.array#config_brightnessThresholdsOfPeakRefreshRate + * @hide + */ + String KEY_PEAK_REFRESH_RATE_DISPLAY_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_brightness_thresholds"; + + /** + * Key for accessing the ambient brightness thresholds for the configured refresh rate zone. + * The value will be a pair of comma separated integers representing the minimum and maximum + * thresholds of the zone, respectively, in lux. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.array#config_ambientThresholdsOfPeakRefreshRate + * @hide + */ + String KEY_PEAK_REFRESH_RATE_AMBIENT_BRIGHTNESS_THRESHOLDS = + "peak_refresh_rate_ambient_thresholds"; + + /** + * Key for default peak refresh rate + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.integer#config_defaultPeakRefreshRate + * @hide + */ + String KEY_PEAK_REFRESH_RATE_DEFAULT = "peak_refresh_rate_default"; + + /** + * Key for controlling which packages are explicitly blocked from running at refresh rates + * higher than 60hz. An app may be added to this list if they exhibit performance issues at + * higher refresh rates. + * + * @see android.provider.DeviceConfig#NAMESPACE_DISPLAY_MANAGER + * @see android.R.array#config_highRefreshRateBlacklist + * @hide + */ + String KEY_HIGH_REFRESH_RATE_BLACKLIST = "high_refresh_rate_blacklist"; + } } diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 8596af107ac1f569d9e8fe1eb5af9a97a32a6040..12b285a0f0ab31b5d666723a3eb18cb7fe755139 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -262,7 +262,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void enroll(byte[] token, CancellationSignal cancel, + public void enroll(int userId, byte[] token, CancellationSignal cancel, EnrollmentCallback callback, int[] disabledFeatures) { if (callback == null) { throw new IllegalArgumentException("Must supply an enrollment callback"); @@ -281,7 +281,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan try { mEnrollmentCallback = callback; Trace.beginSection("FaceManager#enroll"); - mService.enroll(mToken, token, mServiceReceiver, + mService.enroll(userId, mToken, token, mServiceReceiver, mContext.getOpPackageName(), disabledFeatures); } catch (RemoteException e) { Log.w(TAG, "Remote exception in enroll: ", e); @@ -339,12 +339,13 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void setFeature(int feature, boolean enabled, byte[] token, + public void setFeature(int userId, int feature, boolean enabled, byte[] token, SetFeatureCallback callback) { if (mService != null) { try { mSetFeatureCallback = callback; - mService.setFeature(feature, enabled, token, mServiceReceiver); + mService.setFeature(userId, feature, enabled, token, mServiceReceiver, + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -355,11 +356,11 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void getFeature(int feature, GetFeatureCallback callback) { + public void getFeature(int userId, int feature, GetFeatureCallback callback) { if (mService != null) { try { mGetFeatureCallback = callback; - mService.getFeature(feature, mServiceReceiver); + mService.getFeature(userId, feature, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -414,7 +415,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan try { mRemovalCallback = callback; mRemovalFace = face; - mService.remove(mToken, face.getBiometricId(), userId, mServiceReceiver); + mService.remove(mToken, face.getBiometricId(), userId, mServiceReceiver, + mContext.getOpPackageName()); } catch (RemoteException e) { Log.w(TAG, "Remote exception in remove: ", e); if (callback != null) { @@ -637,7 +639,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } } Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode); - return null; + return ""; } /** diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 601be7595581f1c50a2f8f48040221712c6a318c..b6a0afbf716cf3ab74c613912e4f9791accbc462 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -50,14 +50,15 @@ interface IFaceService { int callingUid, int callingPid, int callingUserId, boolean fromClient); // Start face enrollment - void enroll(IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver, + void enroll(int userId, IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver, String opPackageName, in int [] disabledFeatures); // Cancel enrollment in progress void cancelEnrollment(IBinder token); // Any errors resulting from this call will be returned to the listener - void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver); + void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver, + String opPackageName); // Rename the face specified by faceId to the given name void rename(int faceId, String name); @@ -98,10 +99,10 @@ interface IFaceService { // Enumerate all faces void enumerate(IBinder token, int userId, IFaceServiceReceiver receiver); - void setFeature(int feature, boolean enabled, in byte [] token, - IFaceServiceReceiver receiver); + void setFeature(int userId, int feature, boolean enabled, in byte [] token, + IFaceServiceReceiver receiver, String opPackageName); - void getFeature(int feature, IFaceServiceReceiver receiver); + void getFeature(int userId, int feature, IFaceServiceReceiver receiver, String opPackageName); void userActivity(); } diff --git a/core/java/android/hardware/radio/TunerAdapter.java b/core/java/android/hardware/radio/TunerAdapter.java index be2846f870799e3fa4d7e73d5a0431fd07acd768..aa5480abafb4beea97c7c3845ff34bf4d1075962 100644 --- a/core/java/android/hardware/radio/TunerAdapter.java +++ b/core/java/android/hardware/radio/TunerAdapter.java @@ -271,6 +271,8 @@ class TunerAdapter extends RadioTuner { mCallback.setProgramListObserver(list, () -> { try { mTuner.stopProgramListUpdates(); + } catch (IllegalStateException ex) { + // it's fine to not stop updates if tuner is already closed } catch (RemoteException ex) { Log.e(TAG, "Couldn't stop program list updates", ex); } diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java index 0fb93e532cd3f1cedbca0261a2aa151cf59c58bf..beff0f7607f810888e77267d3baf295259c9f57f 100644 --- a/core/java/android/hardware/radio/TunerCallbackAdapter.java +++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java @@ -211,10 +211,12 @@ class TunerCallbackAdapter extends ITunerCallback.Stub { @Override public void onProgramListUpdated(ProgramList.Chunk chunk) { - synchronized (mLock) { - if (mProgramList == null) return; - mProgramList.apply(Objects.requireNonNull(chunk)); - } + mHandler.post(() -> { + synchronized (mLock) { + if (mProgramList == null) return; + mProgramList.apply(Objects.requireNonNull(chunk)); + } + }); } @Override diff --git a/core/java/android/inputmethodservice/SoftInputWindow.java b/core/java/android/inputmethodservice/SoftInputWindow.java index 0513feef801f37a4e8d3a0c21105e342dd544446..356b3448430a6d7e711021f74237ce3bed8a6e5f 100644 --- a/core/java/android/inputmethodservice/SoftInputWindow.java +++ b/core/java/android/inputmethodservice/SoftInputWindow.java @@ -21,6 +21,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.app.Dialog; import android.content.Context; +import android.content.pm.PackageManager; import android.graphics.Rect; import android.os.Debug; import android.os.IBinder; @@ -50,6 +51,7 @@ public class SoftInputWindow extends Dialog { final int mWindowType; final int mGravity; final boolean mTakesFocus; + final boolean mAutomotiveHideNavBarForKeyboard; private final Rect mBounds = new Rect(); @Retention(SOURCE) @@ -134,6 +136,8 @@ public class SoftInputWindow extends Dialog { mWindowType = windowType; mGravity = gravity; mTakesFocus = takesFocus; + mAutomotiveHideNavBarForKeyboard = context.getResources().getBoolean( + com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard); initDockWindow(); } @@ -247,6 +251,11 @@ public class SoftInputWindow extends Dialog { windowModFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; } + if (isAutomotive() && mAutomotiveHideNavBarForKeyboard) { + windowSetFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + windowModFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + } + getWindow().setFlags(windowSetFlags, windowModFlags); } @@ -338,6 +347,10 @@ public class SoftInputWindow extends Dialog { mWindowState = newState; } + private boolean isAutomotive() { + return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); + } + private static String stateToString(@SoftInputWindowState int state) { switch (state) { case SoftInputWindowState.TOKEN_PENDING: diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl index 41efc5040885f4f09053e0d93923ac6d81870c50..e5f3d26667a09a60391f74d50ee13f23ba52651f 100644 --- a/core/java/android/net/INetworkStatsService.aidl +++ b/core/java/android/net/INetworkStatsService.aidl @@ -66,7 +66,6 @@ interface INetworkStatsService { /** Force update of ifaces. */ void forceUpdateIfaces( in Network[] defaultNetworks, - in VpnInfo[] vpnArray, in NetworkState[] networkStates, in String activeIface); /** Force update of statistics. */ diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 0eb6591151c17342cf2c8d64ee52469d81aacb53..c883e06290403d83417db37739831942a6edb19d 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -18,11 +18,11 @@ package android.net; import static android.os.Process.CLAT_UID; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; -import android.util.Slog; import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; @@ -36,6 +36,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Objects; +import java.util.function.Predicate; /** * Collection of active network statistics. Can contain summary details across @@ -994,23 +995,33 @@ public class NetworkStats implements Parcelable { if (limitUid == UID_ALL && limitTag == TAG_ALL && limitIfaces == INTERFACES_ALL) { return; } + filter(e -> (limitUid == UID_ALL || limitUid == e.uid) + && (limitTag == TAG_ALL || limitTag == e.tag) + && (limitIfaces == INTERFACES_ALL + || ArrayUtils.contains(limitIfaces, e.iface))); + } + + /** + * Only keep entries with {@link #set} value less than {@link #SET_DEBUG_START}. + * + *

This mutates the original structure in place. + */ + public void filterDebugEntries() { + filter(e -> e.set < SET_DEBUG_START); + } + private void filter(Predicate predicate) { Entry entry = new Entry(); int nextOutputEntry = 0; for (int i = 0; i < size; i++) { entry = getValues(i, entry); - final boolean matches = - (limitUid == UID_ALL || limitUid == entry.uid) - && (limitTag == TAG_ALL || limitTag == entry.tag) - && (limitIfaces == INTERFACES_ALL - || ArrayUtils.contains(limitIfaces, entry.iface)); - - if (matches) { - setValues(nextOutputEntry, entry); + if (predicate.test(entry)) { + if (nextOutputEntry != i) { + setValues(nextOutputEntry, entry); + } nextOutputEntry++; } } - size = nextOutputEntry; } @@ -1176,133 +1187,221 @@ public class NetworkStats implements Parcelable { /** * VPN accounting. Move some VPN's underlying traffic to other UIDs that use tun0 iface. * - * This method should only be called on delta NetworkStats. Do not call this method on a - * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may - * change over time. - * - * This method performs adjustments for one active VPN package and one VPN iface at a time. + *

This method should only be called on delta NetworkStats. Do not call this method on a + * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may change + * over time. * - * It is possible for the VPN software to use multiple underlying networks. This method - * only migrates traffic for the primary underlying network. + *

This method performs adjustments for one active VPN package and one VPN iface at a time. * * @param tunUid uid of the VPN application * @param tunIface iface of the vpn tunnel - * @param underlyingIface the primary underlying network iface used by the VPN application - * @return true if it successfully adjusts the accounting for VPN, false otherwise + * @param underlyingIfaces underlying network ifaces used by the VPN application */ - public boolean migrateTun(int tunUid, String tunIface, String underlyingIface) { - Entry tunIfaceTotal = new Entry(); - Entry underlyingIfaceTotal = new Entry(); + public void migrateTun(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces) { + // Combined usage by all apps using VPN. + final Entry tunIfaceTotal = new Entry(); + // Usage by VPN, grouped by its {@code underlyingIfaces}. + final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length]; + // Usage by VPN, summed across all its {@code underlyingIfaces}. + final Entry underlyingIfacesTotal = new Entry(); + + for (int i = 0; i < perInterfaceTotal.length; i++) { + perInterfaceTotal[i] = new Entry(); + } - tunAdjustmentInit(tunUid, tunIface, underlyingIface, tunIfaceTotal, underlyingIfaceTotal); + tunAdjustmentInit(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, perInterfaceTotal, + underlyingIfacesTotal); - // If tunIface < underlyingIface, it leaves the overhead traffic in the VPN app. - // If tunIface > underlyingIface, the VPN app doesn't get credit for data compression. + // If tunIface < underlyingIfacesTotal, it leaves the overhead traffic in the VPN app. + // If tunIface > underlyingIfacesTotal, the VPN app doesn't get credit for data compression. // Negative stats should be avoided. - Entry pool = tunGetPool(tunIfaceTotal, underlyingIfaceTotal); - if (pool.isEmpty()) { - return true; - } - Entry moved = - addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); - deductTrafficFromVpnApp(tunUid, underlyingIface, moved); - - if (!moved.isEmpty()) { - Slog.wtf(TAG, "Failed to deduct underlying network traffic from VPN package. Moved=" - + moved); - return false; - } - return true; + final Entry[] moved = + addTrafficToApplications(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, + perInterfaceTotal, underlyingIfacesTotal); + deductTrafficFromVpnApp(tunUid, underlyingIfaces, moved); } /** * Initializes the data used by the migrateTun() method. * - * This is the first pass iteration which does the following work: - * (1) Adds up all the traffic through the tunUid's underlyingIface - * (both foreground and background). - * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. + *

This is the first pass iteration which does the following work: + * + *

    + *
  • Adds up all the traffic through the tunUid's underlyingIfaces (both foreground and + * background). + *
  • Adds up all the traffic through tun0 excluding traffic from the vpn app itself. + *
+ * + * @param tunUid uid of the VPN application + * @param tunIface iface of the vpn tunnel + * @param underlyingIfaces underlying network ifaces used by the VPN application + * @param tunIfaceTotal output parameter; combined data usage by all apps using VPN + * @param perInterfaceTotal output parameter; data usage by VPN app, grouped by its {@code + * underlyingIfaces} + * @param underlyingIfacesTotal output parameter; data usage by VPN, summed across all of its + * {@code underlyingIfaces} */ - private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, - Entry tunIfaceTotal, Entry underlyingIfaceTotal) { - Entry recycle = new Entry(); + private void tunAdjustmentInit(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { + final Entry recycle = new Entry(); for (int i = 0; i < size; i++) { getValues(i, recycle); if (recycle.uid == UID_ALL) { throw new IllegalStateException( "Cannot adjust VPN accounting on an iface aggregated NetworkStats."); - } if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { + } + if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { throw new IllegalStateException( "Cannot adjust VPN accounting on a NetworkStats containing SET_DBG_VPN_*"); } - - if (recycle.uid == tunUid && recycle.tag == TAG_NONE - && Objects.equals(underlyingIface, recycle.iface)) { - underlyingIfaceTotal.add(recycle); + if (recycle.tag != TAG_NONE) { + // TODO(b/123666283): Take all tags for tunUid into account. + continue; } - if (recycle.uid != tunUid && recycle.tag == TAG_NONE - && Objects.equals(tunIface, recycle.iface)) { + if (recycle.uid == tunUid) { + // Add up traffic through tunUid's underlying interfaces. + for (int j = 0; j < underlyingIfaces.length; j++) { + if (Objects.equals(underlyingIfaces[j], recycle.iface)) { + perInterfaceTotal[j].add(recycle); + underlyingIfacesTotal.add(recycle); + break; + } + } + } else if (tunIface.equals(recycle.iface)) { // Add up all tunIface traffic excluding traffic from the vpn app itself. tunIfaceTotal.add(recycle); } } } - private static Entry tunGetPool(Entry tunIfaceTotal, Entry underlyingIfaceTotal) { - Entry pool = new Entry(); - pool.rxBytes = Math.min(tunIfaceTotal.rxBytes, underlyingIfaceTotal.rxBytes); - pool.rxPackets = Math.min(tunIfaceTotal.rxPackets, underlyingIfaceTotal.rxPackets); - pool.txBytes = Math.min(tunIfaceTotal.txBytes, underlyingIfaceTotal.txBytes); - pool.txPackets = Math.min(tunIfaceTotal.txPackets, underlyingIfaceTotal.txPackets); - pool.operations = Math.min(tunIfaceTotal.operations, underlyingIfaceTotal.operations); - return pool; - } + /** + * Distributes traffic across apps that are using given {@code tunIface}, and returns the total + * traffic that should be moved off of {@code tunUid} grouped by {@code underlyingIfaces}. + * + * @param tunUid uid of the VPN application + * @param tunIface iface of the vpn tunnel + * @param underlyingIfaces underlying network ifaces used by the VPN application + * @param tunIfaceTotal combined data usage across all apps using {@code tunIface} + * @param perInterfaceTotal data usage by VPN app, grouped by its {@code underlyingIfaces} + * @param underlyingIfacesTotal data usage by VPN, summed across all of its {@code + * underlyingIfaces} + */ + private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { + // Traffic that should be moved off of each underlying interface for tunUid (see + // deductTrafficFromVpnApp below). + final Entry[] moved = new Entry[underlyingIfaces.length]; + for (int i = 0; i < underlyingIfaces.length; i++) { + moved[i] = new Entry(); + } - private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, - Entry tunIfaceTotal, Entry pool) { - Entry moved = new Entry(); - Entry tmpEntry = new Entry(); - tmpEntry.iface = underlyingIface; - for (int i = 0; i < size; i++) { - // the vpn app is excluded from the redistribution but all moved traffic will be - // deducted from the vpn app (see deductTrafficFromVpnApp below). - if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { - if (tunIfaceTotal.rxBytes > 0) { - tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; - } else { - tmpEntry.rxBytes = 0; + final Entry tmpEntry = new Entry(); + final int origSize = size; + for (int i = 0; i < origSize; i++) { + if (!Objects.equals(iface[i], tunIface)) { + // Consider only entries that go onto the VPN interface. + continue; + } + if (uid[i] == tunUid) { + // Exclude VPN app from the redistribution, as it can choose to create packet + // streams by writing to itself. + continue; + } + tmpEntry.uid = uid[i]; + tmpEntry.tag = tag[i]; + tmpEntry.metered = metered[i]; + tmpEntry.roaming = roaming[i]; + tmpEntry.defaultNetwork = defaultNetwork[i]; + + // In a first pass, compute this entry's total share of data across all + // underlyingIfaces. This is computed on the basis of the share of this entry's usage + // over tunIface. + // TODO: Consider refactoring first pass into a separate helper method. + long totalRxBytes = 0; + if (tunIfaceTotal.rxBytes > 0) { + // Note - The multiplication below should not overflow since NetworkStatsService + // processes this every time device has transmitted/received amount equivalent to + // global threshold alert (~ 2MB) across all interfaces. + final long rxBytesAcrossUnderlyingIfaces = + underlyingIfacesTotal.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; + // app must not be blamed for more than it consumed on tunIface + totalRxBytes = Math.min(rxBytes[i], rxBytesAcrossUnderlyingIfaces); + } + long totalRxPackets = 0; + if (tunIfaceTotal.rxPackets > 0) { + final long rxPacketsAcrossUnderlyingIfaces = + underlyingIfacesTotal.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; + totalRxPackets = Math.min(rxPackets[i], rxPacketsAcrossUnderlyingIfaces); + } + long totalTxBytes = 0; + if (tunIfaceTotal.txBytes > 0) { + final long txBytesAcrossUnderlyingIfaces = + underlyingIfacesTotal.txBytes * txBytes[i] / tunIfaceTotal.txBytes; + totalTxBytes = Math.min(txBytes[i], txBytesAcrossUnderlyingIfaces); + } + long totalTxPackets = 0; + if (tunIfaceTotal.txPackets > 0) { + final long txPacketsAcrossUnderlyingIfaces = + underlyingIfacesTotal.txPackets * txPackets[i] / tunIfaceTotal.txPackets; + totalTxPackets = Math.min(txPackets[i], txPacketsAcrossUnderlyingIfaces); + } + long totalOperations = 0; + if (tunIfaceTotal.operations > 0) { + final long operationsAcrossUnderlyingIfaces = + underlyingIfacesTotal.operations * operations[i] / tunIfaceTotal.operations; + totalOperations = Math.min(operations[i], operationsAcrossUnderlyingIfaces); + } + // In a second pass, distribute these values across interfaces in the proportion that + // each interface represents of the total traffic of the underlying interfaces. + for (int j = 0; j < underlyingIfaces.length; j++) { + tmpEntry.iface = underlyingIfaces[j]; + tmpEntry.rxBytes = 0; + // Reset 'set' to correct value since it gets updated when adding debug info below. + tmpEntry.set = set[i]; + if (underlyingIfacesTotal.rxBytes > 0) { + tmpEntry.rxBytes = + totalRxBytes + * perInterfaceTotal[j].rxBytes + / underlyingIfacesTotal.rxBytes; } - if (tunIfaceTotal.rxPackets > 0) { - tmpEntry.rxPackets = pool.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; - } else { - tmpEntry.rxPackets = 0; + tmpEntry.rxPackets = 0; + if (underlyingIfacesTotal.rxPackets > 0) { + tmpEntry.rxPackets = + totalRxPackets + * perInterfaceTotal[j].rxPackets + / underlyingIfacesTotal.rxPackets; } - if (tunIfaceTotal.txBytes > 0) { - tmpEntry.txBytes = pool.txBytes * txBytes[i] / tunIfaceTotal.txBytes; - } else { - tmpEntry.txBytes = 0; + tmpEntry.txBytes = 0; + if (underlyingIfacesTotal.txBytes > 0) { + tmpEntry.txBytes = + totalTxBytes + * perInterfaceTotal[j].txBytes + / underlyingIfacesTotal.txBytes; } - if (tunIfaceTotal.txPackets > 0) { - tmpEntry.txPackets = pool.txPackets * txPackets[i] / tunIfaceTotal.txPackets; - } else { - tmpEntry.txPackets = 0; + tmpEntry.txPackets = 0; + if (underlyingIfacesTotal.txPackets > 0) { + tmpEntry.txPackets = + totalTxPackets + * perInterfaceTotal[j].txPackets + / underlyingIfacesTotal.txPackets; } - if (tunIfaceTotal.operations > 0) { + tmpEntry.operations = 0; + if (underlyingIfacesTotal.operations > 0) { tmpEntry.operations = - pool.operations * operations[i] / tunIfaceTotal.operations; - } else { - tmpEntry.operations = 0; + totalOperations + * perInterfaceTotal[j].operations + / underlyingIfacesTotal.operations; } - tmpEntry.uid = uid[i]; - tmpEntry.tag = tag[i]; - tmpEntry.set = set[i]; - tmpEntry.metered = metered[i]; - tmpEntry.roaming = roaming[i]; - tmpEntry.defaultNetwork = defaultNetwork[i]; + // tmpEntry now contains the migrated data of the i-th entry for the j-th underlying + // interface. Add that data usage to this object. combineValues(tmpEntry); if (tag[i] == TAG_NONE) { - moved.add(tmpEntry); + // Add the migrated data to moved so it is deducted from the VPN app later. + moved[j].add(tmpEntry); // Add debug info tmpEntry.set = SET_DBG_VPN_IN; combineValues(tmpEntry); @@ -1312,38 +1411,45 @@ public class NetworkStats implements Parcelable { return moved; } - private void deductTrafficFromVpnApp(int tunUid, String underlyingIface, Entry moved) { - // Add debug info - moved.uid = tunUid; - moved.set = SET_DBG_VPN_OUT; - moved.tag = TAG_NONE; - moved.iface = underlyingIface; - moved.metered = METERED_ALL; - moved.roaming = ROAMING_ALL; - moved.defaultNetwork = DEFAULT_NETWORK_ALL; - combineValues(moved); - - // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than - // the TAG_NONE traffic. - // - // Relies on the fact that the underlying traffic only has state ROAMING_NO and METERED_NO, - // which should be the case as it comes directly from the /proc file. We only blend in the - // roaming data after applying these adjustments, by checking the NetworkIdentity of the - // underlying iface. - int idxVpnBackground = findIndex(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnBackground != -1) { - tunSubtract(idxVpnBackground, this, moved); - } + private void deductTrafficFromVpnApp( + int tunUid, + @NonNull String[] underlyingIfaces, + @NonNull Entry[] moved) { + for (int i = 0; i < underlyingIfaces.length; i++) { + moved[i].uid = tunUid; + // Add debug info + moved[i].set = SET_DBG_VPN_OUT; + moved[i].tag = TAG_NONE; + moved[i].iface = underlyingIfaces[i]; + moved[i].metered = METERED_ALL; + moved[i].roaming = ROAMING_ALL; + moved[i].defaultNetwork = DEFAULT_NETWORK_ALL; + combineValues(moved[i]); + + // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than + // the TAG_NONE traffic. + // + // Relies on the fact that the underlying traffic only has state ROAMING_NO and + // METERED_NO, which should be the case as it comes directly from the /proc file. + // We only blend in the roaming data after applying these adjustments, by checking the + // NetworkIdentity of the underlying iface. + final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT, + TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnBackground != -1) { + // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed + // from foreground usage. + tunSubtract(idxVpnBackground, this, moved[i]); + } - int idxVpnForeground = findIndex(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, - METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnForeground != -1) { - tunSubtract(idxVpnForeground, this, moved); + final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND, + TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnForeground != -1) { + tunSubtract(idxVpnForeground, this, moved[i]); + } } } - private static void tunSubtract(int i, NetworkStats left, Entry right) { + private static void tunSubtract(int i, @NonNull NetworkStats left, @NonNull Entry right) { long rxBytes = Math.min(left.rxBytes[i], right.rxBytes); left.rxBytes[i] -= rxBytes; right.rxBytes -= rxBytes; diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index ae421a4991a4c046b2db12e4d8d46071aedc9084..87c7118c0ed83d4fc27679bea7f700999cbd3661 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -48,6 +48,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -481,17 +482,39 @@ public class NetworkTemplate implements Parcelable { * For example, given an incoming template matching B, and the currently * active merge set [A,B], we'd return a new template that primarily matches * A, but also matches B. + * TODO: remove and use {@link #normalize(NetworkTemplate, List)}. */ @UnsupportedAppUsage public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) { - if (template.isMatchRuleMobile() && ArrayUtils.contains(merged, template.mSubscriberId)) { - // Requested template subscriber is part of the merge group; return - // a template that matches all merged subscribers. - return new NetworkTemplate(template.mMatchRule, merged[0], merged, - template.mNetworkId); - } else { - return template; + return normalize(template, Arrays.asList(merged)); + } + + /** + * Examine the given template and normalize if it refers to a "merged" + * mobile subscriber. We pick the "lowest" merged subscriber as the primary + * for key purposes, and expand the template to match all other merged + * subscribers. + * + * There can be multiple merged subscriberIds for multi-SIM devices. + * + *

+ * For example, given an incoming template matching B, and the currently + * active merge set [A,B], we'd return a new template that primarily matches + * A, but also matches B. + */ + public static NetworkTemplate normalize(NetworkTemplate template, List mergedList) { + if (!template.isMatchRuleMobile()) return template; + + for (String[] merged : mergedList) { + if (ArrayUtils.contains(merged, template.mSubscriberId)) { + // Requested template subscriber is part of the merge group; return + // a template that matches all merged subscribers. + return new NetworkTemplate(template.mMatchRule, merged[0], merged, + template.mNetworkId); + } } + + return template; } @UnsupportedAppUsage diff --git a/core/java/android/net/util/MultinetworkPolicyTracker.java b/core/java/android/net/util/MultinetworkPolicyTracker.java index 30c5cd98b71977f32c5ab2936d852be35dcfbc06..f7e494d830ace9c2c65e4f3ce26562f6c988c98b 100644 --- a/core/java/android/net/util/MultinetworkPolicyTracker.java +++ b/core/java/android/net/util/MultinetworkPolicyTracker.java @@ -16,28 +16,31 @@ package android.net.util; +import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI; +import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE; + +import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Resources; import android.database.ContentObserver; -import android.net.ConnectivityManager; import android.net.Uri; import android.os.Handler; -import android.os.Message; import android.os.UserHandle; import android.provider.Settings; +import android.telephony.PhoneStateListener; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.util.Slog; -import java.util.Arrays; -import java.util.List; - -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; -import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI; -import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE; +import java.util.Arrays; +import java.util.List; /** * A class to encapsulate management of the "Smart Networking" capability of @@ -69,6 +72,7 @@ public class MultinetworkPolicyTracker { private volatile boolean mAvoidBadWifi = true; private volatile int mMeteredMultipathPreference; + private int mActiveSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; public MultinetworkPolicyTracker(Context ctx, Handler handler) { this(ctx, handler, null); @@ -95,6 +99,14 @@ public class MultinetworkPolicyTracker { } }; + TelephonyManager.from(ctx).listen(new PhoneStateListener() { + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + mActiveSubId = subId; + reevaluate(); + } + }, PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); + updateAvoidBadWifi(); updateMeteredMultipathPreference(); } @@ -131,7 +143,12 @@ public class MultinetworkPolicyTracker { * Whether the device or carrier configuration disables avoiding bad wifi by default. */ public boolean configRestrictsAvoidBadWifi() { - return (mContext.getResources().getInteger(R.integer.config_networkAvoidBadWifi) == 0); + return (getResourcesForActiveSubId().getInteger(R.integer.config_networkAvoidBadWifi) == 0); + } + + @NonNull + private Resources getResourcesForActiveSubId() { + return SubscriptionManager.getResourcesForSubId(mContext, mActiveSubId); } /** diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 00d522bae27f34bb9299dcc720aeada4a29bd5be..ecd16dd1f612d3fdbcaec789009dde62b7eabfd2 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -266,8 +266,11 @@ public abstract class BatteryStats implements Parcelable { * - Fixed bug in min learned capacity updating process. * New in version 34: * - Deprecated STATS_SINCE_UNPLUGGED and STATS_CURRENT. + * New in version 35: + * - Fixed bug that was not reporting high cellular tx power correctly + * - Added out of service and emergency service modes to data connection types */ - static final int CHECKIN_VERSION = 34; + static final int CHECKIN_VERSION = 35; /** * Old version, we hit 9 and ran out of room, need to remove. @@ -2371,18 +2374,21 @@ public abstract class BatteryStats implements Parcelable { */ public abstract int getMobileRadioActiveUnknownCount(int which); - public static final int DATA_CONNECTION_NONE = 0; - public static final int DATA_CONNECTION_OTHER = TelephonyManager.MAX_NETWORK_TYPE + 1; + public static final int DATA_CONNECTION_OUT_OF_SERVICE = 0; + public static final int DATA_CONNECTION_EMERGENCY_SERVICE = + TelephonyManager.MAX_NETWORK_TYPE + 1; + public static final int DATA_CONNECTION_OTHER = DATA_CONNECTION_EMERGENCY_SERVICE + 1; + static final String[] DATA_CONNECTION_NAMES = { - "none", "gprs", "edge", "umts", "cdma", "evdo_0", "evdo_A", + "oos", "gprs", "edge", "umts", "cdma", "evdo_0", "evdo_A", "1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte", "ehrpd", "hspap", "gsm", "td_scdma", "iwlan", "lte_ca", "nr", - "other" + "emngcy", "other" }; @UnsupportedAppUsage - public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1; + public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER + 1; /** * Returns the time in microseconds that the phone has been running with @@ -6564,6 +6570,10 @@ public abstract class BatteryStats implements Parcelable { } oldState = rec.states; oldState2 = rec.states2; + // Clear High Tx Power Flag for volta positioning + if ((rec.states2 & HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG) != 0) { + rec.states2 &= ~HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG; + } } return item.toString(); @@ -7865,9 +7875,9 @@ public abstract class BatteryStats implements Parcelable { // Phone data connection (DATA_CONNECTION_TIME_DATA and DATA_CONNECTION_COUNT_DATA) for (int i = 0; i < NUM_DATA_CONNECTION_TYPES; ++i) { // Map OTHER to TelephonyManager.NETWORK_TYPE_UNKNOWN and mark NONE as a boolean. - boolean isNone = (i == DATA_CONNECTION_NONE); + boolean isNone = (i == DATA_CONNECTION_OUT_OF_SERVICE); int telephonyNetworkType = i; - if (i == DATA_CONNECTION_OTHER) { + if (i == DATA_CONNECTION_OTHER || i == DATA_CONNECTION_EMERGENCY_SERVICE) { telephonyNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; } final long pdcToken = proto.start(SystemProto.DATA_CONNECTION); diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index ce1942cc6d916d71ddcb21416b6f591a95d47d94..7a70e93b69d546d870cd79ccd23a91de6a8b2966 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -67,6 +67,8 @@ public class GraphicsEnvironment { private static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1"; private static final String PROPERTY_GFX_DRIVER_BUILD_TIME = "ro.gfx.driver_build_time"; private static final String METADATA_DRIVER_BUILD_TIME = "com.android.gamedriver.build_time"; + private static final String METADATA_DEVELOPER_DRIVER_ENABLE = + "com.android.graphics.developerdriver.enable"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private static final String ANGLE_TEMP_RULES = "debug.angle.rules"; private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID"; @@ -691,7 +693,8 @@ public class GraphicsEnvironment { /** * Return the driver package name to use. Return null for system driver. */ - private static String chooseDriverInternal(Context context, Bundle coreSettings) { + private static String chooseDriverInternal( + Context context, Bundle coreSettings, PackageManager pm, String packageName) { final String gameDriver = SystemProperties.get(PROPERTY_GFX_DRIVER); final boolean hasGameDriver = gameDriver != null && !gameDriver.isEmpty(); @@ -706,12 +709,24 @@ public class GraphicsEnvironment { // To minimize risk of driver updates crippling the device beyond user repair, never use an // updated driver for privileged or non-updated system apps. Presumably pre-installed apps // were tested thoroughly with the pre-installed driver. - final ApplicationInfo ai = context.getApplicationInfo(); + ApplicationInfo ai; + try { + // Get the ApplicationInfo from PackageManager so that metadata fields present. + ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + // Unlikely to fail for applications, but in case of failure, fall back to use the + // ApplicationInfo from context directly. + ai = context.getApplicationInfo(); + } if (ai.isPrivilegedApp() || (ai.isSystemApp() && !ai.isUpdatedSystemApp())) { if (DEBUG) Log.v(TAG, "Ignoring driver package for privileged/non-updated system app."); return null; } + final boolean enablePrereleaseDriver = + (ai.metaData != null && ai.metaData.getBoolean(METADATA_DEVELOPER_DRIVER_ENABLE)) + || getCanLoadSystemLibraries() == 1; + // Priority for Game Driver settings global on confliction (Higher priority comes first): // 1. GAME_DRIVER_ALL_APPS // 2. GAME_DRIVER_OPT_OUT_APPS @@ -728,7 +743,7 @@ public class GraphicsEnvironment { return hasGameDriver ? gameDriver : null; case GAME_DRIVER_GLOBAL_OPT_IN_PRERELEASE_DRIVER: if (DEBUG) Log.v(TAG, "All apps opt in to use prerelease driver."); - return hasPrereleaseDriver ? prereleaseDriver : null; + return hasPrereleaseDriver && enablePrereleaseDriver ? prereleaseDriver : null; case GAME_DRIVER_GLOBAL_OPT_IN_DEFAULT: default: break; @@ -745,7 +760,7 @@ public class GraphicsEnvironment { null, coreSettings, Settings.Global.GAME_DRIVER_PRERELEASE_OPT_IN_APPS) .contains(appPackageName)) { if (DEBUG) Log.v(TAG, "App opts in for prerelease Game Driver."); - return hasPrereleaseDriver ? prereleaseDriver : null; + return hasPrereleaseDriver && enablePrereleaseDriver ? prereleaseDriver : null; } // Early return here since the rest logic is only for Game Driver. @@ -783,7 +798,8 @@ public class GraphicsEnvironment { */ private static boolean chooseDriver( Context context, Bundle coreSettings, PackageManager pm, String packageName) { - final String driverPackageName = chooseDriverInternal(context, coreSettings); + final String driverPackageName = chooseDriverInternal(context, coreSettings, pm, + packageName); if (driverPackageName == null) { return false; } diff --git a/core/java/android/os/IVibratorService.aidl b/core/java/android/os/IVibratorService.aidl index e8b3ca6cb7ae369063e25f5aa811c92c9b6037fd..1456ff7e6c5e880d0fd8a692c8e644c4f1b4c6d4 100644 --- a/core/java/android/os/IVibratorService.aidl +++ b/core/java/android/os/IVibratorService.aidl @@ -16,6 +16,7 @@ package android.os; +import android.media.AudioAttributes; import android.os.VibrationEffect; /** {@hide} */ @@ -23,8 +24,8 @@ interface IVibratorService { boolean hasVibrator(); boolean hasAmplitudeControl(); - void vibrate(int uid, String opPkg, in VibrationEffect effect, int usageHint, String reason, - IBinder token); + void vibrate(int uid, String opPkg, in VibrationEffect effect, in AudioAttributes attributes, + String reason, IBinder token); void cancelVibrate(IBinder token); } diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 53298d8d8aed8f7a7ab09b790899d930c8c781d7..48fc2a6bf449ab7b8be71af35d9cd40a10b94603 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -31,6 +31,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.provider.Settings; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; import android.text.format.DateFormat; @@ -56,10 +58,12 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; @@ -87,11 +91,14 @@ public class RecoverySystem { private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500; private static final long DEFAULT_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 30000L; // 30 s - private static final long MIN_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 5000L; // 5 s - private static final long MAX_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 60000L; // 60 s + private static final long DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + 45000L; // 45 s + private static final long MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 15000L; // 15 s + private static final long MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 90000L; // 90 s + /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); @@ -99,9 +106,14 @@ public class RecoverySystem { private static final String LAST_PREFIX = "last_"; private static final String ACTION_EUICC_FACTORY_RESET = "com.android.internal.action.EUICC_FACTORY_RESET"; + private static final String ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS = + "com.android.internal.action.EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS"; - /** used in {@link #wipeEuiccData} as package name of callback intent */ - private static final String PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK = "android"; + /** + * Used in {@link #wipeEuiccData} & {@link #removeEuiccInvisibleSubs} as package name of + * callback intent. + */ + private static final String PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK = "android"; /** * The recovery image uses this file to identify the location (i.e. blocks) @@ -754,8 +766,11 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); + EuiccManager euiccManager = context.getSystemService(EuiccManager.class); if (wipeEuicc) { - wipeEuiccData(context, PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK); + wipeEuiccData(context, PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + } else { + removeEuiccInvisibleSubs(context, euiccManager); } String shutdownArg = null; @@ -851,6 +866,110 @@ public class RecoverySystem { return false; } + private static void removeEuiccInvisibleSubs( + Context context, EuiccManager euiccManager) { + ContentResolver cr = context.getContentResolver(); + if (Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) == 0) { + // If the eUICC isn't provisioned, there's no need to remove euicc invisible profiles, + // as there's nothing to be removed. + Log.i(TAG, "Skip removing eUICC invisible profiles as it is not provisioned."); + return; + } else if (euiccManager == null || !euiccManager.isEnabled()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as eUICC manager is not available."); + return; + } + SubscriptionManager subscriptionManager = + context.getSystemService(SubscriptionManager.class); + List availableSubs = + subscriptionManager.getAvailableSubscriptionInfoList(); + if (availableSubs == null || availableSubs.isEmpty()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as no available profiles found."); + return; + } + List invisibleSubs = new ArrayList<>(); + for (SubscriptionInfo sub : availableSubs) { + if (sub.isEmbedded() && !subscriptionManager.isSubscriptionVisible(sub)) { + invisibleSubs.add(sub); + } + } + removeEuiccInvisibleSubs(context, invisibleSubs, euiccManager); + } + + private static boolean removeEuiccInvisibleSubs( + Context context, List subscriptionInfos, EuiccManager euiccManager) { + if (subscriptionInfos == null || subscriptionInfos.isEmpty()) { + Log.i(TAG, "There are no eUICC invisible profiles needed to be removed."); + return true; + } + CountDownLatch removeSubsLatch = new CountDownLatch(subscriptionInfos.size()); + final AtomicInteger removedSubsCount = new AtomicInteger(0); + + BroadcastReceiver removeEuiccSubsReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS.equals(intent.getAction())) { + if (getResultCode() != EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) { + int detailedCode = intent.getIntExtra( + EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0); + Log.e(TAG, "Error removing euicc opportunistic profile, Detailed code = " + + detailedCode); + } else { + Log.e(TAG, "Successfully remove euicc opportunistic profile."); + removedSubsCount.incrementAndGet(); + } + removeSubsLatch.countDown(); + } + } + }; + + Intent intent = new Intent(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + intent.setPackage(PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + PendingIntent callbackIntent = PendingIntent.getBroadcastAsUser( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT, UserHandle.SYSTEM); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + HandlerThread euiccHandlerThread = + new HandlerThread("euiccRemovingSubsReceiverThread"); + euiccHandlerThread.start(); + Handler euiccHandler = new Handler(euiccHandlerThread.getLooper()); + context.getApplicationContext() + .registerReceiver( + removeEuiccSubsReceiver, intentFilter, null, euiccHandler); + for (SubscriptionInfo subscriptionInfo : subscriptionInfos) { + Log.i( + TAG, + "Remove invisible subscription " + subscriptionInfo.getSubscriptionId() + + " from card " + subscriptionInfo.getCardId()); + euiccManager.createForCardId(subscriptionInfo.getCardId()) + .deleteSubscription(subscriptionInfo.getSubscriptionId(), callbackIntent); + } + try { + long waitingTimeMillis = Settings.Global.getLong( + context.getContentResolver(), + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, + DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS); + if (waitingTimeMillis < MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } else if (waitingTimeMillis > MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } + if (!removeSubsLatch.await(waitingTimeMillis, TimeUnit.MILLISECONDS)) { + Log.e(TAG, "Timeout removing invisible euicc profiles."); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + Log.e(TAG, "Removing invisible euicc profiles interrupted", e); + return false; + } finally { + context.getApplicationContext().unregisterReceiver(removeEuiccSubsReceiver); + if (euiccHandlerThread != null) { + euiccHandlerThread.quit(); + } + } + return removedSubsCount.get() == subscriptionInfos.size(); + } + /** {@hide} */ public static void rebootPromptAndWipeUserData(Context context, String reason) throws IOException { diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java index 4af514abfd69d25351d040b7bd26457ac8cbaac9..a5188e7cd58d08b32a6e465fd9f380aeec936d4f 100644 --- a/core/java/android/os/SystemVibrator.java +++ b/core/java/android/os/SystemVibrator.java @@ -77,16 +77,12 @@ public class SystemVibrator extends Vibrator { return; } try { - mService.vibrate(uid, opPkg, effect, usageForAttributes(attributes), reason, mToken); + mService.vibrate(uid, opPkg, effect, attributes, reason, mToken); } catch (RemoteException e) { Log.w(TAG, "Failed to vibrate.", e); } } - private static int usageForAttributes(AudioAttributes attributes) { - return attributes != null ? attributes.getUsage() : AudioAttributes.USAGE_UNKNOWN; - } - @Override public void cancel() { if (mService == null) { diff --git a/core/java/android/os/VibrationEffect.java b/core/java/android/os/VibrationEffect.java index 702b41beb0710cc1e6ac3f1ebf10fa7d698b8586..26da0a0aee0745462fce300e849e952b7cfbce1b 100644 --- a/core/java/android/os/VibrationEffect.java +++ b/core/java/android/os/VibrationEffect.java @@ -53,7 +53,7 @@ public abstract class VibrationEffect implements Parcelable { public static final int MAX_AMPLITUDE = 255; /** - * A click effect. + * A click effect. Use this effect as a baseline, as it's the most common type of click effect. * * @see #get(int) */ @@ -67,7 +67,7 @@ public abstract class VibrationEffect implements Parcelable { public static final int EFFECT_DOUBLE_CLICK = Effect.DOUBLE_CLICK; /** - * A tick effect. + * A tick effect. This effect is less strong compared to {@link #EFFECT_CLICK}. * @see #get(int) */ public static final int EFFECT_TICK = Effect.TICK; @@ -89,7 +89,7 @@ public abstract class VibrationEffect implements Parcelable { public static final int EFFECT_POP = Effect.POP; /** - * A heavy click effect. + * A heavy click effect. This effect is stronger than {@link #EFFECT_CLICK}. * @see #get(int) */ public static final int EFFECT_HEAVY_CLICK = Effect.HEAVY_CLICK; diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index 182a2ffa5221629d3ce56c650a1e91e07fbc2376..2934c5dff858e82d012aa4647c5709def8cd67cb 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -25,14 +25,15 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; import android.content.pm.IPackageManager; +import android.content.pm.permission.SplitPermissionInfoParcelable; import android.os.RemoteException; +import android.util.Log; import com.android.internal.annotations.Immutable; -import com.android.server.SystemConfig; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Objects; /** * System level service for accessing the permission capabilities of the platform. @@ -43,18 +44,14 @@ import java.util.Objects; @SystemApi @SystemService(Context.PERMISSION_SERVICE) public final class PermissionManager { - /** - * {@link android.content.pm.PackageParser} needs access without having a {@link Context}. - * - * @hide - */ - public static final ArrayList SPLIT_PERMISSIONS = - SystemConfig.getInstance().getSplitPermissions(); + private static final String TAG = PermissionManager.class.getName(); private final @NonNull Context mContext; private final IPackageManager mPackageManager; + private List mSplitPermissionInfos; + /** * Creates a new instance. * @@ -122,7 +119,48 @@ public final class PermissionManager { * @return All permissions that are split. */ public @NonNull List getSplitPermissions() { - return SPLIT_PERMISSIONS; + if (mSplitPermissionInfos != null) { + return mSplitPermissionInfos; + } + + List parcelableList; + try { + parcelableList = mPackageManager.getSplitPermissions(); + } catch (RemoteException e) { + Log.w(TAG, "Error getting split permissions", e); + return Collections.emptyList(); + } + + mSplitPermissionInfos = splitPermissionInfoListToNonParcelableList(parcelableList); + + return mSplitPermissionInfos; + } + + private List splitPermissionInfoListToNonParcelableList( + List parcelableList) { + final int size = parcelableList.size(); + List list = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + list.add(new SplitPermissionInfo(parcelableList.get(i))); + } + return list; + } + + /** + * Converts a {@link List} of {@link SplitPermissionInfo} into a List of + * {@link SplitPermissionInfoParcelable} and returns it. + * @hide + */ + public static List splitPermissionInfoListToParcelableList( + List splitPermissionsList) { + final int size = splitPermissionsList.size(); + List outList = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + SplitPermissionInfo info = splitPermissionsList.get(i); + outList.add(new SplitPermissionInfoParcelable( + info.getSplitPermission(), info.getNewPermissions(), info.getTargetSdk())); + } + return outList; } /** @@ -131,44 +169,40 @@ public final class PermissionManager { */ @Immutable public static final class SplitPermissionInfo { - private final @NonNull String mSplitPerm; - private final @NonNull List mNewPerms; - private final int mTargetSdk; + private @NonNull final SplitPermissionInfoParcelable mSplitPermissionInfoParcelable; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SplitPermissionInfo that = (SplitPermissionInfo) o; - return mTargetSdk == that.mTargetSdk - && mSplitPerm.equals(that.mSplitPerm) - && mNewPerms.equals(that.mNewPerms); + return mSplitPermissionInfoParcelable.equals(that.mSplitPermissionInfoParcelable); } @Override public int hashCode() { - return Objects.hash(mSplitPerm, mNewPerms, mTargetSdk); + return mSplitPermissionInfoParcelable.hashCode(); } /** * Get the permission that is split. */ public @NonNull String getSplitPermission() { - return mSplitPerm; + return mSplitPermissionInfoParcelable.getSplitPermission(); } /** * Get the permissions that are added. */ public @NonNull List getNewPermissions() { - return mNewPerms; + return mSplitPermissionInfoParcelable.getNewPermissions(); } /** * Get the target API level when the permission was split. */ public int getTargetSdk() { - return mTargetSdk; + return mSplitPermissionInfoParcelable.getTargetSdk(); } /** @@ -182,9 +216,11 @@ public final class PermissionManager { */ public SplitPermissionInfo(@NonNull String splitPerm, @NonNull List newPerms, int targetSdk) { - mSplitPerm = splitPerm; - mNewPerms = newPerms; - mTargetSdk = targetSdk; + this(new SplitPermissionInfoParcelable(splitPerm, newPerms, targetSdk)); + } + + private SplitPermissionInfo(@NonNull SplitPermissionInfoParcelable parcelable) { + mSplitPermissionInfoParcelable = parcelable; } } } diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index ea4eba26b12ac767c50ecc0c6eb81e9715654cfb..8290eee20189f1d807a0b25aa9fa97625af1411d 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -870,8 +870,8 @@ public final class ContactsContract { protected interface ContactOptionsColumns { /** * The number of times a contact has been contacted. - *

Caution: As of January 7, 2019, this field is obsolete. For - * more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the * Contacts Provider * page.

*

Type: INTEGER

@@ -885,8 +885,8 @@ public final class ContactsContract { /** * The last time a contact was contacted. - *

Caution: As of January 7, 2019, this field is obsolete. For - * more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the * Contacts Provider * page.

*

Type: INTEGER

@@ -1694,10 +1694,10 @@ public final class ContactsContract { * TIMES_CONTACTED field is incremented by 1 and the LAST_TIME_CONTACTED * field is populated with the current system time. * - *

Caution: As of January 7, 2019, this method is obsolete. For - * more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the * Contacts Provider - * page. + * page.

* * @param resolver the ContentResolver to use * @param contactId the person who was contacted @@ -1733,8 +1733,8 @@ public final class ContactsContract { * Frequent contacts are no longer included in the result as of * Android version {@link android.os.Build.VERSION_CODES#Q}. * - *

Caution: As of January 7, 2019, this field no longer sorts - * results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, this + * field doesn't sort results based on contacts frequency. For more information, see the * Contacts Provider * page. */ @@ -1748,8 +1748,8 @@ public final class ContactsContract { * Android version {@link android.os.Build.VERSION_CODES#Q}. * This URI always returns an empty cursor. * - *

Caution: As of January 7, 2019, this field no longer sorts - * results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, this + * field doesn't sort results based on contacts frequency. For more information, see the * Contacts Provider * page. */ @@ -1763,8 +1763,8 @@ public final class ContactsContract { * various parts of the contact name. The filter argument should be passed * as an additional path segment after this URI. * - *

Caution: As of January 7, 2019, this field no longer sorts - * results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, this + * field doesn't sort results based on contacts frequency. For more information, see the * Contacts Provider * page. */ @@ -4298,10 +4298,10 @@ public final class ContactsContract { * Android version {@link android.os.Build.VERSION_CODES#Q}. * This column always contains 0. * - *

Caution: As of January 7, 2019, this field is obsolete. - * For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the * Contacts Provider - * page. + * page.

*/ @Deprecated public static final String LAST_TIME_USED = "last_time_used"; @@ -4312,10 +4312,10 @@ public final class ContactsContract { * Android version {@link android.os.Build.VERSION_CODES#Q}. * This column always contains 0. * - *

Caution: As of January 7, 2019, this field is obsolete. - * For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the * Contacts Provider - * page. + * page.

*/ @Deprecated public static final String TIMES_USED = "times_used"; @@ -5266,8 +5266,8 @@ public final class ContactsContract { /** * The content:// style URI for this table. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, this + * field doesn't sort results based on contacts frequency. For more information, see the * Contacts Provider * page. * @@ -5284,8 +5284,8 @@ public final class ContactsContract { /** *

URI used for the "enterprise caller-id".

* - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, this + * field doesn't sort results based on contacts frequency. For more information, see the * Contacts Provider * page. * @@ -6086,8 +6086,8 @@ public final class ContactsContract { * to display names as well as phone numbers. The filter argument should be passed * as an additional path segment after this URI. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: This field deosn't sort results based on contacts + * frequency. For more information, see the * Contacts Provider * page. */ @@ -6099,8 +6099,9 @@ public final class ContactsContract { * same columns. This URI requires {@link ContactsContract#DIRECTORY_PARAM_KEY} in * parameters, otherwise it will throw IllegalArgumentException. * - *

Caution: As of January 7, 2019, this field no longer sorts - * results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field doesn't sort results based on contacts frequency. For more information, + * see the * Contacts Provider * page. */ @@ -6367,8 +6368,9 @@ public final class ContactsContract { * as an additional path segment after this URI. *

* - *

Caution: As of January 7, 2019, this field no longer sorts - * results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field doesn't sort results based on contacts frequency. For more information, + * see the * Contacts Provider * page.

* @@ -6390,8 +6392,9 @@ public final class ContactsContract { * same columns. This URI requires {@link ContactsContract#DIRECTORY_PARAM_KEY} in * parameters, otherwise it will throw IllegalArgumentException. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field doesn't sort results based on contacts frequency. For more information, + * see the * Contacts Provider * page. */ @@ -7609,8 +7612,8 @@ public final class ContactsContract { *

Similar to {@link Phone#CONTENT_FILTER_URI}, but allows users to filter callable * data. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: This field no longer sorts results based on + * contacts frequency. For more information, see the * Contacts Provider * page. */ @@ -7622,8 +7625,9 @@ public final class ContactsContract { * callable data. This URI requires {@link ContactsContract#DIRECTORY_PARAM_KEY} in * parameters, otherwise it will throw IllegalArgumentException. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field doesn't sort results based on contacts frequency. For more information, + * see the * Contacts Provider * page.

*/ @@ -7653,8 +7657,9 @@ public final class ContactsContract { *

The content:// style URI for these data items, which allows for a query parameter * to be appended onto the end to filter for data items matching the query. * - *

Caution: As of January 7, 2019, this field no longer - * sorts results based on contacts frequency. For more information, see the + *

Caution: If you publish your app to the Google Play Store, + * this field doesn't sort results based on contacts frequency. For more information, + * see the * Contacts Provider * page. */ @@ -8305,15 +8310,14 @@ public final class ContactsContract { } /** - *

Caution: As of January 7, 2019, this class is obsolete. For - * more information, see the - * Contacts Provider - * page. - *

*

* API allowing applications to send usage information for each {@link Data} row to the * Contacts Provider. Applications can also clear all usage information. *

+ *

Caution: If you publish your app to the Google Play Store, + * this field is obsolete, regardless of Android version. For more information, see the + * Contacts Provider + * page.

*

* With the feedback, Contacts Provider may return more contextually appropriate results for * Data listing, typically supplied with diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index e30ba38c127fa70347428de7c33a4c302177e730..c837b93461737d99031a05b01fd4fb0a5f8819f1 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -135,6 +135,14 @@ public final class DeviceConfig { @SystemApi public static final String NAMESPACE_DEX_BOOT = "dex_boot"; + /** + * Namespace for display manager related features. The names to access the properties in this + * namespace should be defined in {@link android.hardware.display.DisplayManager}. + * + * @hide + */ + public static final String NAMESPACE_DISPLAY_MANAGER = "display_manager"; + /** * Namespace for all Game Driver features. * @@ -336,6 +344,20 @@ public final class DeviceConfig { @TestApi String KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE = "system_gestures_excluded_by_pre_q_sticky_immersive"; + + /** + * The minimum duration between gesture exclusion logging for a given window in + * milliseconds. + * + * Events that happen in-between will be silently dropped. + * + * A non-positive value disables logging. + * + * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER + * @hide + */ + String KEY_SYSTEM_GESTURE_EXCLUSION_LOG_DEBOUNCE_MILLIS = + "system_gesture_exclusion_log_debounce_millis"; } private static final Object sLock = new Object(); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1d92644fcfda526184e33c38321876d7e89aa290..0c5cb5e2e51bf665be9a756db38a5cef11b03050 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -88,6 +88,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.MemoryIntArray; +import android.view.Display; import android.view.inputmethod.InputMethodSystemProperty; import com.android.internal.annotations.GuardedBy; @@ -3477,6 +3478,14 @@ public final class Settings { } }; + /** + * The user selected min refresh rate in frames per second. + * + * If this isn't set, 0 will be used. + * @hide + */ + public static final String MIN_REFRESH_RATE = "min_refresh_rate"; + /** * The user selected peak refresh rate in frames per second. * @@ -4075,7 +4084,7 @@ public final class Settings { * preference, this rotation value will be used. Must be one of the * {@link android.view.Surface#ROTATION_0 Surface rotation constants}. * - * @see android.view.Display#getRotation + * @see Display#getRotation */ public static final String USER_ROTATION = "user_rotation"; @@ -6347,13 +6356,15 @@ public final class Settings { "lock_screen_allow_remote_input"; /** - * Indicates which clock face to show on lock screen and AOD. + * Indicates which clock face to show on lock screen and AOD formatted as a serialized + * {@link org.json.JSONObject} with the format: + * {"clock": id, "_applied_timestamp": timestamp} * @hide */ public static final String LOCK_SCREEN_CUSTOM_CLOCK_FACE = "lock_screen_custom_clock_face"; private static final Validator LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR = - ANY_STRING_VALIDATOR; + SettingsValidators.JSON_OBJECT_VALIDATOR; /** * Indicates which clock face to show on lock screen and AOD while docked. @@ -7757,12 +7768,21 @@ public final class Settings { private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** - * Gesture that wakes up the display, showing the ambient version of the status bar. + * Gesture that wakes up the display, showing some version of the lock screen. + * @hide + */ + public static final String DOZE_WAKE_LOCK_SCREEN_GESTURE = "doze_wake_screen_gesture"; + + private static final Validator DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + + /** + * Gesture that wakes up the display, toggling between {@link Display.STATE_OFF} and + * {@link Display.STATE_DOZE}. * @hide */ - public static final String DOZE_WAKE_SCREEN_GESTURE = "doze_wake_screen_gesture"; + public static final String DOZE_WAKE_DISPLAY_GESTURE = "doze_wake_display_gesture"; - private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + private static final Validator DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** * Gesture that skips media. @@ -7778,9 +7798,29 @@ public final class Settings { */ public static final String SKIP_GESTURE_COUNT = "skip_gesture_count"; + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SKIP_TOUCH_COUNT = "skip_touch_count"; + private static final Validator SKIP_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; + /** + * Direction to advance media for skip gesture + * @hide + */ + public static final String SKIP_DIRECTION = "skip_gesture_direction"; + + /** + * Only used if FeatureFlag "settings_skip_direction_mutable" is enabled. + * If feature flag is disabled, should assume SKIP_DIRECTION = 0. + * 0 / false = right to left to advance to next + * 1 / true = left to right to advance to next + */ + private static final Validator SKIP_DIRECTION_VALIDATOR = BOOLEAN_VALIDATOR; + /** * Gesture that silences sound (alarms, notification, calls). * @hide @@ -7808,11 +7848,22 @@ public final class Settings { public static final String SILENCE_CALL_GESTURE_COUNT = "silence_call_gesture_count"; /** - * Count of successful silence notification gestures. + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_ALARMS_TOUCH_COUNT = "silence_alarms_touch_count"; + + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_TIMER_TOUCH_COUNT = "silence_timer_touch_count"; + + /** + * Count of non-gesture interaction. * @hide */ - public static final String SILENCE_NOTIFICATION_GESTURE_COUNT = - "silence_notification_gesture_count"; + public static final String SILENCE_CALL_TOUCH_COUNT = "silence_call_touch_count"; private static final Validator SILENCE_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; @@ -8275,6 +8326,16 @@ public final class Settings { private static final Validator FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR = BOOLEAN_VALIDATOR; + /** + * Whether or not media is shown automatically when bypassing as a heads up. + * @hide + */ + public static final String SHOW_MEDIA_WHEN_BYPASSING = + "show_media_when_bypassing"; + + private static final Validator SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR = + BOOLEAN_VALIDATOR; + /** * Whether or not face unlock requires attention. This is a cached value, the source of * truth is obtained through the HAL. @@ -8315,14 +8376,17 @@ public final class Settings { BOOLEAN_VALIDATOR; /** - * Whether or not the face unlock education screen has been shown to the user. + * Whether or not a user should re enroll their face. + * + * Face unlock re enroll. + * 0 = No re enrollment. + * 1 = Re enrollment is suggested. + * 2 = Re enrollment is required after a set time period. + * 3 = Re enrollment is required immediately. + * * @hide */ - public static final String FACE_UNLOCK_EDUCATION_INFO_DISPLAYED = - "face_unlock_education_info_displayed"; - - private static final Validator FACE_UNLOCK_EDUCATION_INFO_DISPLAYED_VALIDATOR = - BOOLEAN_VALIDATOR; + public static final String FACE_UNLOCK_RE_ENROLL = "face_unlock_re_enroll"; /** * Whether or not debugging is enabled. @@ -8660,10 +8724,16 @@ public final class Settings { * Whether the notification bubbles are globally enabled * The value is boolean (1 or 0). * @hide + * @deprecated use {@link Global#NOTIFICATION_BUBBLES} instead. */ @TestApi + @Deprecated public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; + /** + * @deprecated use {@link Global#NOTIFICATION_BUBBLES_VALIDATOR} instead. + */ + @Deprecated private static final Validator NOTIFICATION_BUBBLES_VALIDATOR = BOOLEAN_VALIDATOR; /** @@ -8974,10 +9044,12 @@ public final class Settings { DOZE_PICK_UP_GESTURE, DOZE_DOUBLE_TAP_GESTURE, DOZE_TAP_SCREEN_GESTURE, - DOZE_WAKE_SCREEN_GESTURE, + DOZE_WAKE_LOCK_SCREEN_GESTURE, + DOZE_WAKE_DISPLAY_GESTURE, NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, + SHOW_MEDIA_WHEN_BYPASSING, FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, @@ -8986,7 +9058,6 @@ public final class Settings { ASSIST_GESTURE_WAKE_ENABLED, VR_DISPLAY_MODE, NOTIFICATION_BADGING, - NOTIFICATION_BUBBLES, NOTIFICATION_DISMISS_RTL, QS_AUTO_ADDED_TILES, SCREENSAVER_ENABLED, @@ -9019,15 +9090,19 @@ public final class Settings { UI_NIGHT_MODE, LOCK_SCREEN_WHEN_TRUST_LOST, SKIP_GESTURE, + SKIP_DIRECTION, SILENCE_GESTURE, THEME_CUSTOMIZATION_OVERLAY_PACKAGES, NAVIGATION_MODE, AWARE_ENABLED, SKIP_GESTURE_COUNT, + SKIP_TOUCH_COUNT, SILENCE_ALARMS_GESTURE_COUNT, - SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_CALL_GESTURE_COUNT, SILENCE_TIMER_GESTURE_COUNT, + SILENCE_ALARMS_TOUCH_COUNT, + SILENCE_CALL_TOUCH_COUNT, + SILENCE_TIMER_TOUCH_COUNT, DARK_MODE_DIALOG_SEEN, GLOBAL_ACTIONS_PANEL_ENABLED, AWARE_LOCK_ENABLED @@ -9146,18 +9221,18 @@ public final class Settings { VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR); - VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_DISPLAY_GESTURE, DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR); VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR); VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR); + VALIDATORS.put(SHOW_MEDIA_WHEN_BYPASSING, SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR); - VALIDATORS.put(FACE_UNLOCK_EDUCATION_INFO_DISPLAYED, - FACE_UNLOCK_EDUCATION_INFO_DISPLAYED_VALIDATOR); VALIDATORS.put(ASSIST_GESTURE_ENABLED, ASSIST_GESTURE_ENABLED_VALIDATOR); VALIDATORS.put(ASSIST_GESTURE_SILENCE_ALERTS_ENABLED, ASSIST_GESTURE_SILENCE_ALERTS_ENABLED_VALIDATOR); @@ -9206,16 +9281,21 @@ public final class Settings { VALIDATORS.put(LOCK_SCREEN_CUSTOM_CLOCK_FACE, LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR); VALIDATORS.put(LOCK_SCREEN_WHEN_TRUST_LOST, LOCK_SCREEN_WHEN_TRUST_LOST_VALIDATOR); VALIDATORS.put(SKIP_GESTURE, SKIP_GESTURE_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); VALIDATORS.put(SILENCE_GESTURE, SILENCE_GESTURE_VALIDATOR); VALIDATORS.put(THEME_CUSTOMIZATION_OVERLAY_PACKAGES, THEME_CUSTOMIZATION_OVERLAY_PACKAGES_VALIDATOR); VALIDATORS.put(NAVIGATION_MODE, NAVIGATION_MODE_VALIDATOR); VALIDATORS.put(AWARE_ENABLED, AWARE_ENABLED_VALIDATOR); VALIDATORS.put(SKIP_GESTURE_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SKIP_TOUCH_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_ALARMS_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_TIMER_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_CALL_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); - VALIDATORS.put(SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_ALARMS_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_TIMER_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_CALL_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(ODI_CAPTIONS_ENABLED, ODI_CAPTIONS_ENABLED_VALIDATOR); VALIDATORS.put(DARK_MODE_DIALOG_SEEN, BOOLEAN_VALIDATOR); VALIDATORS.put(UI_NIGHT_MODE, UI_NIGHT_MODE_VALIDATOR); @@ -9347,6 +9427,16 @@ public final class Settings { */ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global"); + /** + * Whether the notification bubbles are globally enabled + * The value is boolean (1 or 0). + * @hide + */ + @TestApi + public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; + + private static final Validator NOTIFICATION_BUBBLES_VALIDATOR = BOOLEAN_VALIDATOR; + /** * Whether users are allowed to add more users or guest from lockscreen. *

@@ -13586,6 +13676,16 @@ public final class Settings { public static final String LOCATION_SETTINGS_LINK_TO_PERMISSIONS_ENABLED = "location_settings_link_to_permissions_enabled"; + /** + * Flag to set the waiting time for removing invisible euicc profiles inside System > + * Settings. + * Type: long + * + * @hide + */ + public static final String EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + "euicc_removing_invisible_profiles_timeout_millis"; + /** * Flag to set the waiting time for euicc factory reset inside System > Settings * Type: long @@ -13806,6 +13906,7 @@ public final class Settings { ZEN_DURATION, CHARGING_VIBRATION_ENABLED, AWARE_ALLOWED, + NOTIFICATION_BUBBLES, }; /** @@ -13872,6 +13973,7 @@ public final class Settings { VALIDATORS.put(AWARE_ALLOWED, AWARE_ALLOWED_VALIDATOR); VALIDATORS.put(POWER_BUTTON_LONG_PRESS, POWER_BUTTON_LONG_PRESS_VALIDATOR); VALIDATORS.put(POWER_BUTTON_VERY_LONG_PRESS, POWER_BUTTON_VERY_LONG_PRESS_VALIDATOR); + VALIDATORS.put(NOTIFICATION_BUBBLES, NOTIFICATION_BUBBLES_VALIDATOR); } /** diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index cb7d41bdf21a2187246a0441e14e941f92e52833..93bcdbffd1330eca0ab36c53da60c84defb1ee63 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -1639,7 +1639,7 @@ public class ZenModeConfig implements Parcelable { @UnsupportedAppUsage public String name; // required for automatic @UnsupportedAppUsage - public int zenMode; + public int zenMode; // ie: Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS @UnsupportedAppUsage public Uri conditionId; // required for automatic public Condition condition; // optional diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 30c4e900f83cc748196b7863085b332fb9a3e2ac..bb39be2b2cf0e1baa1c3f7b8f44951d9bfe5b9d9 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -51,7 +51,6 @@ import android.view.textclassifier.TextSelection; import com.android.internal.util.Preconditions; -import java.lang.ref.WeakReference; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -431,23 +430,18 @@ public abstract class TextClassifierService extends Service { * Forwards the callback result to a wrapped binder callback. */ private static final class ProxyCallback implements Callback { - private WeakReference mTextClassifierCallback; + private ITextClassifierCallback mTextClassifierCallback; private ProxyCallback(ITextClassifierCallback textClassifierCallback) { - mTextClassifierCallback = - new WeakReference<>(Preconditions.checkNotNull(textClassifierCallback)); + mTextClassifierCallback = Preconditions.checkNotNull(textClassifierCallback); } @Override public void onSuccess(T result) { - ITextClassifierCallback callback = mTextClassifierCallback.get(); - if (callback == null) { - return; - } try { Bundle bundle = new Bundle(1); bundle.putParcelable(KEY_RESULT, result); - callback.onSuccess(bundle); + mTextClassifierCallback.onSuccess(bundle); } catch (RemoteException e) { Slog.d(LOG_TAG, "Error calling callback"); } @@ -455,12 +449,8 @@ public abstract class TextClassifierService extends Service { @Override public void onFailure(CharSequence error) { - ITextClassifierCallback callback = mTextClassifierCallback.get(); - if (callback == null) { - return; - } try { - callback.onFailure(); + mTextClassifierCallback.onFailure(); } catch (RemoteException e) { Slog.d(LOG_TAG, "Error calling callback"); } diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java index 70dfef574ca5323d1018af05d11e035925222d73..fb13c1f5dde3bbd4da8f621008de22134584d42e 100644 --- a/core/java/android/speech/RecognitionService.java +++ b/core/java/android/speech/RecognitionService.java @@ -170,13 +170,23 @@ public abstract class RecognitionService extends Service { * Checks whether the caller has sufficient permissions * * @param listener to send the error message to in case of error + * @param forDataDelivery If the permission check is for delivering the sensitive data. * @return {@code true} if the caller has enough permissions, {@code false} otherwise */ - private boolean checkPermissions(IRecognitionListener listener) { + private boolean checkPermissions(IRecognitionListener listener, boolean forDataDelivery) { if (DBG) Log.d(TAG, "checkPermissions"); - if (PermissionChecker.checkCallingOrSelfPermission(this, - android.Manifest.permission.RECORD_AUDIO) == PermissionChecker.PERMISSION_GRANTED) { - return true; + if (forDataDelivery) { + if (PermissionChecker.checkCallingOrSelfPermissionForDataDelivery(this, + android.Manifest.permission.RECORD_AUDIO) + == PermissionChecker.PERMISSION_GRANTED) { + return true; + } + } else { + if (PermissionChecker.checkCallingOrSelfPermissionForPreflight(this, + android.Manifest.permission.RECORD_AUDIO) + == PermissionChecker.PERMISSION_GRANTED) { + return true; + } } try { Log.e(TAG, "call for recognition service without RECORD_AUDIO permissions"); @@ -342,7 +352,7 @@ public abstract class RecognitionService extends Service { public void startListening(Intent recognizerIntent, IRecognitionListener listener) { if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder()); final RecognitionService service = mServiceRef.get(); - if (service != null && service.checkPermissions(listener)) { + if (service != null && service.checkPermissions(listener, true /*forDataDelivery*/)) { service.mHandler.sendMessage(Message.obtain(service.mHandler, MSG_START_LISTENING, service.new StartListeningArgs( recognizerIntent, listener, Binder.getCallingUid()))); @@ -353,7 +363,7 @@ public abstract class RecognitionService extends Service { public void stopListening(IRecognitionListener listener) { if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder()); final RecognitionService service = mServiceRef.get(); - if (service != null && service.checkPermissions(listener)) { + if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/)) { service.mHandler.sendMessage(Message.obtain(service.mHandler, MSG_STOP_LISTENING, listener)); } @@ -363,7 +373,7 @@ public abstract class RecognitionService extends Service { public void cancel(IRecognitionListener listener) { if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder()); final RecognitionService service = mServiceRef.get(); - if (service != null && service.checkPermissions(listener)) { + if (service != null && service.checkPermissions(listener, false /*forDataDelivery*/)) { service.mHandler.sendMessage(Message.obtain(service.mHandler, MSG_CANCEL, listener)); } diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index 86651060a394686d3e1aa9d408adf8fc237f6e79..1c50d73c495334c0843fbeb367a3b5a3f2ad6c95 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -276,6 +276,7 @@ public class TextLine { final int runCount = mDirections.getRunCount(); for (int runIndex = 0; runIndex < runCount; runIndex++) { final int runStart = mDirections.getRunStart(runIndex); + if (runStart > mLen) break; final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen); final boolean runIsRtl = mDirections.isRunRtl(runIndex); @@ -360,6 +361,7 @@ public class TextLine { float h = 0; for (int runIndex = 0; runIndex < mDirections.getRunCount(); runIndex++) { final int runStart = mDirections.getRunStart(runIndex); + if (runStart > mLen) break; final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen); final boolean runIsRtl = mDirections.isRunRtl(runIndex); @@ -417,6 +419,7 @@ public class TextLine { float h = 0; for (int runIndex = 0; runIndex < mDirections.getRunCount(); runIndex++) { final int runStart = mDirections.getRunStart(runIndex); + if (runStart > mLen) break; final int runLimit = Math.min(runStart + mDirections.getRunLength(runIndex), mLen); final boolean runIsRtl = mDirections.isRunRtl(runIndex); diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index 324e02ceb1d57e3a223a90bac9eec21adefc13a7..0e0c676c27825c65e8e4d8980f3625e276284730 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -57,6 +57,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false"); DEFAULT_FLAGS.put(PIXEL_WALLPAPER_CATEGORY_SWITCH, "false"); DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false"); + DEFAULT_FLAGS.put("settings_skip_direction_mutable", "true"); } /** diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index bbd44c8b85af50849b1ee15edc7d144f9d62c94c..4b929683fd6dd158453910ae6cdfbdd8687e1d54 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -830,6 +830,32 @@ public final class AccessibilityInteractionController { return false; } + private void adjustBoundsInScreenIfNeeded(List infos) { + if (infos == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final int infoCount = infos.size(); + for (int i = 0; i < infoCount; i++) { + final AccessibilityNodeInfo info = infos.get(i); + adjustBoundsInScreenIfNeeded(info); + } + } + + private void adjustBoundsInScreenIfNeeded(AccessibilityNodeInfo info) { + if (info == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final Rect boundsInScreen = mTempRect; + info.getBoundsInScreen(boundsInScreen); + boundsInScreen.offset(mViewRootImpl.mAttachInfo.mLocationInParentDisplay.x, + mViewRootImpl.mAttachInfo.mLocationInParentDisplay.y); + info.setBoundsInScreen(boundsInScreen); + } + + private boolean shouldBypassAdjustBoundsInScreen() { + return mViewRootImpl.mAttachInfo.mLocationInParentDisplay.equals(0, 0); + } + private void applyAppScaleAndMagnificationSpecIfNeeded(AccessibilityNodeInfo info, MagnificationSpec spec) { if (info == null) { @@ -921,6 +947,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(infos); applyAppScaleAndMagnificationSpecIfNeeded(infos, spec); adjustIsVisibleToUserIfNeeded(infos, interactiveRegion); callback.setFindAccessibilityNodeInfosResult(infos, interactionId); @@ -939,6 +966,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(info); applyAppScaleAndMagnificationSpecIfNeeded(info, spec); adjustIsVisibleToUserIfNeeded(info, interactiveRegion); callback.setFindAccessibilityNodeInfoResult(info, interactionId); diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index b7d52edaca83641be66501a17885ac351e16f7f1..5643068211f6948c6e7f96d659b10f333033e919 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.DisplayEventReceiver.CONFIG_CHANGED_EVENT_SUPPRESS; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER; @@ -973,7 +974,7 @@ public final class Choreographer { private int mFrame; public FrameDisplayEventReceiver(Looper looper, int vsyncSource) { - super(looper, vsyncSource); + super(looper, vsyncSource, CONFIG_CHANGED_EVENT_SUPPRESS); } // TODO(b/116025192): physicalDisplayId is ignored because SF only emits VSYNC events for diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 60daddd663d5dc1995ad916278ca5df7b7592e03..91acc4638c267d7adfaa0df55067f5011ef7ddb8 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -53,6 +53,20 @@ public abstract class DisplayEventReceiver { */ public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1; + /** + * Specifies to suppress config changed events from being generated from Surface Flinger. + *

+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_SUPPRESS = 0; + + /** + * Specifies to generate config changed events from Surface Flinger. + *

+ * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_DISPATCH = 1; + private static final String TAG = "DisplayEventReceiver"; private final CloseGuard mCloseGuard = CloseGuard.get(); @@ -65,7 +79,7 @@ public abstract class DisplayEventReceiver { private MessageQueue mMessageQueue; private static native long nativeInit(WeakReference receiver, - MessageQueue messageQueue, int vsyncSource); + MessageQueue messageQueue, int vsyncSource, int configChanged); private static native void nativeDispose(long receiverPtr); @FastNative private static native void nativeScheduleVsync(long receiverPtr); @@ -77,7 +91,7 @@ public abstract class DisplayEventReceiver { */ @UnsupportedAppUsage public DisplayEventReceiver(Looper looper) { - this(looper, VSYNC_SOURCE_APP); + this(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_SUPPRESS); } /** @@ -85,15 +99,17 @@ public abstract class DisplayEventReceiver { * * @param looper The looper to use when invoking callbacks. * @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values. + * @param configChanged Whether to dispatch config changed events. Must be one of the + * CONFIG_CHANGED_EVENT_* values. */ - public DisplayEventReceiver(Looper looper, int vsyncSource) { + public DisplayEventReceiver(Looper looper, int vsyncSource, int configChanged) { if (looper == null) { throw new IllegalArgumentException("looper must not be null"); } mMessageQueue = looper.getQueue(); mReceiverPtr = nativeInit(new WeakReference(this), mMessageQueue, - vsyncSource); + vsyncSource, configChanged); mCloseGuard.open("dispose"); } diff --git a/core/java/android/view/DragAndDropPermissions.java b/core/java/android/view/DragAndDropPermissions.java index e72ff38ce3f04510e3e267f2f64b6f9fad2f8e45..d47604d6ec417995183037fa9e5d562d8fd2cf6a 100644 --- a/core/java/android/view/DragAndDropPermissions.java +++ b/core/java/android/view/DragAndDropPermissions.java @@ -37,7 +37,7 @@ import com.android.internal.view.IDragAndDropPermissions; * View.startDragAndDrop} by the app that started the drag operation. *

*

- * The life cycle of the permissions is bound to the activity used to call {@link + * The lifecycle of the permissions is bound to the activity used to call {@link * android.app.Activity#requestDragAndDropPermissions(DragEvent) requestDragAndDropPermissions}. The * permissions are revoked when this activity is destroyed, or when {@link #release()} is called, * whichever occurs first. @@ -49,6 +49,10 @@ import com.android.internal.view.IDragAndDropPermissions; * {@link Activity#onSaveInstanceState} bundle and later retrieved in order to manually release * the permissions once they are no longer needed. *

+ *

+ * Learn more about drag permissions + * in multi-window mode. + *

*/ public final class DragAndDropPermissions implements Parcelable { diff --git a/core/java/android/view/GestureExclusionTracker.java b/core/java/android/view/GestureExclusionTracker.java index 6fcdd714f8276572eab28be5d9040db7d7bec631..fffb323e6d500b24bc8de43efee65f2c2907018b 100644 --- a/core/java/android/view/GestureExclusionTracker.java +++ b/core/java/android/view/GestureExclusionTracker.java @@ -44,7 +44,7 @@ class GestureExclusionTracker { while (i.hasNext()) { final GestureExclusionViewInfo info = i.next(); final View v = info.getView(); - if (v == null || !v.isAttachedToWindow()) { + if (v == null || !v.isAttachedToWindow() || !v.isAggregatedVisible()) { mGestureExclusionViewsChanged = true; i.remove(); continue; @@ -122,7 +122,8 @@ class GestureExclusionTracker { public int update() { final View excludedView = getView(); - if (excludedView == null || !excludedView.isAttachedToWindow()) return GONE; + if (excludedView == null || !excludedView.isAttachedToWindow() + || !excludedView.isAggregatedVisible()) return GONE; final List localRects = excludedView.getSystemGestureExclusionRects(); final List newRects = new ArrayList<>(localRects.size()); for (Rect src : localRects) { diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl index 956161acd7623e1391d9a711e06a2a74aaf26383..955be8d40c47b326d0b0477b206a29934ae76b5f 100644 --- a/core/java/android/view/IRecentsAnimationController.aidl +++ b/core/java/android/view/IRecentsAnimationController.aidl @@ -76,6 +76,21 @@ interface IRecentsAnimationController { */ void hideCurrentInputMethod(); + /** + * This call is deprecated, use #setDeferCancelUntilNextTransition() instead + * TODO(138144750): Remove this method once there are no callers + * @deprecated + */ + void setCancelWithDeferredScreenshot(boolean screenshot); + + /** + * Clean up the screenshot of previous task which was created during recents animation that + * was cancelled by a stack order change. + * + * @see {@link IRecentsAnimationRunner#onAnimationCanceled} + */ + void cleanupScreenshot(); + /** * Set a state for controller whether would like to cancel recents animations with deferred * task screenshot presentation. @@ -86,22 +101,23 @@ interface IRecentsAnimationController { * screenshot, so that Launcher can still control the leash lifecycle & make the next app * transition animate smoothly without flickering. * - * @param screenshot When set {@code true}, means recents animation will be canceled when the - * next app launch. System will take previous task's screenshot when the next - * app transition starting, and skip previous task's animation. - * Set {@code false} means will not take screenshot & skip animation - * for previous task. + * @param defer When set {@code true}, means that the recents animation will defer canceling the + * animation when a stack order change is triggered until the subsequent app + * transition start and skip previous task's animation. + * When set to {@code false}, means that the recents animation will be canceled + * immediately when the stack order changes. + * @param screenshot When set {@code true}, means that the system will take previous task's + * screenshot and replace the contents of the leash with it when the next app + * transition starting. The runner must call #cleanupScreenshot() to end the + * recents animation. + * When set to {@code false}, means that the system will simply wait for the + * next app transition start to immediately cancel the recents animation. This + * can be useful when you want an immediate transition into a state where the + * task is shown in the home/recents activity (without waiting for a + * screenshot). * * @see #cleanupScreenshot() * @see IRecentsAnimationRunner#onCancelled */ - void setCancelWithDeferredScreenshot(boolean screenshot); - - /** - * Clean up the screenshot of previous task which was created during recents animation that - * was cancelled by a stack order change. - * - * @see {@link IRecentsAnimationRunner#onAnimationCanceled} - */ - void cleanupScreenshot(); + void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot); } diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl index 9c652a8d990ba62362c13aefae635012e02a3368..6cda60c80b7df2ddd6a33ec62d47ff586f5310c1 100644 --- a/core/java/android/view/IRecentsAnimationRunner.aidl +++ b/core/java/android/view/IRecentsAnimationRunner.aidl @@ -36,7 +36,7 @@ oneway interface IRecentsAnimationRunner { * @param deferredWithScreenshot If set to {@code true}, the contents of the task will be * replaced with a screenshot, such that the runner's leash is * still active. As soon as the runner doesn't need the leash - * anymore, it can call + * anymore, it must call * {@link IRecentsAnimationController#cleanupScreenshot). * * @see {@link RecentsAnimationController#cleanupScreenshot} diff --git a/core/java/android/view/ISystemGestureExclusionListener.aidl b/core/java/android/view/ISystemGestureExclusionListener.aidl index a032625547d20591b89c67a0343afaaf98022ebb..9c2f9a6a192cf7f94813a50f77196a92b6d83300 100644 --- a/core/java/android/view/ISystemGestureExclusionListener.aidl +++ b/core/java/android/view/ISystemGestureExclusionListener.aidl @@ -28,7 +28,14 @@ oneway interface ISystemGestureExclusionListener { * Called when the system gesture exclusion for the given display changed. * @param displayId the display whose system gesture exclusion changed * @param systemGestureExclusion a {@code Region} where the app would like priority over the - * system gestures, in display coordinates. + * system gestures, in display coordinates. Certain restrictions + * might be applied such that apps don't get all the exclusions + * they request. + * @param systemGestureExclusionUnrestricted a {@code Region} where the app would like priority + * over the system gestures, in display coordinates, without + * any restrictions applied. Null if no restrictions have been + * applied. */ - void onSystemGestureExclusionChanged(int displayId, in Region systemGestureExclusion); + void onSystemGestureExclusionChanged(int displayId, in Region systemGestureExclusion, + in Region systemGestureExclusionUnrestricted); } \ No newline at end of file diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 699e795be9803b5e0b7e639c46853d05b2e25e51..f34f9e6d5ce89a1c218cccea46389997728596f5 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -17,6 +17,7 @@ package android.view; +import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -56,6 +57,12 @@ oneway interface IWindow { boolean forceLayout, boolean alwaysConsumeSystemBars, int displayId, in DisplayCutout.ParcelableWrapper displayCutout); + /** + * Called when the window location in parent display has changed. The offset will only be a + * nonzero value if the window is on an embedded display that is re-parented to another window. + */ + void locationInParentDisplayChanged(in Point offset); + /** * Called when the window insets configuration has changed. */ diff --git a/core/java/android/view/RemoteAnimationAdapter.java b/core/java/android/view/RemoteAnimationAdapter.java index bc2fe545a8acd9df6c6a256cfe051f49e92ae980..c686440171a260efe219d0c98fbc56cfca59cda4 100644 --- a/core/java/android/view/RemoteAnimationAdapter.java +++ b/core/java/android/view/RemoteAnimationAdapter.java @@ -55,6 +55,7 @@ public class RemoteAnimationAdapter implements Parcelable { /** @see #getCallingPid */ private int mCallingPid; + private int mCallingUid; /** * @param runner The interface that gets notified when we actually need to start the animation. @@ -103,10 +104,11 @@ public class RemoteAnimationAdapter implements Parcelable { } /** - * To be called by system_server to keep track which pid is running this animation. + * To be called by system_server to keep track which pid and uid is running this animation. */ - public void setCallingPid(int pid) { + public void setCallingPidUid(int pid, int uid) { mCallingPid = pid; + mCallingUid = uid; } /** @@ -116,6 +118,13 @@ public class RemoteAnimationAdapter implements Parcelable { return mCallingPid; } + /** + * @return The uid of the process running the animation. + */ + public int getCallingUid() { + return mCallingUid; + } + @Override public int describeContents() { return 0; diff --git a/core/java/android/view/RemoteAnimationDefinition.java b/core/java/android/view/RemoteAnimationDefinition.java index 884cae440bed092c1ca64fd64aab36fbf965d5ff..da599efb6eee2176e6aafc7348bc55aebe33016d 100644 --- a/core/java/android/view/RemoteAnimationDefinition.java +++ b/core/java/android/view/RemoteAnimationDefinition.java @@ -118,9 +118,9 @@ public class RemoteAnimationDefinition implements Parcelable { * To be called by system_server to keep track which pid is running the remote animations inside * this definition. */ - public void setCallingPid(int pid) { + public void setCallingPidUid(int pid, int uid) { for (int i = mTransitionAnimationMap.size() - 1; i >= 0; i--) { - mTransitionAnimationMap.valueAt(i).adapter.setCallingPid(pid); + mTransitionAnimationMap.valueAt(i).adapter.setCallingPidUid(pid, uid); } } diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index cb64ab1fd921d8d3f1c87117c6c460f1f6b58010..17f07b5a2ad4028bb78643fc98d5a93da1a7cb6b 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.content.res.CompatibilityInfo.Translator; import android.graphics.Canvas; +import android.graphics.ColorSpace; import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.RecordingCanvas; @@ -80,7 +81,8 @@ public class Surface implements Parcelable { private static native long nativeGetNextFrameNumber(long nativeObject); private static native int nativeSetScalingMode(long nativeObject, int scalingMode); private static native int nativeForceScopedDisconnect(long nativeObject); - private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer); + private static native int nativeAttachAndQueueBufferWithColorSpace(long nativeObject, + GraphicBuffer buffer, int colorSpaceId); private static native int nativeSetSharedBufferModeEnabled(long nativeObject, boolean enabled); private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled); @@ -699,20 +701,37 @@ public class Surface implements Parcelable { } /** - * Transfer ownership of buffer and present it on the Surface. + * Transfer ownership of buffer with a color space and present it on the Surface. + * The supported color spaces are SRGB and Display P3, other color spaces will be + * treated as SRGB. * @hide */ - public void attachAndQueueBuffer(GraphicBuffer buffer) { + public void attachAndQueueBufferWithColorSpace(GraphicBuffer buffer, ColorSpace colorSpace) { synchronized (mLock) { checkNotReleasedLocked(); - int err = nativeAttachAndQueueBuffer(mNativeObject, buffer); + if (colorSpace == null) { + colorSpace = ColorSpace.get(ColorSpace.Named.SRGB); + } + int err = nativeAttachAndQueueBufferWithColorSpace(mNativeObject, buffer, + colorSpace.getId()); if (err != 0) { throw new RuntimeException( - "Failed to attach and queue buffer to Surface (bad object?)"); + "Failed to attach and queue buffer to Surface (bad object?), " + + "native error: " + err); } } } + /** + * Deprecated, use attachAndQueueBufferWithColorSpace instead. + * Transfer ownership of buffer and present it on the Surface. + * The color space of the buffer is treated as SRGB. + * @hide + */ + public void attachAndQueueBuffer(GraphicBuffer buffer) { + attachAndQueueBufferWithColorSpace(buffer, ColorSpace.get(ColorSpace.Named.SRGB)); + } + /** * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture * @hide diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index ed6f9b2ccfb098595e2feac345d0a2edc1ef840a..fe10de13082b7fd498e57a7586d657cdf71cf4ec 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -84,7 +84,6 @@ public final class SurfaceControl implements Parcelable { private static native long nativeCopyFromSurfaceControl(long nativeObject); private static native void nativeWriteToParcel(long nativeObject, Parcel out); private static native void nativeRelease(long nativeObject); - private static native void nativeDestroy(long nativeObject); private static native void nativeDisconnect(long nativeObject); private static native ScreenshotGraphicBuffer nativeScreenshot(IBinder displayToken, @@ -932,19 +931,6 @@ public final class SurfaceControl implements Parcelable { mCloseGuard.close(); } - /** - * Release the local resources like {@link #release} but also - * remove the Surface from the screen. - * @hide - */ - public void remove() { - if (mNativeObject != 0) { - nativeDestroy(mNativeObject); - mNativeObject = 0; - } - mCloseGuard.close(); - } - /** * Disconnect any client still connected to the surface. * @hide @@ -1869,7 +1855,8 @@ public final class SurfaceControl implements Parcelable { final ScreenshotGraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width, height, useIdentityTransform, rotation); try { - consumer.attachAndQueueBuffer(buffer.getGraphicBuffer()); + consumer.attachAndQueueBufferWithColorSpace(buffer.getGraphicBuffer(), + buffer.getColorSpace()); } catch (RuntimeException e) { Log.w(TAG, "Failed to take screenshot - " + e.getMessage()); } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 254d04e8715deaf8ef14dce5b144803facff5e88..d11548d687b1532fad8702f74de90257d2bb2a20 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -23,7 +23,6 @@ import static android.view.WindowManagerPolicyConstants.APPLICATION_PANEL_SUBLAY import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.CompatibilityInfo.Translator; -import android.content.res.Configuration; import android.graphics.BlendMode; import android.graphics.Canvas; import android.graphics.Color; @@ -100,10 +99,10 @@ import java.util.concurrent.locks.ReentrantLock; public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallback { private static final String TAG = "SurfaceView"; private static final boolean DEBUG = false; + private static final boolean DEBUG_POSITION = false; @UnsupportedAppUsage - final ArrayList mCallbacks - = new ArrayList(); + final ArrayList mCallbacks = new ArrayList<>(); final int[] mLocation = new int[2]; @@ -126,8 +125,8 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb // we need to preserve the old one until the new one has drawn. SurfaceControl mDeferredDestroySurfaceControl; SurfaceControl mBackgroundControl; + final Object mSurfaceControlLock = new Object(); final Rect mTmpRect = new Rect(); - final Configuration mConfiguration = new Configuration(); Paint mRoundedViewportPaint; @@ -137,25 +136,16 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb boolean mIsCreating = false; private volatile boolean mRtHandlingPositionUpdates = false; - private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener - = new ViewTreeObserver.OnScrollChangedListener() { - @Override - public void onScrollChanged() { - updateSurface(); - } - }; + private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener = + this::updateSurface; @UnsupportedAppUsage - private final ViewTreeObserver.OnPreDrawListener mDrawListener = - new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - // reposition ourselves where the surface is - mHaveFrame = getWidth() > 0 && getHeight() > 0; - updateSurface(); - return true; - } - }; + private final ViewTreeObserver.OnPreDrawListener mDrawListener = () -> { + // reposition ourselves where the surface is + mHaveFrame = getWidth() > 0 && getHeight() > 0; + updateSurface(); + return true; + }; boolean mRequestedVisible = false; boolean mWindowVisibility = false; @@ -173,6 +163,9 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb @UnsupportedAppUsage int mRequestedFormat = PixelFormat.RGB_565; + boolean mUseAlpha = false; + float mSurfaceAlpha = 1f; + @UnsupportedAppUsage boolean mHaveFrame = false; boolean mSurfaceCreated = false; @@ -190,7 +183,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) final Rect mSurfaceFrame = new Rect(); int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1; - private Translator mTranslator; private boolean mGlobalListenersAdded; private boolean mAttachedToWindow; @@ -200,6 +192,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb private int mPendingReportDraws; private SurfaceControl.Transaction mRtTransaction = new SurfaceControl.Transaction(); + private SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction(); public SurfaceView(Context context) { this(context, null); @@ -288,6 +281,152 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb updateSurface(); } + /** + * Make alpha value of this view reflect onto the surface. This can only be called from at most + * one SurfaceView within a view tree. + * + *

Note: Alpha value of the view is ignored and the underlying + * surface is rendered opaque by default.

+ * + * @hide + */ + public void setUseAlpha() { + if (!mUseAlpha) { + mUseAlpha = true; + updateSurfaceAlpha(); + } + } + + @Override + public void setAlpha(float alpha) { + // Sets the opacity of the view to a value, where 0 means the view is completely transparent + // and 1 means the view is completely opaque. + // + // Note: Alpha value of this view is ignored by default. To enable alpha blending, you need + // to call setUseAlpha() as well. + // This view doesn't support translucent opacity if the view is located z-below, since the + // logic to punch a hole in the view hierarchy cannot handle such case. See also + // #clearSurfaceViewPort(Canvas) + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " setAlpha: mUseAlpha = " + mUseAlpha + " alpha=" + alpha); + } + super.setAlpha(alpha); + updateSurfaceAlpha(); + } + + private float getFixedAlpha() { + // Compute alpha value to be set on the underlying surface. + final float alpha = getAlpha(); + return mUseAlpha && (mSubLayer > 0 || alpha == 0f) ? alpha : 1f; + } + + private void updateSurfaceAlpha() { + if (!mUseAlpha) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha: setUseAlpha() is not called, ignored."); + } + return; + } + final float viewAlpha = getAlpha(); + if (mSubLayer < 0 && 0f < viewAlpha && viewAlpha < 1f) { + Log.w(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha:" + + " translucent color is not supported for a surface placed z-below."); + } + if (!mHaveFrame) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha: has no surface."); + } + return; + } + final ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot == null) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha: ViewRootImpl not available."); + } + return; + } + if (mSurfaceControl == null) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + "updateSurfaceAlpha:" + + " surface is not yet created, or already released."); + } + return; + } + final Surface parent = viewRoot.mSurface; + if (parent == null || !parent.isValid()) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha: ViewRootImpl has no valid surface"); + } + return; + } + final float alpha = getFixedAlpha(); + if (alpha != mSurfaceAlpha) { + if (isHardwareAccelerated()) { + /* + * Schedule a callback that reflects an alpha value onto the underlying surfaces. + * This gets called on a RenderThread worker thread, so members accessed here must + * be protected by a lock. + */ + viewRoot.registerRtFrameCallback(frame -> { + try { + final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); + synchronized (mSurfaceControlLock) { + if (!parent.isValid()) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha RT:" + + " ViewRootImpl has no valid surface"); + } + return; + } + if (mSurfaceControl == null) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + "updateSurfaceAlpha RT:" + + " mSurfaceControl has already released"); + } + return; + } + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha RT: set alpha=" + alpha); + } + t.setAlpha(mSurfaceControl, alpha); + t.deferTransactionUntilSurface(mSurfaceControl, parent, frame); + } + // It's possible that mSurfaceControl is released in the UI thread before + // the transaction completes. If that happens, an exception is thrown, which + // must be caught immediately. + t.apply(); + } catch (Exception e) { + Log.e(TAG, System.identityHashCode(this) + + "updateSurfaceAlpha RT: Exception during surface transaction", e); + } + }); + damageInParent(); + } else { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurfaceAlpha: set alpha=" + alpha); + } + SurfaceControl.openTransaction(); + try { + mSurfaceControl.setAlpha(alpha); + } finally { + SurfaceControl.closeTransaction(); + } + } + mSurfaceAlpha = alpha; + } + } + private void performDrawFinished() { if (mPendingReportDraws > 0) { mDrawFinished = true; @@ -337,11 +476,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mRequestedVisible = false; updateSurface(); - if (mSurfaceControl != null) { - mSurfaceControl.remove(); - } - mSurfaceControl = null; - + releaseSurfaces(); mHaveFrame = false; super.onDetachedFromWindow(); @@ -510,15 +645,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } } - private Rect getParentSurfaceInsets() { - final ViewRootImpl root = getViewRootImpl(); - if (root == null) { - return null; - } else { - return root.mWindowAttributes.surfaceInsets; - } - } - private void updateBackgroundVisibilityInTransaction(SurfaceControl viewRoot) { if (mBackgroundControl == null) { return; @@ -532,29 +658,40 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } private void releaseSurfaces() { - if (mSurfaceControl != null) { - mSurfaceControl.remove(); - mSurfaceControl = null; - } - if (mBackgroundControl != null) { - mBackgroundControl.remove(); - mBackgroundControl = null; + synchronized (mSurfaceControlLock) { + if (mSurfaceControl != null) { + mTmpTransaction.remove(mSurfaceControl); + mSurfaceControl = null; + } + if (mBackgroundControl != null) { + mTmpTransaction.remove(mBackgroundControl); + mBackgroundControl = null; + } + mTmpTransaction.apply(); } + mSurfaceAlpha = 1f; } /** @hide */ protected void updateSurface() { if (!mHaveFrame) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + " updateSurface: has no frame"); + } return; } ViewRootImpl viewRoot = getViewRootImpl(); if (viewRoot == null || viewRoot.mSurface == null || !viewRoot.mSurface.isValid()) { + if (DEBUG) { + Log.d(TAG, System.identityHashCode(this) + + " updateSurface: no valid surface"); + } return; } - mTranslator = viewRoot.mTranslator; - if (mTranslator != null) { - mSurface.setCompatibilityTranslator(mTranslator); + final Translator translator = viewRoot.mTranslator; + if (translator != null) { + mSurface.setCompatibilityTranslator(translator); } int myWidth = mRequestedWidth; @@ -562,20 +699,25 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb int myHeight = mRequestedHeight; if (myHeight <= 0) myHeight = getHeight(); + final float alpha = getFixedAlpha(); final boolean formatChanged = mFormat != mRequestedFormat; final boolean visibleChanged = mVisible != mRequestedVisible; + final boolean alphaChanged = mSurfaceAlpha != alpha; final boolean creating = (mSurfaceControl == null || formatChanged || visibleChanged) && mRequestedVisible; final boolean sizeChanged = mSurfaceWidth != myWidth || mSurfaceHeight != myHeight; final boolean windowVisibleChanged = mWindowVisibility != mLastWindowVisibility; boolean redrawNeeded = false; - if (creating || formatChanged || sizeChanged || visibleChanged || windowVisibleChanged) { + if (creating || formatChanged || sizeChanged || visibleChanged || (mUseAlpha + && alphaChanged) || windowVisibleChanged) { getLocationInWindow(mLocation); if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " " + "Changes: creating=" + creating + " format=" + formatChanged + " size=" + sizeChanged + + " visible=" + visibleChanged + " alpha=" + alphaChanged + + " mUseAlpha=" + mUseAlpha + " visible=" + visibleChanged + " left=" + (mWindowSpaceLeft != mLocation[0]) + " top=" + (mWindowSpaceTop != mLocation[1])); @@ -593,11 +735,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mScreenRect.top = mWindowSpaceTop; mScreenRect.right = mWindowSpaceLeft + getWidth(); mScreenRect.bottom = mWindowSpaceTop + getHeight(); - if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mScreenRect); + if (translator != null) { + translator.translateRectInAppWindowToScreen(mScreenRect); } - final Rect surfaceInsets = getParentSurfaceInsets(); + final Rect surfaceInsets = viewRoot.mWindowAttributes.surfaceInsets; mScreenRect.offset(surfaceInsets.left, surfaceInsets.top); if (creating) { @@ -646,6 +788,10 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mSurfaceControl.hide(); } updateBackgroundVisibilityInTransaction(viewRoot.getSurfaceControl()); + if (mUseAlpha) { + mSurfaceControl.setAlpha(alpha); + mSurfaceAlpha = alpha; + } // While creating the surface, we will set it's initial // geometry. Outside of that though, we should generally @@ -680,11 +826,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mSurfaceFrame.left = 0; mSurfaceFrame.top = 0; - if (mTranslator == null) { + if (translator == null) { mSurfaceFrame.right = mSurfaceWidth; mSurfaceFrame.bottom = mSurfaceHeight; } else { - float appInvertedScale = mTranslator.applicationInvertedScale; + float appInvertedScale = translator.applicationInvertedScale; mSurfaceFrame.right = (int) (mSurfaceWidth * appInvertedScale + 0.5f); mSurfaceFrame.bottom = (int) (mSurfaceHeight * appInvertedScale + 0.5f); } @@ -702,7 +848,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb try { redrawNeeded |= visible && !mDrawFinished; - SurfaceHolder.Callback callbacks[] = null; + SurfaceHolder.Callback[] callbacks = null; final boolean surfaceChanged = creating; if (mSurfaceCreated && (surfaceChanged || (!visible && visibleChanged))) { @@ -788,7 +934,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mIsCreating = false; if (mSurfaceControl != null && !mSurfaceCreated) { mSurface.release(); - releaseSurfaces(); } } @@ -818,8 +963,8 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb mScreenRect.set(mWindowSpaceLeft, mWindowSpaceTop, mWindowSpaceLeft + mLocation[0], mWindowSpaceTop + mLocation[1]); - if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mScreenRect); + if (translator != null) { + translator.translateRectInAppWindowToScreen(mScreenRect); } if (mSurfaceControl == null) { @@ -828,10 +973,13 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) { try { - if (DEBUG) Log.d(TAG, String.format("%d updateSurfacePosition UI, " + - "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mScreenRect.left, mScreenRect.top, - mScreenRect.right, mScreenRect.bottom)); + if (DEBUG_POSITION) { + Log.d(TAG, String.format("%d updateSurfacePosition UI, " + + "position = [%d, %d, %d, %d]", + System.identityHashCode(this), + mScreenRect.left, mScreenRect.top, + mScreenRect.right, mScreenRect.bottom)); + } setParentSpaceRectangle(mScreenRect, -1); } catch (Exception ex) { Log.e(TAG, "Exception configuring surface", ex); @@ -848,13 +996,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } if (mDeferredDestroySurfaceControl != null) { - mDeferredDestroySurfaceControl.remove(); + mTmpTransaction.remove(mDeferredDestroySurfaceControl).apply(); mDeferredDestroySurfaceControl = null; } - runOnUiThread(() -> { - performDrawFinished(); - }); + runOnUiThread(this::performDrawFinished); } /** @@ -884,7 +1030,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb if (mViewVisibility) { mRtTransaction.show(surface); } - } private void setParentSpaceRectangle(Rect position, long frameNumber) { @@ -925,10 +1070,10 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb return; } try { - if (DEBUG) { + if (DEBUG_POSITION) { Log.d(TAG, String.format( "%d updateSurfacePosition RenderWorker, frameNr = %d, " - + "postion = [%d, %d, %d, %d]", + + "position = [%d, %d, %d, %d]", System.identityHashCode(this), frameNumber, left, top, right, bottom)); } @@ -964,7 +1109,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb }; private SurfaceHolder.Callback[] getSurfaceCallbacks() { - SurfaceHolder.Callback callbacks[]; + SurfaceHolder.Callback[] callbacks; synchronized (mCallbacks) { callbacks = new SurfaceHolder.Callback[mCallbacks.size()]; mCallbacks.toArray(callbacks); @@ -1034,7 +1179,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb synchronized (mCallbacks) { // This is a linear search, but in practice we'll // have only a couple callbacks, so it doesn't matter. - if (mCallbacks.contains(callback) == false) { + if (!mCallbacks.contains(callback)) { mCallbacks.add(callback); } } diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 3d3d5dc7db325a001ad8e7799d2c65bbafda4f30..f18aa81b95e5017025339d7662fba1f67fc2aca5 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -17,6 +17,7 @@ package android.view; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; import android.graphics.HardwareRenderer; @@ -35,6 +36,7 @@ import com.android.internal.R; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; /** * Threaded renderer that proxies the rendering to a render thread. Most calls @@ -300,7 +302,8 @@ public final class ThreadedRenderer extends HardwareRenderer { private boolean mEnabled; private boolean mRequested = true; - private FrameDrawingCallback mNextRtFrameCallback; + @Nullable + private ArrayList mNextRtFrameCallbacks; ThreadedRenderer(Context context, boolean translucent, String name) { super(); @@ -441,8 +444,11 @@ public final class ThreadedRenderer extends HardwareRenderer { * * @param callback The callback to register. */ - void registerRtFrameCallback(FrameDrawingCallback callback) { - mNextRtFrameCallback = callback; + void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { + if (mNextRtFrameCallbacks == null) { + mNextRtFrameCallbacks = new ArrayList<>(); + } + mNextRtFrameCallbacks.add(callback); } /** @@ -583,10 +589,14 @@ public final class ThreadedRenderer extends HardwareRenderer { // Consume and set the frame callback after we dispatch draw to the view above, but before // onPostDraw below which may reset the callback for the next frame. This ensures that // updates to the frame callback during scroll handling will also apply in this frame. - final FrameDrawingCallback callback = mNextRtFrameCallback; - mNextRtFrameCallback = null; - if (callback != null) { - setFrameCallback(callback); + if (mNextRtFrameCallbacks != null) { + final ArrayList frameCallbacks = mNextRtFrameCallbacks; + mNextRtFrameCallbacks = null; + setFrameCallback(frame -> { + for (int i = 0; i < frameCallbacks.size(); ++i) { + frameCallbacks.get(i).onFrameDraw(frame); + } + }); } if (mRootNodeNeedsUpdate || !mRootNode.hasDisplayList()) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index ac2fa3b526928ab1a210e9e26f42d2d096a0d5a3..243f976d2e53f48dd2c302a03cc2bb9ecbd26ceb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1390,6 +1390,74 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1; + /** @hide */ + @IntDef(prefix = { "IMPORTANT_FOR_CONTENT_CAPTURE_" }, value = { + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES, + IMPORTANT_FOR_CONTENT_CAPTURE_NO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ContentCaptureImportance {} + + /** + * Automatically determine whether a view is important for content capture. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0x0; + + /** + * The view is important for content capture, and its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 0x1; + + /** + * The view is not important for content capture, but its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 0x2; + + /** + * The view is important for content capture, but its children (if any) will not be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 0x4; + + /** + * The view is not important for content capture, and its children (if any) will not be + * traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 0x8; + + /** * This view is enabled. Interpretation varies by subclass. * Use with ENABLED_MASK when calling setFlags. @@ -3362,6 +3430,55 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /* End of masks for mPrivateFlags3 */ + /* + * Masks for mPrivateFlags4, as generated by dumpFlags(): + * + * |-------|-------|-------|-------| + * 1111 PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE + * 11 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK + * |-------|-------|-------|-------| + */ + + /** + * Mask for obtaining the bits which specify how to determine + * whether a view is important for autofill. + * + *

NOTE: the important for content capture values were the first flags added and are set in + * the rightmost position, so we don't need to shift them + */ + private static final int PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK = + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO | IMPORTANT_FOR_CONTENT_CAPTURE_YES + | IMPORTANT_FOR_CONTENT_CAPTURE_NO + | IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + | IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS; + + /* + * Variables used to control when the IntelligenceManager.notifyNodeAdded()/removed() methods + * should be called. + * + * The idea is to call notifyAppeared() after the view is layout and visible, then call + * notifyDisappeared() when it's gone (without known when it was removed from the parent). + */ + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED = 0x10; + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED = 0x20; + + /* + * Flags used to cache the value returned by isImportantForContentCapture while the view + * hierarchy is being traversed. + */ + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED = 0x40; + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE = 0x80; + + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK = + PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + | PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + + /* End of masks for mPrivateFlags4 */ + /** @hide */ protected static final int VIEW_STRUCTURE_FOR_ASSIST = 0; /** @hide */ @@ -3985,6 +4102,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 129147060) int mPrivateFlags3; + private int mPrivateFlags4; + /** * This view's request for the visibility of the status bar. * @hide @@ -8442,6 +8561,65 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onProvideStructure(structure, VIEW_STRUCTURE_FOR_AUTOFILL, flags); } + /** + * Populates a {@link ViewStructure} for content capture. + * + *

This method is called after a view is that is eligible for content capture + * (for example, if it {@link #isImportantForAutofill()}, an intelligence service is enabled for + * the user, and the activity rendering the view is enabled for content capture) is laid out and + * is visible. + * + *

The populated structure is then passed to the service through + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}. + * + *

Note: views that manage a virtual structure under this view must populate just + * the node representing this view and return right away, then asynchronously report (not + * necessarily in the UI thread) when the children nodes appear, disappear or have their text + * changed by calling + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}, + * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and + * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)} + * respectively. The structure for the a child must be created using + * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the + * {@code autofillId} for a child can be obtained either through + * {@code childStructure.getAutofillId()} or + * {@link ContentCaptureSession#newAutofillId(AutofillId, long)}. + * + *

When the virtual view hierarchy represents a web page, you should also: + * + *

    + *
  • Call {@link ContentCaptureManager#getContentCaptureConditions()} to infer content + * capture events should be generate for that URL. + *
  • Create a new {@link ContentCaptureSession} child for every HTML element that + * renders a new URL (like an {@code IFRAME}) and use that session to notify events from + * that subtree. + *
+ * + *

Note: the following methods of the {@code structure} will be ignored: + *

    + *
  • {@link ViewStructure#setChildCount(int)} + *
  • {@link ViewStructure#addChildCount(int)} + *
  • {@link ViewStructure#getChildCount()} + *
  • {@link ViewStructure#newChild(int)} + *
  • {@link ViewStructure#asyncNewChild(int)} + *
  • {@link ViewStructure#asyncCommit()} + *
  • {@link ViewStructure#setWebDomain(String)} + *
  • {@link ViewStructure#newHtmlInfoBuilder(String)} + *
  • {@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)} + *
  • {@link ViewStructure#setDataIsSensitive(boolean)} + *
  • {@link ViewStructure#setAlpha(float)} + *
  • {@link ViewStructure#setElevation(float)} + *
  • {@link ViewStructure#setTransformation(Matrix)} + * + *
+ * + * @hide + */ + @TestApi + public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) { + onProvideStructure(structure, VIEW_STRUCTURE_FOR_CONTENT_CAPTURE, flags); + } + /** @hide */ protected void onProvideStructure(@NonNull ViewStructure structure, @ViewStructureType int viewFor, int flags) { @@ -9079,6 +9257,280 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } + /** + * Gets the mode for determining whether this view is important for content capture. + * + *

See {@link #setImportantForContentCapture(int)} and + * {@link #isImportantForContentCapture()} for more info about this mode. + * + * @return {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO} by default, or value passed to + * {@link #setImportantForContentCapture(int)}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @ViewDebug.ExportedProperty(mapping = { + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to = "auto"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES, to = "yes"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO, to = "no"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + to = "yesExcludeDescendants"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, + to = "noExcludeDescendants")}) +// @InspectableProperty(enumMapping = { +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, name = "auto"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES, name = "yes"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO, name = "no"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, +// name = "yesExcludeDescendants"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, +// name = "noExcludeDescendants"), +// }) + @TestApi + public @ContentCaptureImportance int getImportantForContentCapture() { + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + return mPrivateFlags4 & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + } + + /** + * Sets the mode for determining whether this view is considered important for content capture. + * + *

The platform determines the importance for autofill automatically but you + * can use this method to customize the behavior. Typically, a view that provides text should + * be marked as {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}. + * + * @param mode {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}, {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS}, + * or {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @TestApi + public void setImportantForContentCapture(@ContentCaptureImportance int mode) { + // Reset first + mPrivateFlags4 &= ~PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + // Then set again + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + mPrivateFlags4 |= (mode & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK); + } + + /** + * Hints the Android System whether this view is considered important for content capture, based + * on the value explicitly set by {@link #setImportantForContentCapture(int)} and heuristics + * when it's {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}. + * + *

See {@link ContentCaptureManager} for more info about content capture. + * + * @return whether the view is considered important for content capture. + * + * @see #setImportantForContentCapture(int) + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + * + * @hide + */ + @TestApi + public final boolean isImportantForContentCapture() { + boolean isImportant; + if ((mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED) != 0) { + isImportant = (mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE) != 0; + return isImportant; + } + + isImportant = calculateIsImportantForContentCapture(); + + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + if (isImportant) { + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + } + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED; + return isImportant; + } + + /** + * Calculates whether the flag is important for content capture so it can be used by + * {@link #isImportantForContentCapture()} while the tree is traversed. + */ + private boolean calculateIsImportantForContentCapture() { + // Check parent mode to ensure we're important + ViewParent parent = mParent; + while (parent instanceof View) { + final int parentImportance = ((View) parent).getImportantForContentCapture(); + if (parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for " + + "content capture because parent " + parent + "'s importance is " + + parentImportance); + } + return false; + } + parent = parent.getParent(); + } + + final int importance = getImportantForContentCapture(); + + // First, check the explicit states. + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES) { + return true; + } + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for content " + + "capture because its importance is " + importance); + } + return false; + } + + // Then use some heuristics to handle AUTO. + if (importance != IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "invalid content capture importance (" + importance + + " on view " + this); + return false; + } + + // View group is important if at least one children also is + if (this instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) this; + for (int i = 0; i < group.getChildCount(); i++) { + final View child = group.getChildAt(i); + if (child.isImportantForContentCapture()) { + return true; + } + } + } + + // If the app developer explicitly set hints or autofill hintsfor it, it's important. + if (getAutofillHints() != null) { + return true; + } + + // Otherwise, assume it's not important... + return false; + } + + /** + * Helper used to notify the {@link ContentCaptureManager} when the view is removed or + * added, based on whether it's laid out and visible, and without knowing if the parent removed + * it from the view hierarchy. + * + *

This method is called from many places (visibility changed, view laid out, view attached + * or detached to/from window, etc...) and hence must contain the logic to call the manager, as + * described below: + * + *

    + *
  1. It should only be called when content capture is enabled for the view. + *
  2. It must call viewAppeared() before viewDisappeared() + *
  3. viewAppearead() can only be called when the view is visible and laidout + *
  4. It should not call the same event twice. + *
+ */ + private void notifyAppearedOrDisappearedForContentCaptureIfNeeded(boolean appeared) { + AttachInfo ai = mAttachInfo; + // Skip it while the view is being laided out for the first time + if (ai != null && !ai.mReadyForContentCaptureUpdates) return; + + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, + "notifyContentCapture(" + appeared + ") for " + getClass().getSimpleName()); + } + try { + notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(appeared); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(boolean appeared) { + AttachInfo ai = mAttachInfo; + + // First check if context has client, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return; + + // Then check if it's enabled in the context... + final ContentCaptureManager ccm = ai != null ? ai.getContentCaptureManager(mContext) + : mContext.getSystemService(ContentCaptureManager.class); + if (ccm == null || !ccm.isContentCaptureEnabled()) return; + + // ... and finally at the view level + // NOTE: isImportantForContentCapture() is more expensive than cm.isContentCaptureEnabled() + if (!isImportantForContentCapture()) return; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) return; + + if (appeared) { + if (!isLaidOut() || getVisibility() != VISIBLE + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + setNotifiedContentCaptureAppeared(); + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on appeared for " + this); + } + } + } else { + if ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) == 0 + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'disappeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on disappeared for " + this); + } + } + } + } + + private void setNotifiedContentCaptureAppeared() { + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + } + + /** @hide */ + protected boolean getNotifiedContentCaptureAppeared() { + return (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0; + } + + /** * Sets the (optional) {@link ContentCaptureSession} associated with this view. * @@ -9331,6 +9783,68 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + /** + * Dispatches the initial content capture events for a view structure. + * + * @hide + */ + public void dispatchInitialProvideContentCaptureStructure() { + AttachInfo ai = mAttachInfo; + if (ai == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no AttachInfo for " + this); + return; + } + ContentCaptureManager ccm = ai.mContentCaptureManager; + if (ccm == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "dispatchProvideContentCaptureStructure(): " + + "no ContentCaptureManager for " + this); + return; + } + + // We must set it before checkign if the view itself is important, because it might + // initially not be (for example, if it's empty), although that might change later (for + // example, if important views are added) + ai.mReadyForContentCaptureUpdates = true; + + if (!isImportantForContentCapture()) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): decorView is not important"); + } + return; + } + + ai.mContentCaptureManager = ccm; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no session for " + this); + } + return; + } + + session.internalNotifyViewTreeEvent(/* started= */ true); + try { + dispatchProvideContentCaptureStructure(); + } finally { + session.internalNotifyViewTreeEvent(/* started= */ false); + } + } + + /** @hide */ + void dispatchProvideContentCaptureStructure() { + ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + ViewStructure structure = session.newViewStructure(this); + onProvideContentCaptureStructure(structure, /* flags= */ 0); + setNotifiedContentCaptureAppeared(); + session.notifyViewAppeared(structure); + } + } + /** * @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo) * @@ -10571,6 +11085,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * *

Do not modify the provided list after this method is called.

* + *

Note: the system will put a limit of 200dp on the vertical extent of the + * exclusions it takes into account. The limit does not apply while the navigation + * bar is {@link #SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the + * {@link android.inputmethodservice.InputMethodService input method} and + * {@link Intent#CATEGORY_HOME home activity}. + *

+ * * @param rects A list of precision gesture regions that this view needs to function correctly */ public void setSystemGestureExclusionRects(@NonNull List rects) { @@ -13281,6 +13802,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public void dispatchStartTemporaryDetach() { mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH; notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); onStartTemporaryDetach(); } @@ -13307,6 +13829,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, notifyFocusChangeToInputMethodManager(true /* hasFocus */); } notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } /** @@ -13821,6 +14344,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } + /** + * @return true if this view and all ancestors are visible as of the last + * {@link #onVisibilityAggregated(boolean)} call. + */ + boolean isAggregatedVisible() { + return (mPrivateFlags3 & PFLAG3_AGGREGATED_VISIBLE) != 0; + } + /** * Internal dispatching method for {@link #onVisibilityAggregated}. Overridden by * ViewGroup. Intended to only be called when {@link #isAttachedToWindow()}, @@ -13849,7 +14380,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @CallSuper public void onVisibilityAggregated(boolean isVisible) { // Update our internal visibility tracking so we can detect changes - boolean oldVisible = (mPrivateFlags3 & PFLAG3_AGGREGATED_VISIBLE) != 0; + boolean oldVisible = isAggregatedVisible(); mPrivateFlags3 = isVisible ? (mPrivateFlags3 | PFLAG3_AGGREGATED_VISIBLE) : (mPrivateFlags3 & ~PFLAG3_AGGREGATED_VISIBLE); if (isVisible && mAttachInfo != null) { @@ -13899,6 +14430,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, : AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED); } } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(isVisible); + if (!getSystemGestureExclusionRects().isEmpty() && isVisible != oldVisible) { + postUpdateSystemGestureExclusionRects(); + } } /** @@ -17597,6 +18133,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } // Reset content capture caches + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK; mCachedContentCaptureSession = null; if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS) @@ -19606,6 +20143,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, needGlobalAttributesUpdate(false); notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) @@ -19655,6 +20193,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); } /** @@ -21989,6 +22528,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags3 &= ~PFLAG3_NOTIFY_AUTOFILL_ENTER_ON_LAYOUT; notifyEnterOrExitForAutoFillIfNeeded(true); } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } private boolean hasParentWantsFocus() { @@ -28053,6 +28594,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ boolean mHandlingPointerEvent; + /** + * The offset of this view's window when it's on an embedded display that is re-parented + * to another window. + */ + final Point mLocationInParentDisplay = new Point(); + /** * Global to the view hierarchy used as a temporary for dealing with * x/y points in the transparent region computations. @@ -28199,6 +28746,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ View mTooltipHost; + /** + * The initial structure has been reported so the view is ready to report updates. + */ + boolean mReadyForContentCaptureUpdates; + + /** + * Map(keyed by session) of content capture events that need to be notified after the view + * hierarchy is traversed: value is either the view itself for appearead events, or its + * autofill id for disappeared. + */ + SparseArray> mContentCaptureEvents; + + /** + * Cached reference to the {@link ContentCaptureManager}. + */ + ContentCaptureManager mContentCaptureManager; + /** * Creates a new set of attachment information with the specified * events handler and thread. @@ -28217,6 +28781,31 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mRootCallbacks = effectPlayer; mTreeObserver = new ViewTreeObserver(context); } + + private void delayNotifyContentCaptureEvent(@NonNull ContentCaptureSession session, + @NonNull View view, boolean appeared) { + if (mContentCaptureEvents == null) { + // Most of the time there will be just one session, so intial capacity is 1 + mContentCaptureEvents = new SparseArray<>(1); + } + int sessionId = session.getId(); + // TODO: life would be much easier if we provided a MultiMap implementation somwhere... + ArrayList events = mContentCaptureEvents.get(sessionId); + if (events == null) { + events = new ArrayList<>(); + mContentCaptureEvents.put(sessionId, events); + } + events.add(appeared ? view : view.getAutofillId()); + } + + @Nullable + ContentCaptureManager getContentCaptureManager(@NonNull Context context) { + if (mContentCaptureManager != null) { + return mContentCaptureManager; + } + mContentCaptureManager = context.getSystemService(ContentCaptureManager.class); + return mContentCaptureManager; + } } /** diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d362024ed5259b93ce24df6353d87aaf06993725..937bd1b34e61f044fc9d48f2f6456ad2baef4f88 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3606,7 +3606,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return; } - final ChildListForAutofill children = getChildrenForAutofill(flags); + final ChildListForAutoFillOrContentCapture children = getChildrenForAutofill(flags); final int childrenCount = children.size(); structure.setChildCount(childrenCount); for (int i = 0; i < childrenCount; i++) { @@ -3617,14 +3617,30 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager children.recycle(); } + /** @hide */ + @Override + public void dispatchProvideContentCaptureStructure() { + super.dispatchProvideContentCaptureStructure(); + + if (!isLaidOut()) return; + + final ChildListForAutoFillOrContentCapture children = getChildrenForContentCapture(); + final int childrenCount = children.size(); + for (int i = 0; i < childrenCount; i++) { + final View child = children.get(i); + child.dispatchProvideContentCaptureStructure(); + } + children.recycle(); + } + /** * Gets the children for autofill. Children for autofill are the first * level descendants that are important for autofill. The returned * child list object is pooled and the caller must recycle it once done. * @hide */ - private @NonNull ChildListForAutofill getChildrenForAutofill( + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForAutofill( @AutofillFlags int flags) { - final ChildListForAutofill children = ChildListForAutofill + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture .obtain(); populateChildrenForAutofill(children, flags); return children; @@ -3652,6 +3668,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForContentCapture() { + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture + .obtain(); + populateChildrenForContentCapture(children); + return children; + } + + /** @hide */ + private void populateChildrenForContentCapture(ArrayList list) { + final int childrenCount = mChildrenCount; + if (childrenCount <= 0) { + return; + } + final ArrayList preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + for (int i = 0; i < childrenCount; i++) { + final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); + final View child = (preorderedList == null) + ? mChildren[childIndex] : preorderedList.get(childIndex); + if (child.isImportantForContentCapture()) { + list.add(child); + } else if (child instanceof ViewGroup) { + ((ViewGroup) child).populateChildrenForContentCapture(list); + } + } + } + private static View getAndVerifyPreorderedView(ArrayList preorderedList, View[] children, int childIndex) { final View child; @@ -8634,16 +8678,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager /** * Pooled class that to hold the children for autifill. */ - private static class ChildListForAutofill extends ArrayList { + private static class ChildListForAutoFillOrContentCapture extends ArrayList { private static final int MAX_POOL_SIZE = 32; - private static final Pools.SimplePool sPool = + private static final Pools.SimplePool sPool = new Pools.SimplePool<>(MAX_POOL_SIZE); - public static ChildListForAutofill obtain() { - ChildListForAutofill list = sPool.acquire(); + public static ChildListForAutoFillOrContentCapture obtain() { + ChildListForAutoFillOrContentCapture list = sPool.acquire(); if (list == null) { - list = new ChildListForAutofill(); + list = new ChildListForAutoFillOrContentCapture(); } return list; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 101ed1e737d0e5432ace1003d5bc3fe1967a9ab1..36fcb5ad5c6241a0cd667a8e89f9445f9a5594d6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -105,7 +105,11 @@ import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; +import android.view.contentcapture.MainContentCaptureSession; import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; @@ -220,6 +224,21 @@ public final class ViewRootImpl implements ViewParent, */ static final int MAX_TRACKBALL_DELAY = 250; + /** + * Initial value for {@link #mContentCaptureEnabled}. + */ + private static final int CONTENT_CAPTURE_ENABLED_NOT_CHECKED = 0; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code true}. + */ + private static final int CONTENT_CAPTURE_ENABLED_TRUE = 1; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code false}. + */ + private static final int CONTENT_CAPTURE_ENABLED_FALSE = 2; + @UnsupportedAppUsage static final ThreadLocal sRunQueues = new ThreadLocal(); @@ -410,6 +429,10 @@ public final class ViewRootImpl implements ViewParent, boolean mLayoutRequested; boolean mFirst; + @Nullable + int mContentCaptureEnabled = CONTENT_CAPTURE_ENABLED_NOT_CHECKED; + boolean mPerformContentCapture; + boolean mReportNextDraw; boolean mFullRedrawNeeded; boolean mNewSurfaceNeeded; @@ -608,6 +631,7 @@ public final class ViewRootImpl implements ViewParent, mTransparentRegion = new Region(); mPreviousTransparentRegion = new Region(); mFirst = true; // true for the first time the view is added + mPerformContentCapture = true; // also true for the first time the view is added mAdded = false; mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this, context); @@ -1106,7 +1130,7 @@ public final class ViewRootImpl implements ViewParent, * * @param callback The callback to register. */ - public void registerRtFrameCallback(FrameDrawingCallback callback) { + public void registerRtFrameCallback(@NonNull FrameDrawingCallback callback) { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.registerRtFrameCallback(frame -> { try { @@ -1614,7 +1638,7 @@ public final class ViewRootImpl implements ViewParent, mSurfaceSession = null; if (mBoundsSurfaceControl != null) { - mBoundsSurfaceControl.remove(); + mTransaction.remove(mBoundsSurfaceControl).apply(); mBoundsSurface.release(); mBoundsSurfaceControl = null; } @@ -2766,9 +2790,55 @@ public final class ViewRootImpl implements ViewParent, } } + if (mAttachInfo.mContentCaptureEvents != null) { + notifyContentCatpureEvents(); + } + mIsInTraversal = false; } + private void notifyContentCatpureEvents() { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents"); + try { + MainContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager + .getMainContentCaptureSession(); + for (int i = 0; i < mAttachInfo.mContentCaptureEvents.size(); i++) { + int sessionId = mAttachInfo.mContentCaptureEvents.keyAt(i); + mainSession.notifyViewTreeEvent(sessionId, /* started= */ true); + ArrayList events = mAttachInfo.mContentCaptureEvents + .valueAt(i); + for_each_event: for (int j = 0; j < events.size(); j++) { + Object event = events.get(j); + if (event instanceof AutofillId) { + mainSession.notifyViewDisappeared(sessionId, (AutofillId) event); + } else if (event instanceof View) { + View view = (View) event; + ContentCaptureSession session = view.getContentCaptureSession(); + if (session == null) { + Log.w(mTag, "no content capture session on view: " + view); + continue for_each_event; + } + int actualId = session.getId(); + if (actualId != sessionId) { + Log.w(mTag, "content capture session mismatch for view (" + view + + "): was " + sessionId + " before, it's " + actualId + " now"); + continue for_each_event; + } + ViewStructure structure = session.newViewStructure(view); + view.onProvideContentCaptureStructure(structure, /* flags= */ 0); + session.notifyViewAppeared(structure); + } else { + Log.w(mTag, "invalid content capture event: " + event); + } + } + mainSession.notifyViewTreeEvent(sessionId, /* started= */ false); + } + mAttachInfo.mContentCaptureEvents = null; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + private void notifySurfaceDestroyed() { mSurfaceHolder.ungetCallbacks(); SurfaceHolder.Callback[] callbacks = mSurfaceHolder.getCallbacks(); @@ -2903,6 +2973,13 @@ public final class ViewRootImpl implements ViewParent, } } mFirstInputStage.onWindowFocusChanged(hasWindowFocus); + + // NOTE: there's no view visibility (appeared / disapparead) events when the windows focus + // is lost, so we don't need to to force a flush - there might be other events such as + // text changes, but these should be flushed independently. + if (hasWindowFocus) { + handleContentCaptureFlush(); + } } private void fireAccessibilityFocusEventIfHasFocusedNode() { @@ -3469,6 +3546,86 @@ public final class ViewRootImpl implements ViewParent, pendingDrawFinished(); } } + if (mPerformContentCapture) { + performContentCaptureInitialReport(); + } + } + + /** + * Checks (and caches) if content capture is enabled for this context. + */ + private boolean isContentCaptureEnabled() { + switch (mContentCaptureEnabled) { + case CONTENT_CAPTURE_ENABLED_TRUE: + return true; + case CONTENT_CAPTURE_ENABLED_FALSE: + return false; + case CONTENT_CAPTURE_ENABLED_NOT_CHECKED: + final boolean reallyEnabled = isContentCaptureReallyEnabled(); + mContentCaptureEnabled = reallyEnabled ? CONTENT_CAPTURE_ENABLED_TRUE + : CONTENT_CAPTURE_ENABLED_FALSE; + return reallyEnabled; + default: + Log.w(TAG, "isContentCaptureEnabled(): invalid state " + mContentCaptureEnabled); + return false; + } + + } + + /** + * Checks (without caching) if content capture is enabled for this context. + */ + private boolean isContentCaptureReallyEnabled() { + // First check if context supports it, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return false; + + final ContentCaptureManager ccm = mAttachInfo.getContentCaptureManager(mContext); + // Then check if it's enabled in the contex itself. + if (ccm == null || !ccm.isContentCaptureEnabled()) return false; + + return true; + } + + private void performContentCaptureInitialReport() { + mPerformContentCapture = false; // One-time offer! + final View rootView = mView; + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "performContentCaptureInitialReport() on " + rootView); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "dispatchContentCapture() for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + // Content capture is a go! + rootView.dispatchInitialProvideContentCaptureStructure(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void handleContentCaptureFlush() { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "handleContentCaptureFlush()"); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "flushContentCapture for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + final ContentCaptureManager ccm = mAttachInfo.mContentCaptureManager; + if (ccm == null) { + Log.w(TAG, "No ContentCapture on AttachInfo"); + return; + } + ccm.flush(ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } } private boolean draw(boolean fullRedrawNeeded) { @@ -3835,6 +3992,13 @@ public final class ViewRootImpl implements ViewParent, } } + void updateLocationInParentDisplay(int x, int y) { + if (mAttachInfo != null + && !mAttachInfo.mLocationInParentDisplay.equals(x, y)) { + mAttachInfo.mLocationInParentDisplay.set(x, y); + } + } + /** * Set the root-level system gesture exclusion rects. These are added to those provided by * the root's view hierarchy. @@ -4339,6 +4503,7 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_INSETS_CHANGED = 30; private static final int MSG_INSETS_CONTROL_CHANGED = 31; private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; + private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33; final class ViewRootHandler extends Handler { @Override @@ -4400,6 +4565,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_INSETS_CONTROL_CHANGED"; case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: + return "MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED"; } return super.getMessageName(message); } @@ -4635,6 +4802,9 @@ public final class ViewRootImpl implements ViewParent, case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: { systemGestureExclusionChanged(); } break; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: { + updateLocationInParentDisplay(msg.arg1, msg.arg2); + } break; } } } @@ -7847,6 +8017,17 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } + /** + * Dispatch the offset changed. + * + * @param offset the offset of this view in the parent window. + */ + public void dispatchLocationInParentDisplayChanged(Point offset) { + Message msg = + mHandler.obtainMessage(MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED, offset.x, offset.y); + mHandler.sendMessage(msg); + } + public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) { synchronized (this) { mWindowFocusChanged = true; @@ -8373,6 +8554,14 @@ public final class ViewRootImpl implements ViewParent, } } + @Override + public void locationInParentDisplayChanged(Point offset) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.dispatchLocationInParentDisplayChanged(offset); + } + } + @Override public void insetsChanged(InsetsState insetsState) { final ViewRootImpl viewAncestor = mViewAncestor.get(); diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index c50a3aa8ac7cfe335e8748e17f22399dc50ce88c..9a5f4c9cc8b9e6762f0c13b8f1e272b299d848fa 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -1074,7 +1074,7 @@ public final class ViewTreeObserver { * be called manually if you are forcing the drawing on a View or a hierarchy of Views * that are not attached to a Window or in the GONE state. * - * @return True if the current draw should be canceled and resceduled, false otherwise. + * @return True if the current draw should be canceled and rescheduled, false otherwise. */ @SuppressWarnings("unchecked") public final boolean dispatchOnPreDraw() { diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index 9340b71a5280a776879228a69d73105ce0e1c4ba..bcc6a552f569850fdf1f1fa5cea4a521ac1baf5f 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -35,6 +35,7 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; +import android.content.Intent; import android.graphics.Insets; import android.graphics.Rect; import android.util.SparseArray; @@ -644,6 +645,14 @@ public final class WindowInsets { * {@link View#setSystemGestureExclusionRects} outside of the * {@link #getMandatorySystemGestureInsets() mandatory system gesture insets}. * + *

Note: the system will put a limit of 200dp on the vertical extent of the + * exclusions it takes into account. The limit does not apply while the navigation + * bar is {@link View#SYSTEM_UI_FLAG_IMMERSIVE_STICKY stickily} hidden, nor to the + * {@link android.inputmethodservice.InputMethodService input method} and + * {@link Intent#CATEGORY_HOME home activity}. + *

+ * + * *

Simple taps are guaranteed to reach the window even within the system gesture insets, * as long as they are outside the {@link #getTappableElementInsets() system window insets}. * diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index a25f2eede90528d86e3a7d32cd414cf76b702af6..36fea589da997b7340cfd20c8e8b009de6e91b25 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -260,6 +260,13 @@ public interface WindowManager extends ViewManager { */ int TRANSIT_TASK_CHANGE_WINDOWING_MODE = 27; + /** + * A display which can only contain one task is being shown because the first activity is + * started or it's being turned on. + * @hide + */ + int TRANSIT_SHOW_SINGLE_TASK_DISPLAY = 28; + /** * @hide */ @@ -287,7 +294,8 @@ public interface WindowManager extends ViewManager { TRANSIT_TRANSLUCENT_ACTIVITY_OPEN, TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE, TRANSIT_CRASHING_ACTIVITY_CLOSE, - TRANSIT_TASK_CHANGE_WINDOWING_MODE + TRANSIT_TASK_CHANGE_WINDOWING_MODE, + TRANSIT_SHOW_SINGLE_TASK_DISPLAY }) @Retention(RetentionPolicy.SOURCE) @interface TransitionType {} @@ -310,6 +318,12 @@ public interface WindowManager extends ViewManager { */ int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = 0x4; + /** + * Transition flag: Keyguard is going away with subtle animation. + * @hide + */ + int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION = 0x8; + /** * @hide */ @@ -1459,6 +1473,9 @@ public interface WindowManager extends ViewManager { *

When this flag is enabled for a window, it automatically sets * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and * {@link View#SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN}.

+ * + *

Note: For devices that support + * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE} this flag may be ignored. */ public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000; @@ -1478,6 +1495,10 @@ public interface WindowManager extends ViewManager { *

When this flag is enabled for a window, it automatically sets * the system UI visibility flags {@link View#SYSTEM_UI_FLAG_LAYOUT_STABLE} and * {@link View#SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION}.

+ * + *

Note: For devices that support + * {@link android.content.pm.PackageManager#FEATURE_AUTOMOTIVE} this flag can be disabled + * by the car manufacturers. */ public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000; diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java index 46a59f09eca7886728aabea9dc094474b33cca97..a22f5a576ab640ee836cfa4308ed2dec98b9f4e8 100644 --- a/core/java/android/view/WindowManagerPolicyConstants.java +++ b/core/java/android/view/WindowManagerPolicyConstants.java @@ -38,10 +38,11 @@ public interface WindowManagerPolicyConstants { int FLAG_INTERACTIVE = 0x20000000; int FLAG_PASS_TO_USER = 0x40000000; - // Flags for IActivityManager.keyguardGoingAway() + // Flags for IActivityTaskManager.keyguardGoingAway() int KEYGUARD_GOING_AWAY_FLAG_TO_SHADE = 1 << 0; int KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS = 1 << 1; int KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER = 1 << 2; + int KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS = 1 << 3; // Flags used for indicating whether the internal and/or external input devices // of some type are available. diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java index 4b25378755f1011bf0ffeea0b5ed0d47a4ebc5cd..f4c7b96b8edc81d8368bd2ff9906dc4f9e9926ff 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java +++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java @@ -44,28 +44,126 @@ import java.util.List; * View itself. Similarly the returned instance is responsible for performing accessibility * actions on any virtual view or the root view itself. For example: *

- *
- *     getAccessibilityNodeProvider(
- *         if (mAccessibilityNodeProvider == null) {
- *             mAccessibilityNodeProvider = new AccessibilityNodeProvider() {
- *                 public boolean performAction(int action, int virtualDescendantId) {
- *                     // Implementation.
- *                     return false;
+ * 
+ *

Kotlin

+ *
+ * // "view" is the View instance on which this class performs accessibility functions.
+ * class MyCalendarViewAccessibilityDelegate(
+ *       private var view: MyCalendarView) : AccessibilityDelegate() {
+ *     override fun getAccessibilityNodeProvider(host: View): AccessibilityNodeProvider {
+ *         return object : AccessibilityNodeProvider() {
+ *             override fun createAccessibilityNodeInfo(virtualViewId: Int):
+ *                     AccessibilityNodeInfo? {
+ *                 when (virtualViewId) {
+ *                     host-view-id -> {
+ *                         val node = AccessibilityNodeInfo.obtain(view)
+ *                         node.addChild(view, child-view-id)
+ *                         // Set other attributes like screenReaderFocusable
+ *                         // and contentDescription.
+ *                         return node
+ *                     }
+ *                     child-view-id -> {
+ *                         val node = AccessibilityNodeInfo
+ *                                 .obtain(view, virtualViewId)
+ *                         node.setParent(view)
+ *                         node.addAction(ACTION_SCROLL_UP)
+ *                         node.addAction(ACTION_SCROLL_DOWN)
+ *                         // Set other attributes like focusable and visibleToUser.
+ *                         node.setBoundsInScreen(
+ *                                 Rect(coords-of-edges-relative-to-screen))
+ *                         return node
+ *                     }
+ *                     else -> return null
  *                 }
+ *             }
  *
- *                 public List findAccessibilityNodeInfosByText(String text,
- *                         int virtualDescendantId) {
- *                     // Implementation.
- *                     return null;
+ *             override fun performAction(
+ *                 virtualViewId: Int,
+ *                 action: Int,
+ *                 arguments: Bundle
+ *             ): Boolean {
+ *                 if (virtualViewId == host-view-id) {
+ *                     return view.performAccessibilityAction(action, arguments)
  *                 }
+ *                 when (action) {
+ *                     ACTION_SCROLL_UP.id -> {
+ *                         // Implement logic in a separate method.
+ *                         navigateToPreviousMonth()
  *
- *                 public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualDescendantId) {
- *                     // Implementation.
- *                     return null;
+ *                         return true
+ *                     }
+ *                     ACTION_SCROLL_DOWN.id ->
+ *                         // Implement logic in a separate method.
+ *                         navigateToNextMonth()
+ *
+ *                         return true
+ *                     else -> return false
  *                 }
- *             });
- *     return mAccessibilityNodeProvider;
+ *             }
+ *         }
+ *     }
+ * }
  * 
+ *

Java

+ *
+ * final class MyCalendarViewAccessibilityDelegate extends AccessibilityDelegate {
+ *     // The View instance on which this class performs accessibility functions.
+ *     private final MyCalendarView view;
+ *
+ *     MyCalendarViewAccessibilityDelegate(MyCalendarView view) {
+ *         this.view = view;
+ *     }
+ *
+ *     @Override
+ *     public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) {
+ *         return new AccessibilityNodeProvider() {
+ *             @Override
+ *             @Nullable
+ *             public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
+ *                 if (virtualViewId == host-view-id) {
+ *                     AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain(view);
+ *                     node.addChild(view, child-view-id);
+ *                     // Set other attributes like screenReaderFocusable and contentDescription.
+ *                     return node;
+ *                 } else if (virtualViewId == child-view-id) {
+ *                     AccessibilityNodeInfo node =
+ *                         AccessibilityNodeInfo.obtain(view, virtualViewId);
+ *                     node.setParent(view);
+ *                     node.addAction(ACTION_SCROLL_UP);
+ *                     node.addAction(ACTION_SCROLL_DOWN);
+ *                     // Set other attributes like focusable and visibleToUser.
+ *                     node.setBoundsInScreen(
+ *                         new Rect(coordinates-of-edges-relative-to-screen));
+ *                     return node;
+ *                 } else {
+ *                     return null;
+ *                 }
+ *             }
+ *
+ *             @Override
+ *             public boolean performAction(int virtualViewId, int action, Bundle arguments) {
+ *                 if (virtualViewId == host-view-id) {
+ *                     return view.performAccessibilityAction(action, arguments);
+ *                 }
+ *
+ *                 if (action == ACTION_SCROLL_UP.getId()) {
+ *                     // Implement logic in a separate method.
+ *                     navigateToPreviousMonth();
+ *
+ *                     return true;
+ *                 } else if (action == ACTION_SCROLL_DOWN.getId()) {
+ *                     // Implement logic in a separate method.
+ *                     navigateToNextMonth();
+ *
+ *                     return true;
+ *                 } else {
+ *                     return false;
+ *                 }
+ *             }
+ *         };
+ *     }
+ * }
+ * 
*/ public abstract class AccessibilityNodeProvider { diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index c5a5f7360321d2861d03804128e4723bb197205e..1e7440bd5a43ec3af50fa54a44a7a2bee91a501a 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -428,14 +428,16 @@ public final class MainContentCaptureSession extends ContentCaptureSession { } final int flushFrequencyMs; - if (reason == FLUSH_REASON_IDLE_TIMEOUT) { - flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; - } else if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { + if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { flushFrequencyMs = mManager.mOptions.textChangeFlushingFrequencyMs; } else { - Log.e(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not called with a " - + "timeout reason."); - return; + if (reason != FLUSH_REASON_IDLE_TIMEOUT) { + if (sDebug) { + Log.d(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not a timeout " + + "reason because mDirectServiceInterface is not ready yet"); + } + } + flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; } mNextFlush = System.currentTimeMillis() + flushFrequencyMs; @@ -478,6 +480,8 @@ public final class MainContentCaptureSession extends ContentCaptureSession { return; } + mNextFlushForTextChanged = false; + final int numberEvents = mEvents.size(); final String reasonString = getFlushReasonAsString(reason); if (sDebug) { @@ -493,10 +497,6 @@ public final class MainContentCaptureSession extends ContentCaptureSession { try { mHandler.removeMessages(MSG_FLUSH); - if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { - mNextFlushForTextChanged = false; - } - final ParceledListSlice events = clearEvents(); mDirectServiceInterface.sendEvents(events, reason, mManager.mOptions); } catch (RemoteException e) { diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index d302c2b082176e6253cba7218aa9ecb971042a6e..032af1c5c7b583b7b49aa4a6ca2d54158caf7670 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -707,9 +707,10 @@ public final class InputMethodManager { if (mBindSequence != bindSequence) { return; } - if (matrixValues == null) { - // That this app is unbound from the parent ActivityView. In this case, - // calling updateCursorAnchorInfo() isn't safe. Only clear the matrix. + if (matrixValues == null || mActivityViewToScreenMatrix == null) { + // Either InputBoundResult#mActivityViewToScreenMatrixValues is null + // OR this app is unbound from the parent ActivityView. In this case, + // calling updateCursorAnchorInfo() isn't safe. Only clear the matrix. mActivityViewToScreenMatrix = null; return; } diff --git a/core/java/android/webkit/PermissionRequest.java b/core/java/android/webkit/PermissionRequest.java index 18ec334d0283aef31dab2ce6997fc1ca94a702ad..ac145b1d81a5ec992fc417ad3f53c4d9a57ed9d1 100644 --- a/core/java/android/webkit/PermissionRequest.java +++ b/core/java/android/webkit/PermissionRequest.java @@ -32,7 +32,7 @@ import android.net.Uri; * avoid unintentionally granting requests for new permissions, you should pass the * specific permissions you intend to grant to {@link #grant(String[]) grant()}, * and avoid writing code like this example: - *
+ * 
  * permissionRequest.grant(permissionRequest.getResources())  // This is wrong!!!
  * 
* See the WebView's release notes for information about new protected resources. diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index 90bef2c7fd2f0ab13030301c4362709c0eb5cbdb..605f98ab1b45c9dbd6a8ec5f258116a564f2c52f 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -521,15 +521,17 @@ public class WebChromeClient { * may not be supported and applications wishing to support these sources * or more advanced file operations should build their own Intent. * - *
-         * How to use:
-         * 1. Build an intent using {@link #createIntent}
-         * 2. Fire the intent using {@link android.app.Activity#startActivityForResult}.
-         * 3. Check for ActivityNotFoundException and take a user friendly action if thrown.
-         * 4. Listen the result using {@link android.app.Activity#onActivityResult}
-         * 5. Parse the result using {@link #parseResult} only if media capture was not requested.
-         * 6. Send the result using filePathCallback of {@link WebChromeClient#onShowFileChooser}
-         * 
+ *

How to use: + *

    + *
  1. Build an intent using {@link #createIntent}
  2. + *
  3. Fire the intent using {@link android.app.Activity#startActivityForResult}.
  4. + *
  5. Check for ActivityNotFoundException and take a user friendly action if thrown.
  6. + *
  7. Listen the result using {@link android.app.Activity#onActivityResult}
  8. + *
  9. Parse the result using {@link #parseResult} only if media capture was not + * requested.
  10. + *
  11. Send the result using filePathCallback of {@link + * WebChromeClient#onShowFileChooser}
  12. + *
* * @return an Intent that supports basic file chooser sources. */ diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index a46580dcc539be1c7125340db86fb19c7f1e989b..7282008f7e3a7861de0b4ed1eec0822a7480158c 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -193,26 +193,24 @@ public abstract class WebSettings { } /** - * Used with {@link #setMixedContentMode} - * * In this mode, the WebView will allow a secure origin to load content from any other origin, * even if that origin is insecure. This is the least secure mode of operation for the WebView, * and where possible apps should not set this mode. + * + * @see #setMixedContentMode */ public static final int MIXED_CONTENT_ALWAYS_ALLOW = 0; /** - * Used with {@link #setMixedContentMode} - * * In this mode, the WebView will not allow a secure origin to load content from an insecure * origin. This is the preferred and most secure mode of operation for the WebView and apps are * strongly advised to use this mode. + * + * @see #setMixedContentMode */ public static final int MIXED_CONTENT_NEVER_ALLOW = 1; /** - * Used with {@link #setMixedContentMode} - * * In this mode, the WebView will attempt to be compatible with the approach of a modern web * browser with regard to mixed content. Some insecure content may be allowed to be loaded by * a secure origin and other types of content will be blocked. The types of content are allowed @@ -221,6 +219,8 @@ public abstract class WebSettings { * This mode is intended to be used by apps that are not in control of the content that they * render but desire to operate in a reasonably secure environment. For highest security, apps * are recommended to use {@link #MIXED_CONTENT_NEVER_ALLOW}. + * + * @see #setMixedContentMode */ public static final int MIXED_CONTENT_COMPATIBILITY_MODE = 2; @@ -234,30 +234,30 @@ public abstract class WebSettings { public @interface ForceDark {} /** - * Used with {@link #setForceDark} - * * Disable force dark, irrespective of the force dark mode of the WebView parent. In this mode, * WebView content will always be rendered as-is, regardless of whether native views are being * automatically darkened. + * + * @see #setForceDark */ public static final int FORCE_DARK_OFF = 0; /** - * Used with {@link #setForceDark} - * * Enable force dark dependent on the state of the WebView parent view. If the WebView parent * view is being automatically force darkened * (see: {@link android.view.View#setForceDarkAllowed}), then WebView content will be rendered * so as to emulate a dark theme. WebViews that are not attached to the view hierarchy will not * be inverted. + * + * @see #setForceDark */ public static final int FORCE_DARK_AUTO = 1; /** - * Used with {@link #setForceDark} - * * Unconditionally enable force dark. In this mode WebView content will always be rendered so * as to emulate a dark theme. + * + * @see #setForceDark */ public static final int FORCE_DARK_ON = 2; @@ -464,7 +464,9 @@ public abstract class WebSettings { * Note that the feature will continue to be supported on older versions of * Android as before. * - * This function does not have any effect. + * @deprecated In Android O and afterwards, this function does not have + * any effect, the form data will be saved to platform's autofill service + * if applicable. */ @Deprecated public abstract void setSaveFormData(boolean save); @@ -1469,6 +1471,7 @@ public abstract class WebSettings { * Set the force dark mode for this WebView. * * @param forceDark the force dark mode to set. + * @see #getForceDark */ public void setForceDark(@ForceDark int forceDark) { // Stub implementation to satisfy Roboelectrc shadows that don't override this yet. @@ -1476,10 +1479,10 @@ public abstract class WebSettings { /** * Get the force dark mode for this WebView. - * - * The default force dark mode is {@link #FORCE_DARK_AUTO} + * The default force dark mode is {@link #FORCE_DARK_AUTO}. * * @return the currently set force dark mode. + * @see #setForceDark */ public @ForceDark int getForceDark() { // Stub implementation to satisfy Roboelectrc shadows that don't override this yet. @@ -1514,34 +1517,34 @@ public abstract class WebSettings { public abstract @MenuItemFlags int getDisabledActionModeMenuItems(); /** - * Used with {@link #setDisabledActionModeMenuItems}. - * * No menu items should be disabled. + * + * @see #setDisabledActionModeMenuItems */ public static final int MENU_ITEM_NONE = 0; /** - * Used with {@link #setDisabledActionModeMenuItems}. - * * Disable menu item "Share". + * + * @see #setDisabledActionModeMenuItems */ public static final int MENU_ITEM_SHARE = 1 << 0; /** - * Used with {@link #setDisabledActionModeMenuItems}. - * * Disable menu item "Web Search". + * + * @see #setDisabledActionModeMenuItems */ public static final int MENU_ITEM_WEB_SEARCH = 1 << 1; /** - * Used with {@link #setDisabledActionModeMenuItems}. - * * Disable all the action mode menu items for text processing. * By default WebView searches for activities that are able to handle * {@link android.content.Intent#ACTION_PROCESS_TEXT} and show them in the * action mode menu. If this flag is set via {@link * #setDisabledActionModeMenuItems}, these menu items will be disabled. + * + * @see #setDisabledActionModeMenuItems */ public static final int MENU_ITEM_PROCESS_TEXT = 1 << 2; } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 14be73dec41cdeb8875a75fe7abc31bb3d7cc44c..721ac2d9a6dcca19507f30a3c332aa97bdc2ad2b 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -413,6 +413,9 @@ public class WebView extends AbsoluteLayout if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } if (context == null) { throw new IllegalArgumentException("Invalid context argument"); @@ -759,7 +762,7 @@ public class WebView extends AbsoluteLayout * encoded. If the data is base64 encoded, the value of the encoding * parameter must be {@code "base64"}. HTML can be encoded with {@link * android.util.Base64#encodeToString(byte[],int)} like so: - *
+     * 
      * String unencodedHtml =
      *     "<html><body>'%28' is the code for '('</body></html>";
      * String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING);
@@ -1840,8 +1843,8 @@ public class WebView extends AbsoluteLayout
 
     /**
      * Injects the supplied Java object into this WebView. The object is
-     * injected into the JavaScript context of the main frame, using the
-     * supplied name. This allows the Java object's methods to be
+     * injected into all frames of the web page, including all the iframes,
+     * using the supplied name. This allows the Java object's methods to be
      * accessed from JavaScript. For applications targeted to API
      * level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
      * and above, only public methods that are annotated with
@@ -1851,7 +1854,7 @@ public class WebView extends AbsoluteLayout
      * important security note below for implications.
      * 

Note that injected objects will not appear in JavaScript until the page is next * (re)loaded. JavaScript should be enabled before injecting the object. For example: - *

+     * 
      * class JsObject {
      *    {@literal @}JavascriptInterface
      *    public String toString() { return "injectedObject"; }
@@ -1880,6 +1883,11 @@ public class WebView extends AbsoluteLayout
      * thread of this WebView. Care is therefore required to maintain thread
      * safety.
      * 
+     * 
  • Because the object is exposed to all the frames, any frame could + * obtain the object name and call methods on it. There is no way to tell the + * calling frame's origin from the app side, so the app must not assume that + * the caller is trustworthy unless the app can guarantee that no third party + * content is ever loaded into the WebView even inside an iframe.
  • *
  • The Java object's fields are not accessible.
  • *
  • For applications targeted to API level {@link android.os.Build.VERSION_CODES#LOLLIPOP} * and above, methods of injected Java objects are enumerable from @@ -2803,6 +2811,12 @@ public class WebView extends AbsoluteLayout mProvider.getViewDelegate().onProvideAutofillVirtualStructure(structure, flags); } + /** @hide */ + @Override + public void onProvideContentCaptureStructure(ViewStructure structure, int flags) { + mProvider.getViewDelegate().onProvideContentCaptureStructure(structure, flags); + } + @Override public void autofill(SparseArrayvalues) { mProvider.getViewDelegate().autofill(values); diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index 50bb6883b903d4f84905ec708cc1a6e767df967b..1db91233aefb62577ec4b39058154967207591ec 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -91,6 +91,7 @@ public abstract class AbsSeekBar extends ProgressBar { @UnsupportedAppUsage private float mDisabledAlpha; + private int mThumbExclusionMaxSize; private int mScaledTouchSlop; private float mTouchDownX; @UnsupportedAppUsage @@ -170,6 +171,8 @@ public abstract class AbsSeekBar extends ProgressBar { applyTickMarkTint(); mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + mThumbExclusionMaxSize = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.seekbar_thumb_exclusion_max_size); } /** @@ -762,11 +765,29 @@ public abstract class AbsSeekBar extends ProgressBar { } mGestureExclusionRects.clear(); thumb.copyBounds(mThumbRect); + mThumbRect.offset(mPaddingLeft - mThumbOffset, mPaddingTop); + growRectTo(mThumbRect, Math.min(getHeight(), mThumbExclusionMaxSize)); mGestureExclusionRects.add(mThumbRect); mGestureExclusionRects.addAll(mUserGestureExclusionRects); super.setSystemGestureExclusionRects(mGestureExclusionRects); } + /** + * Grows {@code r} from its center such that each dimension is at least {@code minimumSize}. + */ + private void growRectTo(Rect r, int minimumSize) { + int dy = (minimumSize - r.height()) / 2; + if (dy > 0) { + r.top -= dy; + r.bottom += dy; + } + int dx = (minimumSize - r.width()) / 2; + if (dx > 0) { + r.left -= dx; + r.right += dx; + } + } + /** * @hide */ diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index c3bb9a0201d04c01df837f06c043d00cd796163d..c55f7d6545487e0609d16be320a2c6dea909aef4 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -1318,7 +1318,8 @@ public abstract class AdapterView extends ViewGroup { @ViewStructureType int viewFor, int flags) { super.onProvideStructure(structure, viewFor, flags); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { final Adapter adapter = getAdapter(); if (adapter == null) return; diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java index c3c2c0db9a77153e26e4e3e9aaedd46451d607f4..2bf1ba5cf01738fd461db57896b119e84deada6d 100644 --- a/core/java/android/widget/ArrayAdapter.java +++ b/core/java/android/widget/ArrayAdapter.java @@ -50,7 +50,7 @@ import java.util.List; * override {@link #getView(int, View, ViewGroup)} * and inflate a view resource. * For a code example, see - * the + * the * CustomChoiceList sample. *

    *

    diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index be5d2211c67008c9b34536c6c478453f9bcd18b4..d62b979a2ed347dc575cc2c32111f4f505ce9609 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -62,8 +62,9 @@ import java.io.IOException; /** * Displays image resources, for example {@link android.graphics.Bitmap} * or {@link android.graphics.drawable.Drawable} resources. - * ImageView is also commonly used to {@link #setImageTintMode(PorterDuff.Mode) - * apply tints to an image} and handle {@link #setScaleType(ScaleType) image scaling}. + * ImageView is also commonly used to + * apply tints to an image and + * handle image scaling. * *

    * The following XML snippet is a common example of using an ImageView to display an image resource: @@ -76,7 +77,8 @@ import java.io.IOException; * <ImageView * android:layout_width="wrap_content" * android:layout_height="wrap_content" - * android:src="@mipmap/ic_launcher" + * android:src="@drawable/my_image" + * android:contentDescription="@string/my_image_description" * /> * </LinearLayout> *

  • diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index ccafa640853d071bc1c8c9596c285ceec9bfd123..d3c69725b45b6e6d072c1921c66c6428f018a502 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -1035,7 +1035,7 @@ public final class Magnifier { // Destroy the renderer. This will not proceed until pending frame callbacks complete. mRenderer.destroy(); mSurface.destroy(); - mSurfaceControl.remove(); + new SurfaceControl.Transaction().remove(mSurfaceControl).apply(); mSurfaceSession.kill(); mHandler.removeCallbacks(mMagnifierUpdater); if (mBitmap != null) { diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index d985528c38fb116b8a810cc6bc354865f7e3ce3a..6b324a541c4276938cebd30c93c9edc6e7d978f8 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -1202,13 +1202,13 @@ public class RelativeLayout extends ViewGroup { * determine where to position the view on the screen. If the view is not contained * within a relative layout, these attributes are ignored. * - * See the - * Relative Layout guide for example code demonstrating how to use relative layout’s + * See the Relative + * Layout guide for example code demonstrating how to use relative layout's * layout parameters in a layout XML. * * To learn more about layout parameters and how they differ from typical view attributes, - * see the - * Layouts guide. + * see the Layouts + * guide. * * * @attr ref android.R.styleable#RelativeLayout_Layout_layout_alignWithParentIfMissing diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index a3e89c85fcbc7f7ccf373083a6652b87f84ea3ad..51b0950a75440bc9e5e253c29798cb92683f175d 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -71,9 +71,9 @@ import java.util.List; * instead of scroll view which offers greater user interface flexibility and * support for the material design scrolling patterns.

    * - *

    To learn more about material design patterns for handling scrolling, see - * - * Scrolling techniques.

    + *

    Material Design offers guidelines on how the appearance of + * several UI components, including app bars and + * banners, should respond to gestures.

    * * @attr ref android.R.styleable#ScrollView_fillViewport */ diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 51ca8052409052bb1ff27991969b0325417a560d..d0f80936f477f295388cf94017fe69455705127c 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -999,6 +999,7 @@ public final class SelectionActionModeHelper { } private void onTimeOut() { + Log.d(LOG_TAG, "Timeout in TextClassificationAsyncTask"); if (getStatus() == Status.RUNNING) { onPostExecute(mTimeOutResultSupplier.get()); } diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index 49a0f39b3bad23db0356c18b7c29ba233e71888e..4c67b080252ab5f238716dfa9bffebc2fd4aa09c 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -433,7 +433,7 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { * to the next tabbed view, in this example). *

    * To move both the focus AND the selected tab at once, please use - * {@link #setCurrentTab}. Normally, the view logic takes care of + * {@link #focusCurrentTab}. Normally, the view logic takes care of * adjusting the focus, so unless you're circumventing the UI, * you'll probably just focus your interest here. * diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 62598fce5947fada8935ce8b2858a30b59db3f28..0918c5fdefa88709327042cfa7922081faf881ec 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -162,6 +162,8 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; @@ -977,6 +979,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } setTextInternal(""); @@ -10558,7 +10563,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Notify managers (such as {@link AutofillManager}) that are interested in text changes. + * Notify managers (such as {@link AutofillManager} and {@link ContentCaptureManager}) that are + * interested on text changes. */ private void notifyListeningManagersAfterTextChanged() { @@ -10574,6 +10580,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener afm.notifyValueChanged(TextView.this); } } + + // TODO(b/121045053): should use a flag / boolean to keep status of SHOWN / HIDDEN instead + // of using isLaidout(), so it's not called in cases where it's laid out but a + // notifyAppeared was not sent. + + // ContentCapture + if (isLaidOut() && isImportantForContentCapture() && getNotifiedContentCaptureAppeared()) { + final ContentCaptureManager cm = mContext.getSystemService(ContentCaptureManager.class); + if (cm != null && cm.isContentCaptureEnabled()) { + final ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + // TODO(b/111276913): pass flags when edited by user / add CTS test + session.notifyViewTextChanged(getAutofillId(), getText()); + } + } + } } private boolean isAutofillable() { @@ -11417,7 +11439,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final boolean isPassword = hasPasswordTransformationMethod() || isPasswordInputType(getInputType()); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { structure.setDataIsSensitive(!mTextSetFromXmlOrResourceId); } @@ -11433,8 +11456,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (mLayout == null) { + if (viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { + Log.w(LOG_TAG, "onProvideContentCaptureStructure(): calling assumeLayout()"); + } assumeLayout(); } Layout layout = mLayout; @@ -11522,7 +11549,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (viewFor == VIEW_STRUCTURE_FOR_ASSIST) { + if (viewFor == VIEW_STRUCTURE_FOR_ASSIST + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { // Extract style information that applies to the TextView as a whole. int style = 0; int typefaceStyle = getTypefaceStyle(); @@ -11550,7 +11578,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener structure.setTextStyle(getTextSize(), getCurrentTextColor(), AssistStructure.ViewNode.TEXT_COLOR_UNDEFINED /* bgColor */, style); } - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { structure.setMinTextEms(getMinEms()); structure.setMaxTextEms(getMaxEms()); int maxLength = -1; diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 00206fc38d1d40ceffa280ebbe2d4968a2fd772d..cae1f3831b4a3c50704e2b27f58fbf115b319a10 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -24,6 +24,7 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; @@ -120,6 +121,7 @@ import com.google.android.collect.Lists; import java.io.IOException; import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; @@ -164,6 +166,8 @@ public class ChooserActivity extends ResolverActivity { public static final String LAUNCH_LOCATON_DIRECT_SHARE = "direct_share"; private static final int APP_PREDICTION_SHARE_TARGET_QUERY_PACKAGE_LIMIT = 20; public static final String APP_PREDICTION_INTENT_FILTER_KEY = "intent_filter"; + + private boolean mIsAppPredictorComponentAvailable; private AppPredictor mAppPredictor; private AppPredictor.Callback mAppPredictorCallback; private Map mDirectShareAppTargetCache; @@ -176,6 +180,20 @@ public class ChooserActivity extends ResolverActivity { private static final boolean USE_SHORTCUT_MANAGER_FOR_DIRECT_TARGETS = true; private static final boolean USE_CHOOSER_TARGET_SERVICE_FOR_DIRECT_TARGETS = true; + public static final int TARGET_TYPE_DEFAULT = 0; + public static final int TARGET_TYPE_CHOOSER_TARGET = 1; + public static final int TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER = 2; + public static final int TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE = 3; + + @IntDef(flag = false, prefix = { "TARGET_TYPE_" }, value = { + TARGET_TYPE_DEFAULT, + TARGET_TYPE_CHOOSER_TARGET, + TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER, + TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ShareTargetType {} + /** * The transition time between placeholders for direct share to a message * indicating that non are available. @@ -216,9 +234,9 @@ public class ChooserActivity extends ResolverActivity { private int mCurrAvailableWidth = 0; /** {@link ChooserActivity#getBaseScore} */ - private static final float CALLER_TARGET_SCORE_BOOST = 900.f; + public static final float CALLER_TARGET_SCORE_BOOST = 900.f; /** {@link ChooserActivity#getBaseScore} */ - private static final float SHORTCUT_TARGET_SCORE_BOOST = 90.f; + public static final float SHORTCUT_TARGET_SCORE_BOOST = 90.f; private static final String TARGET_DETAILS_FRAGMENT_TAG = "targetDetailsFragment"; // TODO: Update to handle landscape instead of using static value private static final int MAX_RANKED_TARGETS = 4; @@ -441,7 +459,7 @@ public class ChooserActivity extends ResolverActivity { } if (sri.resultTargets != null) { mChooserListAdapter.addServiceResults(sri.originalTarget, - sri.resultTargets, false); + sri.resultTargets, TARGET_TYPE_CHOOSER_TARGET); } unbindService(sri.connection); sri.connection.destroy(); @@ -472,7 +490,7 @@ public class ChooserActivity extends ResolverActivity { final ServiceResultInfo resultInfo = (ServiceResultInfo) msg.obj; if (resultInfo.resultTargets != null) { mChooserListAdapter.addServiceResults(resultInfo.originalTarget, - resultInfo.resultTargets, true); + resultInfo.resultTargets, msg.arg1); } break; @@ -491,6 +509,9 @@ public class ChooserActivity extends ResolverActivity { @Override protected void onCreate(Bundle savedInstanceState) { final long intentReceivedTime = System.currentTimeMillis(); + // This is the only place this value is being set. Effectively final. + mIsAppPredictorComponentAvailable = isAppPredictionServiceAvailable(); + mIsSuccessfullySelected = false; Intent intent = getIntent(); Parcelable targetParcelable = intent.getParcelableExtra(Intent.EXTRA_INTENT); @@ -706,6 +727,38 @@ public class ChooserActivity extends ResolverActivity { } } + /** + * Returns true if app prediction service is defined and the component exists on device. + */ + @VisibleForTesting + public boolean isAppPredictionServiceAvailable() { + if (getPackageManager().getAppPredictionServicePackageName() == null) { + // Default AppPredictionService is not defined. + return false; + } + + final String appPredictionServiceName = + getString(R.string.config_defaultAppPredictionService); + if (appPredictionServiceName == null) { + return false; + } + final ComponentName appPredictionComponentName = + ComponentName.unflattenFromString(appPredictionServiceName); + if (appPredictionComponentName == null) { + return false; + } + + // Check if the app prediction component actually exists on the device. + Intent intent = new Intent(); + intent.setComponent(appPredictionComponentName); + if (getPackageManager().resolveService(intent, PackageManager.MATCH_ALL) == null) { + Log.e(TAG, "App prediction service is defined, but does not exist: " + + appPredictionServiceName); + return false; + } + return true; + } + /** * Check if the profile currently used is a work profile. * @return true if it is work profile, false if it is parent profile (or no work profile is @@ -766,6 +819,11 @@ public class ChooserActivity extends ResolverActivity { clipboardManager.setPrimaryClip(clipData); Toast.makeText(getApplicationContext(), R.string.copied, Toast.LENGTH_SHORT).show(); + // Log share completion via copy + LogMaker targetLogMaker = new LogMaker( + MetricsEvent.ACTION_ACTIVITY_CHOOSER_PICKED_SYSTEM_TARGET).setSubtype(1); + getMetricsLogger().write(targetLogMaker); + finish(); } } @@ -1178,7 +1236,7 @@ public class ChooserActivity extends ResolverActivity { mChooserListAdapter = (ChooserListAdapter) adapter; if (mCallerChooserTargets != null && mCallerChooserTargets.length > 0) { mChooserListAdapter.addServiceResults(null, Lists.newArrayList(mCallerChooserTargets), - false); + TARGET_TYPE_DEFAULT); } mChooserRowAdapter = new ChooserRowAdapter(mChooserListAdapter); if (listView != null) { @@ -1524,33 +1582,32 @@ public class ChooserActivity extends ResolverActivity { } } + // If |appTargets| is not null, results are from AppPredictionService and already sorted. + final int shortcutType = (appTargets == null ? TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER : + TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); + // Match ShareShortcutInfos with DisplayResolveInfos to be able to use the old code path // for direct share targets. After ShareSheet is refactored we should use the // ShareShortcutInfos directly. boolean resultMessageSent = false; for (int i = 0; i < driList.size(); i++) { - List chooserTargets = new ArrayList<>(); + List matchingShortcuts = new ArrayList<>(); for (int j = 0; j < resultList.size(); j++) { if (driList.get(i).getResolvedComponentName().equals( resultList.get(j).getTargetComponent())) { - ShortcutManager.ShareShortcutInfo shareShortcutInfo = resultList.get(j); - // Incoming results are ordered but without a score. Create a score - // based on the index in order to be sorted appropriately when joined - // with legacy direct share api results. - float score = Math.max(1.0f - (0.05f * j), 0.0f); - ChooserTarget chooserTarget = convertToChooserTarget(shareShortcutInfo, score); - chooserTargets.add(chooserTarget); - if (mDirectShareAppTargetCache != null && appTargets != null) { - mDirectShareAppTargetCache.put(chooserTarget, appTargets.get(j)); - } + matchingShortcuts.add(resultList.get(j)); } } - if (chooserTargets.isEmpty()) { + if (matchingShortcuts.isEmpty()) { continue; } + List chooserTargets = convertToChooserTarget( + matchingShortcuts, resultList, appTargets, shortcutType); + final Message msg = Message.obtain(); msg.what = ChooserHandler.SHORTCUT_MANAGER_SHARE_TARGET_RESULT; msg.obj = new ServiceResultInfo(driList.get(i), chooserTargets, null); + msg.arg1 = shortcutType; mChooserHandler.sendMessage(msg); resultMessageSent = true; } @@ -1584,23 +1641,69 @@ public class ChooserActivity extends ResolverActivity { return false; } - private ChooserTarget convertToChooserTarget(ShortcutManager.ShareShortcutInfo shareShortcut, - float score) { - ShortcutInfo shortcutInfo = shareShortcut.getShortcutInfo(); - Bundle extras = new Bundle(); - extras.putString(Intent.EXTRA_SHORTCUT_ID, shortcutInfo.getId()); - return new ChooserTarget( - // The name of this target. - shortcutInfo.getShortLabel(), - // Don't load the icon until it is selected to be shown - null, - // The ranking score for this target (0.0-1.0); the system will omit items with low - // scores when there are too many Direct Share items. - score, - // The name of the component to be launched if this target is chosen. - shareShortcut.getTargetComponent().clone(), - // The extra values here will be merged into the Intent when this target is chosen. - extras); + /** + * Converts a list of ShareShortcutInfos to ChooserTargets. + * @param matchingShortcuts List of shortcuts, all from the same package, that match the current + * share intent filter. + * @param allShortcuts List of all the shortcuts from all the packages on the device that are + * returned for the current sharing action. + * @param allAppTargets List of AppTargets. Null if the results are not from prediction service. + * @param shortcutType One of the values TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER or + * TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE + * @return A list of ChooserTargets sorted by score in descending order. + */ + @VisibleForTesting + @NonNull + public List convertToChooserTarget( + @NonNull List matchingShortcuts, + @NonNull List allShortcuts, + @Nullable List allAppTargets, @ShareTargetType int shortcutType) { + // A set of distinct scores for the matched shortcuts. We use index of a rank in the sorted + // list instead of the actual rank value when converting a rank to a score. + List scoreList = new ArrayList<>(); + if (shortcutType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER) { + for (int i = 0; i < matchingShortcuts.size(); i++) { + int shortcutRank = matchingShortcuts.get(i).getShortcutInfo().getRank(); + if (!scoreList.contains(shortcutRank)) { + scoreList.add(shortcutRank); + } + } + Collections.sort(scoreList); + } + + List chooserTargetList = new ArrayList<>(matchingShortcuts.size()); + for (int i = 0; i < matchingShortcuts.size(); i++) { + ShortcutInfo shortcutInfo = matchingShortcuts.get(i).getShortcutInfo(); + int indexInAllShortcuts = allShortcuts.indexOf(matchingShortcuts.get(i)); + + float score; + if (shortcutType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE) { + // Incoming results are ordered. Create a score based on index in the original list. + score = Math.max(1.0f - (0.01f * indexInAllShortcuts), 0.0f); + } else { + // Create a score based on the rank of the shortcut. + int rankIndex = scoreList.indexOf(shortcutInfo.getRank()); + score = Math.max(1.0f - (0.01f * rankIndex), 0.0f); + } + + Bundle extras = new Bundle(); + extras.putString(Intent.EXTRA_SHORTCUT_ID, shortcutInfo.getId()); + ChooserTarget chooserTarget = new ChooserTarget(shortcutInfo.getShortLabel(), + null, // Icon will be loaded later if this target is selected to be shown. + score, matchingShortcuts.get(i).getTargetComponent().clone(), extras); + + chooserTargetList.add(chooserTarget); + if (mDirectShareAppTargetCache != null && allAppTargets != null) { + mDirectShareAppTargetCache.put(chooserTarget, + allAppTargets.get(indexInAllShortcuts)); + } + } + + // Sort ChooserTargets by score in descending order + Comparator byScore = + (ChooserTarget a, ChooserTarget b) -> -Float.compare(a.getScore(), b.getScore()); + Collections.sort(chooserTargetList, byScore); + return chooserTargetList; } private String convertServiceName(String packageName, String serviceName) { @@ -1635,10 +1738,6 @@ public class ChooserActivity extends ResolverActivity { mServiceConnections.clear(); } - public void onSetupVoiceInteraction() { - // Do nothing. We'll send the voice stuff ourselves. - } - private void logDirectShareTargetReceived(int logCategory) { final long queryTime = logCategory == MetricsEvent.ACTION_DIRECT_SHARE_TARGETS_LOADED_SHORTCUT_MANAGER @@ -1693,8 +1792,10 @@ public class ChooserActivity extends ResolverActivity { @Nullable private AppPredictor getAppPredictor() { - if (mAppPredictor == null - && getPackageManager().getAppPredictionServicePackageName() != null) { + if (!mIsAppPredictorComponentAvailable) { + return null; + } + if (mAppPredictor == null) { final IntentFilter filter = getTargetIntentFilter(); Bundle extras = new Bundle(); extras.putParcelable(APP_PREDICTION_INTENT_FILTER_KEY, filter); @@ -2642,7 +2743,7 @@ public class ChooserActivity extends ResolverActivity { * if score is too low. */ public void addServiceResults(DisplayResolveInfo origTarget, List targets, - boolean isShortcutResult) { + @ShareTargetType int targetType) { if (DEBUG) { Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size() + " targets"); @@ -2652,9 +2753,12 @@ public class ChooserActivity extends ResolverActivity { return; } - final float baseScore = getBaseScore(origTarget, isShortcutResult); + final float baseScore = getBaseScore(origTarget, targetType); Collections.sort(targets, mBaseTargetComparator); + final boolean isShortcutResult = + (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER + || targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); final int maxTargets = isShortcutResult ? mMaxShortcutTargetsPerApp : MAX_CHOOSER_TARGETS_PER_APP; float lastScore = 0; @@ -2705,17 +2809,17 @@ public class ChooserActivity extends ResolverActivity { *

  • Legacy direct share targets * */ - private float getBaseScore(DisplayResolveInfo target, boolean isShortcutResult) { + public float getBaseScore(DisplayResolveInfo target, @ShareTargetType int targetType) { if (target == null) { return CALLER_TARGET_SCORE_BOOST; } - if (isShortcutResult && getAppPredictorForDirectShareIfEnabled() != null) { + if (targetType == TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE) { return SHORTCUT_TARGET_SCORE_BOOST; } float score = super.getScore(target); - if (isShortcutResult) { + if (targetType == TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER) { return score * SHORTCUT_TARGET_SCORE_BOOST; } diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index d60d5438b3a74af8c0974821056ebf1e2c4f983a..15b1d75e88d093c0b8fb56eee8ac99bae3f068d3 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -106,7 +106,7 @@ interface IBatteryStats { void notePhoneOn(); void notePhoneOff(); void notePhoneSignalStrength(in SignalStrength signalStrength); - void notePhoneDataConnectionState(int dataType, boolean hasData); + void notePhoneDataConnectionState(int dataType, boolean hasData, int serviceType); void notePhoneState(int phoneState); void noteWifiOn(); void noteWifiOff(); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 58ce03baa136e2cdf3d7c6274af2de2b2eb659c2..407a85f1bb0556c74f1d988037e73e8753063ebf 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -361,9 +361,6 @@ public class ResolverActivity extends Activity { initSuspendedColorMatrix(); - if (isVoiceInteraction()) { - onSetupVoiceInteraction(); - } final Set categories = intent.getCategories(); MetricsLogger.action(this, mAdapter.hasFilteredItem() ? MetricsProto.MetricsEvent.ACTION_SHOW_APP_DISAMBIG_APP_FEATURED @@ -442,24 +439,21 @@ public class ResolverActivity extends Activity { mSuspendedMatrixColorFilter = new ColorMatrixColorFilter(matrix); } - /** - * Perform any initialization needed for voice interaction. - */ - public void onSetupVoiceInteraction() { - // Do it right now. Subclasses may delay this and send it later. - sendVoiceChoicesIfNeeded(); - } - public void sendVoiceChoicesIfNeeded() { if (!isVoiceInteraction()) { // Clearly not needed. return; } - final Option[] options = new Option[mAdapter.getCount()]; for (int i = 0, N = options.length; i < N; i++) { - options[i] = optionForChooserTarget(mAdapter.getItem(i), i); + TargetInfo target = mAdapter.getItem(i); + if (target == null) { + // If this occurs, a new set of targets is being loaded. Let that complete, + // and have the next call to send voice choices proceed instead. + return; + } + options[i] = optionForChooserTarget(target, i); } mPickOptionRequest = new PickTargetOptionRequest( @@ -1872,7 +1866,7 @@ public class ResolverActivity extends Activity { } } - + sendVoiceChoicesIfNeeded(); postListReadyRunnable(); } diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index b27c11b524e501dcceea0d13ce3532dc48f16c7e..3003ce80cbc1b41d9ab4b5401d20e1383ca12270 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -73,13 +73,8 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } mOnColorsChangedListeners = new ArrayList<>(); - - if (wallpaperManager == null) { - Log.w(TAG, "Can't listen to color changes!"); - } else { - wallpaperManager.addOnColorsChangedListener(this, null /* handler */); - initExtractColors(wallpaperManager, immediately); - } + wallpaperManager.addOnColorsChangedListener(this, null /* handler */); + initExtractColors(wallpaperManager, immediately); } private void initExtractColors(WallpaperManager wallpaperManager, boolean immediately) { diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 8dc47a40158069fe4c3a20409811b3f662d99985..40ee511b0727af238cee6bd9c52c38e2123a96f3 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -106,7 +106,7 @@ public final class SystemUiDeviceConfigFlags { */ public static final String HASH_SALT_MAX_DAYS = "hash_salt_max_days"; - // Flags related to Assistant Handles + // Flags related to Assistant /** * (String) Which behavior mode for the Assistant Handles to use. @@ -176,11 +176,48 @@ public final class SystemUiDeviceConfigFlags { public static final String ASSIST_HANDLES_SUPPRESS_ON_APPS = "assist_handles_suppress_on_apps"; + /** + * Allow touch passthrough above assist area during a session. + */ + public static final String ASSIST_TAP_PASSTHROUGH = "assist_tap_passthrough"; + /** * (bool) Whether to show handles when taught. */ public static final String ASSIST_HANDLES_SHOW_WHEN_TAUGHT = "assist_handles_show_when_taught"; + /** + * (long) Duration per pixel, in milliseconds, of scrolling text at fast speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_FAST = + "assist_transcription_duration_per_px_fast"; + + /** + * (long) Duration per pixel, in milliseconds, of scrolling text at regular speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_REGULAR = + "assist_transcription_duration_per_px_regular"; + + /** + * (long) Duration, in milliseconds, over which text fades in. + */ + public static final String ASSIST_TRANSCRIPTION_FADE_IN_DURATION = + "assist_transcription_fade_in_duration"; + + /** + * (long) Maximum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MAX_DURATION = + "assist_transcription_max_duration"; + + /** + * (long) Minimum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MIN_DURATION = + "assist_transcription_min_duration"; + + // Flags related to brightline falsing + /** * (bool) Whether to use the new BrightLineFalsingManager. */ @@ -270,5 +307,6 @@ public final class SystemUiDeviceConfigFlags { "brightline_falsing_zigzag_y_secondary_deviance"; - private SystemUiDeviceConfigFlags() { } + private SystemUiDeviceConfigFlags() { + } } diff --git a/core/java/com/android/internal/net/VpnInfo.java b/core/java/com/android/internal/net/VpnInfo.java index b1a412871bd28dd699ff5fe5ac1628beb79fc8cf..e74af5eb50de0e6ec40b25dc1c59faf494774df8 100644 --- a/core/java/com/android/internal/net/VpnInfo.java +++ b/core/java/com/android/internal/net/VpnInfo.java @@ -19,6 +19,8 @@ package com.android.internal.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Arrays; + /** * A lightweight container used to carry information of the ongoing VPN. * Internal use only.. @@ -28,14 +30,14 @@ import android.os.Parcelable; public class VpnInfo implements Parcelable { public int ownerUid; public String vpnIface; - public String primaryUnderlyingIface; + public String[] underlyingIfaces; @Override public String toString() { return "VpnInfo{" + "ownerUid=" + ownerUid + ", vpnIface='" + vpnIface + '\'' - + ", primaryUnderlyingIface='" + primaryUnderlyingIface + '\'' + + ", underlyingIfaces='" + Arrays.toString(underlyingIfaces) + '\'' + '}'; } @@ -48,7 +50,7 @@ public class VpnInfo implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(ownerUid); dest.writeString(vpnIface); - dest.writeString(primaryUnderlyingIface); + dest.writeStringArray(underlyingIfaces); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @@ -57,7 +59,7 @@ public class VpnInfo implements Parcelable { VpnInfo info = new VpnInfo(); info.ownerUid = source.readInt(); info.vpnIface = source.readString(); - info.primaryUnderlyingIface = source.readString(); + info.underlyingIfaces = source.readStringArray(); return info; } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 3a7caa4c2fc02a0ffe7c68efe740a5634057f9d5..4573084983987e01ba1e28beba8fa9f8f6e0f38c 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -906,8 +906,6 @@ public class BatteryStatsImpl extends BatteryStats { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected StopwatchTimer mBluetoothScanTimer; - boolean mIsCellularTxPowerHigh = false; - int mMobileRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW; long mMobileRadioActiveStartTime; StopwatchTimer mMobileRadioActiveTimer; @@ -5261,16 +5259,26 @@ public class BatteryStatsImpl extends BatteryStats { } @UnsupportedAppUsage - public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { + public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData, int serviceType) { // BatteryStats uses 0 to represent no network type. // Telephony does not have a concept of no network type, and uses 0 to represent unknown. // Unknown is included in DATA_CONNECTION_OTHER. - int bin = DATA_CONNECTION_NONE; + int bin = DATA_CONNECTION_OUT_OF_SERVICE; if (hasData) { if (dataType > 0 && dataType <= TelephonyManager.MAX_NETWORK_TYPE) { bin = dataType; } else { - bin = DATA_CONNECTION_OTHER; + switch (serviceType) { + case ServiceState.STATE_OUT_OF_SERVICE: + bin = DATA_CONNECTION_OUT_OF_SERVICE; + break; + case ServiceState.STATE_EMERGENCY_ONLY: + bin = DATA_CONNECTION_EMERGENCY_SERVICE; + break; + default: + bin = DATA_CONNECTION_OTHER; + break; + } } } if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData); @@ -11190,19 +11198,9 @@ public class BatteryStatsImpl extends BatteryStats { } } if (levelMaxTimeSpent == ModemActivityInfo.TX_POWER_LEVELS - 1) { - if (!mIsCellularTxPowerHigh) { - mHistoryCur.states2 |= HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG; - addHistoryRecordLocked(elapsedRealtime, uptime); - mIsCellularTxPowerHigh = true; - } - return; - } - if (mIsCellularTxPowerHigh) { - mHistoryCur.states2 &= ~HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG; + mHistoryCur.states2 |= HistoryItem.STATE2_CELLULAR_HIGH_TX_POWER_FLAG; addHistoryRecordLocked(elapsedRealtime, uptime); - mIsCellularTxPowerHigh = false; } - return; } private final class BluetoothActivityInfoCache { @@ -13660,7 +13658,6 @@ public class BatteryStatsImpl extends BatteryStats { mCameraOnTimer.readSummaryFromParcelLocked(in); mBluetoothScanNesting = 0; mBluetoothScanTimer.readSummaryFromParcelLocked(in); - mIsCellularTxPowerHigh = false; int NRPMS = in.readInt(); if (NRPMS > 10000) { @@ -14644,7 +14641,6 @@ public class BatteryStatsImpl extends BatteryStats { mCameraOnTimer = new StopwatchTimer(mClocks, null, -13, null, mOnBatteryTimeBase, in); mBluetoothScanNesting = 0; mBluetoothScanTimer = new StopwatchTimer(mClocks, null, -14, null, mOnBatteryTimeBase, in); - mIsCellularTxPowerHigh = false; mDischargeUnplugLevel = in.readInt(); mDischargePlugLevel = in.readInt(); mDischargeCurrentLevel = in.readInt(); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 7c52a40d4494d4515fec8582581b405db4095ea5..07002d78890819e648f8a518be7e263f57d813e4 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -796,7 +796,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind updateElevation(); mAllowUpdateElevation = true; - if (changed && mResizeMode == RESIZE_MODE_DOCKED_DIVIDER) { + if (changed + && (mResizeMode == RESIZE_MODE_DOCKED_DIVIDER + || mDrawLegacyNavigationBarBackground)) { getViewRootImpl().requestInvalidateRootRenderNode(); } } diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index adf7692adc56924b67dbc4816a85dc0540c93a77..52172cf04362997f844900c3fa97b18d12b9ba96 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/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 7fd94c6859fb27d8153f9b1b0548085a22c43eff..cac691cf7d451f74d2983f1a58c624a222bc1325 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,6 +1,7 @@ package com.android.internal.util; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -13,6 +14,8 @@ import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; +import java.util.function.Consumer; + public class ScreenshotHelper { private static final String TAG = "ScreenshotHelper"; @@ -33,18 +36,59 @@ public class ScreenshotHelper { mContext = context; } + /** + * Request a screenshot be taken with a specific timeout. + * + * Added to support reducing unit test duration; the method variant without a timeout argument + * is recommended for general use. + * + * @param screenshotType The type of screenshot, for example either + * {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN} + * or + * {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION} + * @param hasStatus {@code true} if the status bar is currently showing. {@code false} + * if + * not. + * @param hasNav {@code true} if the navigation bar is currently showing. {@code + * false} + * if not. + * @param handler A handler used in case the screenshot times out + * @param completionConsumer Consumes `false` if a screenshot was not taken, and `true` if the + * screenshot was taken. + */ + public void takeScreenshot(final int screenshotType, final boolean hasStatus, + final boolean hasNav, @NonNull Handler handler, + @Nullable Consumer completionConsumer) { + takeScreenshot(screenshotType, hasStatus, hasNav, SCREENSHOT_TIMEOUT_MS, handler, + completionConsumer); + } + /** * Request a screenshot be taken. * - * @param screenshotType The type of screenshot, for example either - * {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN} - * or {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION} - * @param hasStatus {@code true} if the status bar is currently showing. {@code false} if not. - * @param hasNav {@code true} if the navigation bar is currently showing. {@code false} if not. - * @param handler A handler used in case the screenshot times out + * Added to support reducing unit test duration; the method variant without a timeout argument + * is recommended for general use. + * + * @param screenshotType The type of screenshot, for example either + * {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN} + * or + * {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION} + * @param hasStatus {@code true} if the status bar is currently showing. {@code false} + * if + * not. + * @param hasNav {@code true} if the navigation bar is currently showing. {@code + * false} + * if not. + * @param timeoutMs If the screenshot hasn't been completed within this time period, + * the screenshot attempt will be cancelled and `completionConsumer` + * will be run. + * @param handler A handler used in case the screenshot times out + * @param completionConsumer Consumes `false` if a screenshot was not taken, and `true` if the + * screenshot was taken. */ public void takeScreenshot(final int screenshotType, final boolean hasStatus, - final boolean hasNav, @NonNull Handler handler) { + final boolean hasNav, long timeoutMs, @NonNull Handler handler, + @Nullable Consumer completionConsumer) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { return; @@ -54,7 +98,8 @@ public class ScreenshotHelper { final Intent serviceIntent = new Intent(); final Runnable mScreenshotTimeout = new Runnable() { - @Override public void run() { + @Override + public void run() { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { mContext.unbindService(mScreenshotConnection); @@ -62,6 +107,9 @@ public class ScreenshotHelper { notifyScreenshotError(); } } + if (completionConsumer != null) { + completionConsumer.accept(false); + } } }; @@ -86,15 +134,22 @@ public class ScreenshotHelper { handler.removeCallbacks(mScreenshotTimeout); } } + if (completionConsumer != null) { + completionConsumer.accept(true); + } } }; msg.replyTo = new Messenger(h); - msg.arg1 = hasStatus ? 1: 0; - msg.arg2 = hasNav ? 1: 0; + msg.arg1 = hasStatus ? 1 : 0; + msg.arg2 = hasNav ? 1 : 0; + try { messenger.send(msg); } catch (RemoteException e) { Log.e(TAG, "Couldn't take screenshot: " + e); + if (completionConsumer != null) { + completionConsumer.accept(false); + } } } } @@ -115,7 +170,7 @@ public class ScreenshotHelper { Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE, UserHandle.CURRENT)) { mScreenshotConnection = conn; - handler.postDelayed(mScreenshotTimeout, SCREENSHOT_TIMEOUT_MS); + handler.postDelayed(mScreenshotTimeout, timeoutMs); } } } diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java index 344d7ef8c83f82bac0fa743b172a6a1e8825b356..8799e3d4c6bf48986a00b6fe561b29fd7351d619 100644 --- a/core/java/com/android/internal/util/XmlUtils.java +++ b/core/java/com/android/internal/util/XmlUtils.java @@ -26,6 +26,8 @@ import android.util.ArrayMap; import android.util.Base64; import android.util.Xml; +import libcore.util.HexEncoding; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -396,16 +398,7 @@ public class XmlUtils { final int N = val.length; out.attribute(null, "num", Integer.toString(N)); - StringBuilder sb = new StringBuilder(val.length*2); - for (int i=0; i> 4) & 0x0f; - sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); - h = b & 0x0f; - sb.append((char)(h >= 10 ? ('a'+h-10) : ('0'+h))); - } - - out.text(sb.toString()); + out.text(HexEncoding.encodeToString(val).toLowerCase()); out.endTag(null, "byte-array"); } @@ -1032,7 +1025,9 @@ public class XmlUtils { "Not a number in num attribute in byte-array"); } - byte[] array = new byte[num]; + // 0 len byte array does not have a text in the XML tag. So, initialize to 0 len array. + // For all other array lens, HexEncoding.decode() below overrides the array. + byte[] array = new byte[0]; int eventType = parser.getEventType(); do { @@ -1043,16 +1038,7 @@ public class XmlUtils { throw new XmlPullParserException( "Invalid value found in byte-array: " + values); } - // This is ugly, but keeping it to mirror the logic in #writeByteArrayXml. - for (int i = 0; i < num; i ++) { - char nibbleHighChar = values.charAt(2 * i); - char nibbleLowChar = values.charAt(2 * i + 1); - int nibbleHigh = nibbleHighChar > 'a' ? (nibbleHighChar - 'a' + 10) - : (nibbleHighChar - '0'); - int nibbleLow = nibbleLowChar > 'a' ? (nibbleLowChar - 'a' + 10) - : (nibbleLowChar - '0'); - array[i] = (byte) ((nibbleHigh & 0x0F) << 4 | (nibbleLow & 0x0F)); - } + array = HexEncoding.decode(values); } } else if (eventType == parser.END_TAG) { if (parser.getName().equals(endTag)) { diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index fb9ff15c79ac59785c36a33e4ec3f58da3b01897..f9cdf3d0be6141d6dda4e7699c1071c16cb34af2 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -16,6 +16,7 @@ package com.android.internal.view; +import android.graphics.Point; import android.graphics.Rect; import android.hardware.input.InputManager; import android.os.Bundle; @@ -54,6 +55,10 @@ public class BaseIWindow extends IWindow.Stub { } } + @Override + public void locationInParentDisplayChanged(Point offset) { + } + @Override public void insetsChanged(InsetsState insetsState) { } diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index 22182677babeeccf800108b1fa7c20699c3e0b1e..3f6c4d4f5634b9726251b1a989372e9f33290b33 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -626,6 +626,13 @@ public class LockPatternView extends View { invalidate(); } + /** + * If there are any cells being drawn. + */ + public boolean isEmpty() { + return mPattern.isEmpty(); + } + /** * Clear the pattern lookup table. Also reset the line fade start times for * the next attempt. diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java index e7d240a1035e6b7fd1947a58391042c30a02077c..9bb45012b61a399c8df302706da626a76d1361c2 100644 --- a/core/java/com/android/internal/widget/MediaNotificationView.java +++ b/core/java/com/android/internal/widget/MediaNotificationView.java @@ -26,6 +26,8 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RemoteViews; +import java.util.ArrayList; + /** * A TextView that can float around an image on the end. * @@ -42,6 +44,7 @@ public class MediaNotificationView extends FrameLayout { private View mMainColumn; private View mMediaContent; private int mImagePushIn; + private ArrayList mListeners; public MediaNotificationView(Context context) { this(context, null); @@ -168,4 +171,50 @@ public class MediaNotificationView extends FrameLayout { mMainColumn = findViewById(com.android.internal.R.id.notification_main_column); mMediaContent = findViewById(com.android.internal.R.id.notification_media_content); } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + super.onVisibilityAggregated(isVisible); + if (mListeners != null) { + for (int i = 0; i < mListeners.size(); i++) { + mListeners.get(i).onAggregatedVisibilityChanged(isVisible); + } + } + } + + /** + * Add a listener to receive updates on the visibility of this view + * + * @param listener The listener to add. + */ + public void addVisibilityListener(VisibilityChangeListener listener) { + if (mListeners == null) { + mListeners = new ArrayList<>(); + } + if (!mListeners.contains(listener)) { + mListeners.add(listener); + } + } + + /** + * Remove the specified listener + * + * @param listener The listener to remove. + */ + public void removeVisibilityListener(VisibilityChangeListener listener) { + if (mListeners != null) { + mListeners.remove(listener); + } + } + + /** + * Interface for receiving updates when the view's visibility changes + */ + public interface VisibilityChangeListener { + /** + * Method called when the visibility of this view has changed + * @param isVisible true if the view is now visible + */ + void onAggregatedVisibilityChanged(boolean isVisible); + } } diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index 9084f625f9cb0bff234d260853e9ff96920035c0..d48034b66266f37fdc3ae43afce56ece9b181877 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -53,6 +53,12 @@ public class PointerLocationView extends View implements InputDeviceListener, // to plot alongside the default one. Useful for testing and comparison purposes. private static final String ALT_STRATEGY_PROPERY_KEY = "debug.velocitytracker.alt"; + /** + * If set to a positive value between 1-255, shows an overlay with the approved (red) and + * rejected (blue) exclusions. + */ + private static final String GESTURE_EXCLUSION_PROP = "debug.pointerlocation.showexclusion"; + public static class PointerState { // Trace of previous points. private float[] mTraceX = new float[32]; @@ -138,8 +144,10 @@ public class PointerLocationView extends View implements InputDeviceListener, private final PointerCoords mTempCoords = new PointerCoords(); private final Region mSystemGestureExclusion = new Region(); + private final Region mSystemGestureExclusionRejected = new Region(); private final Path mSystemGestureExclusionPath = new Path(); private final Paint mSystemGestureExclusionPaint; + private final Paint mSystemGestureExclusionRejectedPaint; private final VelocityTracker mVelocity; private final VelocityTracker mAltVelocity; @@ -190,6 +198,10 @@ public class PointerLocationView extends View implements InputDeviceListener, mSystemGestureExclusionPaint.setARGB(25, 255, 0, 0); mSystemGestureExclusionPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mSystemGestureExclusionRejectedPaint = new Paint(); + mSystemGestureExclusionRejectedPaint.setARGB(25, 0, 0, 255); + mSystemGestureExclusionRejectedPaint.setStyle(Paint.Style.FILL_AND_STROKE); + PointerState ps = new PointerState(); mPointers.add(ps); mActivePointerId = 0; @@ -263,6 +275,12 @@ public class PointerLocationView extends View implements InputDeviceListener, canvas.drawPath(mSystemGestureExclusionPath, mSystemGestureExclusionPaint); } + if (!mSystemGestureExclusionRejected.isEmpty()) { + mSystemGestureExclusionPath.reset(); + mSystemGestureExclusionRejected.getBoundaryPath(mSystemGestureExclusionPath); + canvas.drawPath(mSystemGestureExclusionPath, mSystemGestureExclusionRejectedPaint); + } + // Labels if (mActivePointerId >= 0) { final PointerState ps = mPointers.get(mActivePointerId); @@ -754,6 +772,9 @@ public class PointerLocationView extends View implements InputDeviceListener, } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } + final int alpha = systemGestureExclusionOpacity(); + mSystemGestureExclusionPaint.setAlpha(alpha); + mSystemGestureExclusionRejectedPaint.setAlpha(alpha); } else { mSystemGestureExclusion.setEmpty(); } @@ -805,7 +826,12 @@ public class PointerLocationView extends View implements InputDeviceListener, } private static boolean shouldShowSystemGestureExclusion() { - return SystemProperties.getBoolean("debug.pointerlocation.showexclusion", false); + return systemGestureExclusionOpacity() > 0; + } + + private static int systemGestureExclusionOpacity() { + int x = SystemProperties.getInt(GESTURE_EXCLUSION_PROP, 0); + return x >= 0 && x <= 255 ? x : 0; } // HACK @@ -928,12 +954,19 @@ public class PointerLocationView extends View implements InputDeviceListener, private ISystemGestureExclusionListener mSystemGestureExclusionListener = new ISystemGestureExclusionListener.Stub() { @Override - public void onSystemGestureExclusionChanged(int displayId, Region systemGestureExclusion) { + public void onSystemGestureExclusionChanged(int displayId, Region systemGestureExclusion, + Region systemGestureExclusionUnrestricted) { Region exclusion = Region.obtain(systemGestureExclusion); + Region rejected = Region.obtain(); + if (systemGestureExclusionUnrestricted != null) { + rejected.set(systemGestureExclusionUnrestricted); + rejected.op(exclusion, Region.Op.DIFFERENCE); + } Handler handler = getHandler(); if (handler != null) { handler.post(() -> { mSystemGestureExclusion.set(exclusion); + mSystemGestureExclusionRejected.set(rejected); exclusion.recycle(); invalidate(); }); diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 9fc79cb606e6fc6284eeee7a8494f0ff1c7fb1a0..510b321e807053d61081c6152dc35f874549dce9 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -53,6 +53,8 @@ import java.util.Map; /** * Loads global system configuration info. + * Note: Initializing this class hits the disk and is slow. This class should generally only be + * accessed by the system_server process. */ public class SystemConfig { static final String TAG = "SystemConfig"; @@ -209,6 +211,11 @@ public class SystemConfig { private final ArraySet mBugreportWhitelistedPackages = new ArraySet<>(); public static SystemConfig getInstance() { + if (!isSystemProcess()) { + Slog.wtf(TAG, "SystemConfig is being accessed by a process other than " + + "system_server."); + } + synchronized (SystemConfig.class) { if (sInstance == null) { sInstance = new SystemConfig(); @@ -1154,4 +1161,8 @@ public class SystemConfig { mSplitPermissions.add(new SplitPermissionInfo(splitPerm, newPermissions, targetSdk)); } } + + private static boolean isSystemProcess() { + return Process.myUid() == Process.SYSTEM_UID; + } } diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp index a1d1d4f0733d673e446edf810023d133999d5996..57d16496fca5dcd8517aa0abb2e3f6cfdd071354 100644 --- a/core/jni/android_hardware_input_InputWindowHandle.cpp +++ b/core/jni/android_hardware_input_InputWindowHandle.cpp @@ -28,6 +28,7 @@ #include "android_hardware_input_InputWindowHandle.h" #include "android_hardware_input_InputApplicationHandle.h" #include "android_util_Binder.h" +#include namespace android { @@ -78,6 +79,12 @@ NativeInputWindowHandle::NativeInputWindowHandle(jweak objWeak) : NativeInputWindowHandle::~NativeInputWindowHandle() { JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObjWeak); + + // Clear the weak reference to the layer handle and flush any binder ref count operations so we + // do not hold on to any binder references. + // TODO(b/139697085) remove this after it can be flushed automatically + mInfo.touchableRegionCropHandle.clear(); + IPCThreadState::self()->flushCommands(); } jobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) { diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 14dbabb1ce022dc7c17c795963f472e3a5c56d51..c3e7a36bef78a26d8ff14c7ea340f4a0f2a58354 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -575,7 +575,7 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o if (outArray != NULL) { outLen = MEMINFO_COUNT; for (int i = 0; i < outLen; i++) { - if (i == MEMINFO_VMALLOC_USED) { + if (i == MEMINFO_VMALLOC_USED && mem[i] == 0) { outArray[i] = smi.ReadVmallocInfo() / 1024; continue; } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 8d702d11d8fea271a92200c4ed9f777acd13e73a..ba538a855f8126702d6e4a0657cba548fb76da1c 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -48,7 +48,8 @@ static struct { class NativeDisplayEventReceiver : public DisplayEventDispatcher { public: NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp& messageQueue, jint vsyncSource); + jobject receiverWeak, const sp& messageQueue, jint vsyncSource, + jint configChanged); void dispose(); @@ -68,9 +69,11 @@ private: NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp& messageQueue, jint vsyncSource) : + jobject receiverWeak, const sp& messageQueue, jint vsyncSource, + jint configChanged) : DisplayEventDispatcher(messageQueue->getLooper(), - static_cast(vsyncSource)), + static_cast(vsyncSource), + static_cast(configChanged)), mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)), mMessageQueue(messageQueue) { ALOGV("receiver %p ~ Initializing display event receiver.", this); @@ -136,7 +139,7 @@ void NativeDisplayEventReceiver::dispatchConfigChanged(nsecs_t timestamp, static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, - jobject messageQueueObj, jint vsyncSource) { + jobject messageQueueObj, jint vsyncSource, jint configChanged) { sp messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); if (messageQueue == NULL) { jniThrowRuntimeException(env, "MessageQueue is not initialized."); @@ -144,7 +147,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } sp receiver = new NativeDisplayEventReceiver(env, - receiverWeak, messageQueue, vsyncSource); + receiverWeak, messageQueue, vsyncSource, configChanged); status_t status = receiver->initialize(); if (status) { String8 message; @@ -179,7 +182,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;I)J", + "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;II)J", (void*)nativeInit }, { "nativeDispose", "(J)V", diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index ccadc7d7c22a8199a2e2cc6ab58e2f5fcb0816a1..ff14a2acc4d776b52f0c5172e3f870d7b0ff82fa 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -75,6 +75,24 @@ static struct { jfieldID bottom; } gRectClassInfo; +class JNamedColorSpace { +public: + // ColorSpace.Named.SRGB.ordinal() = 0; + static constexpr jint SRGB = 0; + + // ColorSpace.Named.DISPLAY_P3.ordinal() = 7; + static constexpr jint DISPLAY_P3 = 7; +}; + +constexpr ui::Dataspace fromNamedColorSpaceValueToDataspace(const jint colorSpace) { + switch (colorSpace) { + case JNamedColorSpace::DISPLAY_P3: + return ui::Dataspace::DISPLAY_P3; + default: + return ui::Dataspace::V0_SRGB; + } +} + // ---------------------------------------------------------------------------- // this is just a pointer we use to pass to inc/decStrong @@ -425,11 +443,12 @@ static jint nativeForceScopedDisconnect(JNIEnv *env, jclass clazz, jlong nativeO return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal); } -static jint nativeAttachAndQueueBuffer(JNIEnv *env, jclass clazz, jlong nativeObject, - jobject graphicBuffer) { +static jint nativeAttachAndQueueBufferWithColorSpace(JNIEnv *env, jclass clazz, jlong nativeObject, + jobject graphicBuffer, jint colorSpaceId) { Surface* surface = reinterpret_cast(nativeObject); sp bp = graphicBufferForJavaObject(env, graphicBuffer); - int err = Surface::attachAndQueueBuffer(surface, bp); + int err = Surface::attachAndQueueBufferWithDataspace(surface, bp, + fromNamedColorSpaceValueToDataspace(colorSpaceId)); return err; } @@ -531,7 +550,8 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber }, {"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode }, {"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect}, - {"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer}, + {"nativeAttachAndQueueBufferWithColorSpace", "(JLandroid/graphics/GraphicBuffer;I)I", + (void*)nativeAttachAndQueueBufferWithColorSpace}, {"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled}, {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 986771dad802d151483901ed2dafaa93fc0b3998..030d3be8a6707b7cce377d3e1a5f112942f8f687 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -217,12 +217,6 @@ static void nativeRelease(JNIEnv* env, jclass clazz, jlong nativeObject) { ctrl->decStrong((void *)nativeCreate); } -static void nativeDestroy(JNIEnv* env, jclass clazz, jlong nativeObject) { - sp ctrl(reinterpret_cast(nativeObject)); - ctrl->destroy(); - ctrl->decStrong((void *)nativeCreate); -} - static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) { SurfaceControl* const ctrl = reinterpret_cast(nativeObject); if (ctrl != NULL) { @@ -1268,8 +1262,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeWriteToParcel }, {"nativeRelease", "(J)V", (void*)nativeRelease }, - {"nativeDestroy", "(J)V", - (void*)nativeDestroy }, {"nativeDisconnect", "(J)V", (void*)nativeDisconnect }, {"nativeCreateTransaction", "()J", diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index c023438eecc232c1c0342233795bd3bef61f8a44..f817c9bec3f5b0d418702aa67cd6f1297b43be49 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -2401,4 +2401,9 @@ enum PageId { // OS: Q // Note: Gear icon is shown next to gesture navigation preference and opens sensitivity dialog SETTINGS_GESTURE_NAV_BACK_SENSITIVITY_DLG = 1748; + + // OPEN: Settings > System > Aware > Aware Display + // CATEGORY: SETTINGS + // OS: Q + SETTINGS_AWARE_DISPLAY = 1750; } diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index 8becd4a15e8f50c9298b0944c2279819987d7fd0..b0bf2912636370c9bacb84b801ae835db443f783 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -688,6 +688,7 @@ message GlobalSettingsProto { // Configuration options for smart replies and smart actions in notifications. This is // encoded as a key=value list separated by commas. optional SettingProto smart_suggestions_in_notifications_flags = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto bubbles = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Notification notification = 82; diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index fed2efaf8a78f03a5dc4f21cc42b93b68cc825cb..61799eefdca643a44b6657102cde9c816af470ba 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -198,11 +198,19 @@ message SecureSettingsProto { optional SettingProto silence_alarms_count = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_calls_count = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto silence_notification_count = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // del: silence_notification_count = 5 optional SettingProto silence_timer_count = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_count = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_enabled = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + optional SettingProto silence_alarms_touch_count = 9 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_calls_touch_count = 10 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_timer_touch_count = 11 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto skip_touch_count = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Gesture gesture = 74; diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto index af6fea017bef4a32687595f8d13459f40e8be0a0..9eaabfbca4636b9284cace4343957132f3a6757f 100644 --- a/core/proto/android/stats/dnsresolver/dns_resolver.proto +++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto @@ -1,214 +1,217 @@ -/* - * 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. - */ -syntax = "proto2"; -package android.stats.dnsresolver; - -enum EventType { - EVENT_UNKNOWN = 0; - EVENT_GETADDRINFO = 1; - EVENT_GETHOSTBYNAME = 2; - EVENT_GETHOSTBYADDR = 3; - EVENT_RES_NSEND = 4; -} - -// The return value of the DNS resolver for each DNS lookups. -// bionic/libc/include/netdb.h -// system/netd/resolv/include/netd_resolv/resolv.h -enum ReturnCode { - RC_EAI_NO_ERROR = 0; - RC_EAI_ADDRFAMILY = 1; - RC_EAI_AGAIN = 2; - RC_EAI_BADFLAGS = 3; - RC_EAI_FAIL = 4; - RC_EAI_FAMILY = 5; - RC_EAI_MEMORY = 6; - RC_EAI_NODATA = 7; - RC_EAI_NONAME = 8; - RC_EAI_SERVICE = 9; - RC_EAI_SOCKTYPE = 10; - RC_EAI_SYSTEM = 11; - RC_EAI_BADHINTS = 12; - RC_EAI_PROTOCOL = 13; - RC_EAI_OVERFLOW = 14; - RC_RESOLV_TIMEOUT = 255; - RC_EAI_MAX = 256; -} - -enum NsRcode { - NS_R_NO_ERROR = 0; // No error occurred. - NS_R_FORMERR = 1; // Format error. - NS_R_SERVFAIL = 2; // Server failure. - NS_R_NXDOMAIN = 3; // Name error. - NS_R_NOTIMPL = 4; // Unimplemented. - NS_R_REFUSED = 5; // Operation refused. - // these are for BIND_UPDATE - NS_R_YXDOMAIN = 6; // Name exists - NS_R_YXRRSET = 7; // RRset exists - NS_R_NXRRSET = 8; // RRset does not exist - NS_R_NOTAUTH = 9; // Not authoritative for zone - NS_R_NOTZONE = 10; // Zone of record different from zone section - NS_R_MAX = 11; - // The following are EDNS extended rcodes - NS_R_BADVERS = 16; - // The following are TSIG errors - // NS_R_BADSIG = 16, - NS_R_BADKEY = 17; - NS_R_BADTIME = 18; -} - -// Currently defined type values for resources and queries. -enum NsType { - NS_T_INVALID = 0; // Cookie. - NS_T_A = 1; // Host address. - NS_T_NS = 2; // Authoritative server. - NS_T_MD = 3; // Mail destination. - NS_T_MF = 4; // Mail forwarder. - NS_T_CNAME = 5; // Canonical name. - NS_T_SOA = 6; // Start of authority zone. - NS_T_MB = 7; // Mailbox domain name. - NS_T_MG = 8; // Mail group member. - NS_T_MR = 9; // Mail rename name. - NS_T_NULL = 10; // Null resource record. - NS_T_WKS = 11; // Well known service. - NS_T_PTR = 12; // Domain name pointer. - NS_T_HINFO = 13; // Host information. - NS_T_MINFO = 14; // Mailbox information. - NS_T_MX = 15; // Mail routing information. - NS_T_TXT = 16; // Text strings. - NS_T_RP = 17; // Responsible person. - NS_T_AFSDB = 18; // AFS cell database. - NS_T_X25 = 19; // X_25 calling address. - NS_T_ISDN = 20; // ISDN calling address. - NS_T_RT = 21; // Router. - NS_T_NSAP = 22; // NSAP address. - NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). - NS_T_SIG = 24; // Security signature. - NS_T_KEY = 25; // Security key. - NS_T_PX = 26; // X.400 mail mapping. - NS_T_GPOS = 27; // Geographical position (withdrawn). - NS_T_AAAA = 28; // IPv6 Address. - NS_T_LOC = 29; // Location Information. - NS_T_NXT = 30; // Next domain (security). - NS_T_EID = 31; // Endpoint identifier. - NS_T_NIMLOC = 32; // Nimrod Locator. - NS_T_SRV = 33; // Server Selection. - NS_T_ATMA = 34; // ATM Address - NS_T_NAPTR = 35; // Naming Authority PoinTeR - NS_T_KX = 36; // Key Exchange - NS_T_CERT = 37; // Certification record - NS_T_A6 = 38; // IPv6 address (experimental) - NS_T_DNAME = 39; // Non-terminal DNAME - NS_T_SINK = 40; // Kitchen sink (experimentatl) - NS_T_OPT = 41; // EDNS0 option (meta-RR) - NS_T_APL = 42; // Address prefix list (RFC 3123) - NS_T_DS = 43; // Delegation Signer - NS_T_SSHFP = 44; // SSH Fingerprint - NS_T_IPSECKEY = 45; // IPSEC Key - NS_T_RRSIG = 46; // RRset Signature - NS_T_NSEC = 47; // Negative security - NS_T_DNSKEY = 48; // DNS Key - NS_T_DHCID = 49; // Dynamic host configuratin identifier - NS_T_NSEC3 = 50; // Negative security type 3 - NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters - NS_T_HIP = 55; // Host Identity Protocol - NS_T_SPF = 99; // Sender Policy Framework - NS_T_TKEY = 249; // Transaction key - NS_T_TSIG = 250; // Transaction signature. - NS_T_IXFR = 251; // Incremental zone transfer. - NS_T_AXFR = 252; // Transfer zone of authority. - NS_T_MAILB = 253; // Transfer mailbox records. - NS_T_MAILA = 254; // Transfer mail agent records. - NS_T_ANY = 255; // Wildcard match. - NS_T_ZXFR = 256; // BIND-specific, nonstandard. - NS_T_DLV = 32769; // DNSSEC look-aside validatation. - NS_T_MAX = 65536; -} - -enum IpVersion { - IV_UNKNOWN = 0; - IV_IPV4 = 1; - IV_IPV6 = 2; -} - -enum TransportType { - TT_UNKNOWN = 0; - TT_UDP = 1; - TT_TCP = 2; - TT_DOT = 3; -} - -enum PrivateDnsModes { - PDM_UNKNOWN = 0; - PDM_OFF = 1; - PDM_OPPORTUNISTIC = 2; - PDM_STRICT = 3; -} - -enum Transport { - // Indicates this network uses a Cellular transport. - TRANSPORT_DEFAULT = 0; // TRANSPORT_CELLULAR - // Indicates this network uses a Wi-Fi transport. - TRANSPORT_WIFI = 1; - // Indicates this network uses a Bluetooth transport. - TRANSPORT_BLUETOOTH = 2; - // Indicates this network uses an Ethernet transport. - TRANSPORT_ETHERNET = 3; - // Indicates this network uses a VPN transport. - TRANSPORT_VPN = 4; - // Indicates this network uses a Wi-Fi Aware transport. - TRANSPORT_WIFI_AWARE = 5; - // Indicates this network uses a LoWPAN transport. - TRANSPORT_LOWPAN = 6; -} - -enum CacheStatus{ - // the cache can't handle that kind of queries. - // or the answer buffer is too small. - CS_UNSUPPORTED = 0; - // the cache doesn't know about this query. - CS_NOTFOUND = 1; - // the cache found the answer. - CS_FOUND = 2; - // Don't do anything on cache. - CS_SKIP = 3; -} - -message DnsQueryEvent { - optional android.stats.dnsresolver.NsRcode rcode = 1; - - optional android.stats.dnsresolver.NsType type = 2; - - optional android.stats.dnsresolver.CacheStatus cache_hit = 3; - - optional android.stats.dnsresolver.IpVersion ip_version = 4; - - optional android.stats.dnsresolver.TransportType transport = 5; - - // Number of DNS query retry times - optional int32 retry_times = 6; - - // Ordinal number of name server. - optional int32 dns_server_count = 7; - - // Used only by TCP and DOT. True for new connections. - optional bool connected = 8; - - optional int32 latency_micros = 9; -} - -message DnsQueryEvents { - repeated DnsQueryEvent dns_query_event = 1; -} +/* + * 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. + */ +syntax = "proto2"; +package android.stats.dnsresolver; + +enum EventType { + EVENT_UNKNOWN = 0; + EVENT_GETADDRINFO = 1; + EVENT_GETHOSTBYNAME = 2; + EVENT_GETHOSTBYADDR = 3; + EVENT_RES_NSEND = 4; +} + +// The return value of the DNS resolver for each DNS lookups. +// bionic/libc/include/netdb.h +// system/netd/resolv/include/netd_resolv/resolv.h +enum ReturnCode { + RC_EAI_NO_ERROR = 0; + RC_EAI_ADDRFAMILY = 1; + RC_EAI_AGAIN = 2; + RC_EAI_BADFLAGS = 3; + RC_EAI_FAIL = 4; + RC_EAI_FAMILY = 5; + RC_EAI_MEMORY = 6; + RC_EAI_NODATA = 7; + RC_EAI_NONAME = 8; + RC_EAI_SERVICE = 9; + RC_EAI_SOCKTYPE = 10; + RC_EAI_SYSTEM = 11; + RC_EAI_BADHINTS = 12; + RC_EAI_PROTOCOL = 13; + RC_EAI_OVERFLOW = 14; + RC_RESOLV_TIMEOUT = 255; + RC_EAI_MAX = 256; +} + +enum NsRcode { + NS_R_NO_ERROR = 0; // No error occurred. + NS_R_FORMERR = 1; // Format error. + NS_R_SERVFAIL = 2; // Server failure. + NS_R_NXDOMAIN = 3; // Name error. + NS_R_NOTIMPL = 4; // Unimplemented. + NS_R_REFUSED = 5; // Operation refused. + // these are for BIND_UPDATE + NS_R_YXDOMAIN = 6; // Name exists + NS_R_YXRRSET = 7; // RRset exists + NS_R_NXRRSET = 8; // RRset does not exist + NS_R_NOTAUTH = 9; // Not authoritative for zone + NS_R_NOTZONE = 10; // Zone of record different from zone section + NS_R_MAX = 11; + // The following are EDNS extended rcodes + NS_R_BADVERS = 16; + // The following are TSIG errors + // NS_R_BADSIG = 16, + NS_R_BADKEY = 17; + NS_R_BADTIME = 18; + NS_R_INTERNAL_ERROR = 254; + NS_R_TIMEOUT = 255; +} + +// Currently defined type values for resources and queries. +enum NsType { + NS_T_INVALID = 0; // Cookie. + NS_T_A = 1; // Host address. + NS_T_NS = 2; // Authoritative server. + NS_T_MD = 3; // Mail destination. + NS_T_MF = 4; // Mail forwarder. + NS_T_CNAME = 5; // Canonical name. + NS_T_SOA = 6; // Start of authority zone. + NS_T_MB = 7; // Mailbox domain name. + NS_T_MG = 8; // Mail group member. + NS_T_MR = 9; // Mail rename name. + NS_T_NULL = 10; // Null resource record. + NS_T_WKS = 11; // Well known service. + NS_T_PTR = 12; // Domain name pointer. + NS_T_HINFO = 13; // Host information. + NS_T_MINFO = 14; // Mailbox information. + NS_T_MX = 15; // Mail routing information. + NS_T_TXT = 16; // Text strings. + NS_T_RP = 17; // Responsible person. + NS_T_AFSDB = 18; // AFS cell database. + NS_T_X25 = 19; // X_25 calling address. + NS_T_ISDN = 20; // ISDN calling address. + NS_T_RT = 21; // Router. + NS_T_NSAP = 22; // NSAP address. + NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). + NS_T_SIG = 24; // Security signature. + NS_T_KEY = 25; // Security key. + NS_T_PX = 26; // X.400 mail mapping. + NS_T_GPOS = 27; // Geographical position (withdrawn). + NS_T_AAAA = 28; // IPv6 Address. + NS_T_LOC = 29; // Location Information. + NS_T_NXT = 30; // Next domain (security). + NS_T_EID = 31; // Endpoint identifier. + NS_T_NIMLOC = 32; // Nimrod Locator. + NS_T_SRV = 33; // Server Selection. + NS_T_ATMA = 34; // ATM Address + NS_T_NAPTR = 35; // Naming Authority PoinTeR + NS_T_KX = 36; // Key Exchange + NS_T_CERT = 37; // Certification record + NS_T_A6 = 38; // IPv6 address (experimental) + NS_T_DNAME = 39; // Non-terminal DNAME + NS_T_SINK = 40; // Kitchen sink (experimentatl) + NS_T_OPT = 41; // EDNS0 option (meta-RR) + NS_T_APL = 42; // Address prefix list (RFC 3123) + NS_T_DS = 43; // Delegation Signer + NS_T_SSHFP = 44; // SSH Fingerprint + NS_T_IPSECKEY = 45; // IPSEC Key + NS_T_RRSIG = 46; // RRset Signature + NS_T_NSEC = 47; // Negative security + NS_T_DNSKEY = 48; // DNS Key + NS_T_DHCID = 49; // Dynamic host configuratin identifier + NS_T_NSEC3 = 50; // Negative security type 3 + NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters + NS_T_HIP = 55; // Host Identity Protocol + NS_T_SPF = 99; // Sender Policy Framework + NS_T_TKEY = 249; // Transaction key + NS_T_TSIG = 250; // Transaction signature. + NS_T_IXFR = 251; // Incremental zone transfer. + NS_T_AXFR = 252; // Transfer zone of authority. + NS_T_MAILB = 253; // Transfer mailbox records. + NS_T_MAILA = 254; // Transfer mail agent records. + NS_T_ANY = 255; // Wildcard match. + NS_T_ZXFR = 256; // BIND-specific, nonstandard. + NS_T_DLV = 32769; // DNSSEC look-aside validatation. + NS_T_MAX = 65536; +} + +enum IpVersion { + IV_UNKNOWN = 0; + IV_IPV4 = 1; + IV_IPV6 = 2; +} + +enum Protocol { + PROTO_UNKNOWN = 0; + PROTO_UDP = 1; + PROTO_TCP = 2; + PROTO_DOT = 3; +} + +enum PrivateDnsModes { + PDM_UNKNOWN = 0; + PDM_OFF = 1; + PDM_OPPORTUNISTIC = 2; + PDM_STRICT = 3; +} + +enum NetworkType { + NT_UNKNOWN = 0; + // Indicates this network uses a Cellular transport. + NT_CELLULAR = 1; + // Indicates this network uses a Wi-Fi transport. + NT_WIFI = 2; + // Indicates this network uses a Bluetooth transport. + NT_BLUETOOTH = 3; + // Indicates this network uses an Ethernet transport. + NT_ETHERNET = 4; + // Indicates this network uses a VPN transport. + NT_VPN = 5; + // Indicates this network uses a Wi-Fi Aware transport. + NT_WIFI_AWARE = 6; + // Indicates this network uses a LoWPAN transport. + NT_LOWPAN = 7; +} + +enum CacheStatus{ + // the cache can't handle that kind of queries. + // or the answer buffer is too small. + CS_UNSUPPORTED = 0; + // the cache doesn't know about this query. + CS_NOTFOUND = 1; + // the cache found the answer. + CS_FOUND = 2; + // Don't do anything on cache. + CS_SKIP = 3; +} + +message DnsQueryEvent { + optional android.stats.dnsresolver.NsRcode rcode = 1; + + optional android.stats.dnsresolver.NsType type = 2; + + optional android.stats.dnsresolver.CacheStatus cache_hit = 3; + + optional android.stats.dnsresolver.IpVersion ip_version = 4; + + optional android.stats.dnsresolver.Protocol protocol = 5; + + // Number of DNS query retry times + optional int32 retry_times = 6; + + // Ordinal number of name server. + optional int32 dns_server_index = 7; + + // Used only by TCP and DOT. True for new connections. + optional bool connected = 8; + + optional int32 latency_micros = 9; +} + +message DnsQueryEvents { + repeated DnsQueryEvent dns_query_event = 1; +} diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index f0cfc278834733646fb0b37028bfc95eecae5835..ce290d15f3550daa289d4b94aa04d96624a2a249 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -759,7 +759,7 @@

    Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. @hide Pending API council approval --> @@ -884,7 +884,7 @@ targetSdkVersion} is 4 or higher.

    This is a soft restricted permission which cannot be held by an app it its - full form until the installer on record did not whitelist the permission. + full form until the installer on record whitelists the permission. Specifically, if the permission is whitelisted the holder app can access external storage and the visual and aural media collections while if the permission is not whitelisted the holder app can only access to the visual @@ -892,7 +892,7 @@ meaning that the whitelist state can be specified only at install time and cannot change until the app is installed. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. - --> +

    Protection level: dangerous --> Is this permission is not whitelisted for an app that targets an API level before +

    If this permission is not whitelisted for an app that targets an API level before {@link android.os.Build.VERSION_CODES#Q} this permission cannot be granted to apps.

    +

    Protection level: dangerous

    --> + user's shared collection. +

    Protection level: dangerous --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. --> Protection level: dangerous

    This is a hard restricted permission which cannot be held by an app until - the installer on record did not whitelist the permission. For more details see + the installer on record whitelists the permission. For more details see {@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}. @deprecated Applications should use {@link android.telecom.CallRedirectionService} instead @@ -1749,7 +1751,7 @@ +

    Not for use by third-party applications. --> @@ -2599,7 +2601,8 @@ android:protectionLevel="signature" /> + as locale. +

    Protection level: signature|privileged|development --> @@ -2898,7 +2901,8 @@ - + @@ -3477,7 +3481,8 @@ android:protectionLevel="signature" /> + but signals for us to quietly ignore calls instead of throwing an exception. +

    Protection level: signature|privileged --> @@ -3835,7 +3840,8 @@ + device can grant permission through the Settings application. +

    Protection level: signature|privileged|development|appop --> @@ -3858,14 +3864,14 @@ +

    Protection level: normal --> - + @@ -3895,7 +3901,8 @@ android:protectionLevel="signature" /> + to ensure that only the system can bind to it. +

    Protection level: signature|privileged --> @@ -3937,7 +3944,8 @@ to the path in the provider where global search queries are performed. This permission can not be held by regular applications; it is used by applications to protect themselves from everyone else - besides global search. --> + besides global search. +

    Protection level: signature|privileged --> @@ -4476,7 +4484,8 @@ - + @@ -4546,7 +4555,8 @@ - + @@ -4578,13 +4588,15 @@ - + + intents}. +

    Protection level: normal --> diff --git a/core/res/res/anim/lock_in.xml b/core/res/res/anim/lock_in.xml deleted file mode 100644 index c7014e80d33ec236078e44b0147ad1bc23cb2e6c..0000000000000000000000000000000000000000 --- a/core/res/res/anim/lock_in.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core/res/res/anim/lock_screen_behind_enter_subtle.xml b/core/res/res/anim/lock_screen_behind_enter_subtle.xml new file mode 100644 index 0000000000000000000000000000000000000000..f9f69b12514c47beed7bc5dc5c00085457fc04fc --- /dev/null +++ b/core/res/res/anim/lock_screen_behind_enter_subtle.xml @@ -0,0 +1,33 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/res/drawable/ic_audio_alarm.xml b/core/res/res/drawable/ic_audio_alarm.xml index 96206ea3ce57be8e098d29cdb5a217ae62a34323..93f9f8f99cdc714c2a1695ac08a00cd4424656ea 100644 --- a/core/res/res/drawable/ic_audio_alarm.xml +++ b/core/res/res/drawable/ic_audio_alarm.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> diff --git a/core/res/res/drawable/ic_audio_alarm_mute.xml b/core/res/res/drawable/ic_audio_alarm_mute.xml index 7f248c3b33e6be9c044d61ce77dd92f9510e3203..510a7c630fd2e999b586dd37a4b2c203c5688aac 100644 --- a/core/res/res/drawable/ic_audio_alarm_mute.xml +++ b/core/res/res/drawable/ic_audio_alarm_mute.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> diff --git a/core/res/res/drawable/ic_battery_80_24dp.xml b/core/res/res/drawable/ic_battery_80_24dp.xml new file mode 100644 index 0000000000000000000000000000000000000000..2513d0d6d6153fd82d929c715626058431b39b7e --- /dev/null +++ b/core/res/res/drawable/ic_battery_80_24dp.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file diff --git a/core/res/res/drawable/ic_bluetooth_share_icon.xml b/core/res/res/drawable/ic_bluetooth_share_icon.xml index 2152af55d5b6acb3a3ee41628ce310dfa46a1bdf..6acfd57e669f12171d8e99207fde16f07bb5957b 100644 --- a/core/res/res/drawable/ic_bluetooth_share_icon.xml +++ b/core/res/res/drawable/ic_bluetooth_share_icon.xml @@ -19,7 +19,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="@android:color/accent_device_default_light"> + android:tint="@*android:color/accent_device_default_light"> diff --git a/core/res/res/drawable/ic_file_copy.xml b/core/res/res/drawable/ic_file_copy.xml index b6d5e7328c404cd26bc232360532ce0329ed9de1..d05b55f1279fa3513b3569fd069224a2f148c133 100644 --- a/core/res/res/drawable/ic_file_copy.xml +++ b/core/res/res/drawable/ic_file_copy.xml @@ -16,9 +16,10 @@ + android:fillColor="@android:color/white"/> diff --git a/core/res/res/drawable/ic_qs_auto_rotate.xml b/core/res/res/drawable/ic_qs_auto_rotate.xml index 47e1059fab44fb669a6a9b5bb35c24fa93116422..8858e2b778bb7392c4ab3303796b993fbed23f53 100644 --- a/core/res/res/drawable/ic_qs_auto_rotate.xml +++ b/core/res/res/drawable/ic_qs_auto_rotate.xml @@ -16,8 +16,8 @@ --> diff --git a/core/res/res/drawable/ic_qs_flashlight.xml b/core/res/res/drawable/ic_qs_flashlight.xml index e63595300d5f691ac5b2d22b1dcd74ad5a5c8e6c..59b0ccd493dd710eca9d06a68c5c15118056a5f7 100644 --- a/core/res/res/drawable/ic_qs_flashlight.xml +++ b/core/res/res/drawable/ic_qs_flashlight.xml @@ -15,8 +15,8 @@ limitations under the License. --> - \ No newline at end of file + diff --git a/core/res/res/drawable/perm_group_activity_recognition.xml b/core/res/res/drawable/perm_group_activity_recognition.xml index 0ade6c67417146f474659bac8af5707cb86d73e5..ef025acbcb0c1a3a6249e382bd9fb34b6b06c993 100644 --- a/core/res/res/drawable/perm_group_activity_recognition.xml +++ b/core/res/res/drawable/perm_group_activity_recognition.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_aural.xml b/core/res/res/drawable/perm_group_aural.xml index b2737f24b86e6705d7c712df4523fff1815cf546..4b4c62cb73b68f05f4a3e290ac54be9b7cfadc76 100644 --- a/core/res/res/drawable/perm_group_aural.xml +++ b/core/res/res/drawable/perm_group_aural.xml @@ -16,6 +16,7 @@ Copyright (C) 2015 The Android Open Source Project - - \ No newline at end of file + diff --git a/core/res/res/drawable/perm_group_call_log.xml b/core/res/res/drawable/perm_group_call_log.xml index 0dfdbee4e600c3dafef7d3ad87619e1b4adefdd3..a37ed88bebfcfe42733c20a9b98e32d641d0841d 100644 --- a/core/res/res/drawable/perm_group_call_log.xml +++ b/core/res/res/drawable/perm_group_call_log.xml @@ -18,6 +18,7 @@ diff --git a/core/res/res/drawable/perm_group_contacts.xml b/core/res/res/drawable/perm_group_contacts.xml index b834a27bac4b0dd1948f3cf8158f79d9f5e8d351..dd6ae210181f53ee706edc8a1cd2d43b8bcefc13 100644 --- a/core/res/res/drawable/perm_group_contacts.xml +++ b/core/res/res/drawable/perm_group_contacts.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_location.xml b/core/res/res/drawable/perm_group_location.xml index a7fa52471ab4183b0fe50dd9e9a60c19d6296ffd..a87fc0dc43df83076a913d59e3f626b6f0203109 100644 --- a/core/res/res/drawable/perm_group_location.xml +++ b/core/res/res/drawable/perm_group_location.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_microphone.xml b/core/res/res/drawable/perm_group_microphone.xml index 9b532c1a73768ea4618e2b22e8cc74e6ea74b638..a1ed72510cf899389ddb80bf4cc5b7480b93141f 100644 --- a/core/res/res/drawable/perm_group_microphone.xml +++ b/core/res/res/drawable/perm_group_microphone.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_phone_calls.xml b/core/res/res/drawable/perm_group_phone_calls.xml index 324d8649270342c3cf1fe43c08d36a62f0da1420..563222698b46ddf861984e1368ce433ed9b07766 100644 --- a/core/res/res/drawable/perm_group_phone_calls.xml +++ b/core/res/res/drawable/perm_group_phone_calls.xml @@ -17,6 +17,7 @@ - \ No newline at end of file + diff --git a/core/res/res/drawable/perm_group_sensors.xml b/core/res/res/drawable/perm_group_sensors.xml index e4663d7206fc84710f7af173adf49c632d066cbd..f800965b6058f2ac5135b42a39bd7ea916a12589 100644 --- a/core/res/res/drawable/perm_group_sensors.xml +++ b/core/res/res/drawable/perm_group_sensors.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml index 4b8965bd9ef849bce33416cbfd4beff1b4a715cb..fceda2b84885efd4d280e65ce36cc17ff1556866 100644 --- a/core/res/res/drawable/perm_group_storage.xml +++ b/core/res/res/drawable/perm_group_storage.xml @@ -17,6 +17,7 @@ diff --git a/core/res/res/drawable/perm_group_visual.xml b/core/res/res/drawable/perm_group_visual.xml index 9b21c279e30a478b7516fdaca1992244deec2da0..bf3edea741993a0b172fb1a8cff6a014b02ac9e7 100644 --- a/core/res/res/drawable/perm_group_visual.xml +++ b/core/res/res/drawable/perm_group_visual.xml @@ -16,11 +16,10 @@ Copyright (C) 2015 The Android Open Source Project - diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml index 13fef67c5e2f2485697ca9c6216d2d1b9d169414..575295b1be45924ac314b58fa5d958a190da622c 100644 --- a/core/res/res/layout/notification_template_material_media.xml +++ b/core/res/res/layout/notification_template_material_media.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - - + diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 13b2ad8e70865d10476be99cbc962657081e0795..cf1abff79bd22470866c30253caaa2e1c395281a 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -95,6 +95,7 @@ "Stemboodskappe" "Wi-Fi-oproepe" "SIM-status" + "Hoëprioriteit-SIM-status" "Ander party het TTY-modus VOL versoek" "Ander party het TTY-modus GOD versoek" "Ander party het TTY-modus SOD versoek" @@ -550,11 +551,11 @@ "Vingerafdrukikoon" - "bestuur gesigstawinghardeware" + "bestuur gesigslothardeware" "Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee." - "gebruik gesigstawinghardeware" - "Laat die program toe om gesigstawinghardeware vir stawing te gebruik" - "Gesigstawing" + "gebruik gesigslothardeware" + "Laat die program toe om gesigslothardeware vir stawing te gebruik" + "Gesigslot" "Skryf jou gesig weer in" "Skryf asseblief jou gesig weer in om herkenning te verbeter" "Kon nie gesigdata akkuraat vasvang nie. Probeer weer." @@ -567,7 +568,7 @@ "Beweeg foon na links." "Beweeg foon na regs." "Kyk asseblief meer reguit na jou toestel." - "Kan nie jou gesig sien nie. Kyk na die foon." + "Posisioneer jou gesig direk voor die foon." "Te veel beweging. Hou foon stil." "Skryf jou gesig asseblief weer in." "Kan nie meer gesig herken nie. Probeer weer." @@ -576,19 +577,19 @@ "Draai jou kop \'n bietjie minder." "Draai jou kop \'n bietjie minder." "Verwyder enigiets wat jou gesig versteek." - "Maak die sensor op die skerm se borand skoon." + "Maak die bokant van jou skerm skoon, insluitend die swart balk" "Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie." - "Probeer gesigstawing weer." + "Probeer gesigslot weer." "Kan nie nuwe gesigdata berg nie. Vee eers \'n ou een uit." - "Gesighandeling is gekanselleer" - "Gesigstawing is deur gebruiker gekanselleer" + "Gesighandeling is gekanselleer." + "Gebruiker het gesigslot gekanselleer." "Te veel pogings. Probeer later weer." - "Te veel pogings. Gesigstawing is gedeaktiveer." + "Te veel pogings. Gesigslot is gedeaktiveer." "Kan nie gesig verifieer nie. Probeer weer." - "Jy het nie gesigstawing opgestel nie" - "Gesigstawing word nie op hierdie toestel gesteun nie" + "Jy het nie gesigslot opgestel nie." + "Gesigslot word nie op hierdie toestel gesteun nie." "Gesig %d" @@ -1254,10 +1255,10 @@ "Tik om alle netwerke te sien" "Koppel" "Alle netwerke" - "Koppel aan Wi-Fi-netwerke?" - "Voorgestel deur %s" - "Ja" - "Nee" + "Laat voorgestelde Wi‑Fi-netwerke toe?" + "Netwerke wat deur %s voorgestel is. Toestel sal dalk outomaties koppel." + "Laat toe" + "Nee, dankie" "Wi-Fi sal outomaties aanskakel" "Wanneer jy naby \'n gestoorde hoëgehaltenetwerk is" "Moenie weer aanskakel nie" @@ -1887,8 +1888,8 @@ "Ongekategoriseer" "Jy stel die belangrikheid van hierdie kennisgewings." "Dit is belangrik as gevolg van die mense wat betrokke is." - "Laat %1$s toe om \'n nuwe gebruiker met %2$s te skep?" - "Laat %1$s toe om \'n nuwe gebruiker met %2$s te skep (\'n gebruiker met hierdie rekening bestaan reeds)?" + "Laat %1$s toe om \'n nuwe gebruiker met %2$s te skep (\'n gebruiker met hierdie rekening bestaan reeds)?" + "Laat %1$s toe om \'n nuwe gebruiker met %2$s te skep?" "Voeg \'n taal by" "Streekvoorkeur" "Voer taalnaam in" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 3ad8263f6ae58d372ed844758a170769a8bc56a6..bce5e053eb44f16fd81b0c02b95e2a1ed27f657f 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -95,6 +95,7 @@ "የድምጽ መልዕክቶች" "የWi-Fi ጥሪ" "የሲም ሁኔታ" + "ከፍተኛ ቅድሚያ ተሰጪ የሲም ኹናቴ" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል" @@ -550,11 +551,11 @@ "የጣት አሻራ አዶ" - "የማረጋገጫ ሃርድዌር ፊትን ያስተዳድሩ" + "በመልክ መክፈቻ ሃርድዌርን ማስተዳደር" "መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።" - "የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ" - "መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል" - "በመልክ ማረጋገጥ" + "በመልክ መክፈት ሃርድዌርን መጠቀም" + "መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል" + "በመልክ መክፈት" "የእርስዎን ፊት ዳግመኛ ያስመዝግቡ" "ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ" "ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።" @@ -567,7 +568,7 @@ "ስልክን ወደ ግራ ያንቀሳቅሱ።" "ስልክን ወደ ቀኝ ያንቀሳቅሱ።" "እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።" - "የእርስዎን ፊት መመልከት አይችልም። ስልኩ ላይ ይመልከቱ።" + "መልክዎን በቀጥታ ከስልኩ ፊት ያድርጉት።" "ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።" "እባክዎ ፊትዎን እንደገና ያስመዝግቡ" "ከእንግዲህ ፊትን ለይቶ ማወቅ አይችልም። እንደገና ይሞክሩ።" @@ -576,19 +577,19 @@ "ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።" "ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።" "የእርስዎን ፊት የሚደብቀውን ሁሉንም ነገር በማስወገድ ላይ" - "በማያ ገጹ ላይኛው ጫፍ ላይ ዳሳሹን ያጽዱ።" + "የማያ ገጽዎን አናት ያጽዱት፣ ጥቁር አሞሌውን ጨምሮ" "መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።" - "በመልክ ማረጋገጥን እንደገና ይሞክሩ።" + "በመልክ መክፈትን እንደገና ይሞክሩ።" "አዲስ የመልክ ውውሂብ ማስቀመጥ አልተቻለም። መጀመሪያ የድሮውን ይሰርዙት።" - "የመልክ ክወና ተሰርዟል" - "መልክን ማረጋገጥ በተጠቃሚ ተሰርዟል" + "የፊት ሥርዓተ ክወና ተሰርዟል።" + "በመልክ መክፈት በተጠቃሚ ተሰርዟል።" "ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።" - "በጣም ብዙ ሙከራዎች። የመልክ ማረጋገጫ ተሰናክሏል።" + "በጣም ብዙ ሙከራዎች። በመልክ መክፈት ተሰናክሏል።" "ፊትን ማረጋገጥ አይቻልም። እንደገና ይሞክሩ።" - "የመልክ ማረጋገጫን አላቀናበሩም" - "የመልክ ማረጋገጫ መስጫ በዚህ መሣሪያ ላይ አይደገፍም።" + "በመልክ መክፈትን አላቀናበሩም።" + "በመልክ መክፈት መስጫ በዚህ መሣሪያ ላይ አይደገፍም።" "ፊት %d" @@ -1254,10 +1255,10 @@ "ሁሉንም አውታረ መረቦችን ለማየት መታ ያድርጉ" "አገናኝ" "ሁሉም አውታረ መረቦች" - "ከWi-Fi አውታረ መረቦች ጋር ይገናኝ?" - "በ%s የተጠቆሙ" - "አዎ" - "አይ" + "የተጠቆሙ የWi‑Fi አውታረ መረቦች ይፈቀዱ?" + "በ%s የተጠቆሙ አውታረ መረቦች። መሣሪያ በራስ-ሰር ሊገናኝ ይችላል።" + "ፍቀድ" + "አይ፣ አመሰግናለሁ" "Wi‑Fi በራስ-ሰር ይበራል" "ከፍተኛ ጥራት ያለው የተቀመጠ አውታረ መረብ አቅራቢያ ሲሆኑ" "መልሰህ አታብራ" @@ -1887,8 +1888,8 @@ "ያልተመደቡ" "የእነዚህን ማሳወቂያዎች አስፈላጊነት አዘጋጅተዋል።" "ይሄ በሚሳተፉ ሰዎች ምክንያት አስፈላጊ ነው።" - "%1$s%2$s አዲስ ተጠቃሚ እንዲፈጥር ይፈቀድለት?" - "%1$s%2$s አዲስ ተጠቃሚ እንዲፈጥር ይፈቀድለት (ይህ መለያ ያለው ተጠቃሚ አስቀድሞ አለ)?" + "%1$s%2$s አዲስ ተጠቃሚ እንዲፈጥር ይፈቀድለት (ይህ መለያ ያለው ተጠቃሚ አስቀድሞ አለ)?" + "%1$s አዲስ ተጠቃሚ ከ %2$s ጋር መፍጠር እንዲችል ይፍቀዱ?" "ቋንቋ ያክሉ" "የክልል ምርጫ" "የቋንቋ ስም ይተይቡ" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 45031746ca2a1343149cb1802df8ee783b532cdf..9ead8caee202107f2e149823faa47dde17169f5a 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -99,6 +99,7 @@ "رسائل البريد الصوتي" "‏الاتصال عبر Wi-Fi" "‏حالة شريحة SIM" + "‏حالة شريحة SIM ذات أولوية" "‏طلب النظير وضع TTY الكامل" "‏طلب النظير وضع TTY على HCO" "‏طلب النظير وضع TTY على VCO" @@ -470,7 +471,7 @@ "للسماح للتطبيق باستخدام مرسل الأشعة تحت الحمراء الخاص بالجهاز اللوحي." "يتيح للتطبيق استخدام مرسل الأشعة تحت الحمراء في جهاز التلفزيون." "للسماح للتطبيق باستخدام مرسل الأشعة تحت الحمراء الخاص بالهاتف." - "تعيين الخلفية" + "ضبط الخلفية" "للسماح للتطبيق بتعيين خلفية النظام." "تعديل حجم الخلفية" "للسماح للتطبيق بتعيين تلميحات حجم خلفية النظام." @@ -532,7 +533,7 @@ "للسماح للتطبيق بتعديل مجموعة صورك." "قراءة المواقع من مجموعة الوسائط التابعة لك" "للسماح للتطبيق بقراءة المواقع من مجموعة الوسائط التابعة لك." - "التحقق من هويتك" + "إثبات هويتك" "معدّات المقاييس الحيوية غير متاحة." "تم إلغاء المصادقة." "لم يتم التعرف عليها." @@ -562,11 +563,11 @@ "رمز بصمة الإصبع" - "إدارة أجهزة مصادقة الوجه" + "إدارة أجهزة \"فتح القفل بالوجه\"" "السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها" - "استخدام أجهزة مصادقة الوجه" - "السماح للتطبيق باستخدام أجهزة مصادقة الوجه" - "المصادقة بالوجه" + "استخدام أجهزة \"فتح القفل بالوجه\"" + "السماح للتطبيق باستخدام أجهزة \"فتح القفل بالوجه\" لإجراء المصادقة" + "فتح القفل بالوجه" "إعادة تسجيل وجهك" "لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه." "تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى." @@ -579,7 +580,7 @@ "يُرجى نقل الهاتف إلى اليمين." "يُرجى نقل الهاتف إلى اليسار." "يُرجى النظر إلى جهازك مباشرة أكثر." - "يتعذّر رؤية وجهك. يُرجى النظر إلى الهاتف." + "ضع وجهك أمام الهاتف مباشرة." "حركة أكثر من اللازم يُرجى حمل بدون حركة." "يُرجى إعادة تسجيل وجهك." "لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى." @@ -588,19 +589,19 @@ "حرّك رأسك قليلاً نحو الأمام مباشرة." "حرّك رأسك قليلاً نحو الوسط." "عليك بإزالة أي شيء يُخفي وجهك." - "نظِّف المستشعر أعلى الشاشة." + "يُرجى تنظيف الجزء العلوي من الشاشة، بما في ذلك الشريط الأسود." "يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح." - "جرِّب مصادقة الوجه مرة أخرى." + "حاول استخدام \"فتح القفل بالوجه\" مرة أخرى." "يتعذَّر تخزين بيانات الوجه الجديد. احذف الوجه القديم أولاً." - "تم إلغاء عملية مصادقة الوجه." - "ألغَى المستخدم مصادقة الوجه." + "تمّ إلغاء عملية مصادقة الوجه." + "ألغى المستخدم \"فتح القفل بالوجه\"." "تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا." - "محاولات كثيرة جدًا. تم إيقاف مصادقة الوجه." + "تم إجراء عدد كبير جدًا من المحاولات. وتم إيقاف \"فتح القفل بالوجه\"." "يتعذّر التحقق من الوجه. حاول مرة أخرى." - "لم يسبق لك إعداد مصادقة الوجه." - "لا تتوفّر إمكانية مصادقة الوجه على هذا الجهاز." + "لم يسبق لك إعداد \"فتح القفل بالوجه\"." + "\"فتح القفل بالوجه\" غير متوفر على هذا الجهاز." "الوجه %d" @@ -1342,10 +1343,10 @@ "انقر للاطلاع على جميع الشبكات" "اتصال" "جميع الشبكات" - "‏هل تريد الاتصال بشبكات Wi-Fi؟" - "اقتراح من %s" - "نعم" - "لا" + "‏هل تريد السماح لشبكات Wi‑Fi المقترحة؟" + "شبكات %s المقترحة - قد يتم توصيل الجهاز تلقائيًا." + "سماح" + "لا، شكرًا" "‏سيتم تشغيل شبكة Wi-Fi تلقائيًا." "عندما تكون بالقرب من شبكة محفوظة عالية الجودة" "عدم إعادة التشغيل" @@ -1676,7 +1677,7 @@ "جارٍ الإرسال..." "تشغيل المتصفح؟" "هل تريد قبول المكالمة؟" - "دومًا" + "دائمًا" "ضبط على الفتح دائمًا" "مرة واحدة فقط" "الإعدادات" @@ -2023,8 +2024,8 @@ "غير مصنفة" "لقد عيَّنت أهمية هذه الإشعارات." "هذه الرسالة مهمة نظرًا لأهمية الأشخاص المعنيين." - "هل تسمح لـ %1$s بإنشاء مستخدم جديد باستخدام %2$s؟" - "هل تسمح لـ %1$s بإنشاء مستخدم جديد باستخدام %2$s (يوجد مستخدم بهذا الحساب مسبقًا)؟" + "هل تسمح لتطبيق %1$s بإنشاء مستخدم جديد باستخدام %2$s (يوجد مستخدم بهذا الحساب مسبقًا)؟" + "هل تسمح لتطبيق %1$s بإنشاء مستخدم جديد باستخدام %2$s ؟" "إضافة لغة" "تفضيل المنطقة" "اكتب اسم اللغة" diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index fe08ba3d339bbd84e27d35d09cd9d2ed9b74c372..34e020efd33ee692c35a0dc554930099ad7c45f9 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -95,6 +95,7 @@ "ভইচমেইলৰ বাৰ্তাসমূহ" "ৱাই-ফাই কলিং" "ছিমৰ স্থিতি" + "উচ্চ অগ্ৰাধিকাৰযুক্ত ছিমৰ স্থিতি" "নেটৱৰ্ক পীয়েৰে TTY ম\'ড FULLলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" "নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" "নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে" @@ -550,11 +551,11 @@ "ফিংগাৰপ্ৰিণ্ট আইকন" - "মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ পৰিচালনা কৰক" + "মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ পৰিচালনা কৰক" "মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।" - "মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক" - "বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে" - "মুখমণ্ডলৰ বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ" + "মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ ব্যৱহাৰ কৰক" + "বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে এপ্‌ক মুখাৱয়বৰদ্বাৰা আনলক কৰা হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ দিয়ে" + "মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধা" "আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক" "চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক" "সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।" @@ -567,7 +568,7 @@ "ফ’নটো বাওঁফালে নিয়ক।" "ফ’নটো সোঁফালে নিয়ক।" "আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।" - "আপোনাৰ মুখমণ্ডল দেখা নাই। ফ’নটোলৈ চাওক।" + "আপোনাৰ মুখখন পোনপটীয়াকৈ ফ’নটোৰ সন্মুখত ৰাখক।" "বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।" "আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।" "মুখমণ্ডল আৰু চিনাক্ত কৰিব নোৱাৰি। আকৌ চেষ্টা কৰক।" @@ -576,19 +577,19 @@ "আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।" "আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।" "আপোনাৰ মুখখন ঢাকি ৰখা বস্তুবোৰ আঁতৰাওক।" - "স্ক্ৰীণৰ একেবাৰে ওপৰৰ কাষত থকা ছেন্সৰটো চাফা কৰক।" + "ক’লা বাৰডালকে ধৰি আপোনাৰ স্ক্রীণৰ ওপৰৰ অংশ চাফা কৰক" "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।" - "আকৌ মুখমণ্ডল সত্যাপন কৰিবলৈ চেষ্টা কৰক।" + "পুনৰ মুখাৱয়বৰদ্বাৰা আনলক কৰি চাওক।" "নতুন মুখমণ্ডলৰ ডেটা জমা কৰিব পৰা নাই। প্ৰথমে পুৰণি এখন মচক।" - "মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল" - "ব্যৱহাৰকাৰীয়ে মুখমণ্ডল প্ৰমাণীকৰণ বাতিল কৰিছে" + "মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।" + "ব্যৱহাৰকাৰীয়ে মুখাৱয়বৰদ্বাৰা আনলক কৰাটো বাতিল কৰিছে।" "অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।" - "অতি বেছি প্ৰয়াস। মুখমণ্ডল প্ৰমাণীকৰণ অক্ষম কৰা হ’ল।" + "অতি বেছি প্ৰয়াস। মুখাৱয়বৰদ্বাৰা আনলক কৰাটো অক্ষম কৰা হৈছে।" "মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক।" - "আপুনি মুখমণ্ডল প্ৰমাণীকৰণ ছেট আপ কৰা নাই" - "এই ডিভাইচটোত মুখমণ্ডল প্ৰমাণীকৰণ ব্যৱহাৰ কৰিব নোৱাৰি" + "আপুনি মুখাৱয়বৰদ্বাৰা আনলক কৰাটো ছেট আপ কৰা নাই।" + "এই ডিভাইচটোত মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধাটো নচলে।" "মুখমণ্ডল %d" @@ -1254,10 +1255,10 @@ "সকলো নেটৱৰ্ক চাবলৈ টিপক" "সংযোগ কৰক" "সকলো নেটৱৰ্ক" - "ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰিবনে?" - "%sএ প্ৰস্তাব দিয়া" - "হয়" - "নহয়" + "পৰামর্শ হিচাপে পোৱা নেটৱর্কবোৰক অনুমতি দিবনে?" + "%sএ পৰামর্শ হিচাপে দিয়া নেটৱর্কবোৰ। ডিভাইচটো স্বয়ংক্ৰিয়ভাৱে সংযোগ হ\'ব পাৰে।" + "অনুমতি দিয়ক" + "নালাগে, ধন্যবাদ" "ৱাই-ফাই স্বয়ংক্ৰিয়ভাৱে অন হ\'ব" "যেতিয়া আপুনি ছেভ কৰি থোৱা উচ্চ মানৰ নেটৱৰ্কৰ কাষত থাকে" "পুনৰাই অন নকৰিব" @@ -1887,8 +1888,8 @@ "শ্ৰেণীবদ্ধ নকৰা" "এই জাননীবোৰৰ গুৰুত্ব আপুনি ছেট কৰব লাগিব।" "এই কার্যৰ সৈতে জড়িত থকা লোকসকলক ভিত্তি কৰি এইয়া গুৰুত্বপূর্ণ বুলি বিবেচনা কৰা হৈছ।" - "%1$s%2$sৰ জৰিয়তে নতুন ব্য়ৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে?" - "%1$s%2$sৰ (এই একাউন্টৰ এজন ব্য়ৱহাৰকাৰী ইতিমধ্যে আছে) জৰিয়তে নতুন ব্য়ৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে?" + "%1$s%2$sৰ (এই একাউণ্টটোৰ এজন ব্যৱহাৰকাৰী ইতিমধ্যে আছে) জৰিয়তে এজন নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে ?" + "%1$s%2$sৰ জৰিয়তে এজন নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিবলৈ অনুমতি দিবনে?" "ভাষা যোগ কৰক" "অঞ্চলৰ অগ্ৰাধিকাৰ" "ভাষাৰ নাম লিখক" diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 4ac94c1ca20a11a96c034325de372ebb1f64d8f8..66722041575efea601374dc29ef8aee11aae2cd3 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -95,6 +95,7 @@ "Səsli e-poçt mesajları" "Wi-Fi zəngi" "SIM status" + "Yüksək Prioritetli SIM statusu" "Eskpert TTY Rejimi FULL-u sorğuladı" "Ekspert TTY Rejimi HCO-nu sorğuladı" "Ekspert TTY Rejimi VCO-nu sorğuladı" @@ -550,11 +551,11 @@ "Barmaq izi ikonası" - "üz identifikasiyası proqramını idarə edin" + "üz kilidi avadanlığını idarə edin" "Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir." - "üz identifikasiyası proqramından istifadə edin" - "Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir" - "Üz identifikasiyası" + "üz kilidi avadanlığından istifadə edin" + "İdentifikasiya üçün tətbiqin üz kilidi avadanlığından istifadə etməsinə icazə verir" + "Üz kilidi" "Üzünüzü yenidən qeydiyyatdan keçirin" "Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin" "Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin." @@ -567,7 +568,7 @@ "Telefonu sola hərəkət etdirin." "Telefonu sağa hərəkət etdirin." "Birbaşa cihaza baxın." - "Üzünüz görünmür. Telefona baxın." + "Üzünüzü telefonun qarşısında sabit saxlayın." "Cihaz stabil deyil. Telefonu tərpətməyin." "Üzünüzü yenidən qeydiyyatdan keçirin." "Üzü artıq tanımaq olmur. Yenidən cəhd edin." @@ -576,19 +577,19 @@ "Başınızı bir az döndərin." "Başınızı bir az döndərin." "Üzünüzü gizlədən maneələri kənarlaşdırın." - "Ekranın yuxarı küncündəki sensoru təmizləyin." + "Qara panel daxil olmaqla, ekranın yuxarısını təmizləyin" "Üz doğrulanmadı. Avadanlıq əlçatan deyil." - "Üz identifikasiyasını yenidən sınayın." + "Üz kilidini yenidən sınayın." "Yeni üz datası saxlanmadı. Əvvəlcə köhnə olanı silin." - "Üz əməliyyatı ləğv edildi" - "Üz dorğulaması istifadəçi tərəfindən ləğv edildi" + "Üz əməliyyatı ləğv edildi." + "İstifadəçi üz kilidini ləğv edib." "Həddindən çox cəhd. Sonraya saxlayın." - "Həddindən çox cəhd. Üz doğrulaması deaktiv edildi." + "Həddindən çox cəhd. Üz kilidi deaktiv edildi." "Üz doğrulanmadı. Yenidən cəhd edin." - "Üz doğrulaması quraşdırmamısınız" - "Üz doğrulaması bu cihazda dəstəklənmir" + "Üz kilidi quraşdırmamısınız." + "Üz kilidi bu cihazda dəstəklənmir." "Üz %d" @@ -1254,10 +1255,10 @@ "Bütün şəbəkələri görmək üçün klikləyin" "Qoşulun" "Bütün şəbəkələr" - "Wi-Fi şəbəkələrinə qoşulsun?" - "%s tərəfindən təklif edildi" - "Bəli" - "Xeyr" + "Təklif edilən Wi‑Fi şəbəkələrinə icazə verilsin?" + "%s təklif edilən şəbəkə. Cihaz avtomatik qoşula bilər." + "İcazə verin" + "Xeyr, təşəkkürlər" "Wi‑Fi avtomatik olaraq aktiv ediləcək" "Yadda saxlanmış yüksək keyfiyyətli şəbəkələr yaxınlıqda olduqda" "Yenidən aktiv etməyin" @@ -1887,8 +1888,8 @@ "Kateqoriyasız" "Bildirişlərin əhəmiyyətini Siz ayarlaryırsınız." "İnsanlar cəlb olunduğu üçün bu vacibdir." - "%1$s tətbiqinə %2$s hesabı ilə yeni İstifadəçi yaratmağa icazə verilsin?" - "%1$s tətbiqinə%2$s (bu hesab ilə İstifadəçi artıq mövcuddur) hesabı ilə yeni İstifadəçi yaratmağa icazə verilsin?" + "%1$s tətbiqinə %2$s (artıq bu hesabı olan İstifadəçi mövcuddur) ilə yeni İstifadəçi yaratmağa icazə verilsin?" + "%1$s tətbiqinə %2$s ilə yeni İstifadəçi yartmağa icazə verilsin?" "Dil əlavə edin" "Region seçimi" "Dil adını daxil edin" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 3911067ba4f81e6344ff9e84dd9f904c27f70277..f21cabfde1e8739bfcbbcec6304897c38f254c10 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -27,7 +27,7 @@ "TB" "PB" "%1$s %2$s" - "<Bez naslova>" + "<Bez imena>" "(Nema broja telefona)" "Nepoznato" "Glasovna pošta" @@ -96,6 +96,7 @@ "Poruke govorne pošte" "Pozivanje preko Wi-Fi mreže" "Status SIM-a" + "Obaveštenja SIM kartice sa statusom „visok prioritet“" "Korisnik zahteva POTPUN režim TTY" "Korisnik zahteva PRENOS ZVUKA za režim TTY" "Korisnik zahteva PRENOS GLASA za režim TTY" @@ -553,11 +554,11 @@ "Ikona otiska prsta" - "upravljanje hardv. za potvrdu identiteta pomoću lica" + "upravljanje hardv. za otključavanje licem" "Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja." - "korišćenje hardv. za potvrdu identiteta pomoću lica" - "Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica" - "Potvrda identiteta licem" + "korišćenje hardvera za otključavanje licem" + "Dozvoljava da aplikacija koristi hardver za otključavanje licem radi potvrde identiteta" + "Otključavanje licem" "Ponovo registrujte lice" "Da biste poboljšali prepoznavanje, ponovo registrujte lice" "Snimanje lica nije uspelo. Probajte ponovo." @@ -570,7 +571,7 @@ "Pomerite telefon ulevo." "Pomerite telefon udesno." "Gledajte pravo u uređaj." - "Ne vidi se lice. Gledajte u telefon." + "Postavite lice direktno ispred telefona" "Mnogo se pomerate. Držite telefon mirno." "Ponovo registrujte lice." "Više ne može da se prepozna lice. Probajte ponovo." @@ -579,19 +580,19 @@ "Malo manje pomerite glavu." "Malo manje pomerite glavu." "Uklonite sve što vam zaklanja lice." - "Očistite senzor na gornjoj ivici ekrana." + "Očistite gornji deo ekrana, uključujući crnu traku" "Provera lica nije uspela. Hardver nije dostupan." - "Probajte ponovo potvrdu identiteta pomoću lica." + "Probajte ponovo otključavanje licem." "Novi podaci o licu nisu sačuvani. Prvo izbrišete prethodne." - "Obrada lica je otkazana" - "Korisnik je otkazao potvrdu identiteta licem" + "Obrada lica je otkazana." + "Korisnik je otkazao otključavanje licem" "Previše pokušaja. Probajte ponovo kasnije." - "Previše pokušaja. Potvrda identiteta licem je onemogućena." + "Previše pokušaja. Otključavanje licem je onemogućeno." "Provera lica nije uspela. Probajte ponovo." - "Niste podesili potvrdu identiteta licem" - "Prepoznavanje lica nije podržano na ovom uređaju" + "Niste podesili otključavanje licem" + "Otključavanje licem nije podržano na ovom uređaju" "Lice %d" @@ -1276,10 +1277,10 @@ "Dodirnite da biste videli sve mreže" "Poveži" "Sve mreže" - "Želite li da se povežete sa Wi-Fi mrežama?" - "%s predlaže" - "Da" - "Ne" + "Želite da dozvolite predložene Wi‑Fi mreže?" + "Mreže koje predlaže %s. Uređaj će se možda povezati automatski." + "Dozvoli" + "Ne, hvala" "Wi‑Fi će se automatski uključiti" "Kada ste u blizini sačuvane mreže visokog kvaliteta" "Ne uključuj ponovo" @@ -1921,8 +1922,8 @@ "Nekategorizovano" "Vi podešavate važnost ovih obaveštenja." "Ovo je važno zbog ljudi koji učestvuju." - "Želite li da dozvolite aplikaciji %1$s da napravi novog korisnika za %2$s?" - "Želite li da dozvolite aplikaciji %1$s da napravi novog korisnika za %2$s (korisnik sa ovim nalogom već postoji)?" + "Želite li da dozvolite da %1$s napravi novog korisnika sa nalogom %2$s (korisnik sa tim nalogom već postoji)?" + "Želite li da dozvolite da %1$s napravi novog korisnika sa nalogom %2$s?" "Dodajte jezik" "Podešavanje regiona" "Unesite naziv jezika" diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index e416c4516f9b1d9f0d317fd0ea2f4078ecdeaa9c..918c51fdab4048cb082617f3395117208ebf1a3c 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -97,6 +97,7 @@ "Паведамленні галасавой пошты" "Wi-Fi-тэлефанія" "Статус SIM-карты" + "Стан SIM-карты з высокім прыярытэтам" "Аднарангавая прылада запытала рэжым TTY FULL" "Аднарангавая прылада запытала рэжым TTY НСО" "Аднарангавая прылада запытала рэжым TTY VCO" @@ -556,11 +557,11 @@ "Значок адбіткаў пальцаў" - "кіраваць абсталяваннем для распазнавання твару" + "кіраваць апаратным забеспячэннем для распазнавання твару" "Праграма зможа дадаваць і выдаляць шаблоны твару." - "карыстацца абсталяваннем для распазнавання твару" - "Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі" - "Распазнаванне твару" + "выкарыстоўваць апаратнае забеспячэнне для распазнавання твару" + "Для аўтэнтыфікацыі праграма зможа ўжываць апаратнае забеспячэнне для распазнавання твару" + "Распазнаванне твару" "Паўтарыце рэгістрацыю твару" "Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару" "Не атрымалася распазнаць твар. Паўтарыце спробу." @@ -573,7 +574,7 @@ "Перамясціце тэлефон улева." "Перамясціце тэлефон управа." "Глядзіце прама на экран прылады." - "Не відаць твару. Глядзіце на тэлефон." + "Трымайце тэлефон прама перад тварам." "Трымайце прыладу нерухома. Трымайце тэлефон роўна." "Паўтарыце рэгістрацыю твару." "Не ўдаецца распазнаць твар. Паўтарыце спробу." @@ -582,19 +583,19 @@ "Галава не ў цэнтры." "Вы занадта моцна павярнулі галаву." "Прыміце ўсё, што закрывае ваш твар." - "Ачысціце датчык уверсе экрана." + "Ачысціце ад бруду верхнюю частку экрана, у тым ліку чорную панэль" "Твар не спраўджаны. Абсталяванне недаступнае." - "Выканайце распазнаванне твару паўторна." + "Выканайце распазнаванне твару паўторна." "Новыя даныя пра твар не захаваны. Спачатку выдаліце старыя." - "Распазнаванне твару скасавана" - "Распазнаванне твару скасавана карыстальнікам" + "Распазнаванне твару скасавана." + "Распазнаванне твару скасавана карыстальнікам." "Занадта шмат спроб. Паўтарыце спробу пазней." - "Занадта шмат спроб. Распазнаванне твару выключана." + "Занадта шмат спроб. Распазнаванне твару выключана." "Не ўдалося спраўдзіць твар. Паўтарыце спробу." - "Вы не наладзілі распазнаванне твару" - "На гэтай прыладзе распазнаванне твару не падтрымліваецца" + "Вы не наладзілі распазнаванне твару." + "На гэтай прыладзе распазнаванне твару не падтрымліваецца." "Твар %d" @@ -839,7 +840,7 @@ "Спыніць" "Перамотка назад" "Перамотка ўперад" - "Толькі экстраныя выклікі" + "Толькі экстранныя выклікі" "Сетка заблакаваная" "SIM-карта заблакавана PUK-кодам." "Глядзіце \"Інструкцыю для карыстальніка\" або звяжыцеся са службай тэхнiчнай падтрымкі." @@ -988,7 +989,7 @@ "Апошні месяц" "Раней" - "дата: %s" + "%s" %s" %s" "дзень" @@ -1298,10 +1299,10 @@ "Дакраніцеся, каб убачыць усе сеткі" "Падключыцца" "Усе сеткі" - "Падключыцца да сетак Wi-Fi?" - "Прапанавана ўладальнікам %s" - "Так" - "Не" + "Дазволіць падключэнне да прапанаваных сетак Wi‑Fi?" + "Праграма \"%s\" прапанавала сеткі. Прылада можа падключыцца да ніх аўтаматычна." + "Дазволіць" + "Не, дзякуй" "Wi‑Fi уключыцца аўтаматычна" "Побач з захаванай сеткай з высакаякасным сігналам" "Не ўключаць зноў" @@ -1386,7 +1387,7 @@ "Дазволу не патрабуецца" "за гэта можа спаганяцца плата" "ОК" - "Зарадка гэтай прылады праз USB" + "Прылада зараджаецца праз USB" "Зарадка падключанай прылады праз USB" "Перадача файлаў праз USB" "Перадача фота (PTP) праз USB" @@ -1398,7 +1399,7 @@ "Выяўлены аксесуар аналагавага аўдыя" "Далучаная прылада не сумяшчальная з гэтым тэлефонам. Націсніце, каб даведацца больш." "Адладка па USB падключана" - "Націсніце, каб адключыць адладку па USB" + "Націсніце, каб выключыць адладку па USB" "Выберыце, каб адключыць адладку USB." "Тэставы рэжым уключаны" "Каб выключыць тэставы рэжым, скіньце налады да заводскіх значэнняў." @@ -1717,8 +1718,8 @@ "%1$s быў адключаны з дапамогай камбінацыі хуткага доступу для спецыяльных магчымасцей" "Каб карыстацца сэрвісам \"%1$s\", націсніце і ўтрымлівайце на працягу трох секунд абедзве клавішы гучнасці" "Выберыце службу для выкарыстання пры націску кнопкі \"Спецыяльныя магчымасці\":" - "З дапамогай жэста спецыяльных магчымасцей (правесці двума пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:" - "З дапамогай жэста спецыяльных магчымасцей (правесці трыма пальцамі па экране знізу ўверх) выберыце службу для выкарыстання:" + "Выберыце службу, дзе будзе выкарыстоўвацца жэст спецыяльных магчымасцей (правесці двума пальцамі па экране знізу ўверх):" + "Выберыце службу, дзе будзе выкарыстоўвацца жэст спецыяльных магчымасцей (правесці двума пальцамі па экране знізу ўверх):" "Каб пераключыцца на другую службу, націсніце і ўтрымлівайце кнопку спецыяльных магчымасцей." "Каб пераключыцца на другую службу, правядзіце ўверх двума пальцамі, утрымліваючы іх на экране." "Каб пераключыцца на іншую службу, правядзіце ўверх трыма пальцамі, утрымліваючы іх на экране." @@ -1955,8 +1956,8 @@ "Некатэгарызаванае" "Вы задалі важнасць гэтых апавяшчэнняў." "Гэта важна, бо з гэтым звязаны пэўныя людзі." - "Дазволіць %1$s стварыць новага Карыстальніка з уліковым запісам %2$s?" - "Дазволіць %1$s стварыць новага Карыстальніка з уліковым запісам %2$s (Карыстальнік з гэтым уліковым запісам ужо існуе)?" + "Дазволіць праграме \"%1$s\" стварыць новага Карыстальніка з уліковым запісам %2$s (Карыстальнік з гэтым уліковым запісам ужо існуе)?" + "Дазволіць праграме \"%1$s\" стварыць новага Карыстальніка з уліковым запісам %2$s?" "Дадаць мову" "Параметры рэгіёна" "Увядзіце назву мовы" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 843452275809e5b4f21f86033e1ea6b4338fba62..542a550585274c53ca250c9f5a5f14eb46b0b74f 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -95,6 +95,7 @@ "Съобщения в гласовата поща" "Обаждания през Wi-Fi" "Състояние на SIM картата" + "Състояние на SIM картата с висок приоритет" "Отсрещният потребител заяви пълен TTY режим (FULL)" "Отсрещният потребител заяви TTY режим с пренос на слух (HCO)" "Отсрещният потребител заяви TTY режим с пренос на глас (VCО)" @@ -550,11 +551,11 @@ "Икона за отпечатък" - "управление на хардуера за удостоверяване с лице" + "управление на хардуера за отключване с лице" "Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване" - "използване на хардуера за удостоверяване с лице" - "Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице" - "Удостоверяване с лице" + "използване на хардуера за отключване с лице" + "Разрешава на приложението да използва хардуера за отключване с лице с цел удостоверяване" + "Отключване с лице" "Регистрирайте отново лицето си" "С цел подобряване на разпознаването регистрирайте отново лицето си" "Лицето не бе заснето точно. Опитайте отново." @@ -567,7 +568,7 @@ "Преместете телефона наляво." "Преместете телефона надясно." "Моля, гледайте точно към устройството си." - "Лицето ви не се вижда. Погледнете към телефона." + "Позиционирайте лицето си директно пред телефона." "Твърде много движение. Дръжте телефона неподвижно." "Моля, регистрирайте лицето си отново." "Лицето не бе разпознато. Опитайте отново." @@ -576,19 +577,19 @@ "Не завъртайте главата си толкова много." "Не завъртайте главата си толкова много." "Премахнете всичко, което закрива лицето ви." - "Изчистете сензора в горния край на екрана." + "Почистете горната част на екрана си, включително черната лента" "Лицето не може да се потвърди. Хардуерът не е налице." - "Опитайте отново да удостоверите с лице." + "Опитайте отново да отключите с лице." "Не може да се запази ново лице. Първо изтрийте старо." - "Операцията с лице е анулирана" - "Удостоверяването с лице е анулирано от потребителя" + "Операцията с лице е анулирана." + "Отключването с лице е анулирано от потребителя." "Твърде много опити. Опитайте отново по-късно." - "Твърде много опити. Удостоверяването с лице е деактивирано." + "Твърде много опити. Отключването с лице е деактивирано." "Лицето не може да се потвърди. Опитайте отново." - "Не сте настроили удостоверяването с лице" - "Удостоверяването с лице не се поддържа на това устройство" + "Не сте настроили отключването с лице." + "Отключването с лице не се поддържа на това устройство." "Лице %d" @@ -1254,10 +1255,10 @@ "Докоснете, за да видите всички мрежи" "Свързване" "Всички мрежи" - "Да се установи ли връзка с Wi-Fi мрежи?" - "Предложено от %s" - "Да" - "Не" + "Да се разрешат ли предложените Wi‑Fi мрежи?" + "Предложени от %s мрежи. Устройството може да се свърже автоматично." + "Разрешаване" + "Не, благодаря" "Wi‑Fi ще се включи автоматично" "Когато сте в района на запазена мрежа с високо качество" "Без повторно включване" @@ -1354,7 +1355,7 @@ "Открит е аналогов аудиоаксесоар" "Свързаното устройство не е съвместимо с този телефон. Докоснете, за да научите повече." "Отстраняване на грешки през USB" - "Докоснете, за да изключите отстраняването на грешки през USB" + "Докоснете, за да изключите" "Изберете, за да деактивирате отстраняването на грешки през USB." "Режимът за тестова среда е активиран" "Възстановете фабричните настройки, за да деактивирате режима за тестова среда." @@ -1887,8 +1888,8 @@ "Некатегоризирани" "Зададохте важността на тези известия." "Това е важно заради участващите хора." - "Да се разреши ли на %1$s да създаде нов потребител с профила %2$s?" - "Да се разреши ли на %1$s да създаде нов потребител с профила %2$s (вече съществува потребител с този профил)?" + "Да се разреши ли на %1$s да създаде нов потребител с профила %2$s (вече съществува потребител с този профил)?" + "Да се разреши ли на %1$s да създаде нов потребител с профила %2$s?" "Добавяне на език" "Предпочитание за региона" "Въведете име на език" diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 7170dbbd6192b70c162d4db1b50a9f96ceeb339d..b8ee884b6d968e539f19bd9941f78ea7ee1e0473 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -70,7 +70,7 @@ "তিন ভাবে কল করা" "অবাঞ্ছিত বিরক্তিকর কলগুলি প্রত্যাখ্যান" "যে নম্বরটি থেকে কল করা হয় সেটি পাঠানো" - "বিরক্ত করবেন না" + "বিরক্ত করবে না" "ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে৷ পরবর্তী কল: সীমাবদ্ধ" "ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে৷ পরবর্তী কল: সীমাবদ্ধ নয়" "ডিফল্টরূপে কলার আইডি সীমাবদ্ধ করা থাকে না৷ পরবর্তী কল: সীমাবদ্ধ" @@ -95,6 +95,7 @@ "ভয়েসমেল মেসেজ" "ওয়াই-ফাই কলিং" "সিম কার্ডের স্টাটাস" + "উচ্চ প্রায়রিটি সিম স্ট্যাটাস" "পির TTY মোড FULL অনুরোধ করেছে" "পির TTY মোড HCO অনুরোধ করেছে" "পির TTY মোড VCO অনুরোধ করেছে" @@ -550,11 +551,11 @@ "আঙ্গুলের ছাপ আইকন" - "ফেস যাচাইকরণ হার্ডওয়্যার পরিচালনা করুন" + "মুখের সাহায্যে আনলক করার হার্ডওয়্যার ম্যানেজ করা" "ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷" - "ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন" - "প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়" - "ফেস যাচাইকরণ" + "মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করা" + "অ্যাপকে যাচাইকরণের জন্য মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করতে দেয়" + "মুখের সাহায্যে আনলক" "আপনার ফেস আবার এনরোল করুন" "শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন" "মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।" @@ -567,7 +568,7 @@ "ফোনটি বাঁদিকে সরান।" "ফোনটি ডানদিকে সরান।" "সরাসরি ডিভাইসের দিকে তাকান।" - "আপনার মুখ দেখা যাচ্ছে না। ফোনের দিকে তাকান।" + "আপনার মুখ সরাসরি ফোনের সামনে রাখুন।" "খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।" "আপনার মুখের ছবি আবার নথিভুক্ত করুন।" "আর মুখ চিনতে পারবেন না। আবার চেষ্টা করুন।" @@ -576,19 +577,19 @@ "আপনার মাথাটি নিচের দিকে সামান্য নামান।" "আপনার মাথাটি সামান্য ঘোরান।" "আপনার ফেসকে আড়াল করে এমন সব কিছু সরিয়ে দিন।" - "স্ক্রিনের উপরের প্রান্তের সেন্সর মুছুন।" + "ব্ল্যাক বার সহ আপনার স্ক্রিনের উপরের অংশ মুছে ফেলুন" "ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।" - "ফেস যাচাইকরণের ফিচার আবার ব্যবহার করুন।" + "আবার মুখের সাহায্যে আনলক করার চেষ্টা করুন।" "নতুন ফেস ডেটা স্টোর করা যায়নি। প্রথমে পুরনোটি মুছে ফেলুন।" - "ফেস যাচাই করার প্রসেস বাতিল করা হয়েছে" - "ব্যবহারকারী মুখ শনাক্তকরণ প্রক্রিয়া বাতিল করেছেন" + "ফেস অপারেশন বাতিল করা হয়েছে৷" + "ব্যবহারকারী মুখের সাহায্যে আনলক বাতিল করে দিয়েছেন।" "অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।" - "অনেকবার চেষ্টা করেছেন। ফেস যাচাই করার ফিচারটি বন্ধ করা আছে।" + "অনেকবার চেষ্টা করেছেন। মুখের সাহায্যে আনলক করার সুবিধা বন্ধ করা হয়েছে।" "আপনার মুখ যাচাই করা যাচ্ছে না। আবার চেষ্টা করুন।" - "ফেস যাচাই করার প্রক্রিয়াটি সেট-আপ করেননি" - "এই ডিভাইসে ফেস যাচাই করা যাবে না" + "এখনও মুখের সাহায্যে আনলক করার সুবিধা সেট-আপ করেননি।" + "এই ডিভাইসে মুখের সাহায্যে আনলক করার সুবিধাটি কাজ করে না।" "%d ফেস" @@ -647,8 +648,8 @@ "ধারককে, একটি ক্যারিয়ার মেসেজিং পরিষেবার উচ্চ স্তরের ইন্টারফেসে জুড়তে অনুমতি দেয়৷ সধারণ অ্যাপ্লিকেশনগুলির জন্য কখনই প্রয়োজন হয় না৷" "পরিষেবা প্রদানকারীর সাথে যুক্ত হন" "কোনো পরিষেবা প্রদানকারীর সাথে যুক্ত হতে ধারককে অনুমতি দিন। সাধারণ অ্যাপ্লিকেশানের জন্য প্র্রয়োজন হয় না।" - "\'বিরক্ত করবেন না\' -তে অ্যাক্সেস" - "অ্যাপটিকে \'বিরক্ত করবেন না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।" + "\'বিরক্ত করবে না\' -তে অ্যাক্সেস" + "অ্যাপটিকে \'বিরক্ত করবে না\' কনফিগারেশন পড়া এবং লেখার অনুমতি দেয়।" "দেখার অনুমতি কাজে লাগানো শুরু করুন" "কোনও অ্যাপের কোনও নির্দিষ্ট অনুমতির ব্যবহার শুরু করার ক্ষেত্রে হোল্ডারকে সাহায্য করে। সাধারণ অ্যাপের জন্য এটির পরিবর্তন হওয়ার কথা নয়।" "পাসওয়ার্ড নিয়মগুলি সেট করে" @@ -1254,10 +1255,10 @@ "সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন" "সংযুক্ত করুন" "সব নেটওয়ার্ক" - "ওয়াই-ফাই নেটওয়ার্কের সাথে কানেক্ট করতে চান?" - "%s সাজেস্ট করেছে" - "হ্যাঁ" - "না" + "সাজেস্ট করা ওয়াই-ফাই নেটওয়ার্কে কানেক্ট করার অনুমতি দিতে চান?" + "%s-এর সাজেস্ট করা নেটওয়ার্ক। ডিভাইস নিজে থেকে কানেক্ট হতে পারে।" + "অনুমতি দিন" + "না থাক" "ওয়াই-ফাই অটোমেটিক চালু হবে" "যখন আপনি একটি উচ্চ মানের সংরক্ষিত নেটওয়ার্ক কাছাকাছি থাকেন" "আবার চালু করবেন না" @@ -1312,7 +1313,7 @@ "এসএমএস পাঠানো হচ্ছে" "<b>%1$s</b> অনেকগুলি এসএমএস পাঠাচ্ছে৷ আপনি কি এই অ্যাপ্লিকেশানটিকে মেসেজ পাঠানো চালিয়ে যাওয়ার অনুমতি দিতে চান?" "অনুমতি দিন" - "আস্বীকার করুন" + "অস্বীকার করুন" "<b>%1$s</b> <b>%2$s</b> এ একটি মেসেজ পাঠাতে চায়৷" "এটির জন্য আপনার মোবাইল অ্যাকাউন্টে ""চার্জ বহন করতে হতে পারে""।" "এর ফলে আপনার মোবাইল অ্যাকাউন্টে চার্জ লাগতে পারে।" @@ -1354,7 +1355,7 @@ "সংযুক্ত ডিভাইস চার্জ করা হচ্ছে। আরও বিকল্প দেখতে ট্যাপ করুন।" "অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে" "সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।" - "USB ডিবাগিং সংযুক্ত হয়েছে" + "USB ডিবাগিং কানেক্ট হয়েছে" "ইউএসবি ডিবাগিং বন্ধ করতে ট্যাপ করুন" "USB ডিবাগিং অক্ষম করতে বেছে নিন।" "টেস্ট হারনেস মোড চালু আছে" @@ -1447,7 +1448,7 @@ "আপনি কি এই অনুরোধটিকে মঞ্জুরি দিতে চান?" "অ্যাক্সেসের অনুরোধ" "অনুমতি দিন" - "আস্বীকার করুন" + "অস্বীকার করুন" "অনুমতির অনুরোধ করা হয়েছে" "%sঅ্যাকাউন্টের জন্য\nঅনুমতির অনুরোধ করা হয়েছে৷" "আপনি এই অ্যাপ্লিকেশানটি আপনার কর্মস্থলের প্রোফাইলের বাইরে ব্যবহার করছেন" @@ -1848,10 +1849,10 @@ "%1$s পর্যন্ত" "%1$s পর্যন্ত (পরবর্তী অ্যালার্ম)" "যতক্ষণ না আপনি বন্ধ করছেন" - "যতক্ষণ পর্যন্ত না আপনি বিরক্ত করবেন না বন্ধ করছেন" + "যতক্ষণ পর্যন্ত না আপনি বিরক্ত করবে না বন্ধ করছেন" "%1$s / %2$s" "সঙ্কুচিত করুন" - "বিরক্ত করবেন না" + "বিরক্ত করবে না" "ডাউনটাইম" "সপ্তাহান্তের রাত্রি" "সপ্তাহান্ত" @@ -1888,8 +1889,8 @@ "বিভাগ নির্ধারিত নয়" "আপনি এই বিজ্ঞপ্তিগুলির গুরুত্ব সেট করেছেন।" "লোকজন জড়িত থাকার কারণে এটি গুরুত্বপূর্ণ।" - "%1$s কে %2$s এর সাথে একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি দেবেন কি?" - "%1$s কে %2$s (একজন ব্যবহারকারী এই অ্যাকাউন্টে ইতিমধ্যেই বিদ্যমান আছেন) এর সাথে একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি দেবেন কি?" + "%2$s-এ (একজন ব্যবহারকারী এই অ্যাকাউন্টে আগে থেকেই রয়েছেন) একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি %1$s-কে দেবেন?" + "%2$s-এ একজন নতুন ব্যবহারকারী তৈরি করার অনুমতি %1$s-কে দেবেন?" "একটি ভাষা যোগ করুন" "পছন্দের অঞ্চল" "ভাষার নাম লিখুন" @@ -1989,10 +1990,10 @@ "কল এবং বিজ্ঞপ্তি আসলে ভাইব্রেট হবে" "কল এবং বিজ্ঞপ্তিগুলি মিউট করা হবে" "সিস্টেমে হয়ে থাকা পরিবর্তন" - "বিরক্ত করবেন না" - "নতুন: \'বিরক্ত করবেন না\' মোড চালু আছে, তাই বিজ্ঞপ্তি লুকিয়ে ফেলা হচ্ছে" + "বিরক্ত করবে না" + "নতুন: \'বিরক্ত করবে না\' মোড চালু আছে, তাই বিজ্ঞপ্তি লুকিয়ে ফেলা হচ্ছে" "আরও জানতে এবং পরিবর্তন করতে ট্যাপ করুন।" - "\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে" + "\'বিরক্ত করবে না\' মোডের সেটিং বদলে গেছে" "কী কী ব্লক করা আছে তা দেখতে ট্যাপ করুন।" "সিস্টেম" "সেটিংস" diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index c7ea23d090bd992566615ca84d76809a063f1f7f..6a2a63af62b85e58ece43f734355e51d8fd4e237 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -96,6 +96,7 @@ "Poruke govorne pošte" "Pozivanje putem WiFi-ja" "Status SIM-a" + "Status visokog prioriteta SIM-a" "Ravnopravni uređaj zatražio načina rada TTY FULL" "Ravnopravni uređaj zatražio načina rada TTY HCO" "Ravnopravni uređaj zatražio načina rada TTY VCO" @@ -293,7 +294,7 @@ "Dozvoliti aplikaciji <b>%1$s</b> da pristupi vašem kalendaru?" "SMS" "šalje i pregleda SMS poruke" - "Dozvoliti aplikaciji <b>%1$s</b> slanje i pregled SMS poruka?" + "Dozvoliti aplikaciji <b>%1$s</b> da šalje i pregleda SMS poruke?" "Pohrana" "pristupa slikama, medijskim fajlovima i fajlovima na vašem uređaju" "Dozvoliti aplikaciji <b>%1$s</b> da pristupa fotografijama, medijima i fajlovima na vašem uređaju?" @@ -486,9 +487,9 @@ "uspostavljanje i prekidanje WiFi veze" "Omogućava aplikaciji uspostavljanje i prekidanje veze sa WiFi pristupnim tačkama, kao i promjenu konfiguracije uređaja za WiFi mreže." "dozvoljava prijem paketa kroz WiFi Multicast" - "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću multicast tehnologije, a ne samo na vaš tablet. Troši više energije nego rad van multicast načina rada." - "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću multicast tehnologije, a ne samo na vaš TV. Troši više energije nego rad van multicast načina rada." - "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću multicast tehnologije, a ne samo na vaš telefon. Troši više energije nego rad van multicast načina rada." + "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću višesmjernih adresa, a ne samo na vaš tablet. Troši više energije nego rad van multicast načina rada." + "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću višesmjernih adresa, a ne samo na vaš TV. Troši više energije nego rad van multicast načina rada." + "Omogućava aplikaciji prijem paketa poslanih svim uređajima na WiFi mreži pomoću višesmjernih adresa, a ne samo na vaš telefon. Troši više energije nego rad van multicast načina rada." "pristup Bluetooth postavkama" "Dozvoljava aplikaciji konfiguriranje lokalnog Bluetooth tableta te otkrivanje udaljenih uređaja i sparivanje s njima." "Dozvoljava aplikaciji konfiguriranje lokalnog Bluetooth TV-a te otkrivanje i povezivanje s udaljenim uređajima." @@ -553,11 +554,11 @@ "Ikona za otisak prsta" - "upravljanje hardverom za autentifikaciju licem" + "upravljanje hardverom za otključavanje licem" "Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu." - "upotreba hardvera za autentifikaciju licem" - "Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem" - "Autentifikacija licem" + "korištenje hardvera za otključavanje licem" + "Omogućava aplikaciji da za autentifikaciju koristi hardver za otključavanje licem" + "Otključavanje licem" "Ponovo registrirajte lice" "Ponovo registrirajte lice da poboljšate prepoznavanje" "Lice nije snimljeno precizno. Pokušajte ponovo." @@ -570,7 +571,7 @@ "Pomjerite telefon ulijevo." "Pomjerite telefon udesno." "Gledajte direktno u uređaj." - "Ne vidi se lice. Gledajte u telefon." + "Postavite lice direktno ispred telefona" "Previše pokreta. Držite telefon mirno." "Ponovo registrirajte lice." "Nije više moguće prepoznati lice. Pokušajte opet." @@ -579,19 +580,19 @@ "Malo manje zakrenite glavu." "Malo manje zakrenite glavu." "Uklonite prepreke koje blokiraju vaše lice." - "Očistite senzor na gornjem rubu ekrana." + "Očistite vrh ekrana, uključujući crnu traku" "Nije moguće potvrditi lice. Hardver nije dostupan." - "Pokušajte ponovo s autentifikacijom lica." + "Pokušajte ponovo s otključavanjem licem." "Nije moguće sačuvati nove podatke o licu. Prvo izbrišite stare." - "Prepoznavanje lica je otkazano" - "Korisnik je otkazao provjeru lica" + "Prepoznavanje lica je otkazano." + "Korisnik je otkazao otključavanje licem." "Previše pokušaja. Pokušajte ponovo kasnije." - "Previše pokušaja. Autentifikacija licem je onemogućena." + "Previše pokušaja. Otključavanje licem je onemogućeno." "Nije moguće potvrditi lice. Pokušajte ponovo." - "Niste postavili autentifikaciju pomoću lica" - "Autentifikacija pomoću lica nije podržana na ovom uređaju" + "Niste postavili otključavanje licem." + "Otključavanje licem nije podržano na ovom uređaju." "Lice %d" @@ -1278,10 +1279,10 @@ "Dodirnite da vidite sve mreže" "Povežite se" "Sve mreže" - "Povezivati na WiFi mreže?" - "Predlaže %s" - "Da" - "Ne" + "Dozvoliti predložene WiFi mreže?" + "Mreže koje predlaže %s. Uređaj će se možda povezati automatski." + "Dozvoli" + "Ne, hvala" "WiFi će se uključiti automatski" "Kada ste u blizini sačuvane mreže visokog kvaliteta" "Nemoj ponovo uključiti" @@ -1377,7 +1378,7 @@ "Punjenje povezanog uređaja. Dodirnite za više opcija." "Otkriven je analogni periferni uređaj" "Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da saznate više." - "Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno" + "Otklanjanje grešaka putem USB-a je uspostavljeno" "Dodirnite da isključite otklanjanje grešaka putem USB-a" "Odaberite da onemogućite ispravljanje grešaka koristeći USB" "Omogućen način rada okvira za testiranje" @@ -1923,8 +1924,8 @@ "Nije kategorizirano" "Vi određujete značaj ovih obavještenja." "Ovo je značajno zbog osoba koje su uključene." - "Da li dozvoljavate aplikaciji %1$s da kreira novog korisnika s računom %2$s?" - "Da li dozvoljavate da %1$s kreira novog korisnika za %2$s (Korisnik sa ovim nalogom već postoji)?" + "Dozvoliti aplikaciji %1$s da kreira novog korisnika s računom %2$s (korisnik s ovim računom već postoji)?" + "Dozvoliti aplikaciji %1$s da kreira novog korisnika s računom %2$s?" "Dodajte jezik" "Izbor regije" "Upišite ime jezika" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 5c7dba85e90dceec258ebff4c650fd2824114ffa..ad045439a7af9bba6cf9c7a6958b842b6585c12e 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -95,6 +95,7 @@ "Missatges de veu" "Trucades per Wi-Fi" "Estat de la SIM" + "Estat de la SIM d\'alta prioritat" "L\'altre dispositiu ha sol·licitat el mode TTY COMPLET." "L\'altre dispositiu ha sol·licitat el mode TTY HCO." "L\'altre dispositiu ha sol·licitat el mode TTY VCO." @@ -550,11 +551,11 @@ "Icona d\'empremta digital" - "gestiona el maquinari d\'autenticació facial" + "gestiona el maquinari de desbloqueig facial" "Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir." - "utilitza el maquinari d\'autenticació facial" - "Permet que l\'aplicació faci servir maquinari d\'autenticació facial" - "Autenticació facial" + "utilitza el maquinari de desbloqueig facial" + "Permet que l\'aplicació faci servir el maquinari de desbloqueig facial per a l\'autenticació" + "Desbloqueig facial" "Torna a registrar la cara" "Per millorar el reconeixement, torna a registrar la cara" "No es reconeix la teva cara. Torna-ho a provar." @@ -567,34 +568,34 @@ "Mou el telèfon cap a l\'esquerra." "Mou el telèfon cap a la dreta." "Mira més directament cap al dispositiu." - "No se\'t veu la cara. Mira el telèfon." + "Posa la cara directament davant del telèfon." "Massa moviment. Subjecta bé el telèfon." "Torna a registrar la teva cara." "Ja no es reconeix la teva cara. Torna-ho a provar." "És massa semblant; canvia de postura." - "Inclina el cap una mica menys." - "Inclina el cap una mica menys." - "No inclinis tant el cap." + "No giris tant el cap." + "No inclinis tant el cap." + "No giris tant el cap." "Suprimeix qualsevol cosa que amagui la teva cara." - "Neteja el sensor de l\'extrem superior." + "Neteja la part superior de la pantalla, inclosa la barra negra" "No es pot verificar la cara. Maquinari no disponible." - "Torna a provar l\'autenticació facial." + "Torna a provar el desbloqueig facial." "No es poden desar dades facials noves. Suprimeix-ne d\'antigues." - "S\'ha cancel·lat el reconeixement facial" - "L\'usuari ha cancel·lat l\'autenticació facial" + "S\'ha cancel·lat el reconeixement facial." + "L\'usuari ha cancel·lat el desbloqueig facial." "Massa intents. Torna-ho a provar més tard." - "Massa intents. S\'ha desactivat l\'autenticació facial." + "Massa intents. S\'ha desactivat el desbloqueig facial." "No es pot verificar la cara. Torna-ho a provar." - "No has configurat l\'autenticació facial" - "L\'autenticació facial no és compatible amb el dispositiu." + "No has configurat el desbloqueig facial" + "El desbloqueig facial no és compatible amb el dispositiu." "Cara %d" "Icona facial" "llegir la configuració de sincronització" - "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Persones estigui sincronitzada amb un compte." + "Permet que l\'aplicació llegeixi la configuració de sincronització d\'un compte. Per exemple, això pot determinar que l\'aplicació Contactes estigui sincronitzada amb un compte." "activar o desactivar la sincronització" "Permet que una aplicació modifiqui la configuració de sincronització d\'un compte. Per exemple, aquesta acció es pot fer servir per activar la sincronització de l\'aplicació Persones amb un compte." "llegir les estadístiques de sincronització" @@ -845,9 +846,9 @@ "Has dibuixat el patró de desbloqueig %1$d vegades de manera incorrecta. Si falles %2$d vegades més, se\'t demanarà que desbloquegis la tauleta amb l\'inici de sessió de Google.\n\n Torna-ho a provar d\'aquí a %3$d segons." "Has dibuixat el patró de desbloqueig incorrectament %1$d vegades. Tens %2$d intents més abans no hagis de desbloquejar el televisor amb les dades d\'inici de sessió de Google.\n\n Torna a provar-ho d\'aquí a %3$d segons." "Has dibuixat el patró de desbloqueig %1$d vegades de manera incorrecta. Si falles %2$d vegades més, se\'t demanarà que desbloquegis el telèfon amb l\'inici de sessió de Google.\n\n Torna-ho a provar d\'aquí a %3$d segons." - "Has provat de desbloquejar la tauleta %1$d vegades incorrectament. D\'aquí a %2$d intents incorrectes més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." + "Has provat de desbloquejar la tauleta %1$d vegades de manera incorrecta. Si falles %2$d vegades més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." "Has provat de desbloquejar el televisor incorrectament %1$d vegades. Tens %2$d intents més abans no es restableixin els valors de fàbrica de l\'aparell i es perdin totes les dades d\'usuari." - "Has provat de desbloquejar la tauleta %1$d vegades incorrectament. D\'aquí a %2$d intents incorrectes més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." + "Has provat de desbloquejar la tauleta %1$d vegades de manera incorrecta. Si falles %2$d vegades més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." "Has provat de desbloquejar la tauleta %d vegades incorrectament. Ara la tauleta es restablirà a la configuració predeterminada de fàbrica." "Has provat de desbloquejar el televisor incorrectament %d vegades. Ara es restabliran els valors de fàbrica de l\'aparell." "Has provat de desbloquejar el telèfon %d vegades incorrectament. Ara el telèfon es restablirà a la configuració predeterminada de fàbrica." @@ -1254,10 +1255,10 @@ "Toca per veure totes les xarxes" "Connecta" "Totes les xarxes" - "Vols connectar-te a una xarxa Wi‑Fi?" - "Suggerida per %s" - "Sí" - "No" + "Vols permetre les xarxes Wi‑Fi suggerides?" + "Xarxes suggerides de l\'aplicació %s. El dispositiu pot connectar-se automàticament." + "Permet" + "No, gràcies" "La Wi-Fi s\'activarà automàticament" "Quan siguis a prop d\'una xarxa de qualitat desada" "No tornis a activar" @@ -1482,7 +1483,7 @@ "Enrere" "Següent" "Omet" - "Cap coincidència" + "No s\'ha trobat cap coincidència" "Troba-ho a la pàgina" %d de %d @@ -1647,9 +1648,9 @@ "Has escrit malament el PIN %1$d vegades. \n\nTorna-ho a provar d\'aquí a %2$d segons." "Has escrit malament la contrasenya %1$d vegades. \n\nTorna-ho a provar d\'aquí a %2$d segons." "Has dibuixat el patró de desbloqueig de manera incorrecta %1$d vegades. \n\nTorna-ho a provar d\'aquí a %2$d segons." - "Has provat de desbloquejar la tauleta %1$d vegades de manera incorrecta. D\'aquí a %2$d intents incorrectes més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." + "Has provat de desbloquejar la tauleta %1$d vegades de manera incorrecta. Si falles %2$d vegades més, la tauleta es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." "Has provat de desbloquejar el televisor incorrectament %1$d vegades. Tens %2$d intents més abans no es restableixin els valors de fàbrica de l\'aparell i es perdin totes les dades d\'usuari." - "Has provat de desbloquejar el telèfon %1$d vegades de manera incorrecta. D\'aquí a %2$d intents incorrectes més, el telèfon es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." + "Has provat de desbloquejar el telèfon %1$d vegades de manera incorrecta. Si falles %2$d vegades més, el telèfon es restablirà a la configuració predeterminada de fàbrica i es perdran totes les dades dels usuaris." "Has provat de desbloquejar la tauleta %d vegades de manera incorrecta. Ara la tauleta es restablirà a la configuració predeterminada de fàbrica." "Has provat de desbloquejar el televisor incorrectament %d vegades. Ara es restabliran els valors de fàbrica de l\'aparell." "Has provat de desbloquejar el telèfon %d vegades de manera incorrecta. Ara el telèfon es restablirà a la configuració predeterminada de fàbrica." @@ -1887,8 +1888,8 @@ "Sense classificar" "Has definit la importància d\'aquestes notificacions." "Aquest missatge és important per les persones implicades." - "Concedeixes permís a %1$s per crear un usuari amb el compte %2$s?" - "Concedeixes permís a %1$s per crear un usuari amb el compte %2$s? (Ja hi ha un usuari amb aquest compte.)" + "Concedeixes permís a %1$s per crear un usuari amb el compte %2$s? (Ja hi ha un usuari amb aquest compte.)" + "Concedeixes permís a %1$s per crear un usuari amb el compte %2$s?" "Afegeix un idioma" "Preferència de regió" "Nom de l\'idioma" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 40150ff1b66aafcd44433a22bc543e301668a450..61b539518688373bb45389e99c9354735ff0edf4 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -97,6 +97,7 @@ "Hlasové zprávy" "Volání přes Wi-Fi" "Stav SIM karty" + "Stav SIM karty: vysoká priorita" "Partner požádal o přechod na režim TTY FULL" "Partner požádal o přechod na režim TTY HCO" "Partner požádal o přechod na režim TTY VCO" @@ -556,11 +557,11 @@ "Ikona otisku prstů" - "správa hardwaru k ověření obličeje" + "správa hardwaru k odemknutí obličejem" "Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity." - "použití hardwaru k ověření obličeje" - "Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje" - "Ověřování obličejem" + "použití hardwaru k odemknutí obličejem" + "Umožňuje aplikaci provést ověření pomocí hardwaru k odemknutí obličejem" + "Odemknutí obličejem" "Zaznamenejte obličej znovu" "Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu" "Obličej se nepodařilo zachytit. Zkuste to znovu." @@ -573,7 +574,7 @@ "Přesuňte telefon vlevo." "Přesuňte telefon vpravo." "Dívejte se přímo na zařízení." - "Obličej není vidět. Podívejte se na telefon." + "Umístěte obličej přímo před telefon." "Příliš mnoho pohybu. Držte telefon nehybně." "Zaznamenejte obličej znovu." "Obličej už nelze rozpoznat. Zkuste to znovu." @@ -582,19 +583,19 @@ "Natočte hlavu o něco méně." "Natočte hlavu o něco méně." "Odstraňte vše, co vám zakrývá obličej." - "Vyčistěte snímač u horního okraje obrazovky." + "Očistěte horní část obrazovky včetně černé části" "Obličej nelze ověřit. Hardware není dostupný." - "Zopakujte ověření obličeje." + "Zopakujte odemknutí obličejem." "Údaje o novém obličeji nelze uložit. Nejdřív vymažte starý." - "Operace snímání obličeje byla zrušena" - "Ověření obličejem zrušil uživatel" + "Operace snímání obličeje byla zrušena." + "Odemknutí obličejem zrušil uživatel." "Příliš mnoho pokusů. Zkuste to později." - "Příliš mnoho pokusů. Ověření obličejem je vypnuto." + "Příliš mnoho pokusů. Odemknutí obličejem bylo deaktivováno." "Obličej se nepodařilo ověřit. Zkuste to znovu." - "Ověření obličejem nemáte nastavené" - "Ověření obličejem na tomto zařízení není podporováno" + "Ověření obličejem nemáte nastavené." + "Odemknutí obličejem na tomto zařízení není podporováno." "Obličej %d" @@ -824,7 +825,7 @@ "Zkusit znovu" "Funkce a data jsou k dispozici po odemčení" "Překročili jste maximální povolený počet pokusů o odemknutí obličejem." - "Není vložena SIM karta" + "Chybí SIM karta" "V tabletu není SIM karta." "V televizi není SIM karta." "V telefonu není žádná SIM karta." @@ -1298,10 +1299,10 @@ "Klepnutím zobrazíte všechny sítě" "Připojit" "Všechny sítě" - "Připojit k sítím Wi-Fi?" - "Navrženo kanálem %s" - "Ano" - "Ne" + "Povolit navrhované sítě Wi-Fi?" + "Sítě navrhované aplikací %s. Zařízení se může připojovat automaticky." + "Povolit" + "Ne, díky" "Wi‑Fi se zapne automaticky" "Když budete v dosahu kvalitní uložené sítě" "Znovu nezapínat" @@ -1955,8 +1956,8 @@ "Neklasifikováno" "Důležitost oznámení určujete vy." "Tato zpráva je důležitá kvůli lidem zapojeným do konverzace." - "Povolit aplikaci %1$s vytvořit nového uživatele s účtem %2$s?" - "Povolit aplikaci %1$s vytvořit nového uživatele s účtem %2$s? (Uživatel s tímto účtem již existuje.)" + "Povolit aplikaci %1$s vytvořit nového uživatele s účtem %2$s? (Uživatel s tímto účtem již existuje.)" + "Povolit aplikaci %1$s vytvořit nového uživatele s účtem %2$s?" "Přidat jazyk" "Preferovaná oblast" "Zadejte název jazyka" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index d841631e861045b328958070a3229d4537f8dd99..88176362635c5434dd77335167496b831e6234fc 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -95,6 +95,7 @@ "Talebeskeder" "Wi-Fi-opkald" "SIM-status" + "SIM-kort med høj prioritet" "Den anden enhed har skiftet til FULD TTY-tilstand" "Den anden enhed har skiftet til TTY-tilstanden HCO" "Den anden enhed har skiftet til TTY-tilstanden VCO" @@ -225,7 +226,7 @@ "Indstillinger for telefon" "Skærmlås" "Sluk" - "Nødopkald" + "Nødsituation" "Fejlrapport" "Afslut sessionen" "Screenshot" @@ -550,11 +551,11 @@ "Ikon for fingeraftryk" - "administrer hardware til ansigtsgenkendelse" + "administrere hardware til ansigtslås" "Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner." - "brug hardware til ansigtsgenkendelse" - "Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse" - "Ansigtsgodkendelse" + "bruge hardware til ansigtslås" + "Tillader, at appen bruger hardware til ansigtslås til godkendelse" + "Ansigtslås" "Registrer dit ansigt igen" "Registrer dit ansigt igen for at forbedre genkendelsen af det" "Der blev ikke registreret ansigtsdata. Prøv igen." @@ -567,7 +568,7 @@ "Flyt telefonen til venstre." "Flyt telefonen til højre." "Kig mere direkte på din enhed." - "Dit ansigt kan ikke registreres. Kig på telefonen." + "Sørg for, at dit ansigt er direkte foran telefonen." "Der er for meget bevægelse. Hold telefonen stille." "Registrer dit ansigt igen." "Ansigtet kan ikke længere genkendes. Prøv igen." @@ -576,19 +577,19 @@ "Du skal ikke dreje hovedet så meget." "Du skal ikke dreje hovedet så meget." "Hvis noget skjuler dit ansigt, skal du fjerne det." - "Rens sensoren ved skærmens øverste kant." + "Rengør toppen af din skærm, inkl. den sorte bjælke" "Ansigt ikke bekræftet. Hardware ikke tilgængelig." - "Prøv ansigtsgodkendelse igen." + "Prøv ansigtslås igen." "Der kan ikke gemmes nye ansigtsdata. Slet et gammelt først." - "Ansigtshandlingen blev annulleret" - "Ansigtsgodkendelsen blev annulleret af brugeren" + "Ansigtshandlingen blev annulleret." + "Ansigtslås blev annulleret af brugeren." "Du har prøvet for mange gange. Prøv igen senere." - "For mange forsøg. Ansigtsgodkendelse er deaktiveret." + "Du har brugt for mange forsøg. Ansigtslås er deaktiveret." "Ansigtet kan ikke genkendes. Prøv igen." - "Du har ikke konfigureret ansigtsgodkendelse" - "Ansigtsgodkendelse understøttes ikke på denne enhed" + "Du har ikke konfigureret ansigtslås." + "Ansigtslås understøttes ikke på denne enhed." "Ansigt %d" @@ -1254,10 +1255,10 @@ "Tryk for at se alle netværk" "Opret forbindelse" "Alle netværk" - "Vil du oprette forbindelse til Wi-Fi-netværk?" - "Foreslået af %s" - "Ja" - "Nej" + "Vil du tillade foreslåede Wi‑Fi-netværk?" + "Netværk foreslået af %s. Enheden opretter muligvis forbindelse automatisk." + "Tillad" + "Nej tak" "Wi‑Fi aktiveres automatisk" "Når du er i nærheden af et gemt netværk af høj kvalitet" "Aktivér ikke igen" @@ -1887,8 +1888,8 @@ "Uden kategori" "Du angiver, hvor vigtige disse notifikationer er." "Dette er vigtigt på grund af de personer, det handler om." - "Vil du give %1$s tilladelse til at oprette en ny bruger med %2$s?" - "Vil du give %1$s tilladelse til at oprette en ny bruger med %2$s (der findes allerede en bruger med denne konto)?" + "Vil du give %1$s tilladelse til at oprette en ny bruger med %2$s (der findes allerede en bruger med denne konto)?" + "Vil du give %1$s tilladelse til at oprette en nye bruger med %2$s?" "Tilføj et sprog" "Områdeindstilling" "Angiv sprog" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 88e046a68800e03704fc23016592b9aa91bbc9d2..4101fbe0017b9fa19e650721ed000c45c1eea91b 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -95,6 +95,7 @@ "Mailboxnachrichten" "WLAN-Telefonie" "Status der SIM-Karte" + "Benachrichtigungen mit hoher Priorität von der SIM-Karte" "Peer hat TTY-Modus \"Vollständig\" angefordert." "Peer hat TTY-Modus \"HCO\" angefordert." "Peer hat TTY-Modus \"VC\" angefordert." @@ -281,7 +282,7 @@ "Zulassen, dass <b>%1$s</b> auf deine Kontakte zugreift?" "Standort" "auf den Standort deines Geräts zugreifen" - "Zulassen, dass <b>%1$s</b> den Gerätestandort abruft?" + "Zulassen, dass die App <b>%1$s</b> den Gerätestandort abruft?" "Die App hat nur Zugriff auf den Gerätestandort, solange du sie verwendest" "Zulassen, dass <b>%1$s</b> <b>ständig</b> auf deinen Standort zugreift?" "Die App hat gegenwärtig nur dann Zugriff auf den Gerätestandort, wenn du sie verwendest" @@ -290,7 +291,7 @@ "Zulassen, dass <b>%1$s</b> auf deinen Kalender zugreift?" "SMS" "SMS senden und abrufen" - "Zulassen, dass <b>%1$s</b> SMS sendet und aufruft?" + "Zulassen, dass die App <b>%1$s</b> SMS sendet und aufruft?" "Speicher" "auf Fotos, Medien und Dateien auf deinem Gerät zugreifen" "Zulassen, dass <b>%1$s</b> auf Fotos, Medien und Dateien auf deinem Gerät zugreift?" @@ -428,7 +429,7 @@ "Diese App kann jederzeit Audio über das Mikrofon aufnehmen." "Befehle an die SIM senden" "Ermöglicht der App das Senden von Befehlen an die SIM-Karte. Dies ist äußerst risikoreich." - "körperlichen Aktivitäten erkennen" + "Körperliche Aktivitäten erkennen" "Diese App kann deine körperliche Aktivität erkennen." "Bilder und Videos aufnehmen" "Diese App kann mit der Kamera jederzeit Bilder und Videos aufnehmen." @@ -550,11 +551,11 @@ "Fingerabdruck-Symbol" - "Gesichtserkennungshardware verwalten" + "Face Unlock-Hardware verwalten" "Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen." - "Gesichtserkennungshardware verwenden" - "Ermöglicht der App, für die Authentifizierung Gesichtserkennungshardware zu verwenden" - "Gesichtserkennung" + "Face Unlock-Hardware verwenden" + "Ermöglicht der App, zu Authentifizierungszwecken Face Unlock-Hardware zu verwenden" + "Face Unlock" "Gesicht neu scannen lassen" "Für bessere Erkennung Gesicht neu scannen lassen" "Gesichtsdaten nicht gut erfasst. Erneut versuchen." @@ -567,7 +568,7 @@ "Beweg das Smartphone nach links." "Beweg das Smartphone nach rechts." "Bitte sieh direkt auf dein Gerät." - "Gesicht wurde nicht gefunden. Blicke aufs Telefon." + "Halte dein Gesicht direkt vor dein Smartphone." "Zu viel Unruhe. Halte das Smartphone ruhig." "Bitte registriere dein Gesicht noch einmal." "Gesicht wird nicht mehr erkannt. Erneut versuchen." @@ -576,19 +577,19 @@ "Neig den Kopf etwas weniger stark." "Neig den Kopf etwas weniger stark." "Entferne alles, was dein Gesicht verdeckt." - "Reinige den Sensor am oberen Rand des Bildschirms." + "Reinige den oberen Teil deines Bildschirms, einschließlich der schwarzen Leiste" "Gesicht nicht erkannt. Hardware nicht verfügbar." - "Gesichtserkennung noch einmal versuchen." + "Face Unlock noch einmal versuchen." "Kein Speicherplatz frei. Bitte erst ein Gesicht löschen." - "Gesichtserkennung abgebrochen" - "Gesichtserkennung vom Nutzer abgebrochen" + "Gesichtserkennung abgebrochen." + "Face Unlock vom Nutzer abgebrochen." "Zu viele Versuche, bitte später noch einmal versuchen" - "Zu viele Versuche. Die Gesichtserkennung wurde deaktiviert." + "Zu viele Versuche. Face Unlock wurde deaktiviert." "Gesichtsprüfung nicht möglich. Noch mal versuchen." - "Die Gesichtserkennung ist nicht eingerichtet" - "Gesichtserkennung wird auf diesem Gerät nicht unterstützt" + "Face Unlock ist nicht eingerichtet." + "Face Unlock wird auf diesem Gerät nicht unterstützt." "Gesicht %d" @@ -995,7 +996,7 @@ "Wochen" "Jahr" "Jahre" - "jetzt" + "Jetzt" %d min %d min @@ -1254,10 +1255,10 @@ "Tippen, um alle Netzwerke zu sehen" "Verbinden" "Alle Netzwerke" - "Verbindung mit WLANs herstellen?" - "Vorschlag von %s" - "Ja" - "Nein" + "Vorgeschlagene WLANs zulassen?" + "Von %s vorgeschlagene Netzwerke. Gerät verbindet sich möglicherweise automatisch." + "Zulassen" + "Nein danke" "WLAN wird automatisch aktiviert" "Wenn du in der Nähe eines sicheren gespeicherten Netzwerks bist" "Nicht wieder aktivieren" @@ -1887,8 +1888,8 @@ "Unkategorisiert" "Du hast die Wichtigkeit dieser Benachrichtigungen festgelegt." "Diese Benachrichtigung ist aufgrund der beteiligten Personen wichtig." - "Möchtest du zulassen, dass %1$s einen neuen Nutzer mit %2$s erstellt?" - "Möchtest du zulassen, dass %1$s einen neuen Nutzer mit %2$s erstellt? Dieses Konto wird jedoch bereits von einem anderen Nutzer verwendet." + "Es gibt bereits einen Nutzer mit %2$s. Möchtest du zulassen, dass %1$s einen neuen Nutzer mit diesem Konto erstellt?" + "Möchtest du zulassen, dass %1$s einen neuen Nutzer mit %2$s erstellt?" "Sprache hinzufügen" "Region auswählen" "Sprache eingeben" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 766b2ead6d325b45d1a014d28255c4ee523f2c4b..91105bb87ed075325b3ef22f8e0484b79813412d 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -95,6 +95,7 @@ "Μηνύματα αυτόματου τηλεφωνητή" "Κλήση Wi-Fi" "Κατάσταση SIM" + "Κατάσταση SIM υψηλής προτεραιότητας" "Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία" "Αίτημα peer για TTY Λειτουργία HCO" "Αίτημα peer για TTY Λειτουργία VCO" @@ -550,11 +551,11 @@ "Εικονίδιο δακτυλικών αποτυπωμάτων" - "διαχείριση υλικολογισμ. ελέγχου ταυτότ. προσώπου" + "διαχείριση εξοπλισμού Face Unlock" "Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση." - "χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου" - "Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας" - "Έλεγχος ταυτότητας προσώπου" + "χρήση εξοπλισμού Face Unlock" + "Επιτρέπει στην εφαρμογή να χρησιμοποιεί εξοπλισμό Face Unlock για έλεγχο ταυτότητας" + "Face Unlock" "Εγγράψτε ξανά το πρόσωπό σας" "Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας" "Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη." @@ -567,7 +568,7 @@ "Μετακινήστε το τηλέφωνο στα αριστερά." "Μετακινήστε το τηλέφωνο στα δεξιά." "Κοιτάξτε απευθείας τη συσκευή σας." - "Δεν εντοπίστηκε το πρόσωπό σας. Δείτε το τηλέφωνο." + "Στρέψτε το πρόσωπό σάς απευθείας στο τηλέφωνο." "Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο." "Καταχωρίστε ξανά το πρόσωπό σας." "Αδύνατη η αναγνώριση του προσώπου. Επανάληψη." @@ -576,19 +577,19 @@ "Στρέψτε λιγότερο το κεφάλι σας." "Στρέψτε λιγότερο το κεφάλι σας." "Απομακρύνετε οτιδήποτε κρύβει το πρόσωπό σας." - "Καθαρίστε τον αισθητήρα επάνω στην οθόνη." + "Καθαρίστε το επάνω μέρος της οθόνης σας, συμπεριλαμβανομένης της μαύρης γραμμής" "Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός." - "Επαναλάβετε τον έλεγχο ταυτότητας προσώπου." + "Δοκιμάστε ξανά το Face Unlock." "Η αποθήκ. νέων δεδομ. προσώπ. είναι αδύν. Διαγρ. ένα παλιό." - "Η λειτουργία προσώπου ακυρώθηκε" - "Ο έλεγχ. ταυτότ. προσώπου ακυρώθηκε από τον χρήστη" + "Η ενέργεια προσώπου ακυρώθηκε." + "Το Face Unlock ακυρώθηκε από τον χρήστη." "Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα." - "Υπερβ. πολλές προσπάθειες. Ο έλεγχ. ταυτ. προσώπου απενεργ." + "Υπερβολικά πολλές προσπάθειες. Το Face Unlock απενεργοποιήθηκε." "Αδύνατη επαλήθευση του προσώπου. Επανάληψη." - "Δεν έχετε ρυθμίσει τον έλεγχο ταυτότητας προσώπου" - "Ο έλεγχος ταυτότητας προσώπου δεν υποστηρίζεται στη συσκευή" + "Δεν έχετε ρυθμίσει το Face Unlock." + "Το Face Unlock δεν υποστηρίζεται σε αυτήν τη συσκευή." "Πρόσωπο %d" @@ -1254,10 +1255,10 @@ "Πατήστε για να δείτε όλα τα δίκτυα" "Σύνδεση" "Όλα τα δίκτυα" - "Σύνδεση σε δίκτυα Wi-Fi;" - "Προτείνεται από %s" - "Ναι" - "Όχι" + "Να επιτρέπονται προτεινόμενα δίκτυα Wi‑Fi;" + "Προτεινόμενα δίκτυα %s. Η συσκευή μπορεί να συνδεθεί αυτόματα." + "Αποδοχή" + "Όχι, ευχαριστώ" "Το Wi‑Fi θα ενεργοποιηθεί αυτόματα" "Όταν βρίσκεστε κοντά σε αποθηκευμένο δίκτυο υψηλής ποιότητας" "Να μην ενεργοποιηθεί ξανά" @@ -1672,7 +1673,7 @@ "Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με δύο δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):" "Επιλέξτε μια υπηρεσία που θα χρησιμοποιείται με την κίνηση προσβασιμότητας (σύρετε με τρία δάχτυλα προς τα επάνω από το κάτω μέρος της οθόνης):" "Για εναλλαγή μεταξύ υπηρεσιών, αγγίξτε παρατεταμένα το κουμπί προσβασιμότητας." - "Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με δύο δάχτυλα προς τα επάνω." + "Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με δύο δάχτυλα προς τα επάνω και μην τα απομακρύνετε από την οθόνη." "Για εναλλαγή μεταξύ υπηρεσιών, σύρετε παρατεταμένα με τρία δάχτυλα προς τα επάνω." "Μεγιστοποίηση" "Τρέχων χρήστης %1$s." @@ -1887,8 +1888,8 @@ "Μη κατηγοριοποιημένο" "Μπορείτε να ρυθμίσετε τη βαρύτητα αυτών των ειδοποιήσεων." "Αυτό είναι σημαντικό λόγω των ατόμων που συμμετέχουν." - "Να επιτραπεί στην εφαρμογή %1$s να δημιουργήσει έναν νέο χρήστη με το λογαριασμό %2$s;" - "Να επιτραπεί στην εφαρμογή %1$s να δημιουργήσει έναν νέο χρήστη με το λογαριασμό %2$s (υπάρχει ήδη χρήστης με αυτόν το λογαριασμό);" + "Επιτρέπετε στην εφαρμογή %1$s να δημιουργήσει έναν νέο χρήστη με τον λογαριασμό %2$s (υπάρχει ήδη χρήστης με αυτόν τον λογαριασμό);" + "Επιτρέπετε στην εφαρμογή %1$s να δημιουργήσει έναν νέο χρήστη με τον λογαριασμό %2$s;" "Προσθήκη γλώσσας" "Προτίμηση περιοχής" "Εισαγ. όνομα γλώσσας" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9ca98f308dc2ea6640177dacb52289ccd8f0ed1e..53fd166f76d8ac8a1b6acd754ed3e7fe819e8cef 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -95,6 +95,7 @@ "Voicemail messages" "Wi-Fi Calling" "SIM status" + "High priority SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -550,11 +551,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage face unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use face unlock hardware" + "Allows the app to use face unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -567,7 +568,7 @@ "Move phone to the left." "Move phone to the right." "Please look more directly at your device." - "Can’t see your face. Look at the phone." + "Position your face directly in front of the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." "No longer able to recognise face. Try again." @@ -576,19 +577,19 @@ "Turn your head a little less." "Turn your head a little less." "Remove anything hiding your face." - "Clean the sensor at the top edge of the screen." + "Clean the top of your screen, including the black bar" "Can’t verify face. Hardware not available." - "Try face authentication again." + "Try face unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up face unlock." + "Face unlock is not supported on this device." "Face %d" @@ -817,7 +818,7 @@ "Try again" "Try again" "Unlock for all features and data" - "Maximum Face Unlock attempts exceeded" + "Maximum face unlock attempts exceeded" "No SIM card" "No SIM card in tablet." "No SIM card in TV." @@ -1254,10 +1255,10 @@ "Tap to see all networks" "Connect" "All networks" - "Connect to Wi‑Fi networks?" - "Suggested by %s" - "Yes" - "No" + "Allow suggested Wi‑Fi networks?" + "%s suggested networks. Device may connect automatically." + "Allow" + "No, thanks" "Wi‑Fi will turn on automatically" "When you\'re near a high‑quality saved network" "Don\'t turn back on" @@ -1887,8 +1888,8 @@ "Uncategorised" "You set the importance of these notifications." "This is important because of the people involved." - "Allow %1$s to create a new User with %2$s ?" - "Allow %1$s to create a new User with %2$s (a User with this account already exists) ?" + "Allow %1$s to create a new User with %2$s (a User with this account already exists)?" + "Allow %1$s to create a new User with %2$s?" "Add a language" "Region preference" "Type language name" diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 4da6381a2887b3e5958091ebe9374941f1ed55dd..661c802444e998c008870a6847539f8b0cab1b3b 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -95,6 +95,7 @@ "Voicemail messages" "Wi-Fi Calling" "SIM status" + "High priority SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -550,11 +551,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage face unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use face unlock hardware" + "Allows the app to use face unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -567,7 +568,7 @@ "Move phone to the left." "Move phone to the right." "Please look more directly at your device." - "Can’t see your face. Look at the phone." + "Position your face directly in front of the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." "No longer able to recognise face. Try again." @@ -576,19 +577,19 @@ "Turn your head a little less." "Turn your head a little less." "Remove anything hiding your face." - "Clean the sensor at the top edge of the screen." + "Clean the top of your screen, including the black bar" "Can’t verify face. Hardware not available." - "Try face authentication again." + "Try face unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up face unlock." + "Face unlock is not supported on this device." "Face %d" @@ -817,7 +818,7 @@ "Try again" "Try again" "Unlock for all features and data" - "Maximum Face Unlock attempts exceeded" + "Maximum face unlock attempts exceeded" "No SIM card" "No SIM card in tablet." "No SIM card in TV." @@ -1254,10 +1255,10 @@ "Tap to see all networks" "Connect" "All networks" - "Connect to Wi‑Fi networks?" - "Suggested by %s" - "Yes" - "No" + "Allow suggested Wi‑Fi networks?" + "%s suggested networks. Device may connect automatically." + "Allow" + "No, thanks" "Wi‑Fi will turn on automatically" "When you\'re near a high‑quality saved network" "Don\'t turn back on" @@ -1887,8 +1888,8 @@ "Uncategorised" "You set the importance of these notifications." "This is important because of the people involved." - "Allow %1$s to create a new User with %2$s ?" - "Allow %1$s to create a new User with %2$s (a User with this account already exists) ?" + "Allow %1$s to create a new User with %2$s (a User with this account already exists)?" + "Allow %1$s to create a new User with %2$s?" "Add a language" "Region preference" "Type language name" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9ca98f308dc2ea6640177dacb52289ccd8f0ed1e..53fd166f76d8ac8a1b6acd754ed3e7fe819e8cef 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -95,6 +95,7 @@ "Voicemail messages" "Wi-Fi Calling" "SIM status" + "High priority SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -550,11 +551,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage face unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use face unlock hardware" + "Allows the app to use face unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -567,7 +568,7 @@ "Move phone to the left." "Move phone to the right." "Please look more directly at your device." - "Can’t see your face. Look at the phone." + "Position your face directly in front of the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." "No longer able to recognise face. Try again." @@ -576,19 +577,19 @@ "Turn your head a little less." "Turn your head a little less." "Remove anything hiding your face." - "Clean the sensor at the top edge of the screen." + "Clean the top of your screen, including the black bar" "Can’t verify face. Hardware not available." - "Try face authentication again." + "Try face unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up face unlock." + "Face unlock is not supported on this device." "Face %d" @@ -817,7 +818,7 @@ "Try again" "Try again" "Unlock for all features and data" - "Maximum Face Unlock attempts exceeded" + "Maximum face unlock attempts exceeded" "No SIM card" "No SIM card in tablet." "No SIM card in TV." @@ -1254,10 +1255,10 @@ "Tap to see all networks" "Connect" "All networks" - "Connect to Wi‑Fi networks?" - "Suggested by %s" - "Yes" - "No" + "Allow suggested Wi‑Fi networks?" + "%s suggested networks. Device may connect automatically." + "Allow" + "No, thanks" "Wi‑Fi will turn on automatically" "When you\'re near a high‑quality saved network" "Don\'t turn back on" @@ -1887,8 +1888,8 @@ "Uncategorised" "You set the importance of these notifications." "This is important because of the people involved." - "Allow %1$s to create a new User with %2$s ?" - "Allow %1$s to create a new User with %2$s (a User with this account already exists) ?" + "Allow %1$s to create a new User with %2$s (a User with this account already exists)?" + "Allow %1$s to create a new User with %2$s?" "Add a language" "Region preference" "Type language name" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 9ca98f308dc2ea6640177dacb52289ccd8f0ed1e..53fd166f76d8ac8a1b6acd754ed3e7fe819e8cef 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -95,6 +95,7 @@ "Voicemail messages" "Wi-Fi Calling" "SIM status" + "High priority SIM status" "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -550,11 +551,11 @@ "Fingerprint icon" - "manage face authentication hardware" + "manage face unlock hardware" "Allows the app to invoke methods to add and delete facial templates for use." - "use face authentication hardware" - "Allows the app to use face authentication hardware for authentication" - "Face Authentication" + "use face unlock hardware" + "Allows the app to use face unlock hardware for authentication" + "Face unlock" "Re-enrol your face" "To improve recognition, please re-enrol your face" "Couldn’t capture accurate face data. Try again." @@ -567,7 +568,7 @@ "Move phone to the left." "Move phone to the right." "Please look more directly at your device." - "Can’t see your face. Look at the phone." + "Position your face directly in front of the phone." "Too much motion. Hold phone steady." "Please re-enroll your face." "No longer able to recognise face. Try again." @@ -576,19 +577,19 @@ "Turn your head a little less." "Turn your head a little less." "Remove anything hiding your face." - "Clean the sensor at the top edge of the screen." + "Clean the top of your screen, including the black bar" "Can’t verify face. Hardware not available." - "Try face authentication again." + "Try face unlock again." "Can’t store new face data. Delete an old one first." - "Face operation cancelled" - "Face authentication cancelled by user" + "Face operation cancelled." + "Face unlock cancelled by user." "Too many attempts. Try again later." - "Too many attempts. Face authentication disabled." + "Too many attempts. Face unlock disabled." "Can’t verify face. Try again." - "You haven’t set up face authentication" - "Face authentication is not supported on this device" + "You haven’t set up face unlock." + "Face unlock is not supported on this device." "Face %d" @@ -817,7 +818,7 @@ "Try again" "Try again" "Unlock for all features and data" - "Maximum Face Unlock attempts exceeded" + "Maximum face unlock attempts exceeded" "No SIM card" "No SIM card in tablet." "No SIM card in TV." @@ -1254,10 +1255,10 @@ "Tap to see all networks" "Connect" "All networks" - "Connect to Wi‑Fi networks?" - "Suggested by %s" - "Yes" - "No" + "Allow suggested Wi‑Fi networks?" + "%s suggested networks. Device may connect automatically." + "Allow" + "No, thanks" "Wi‑Fi will turn on automatically" "When you\'re near a high‑quality saved network" "Don\'t turn back on" @@ -1887,8 +1888,8 @@ "Uncategorised" "You set the importance of these notifications." "This is important because of the people involved." - "Allow %1$s to create a new User with %2$s ?" - "Allow %1$s to create a new User with %2$s (a User with this account already exists) ?" + "Allow %1$s to create a new User with %2$s (a User with this account already exists)?" + "Allow %1$s to create a new User with %2$s?" "Add a language" "Region preference" "Type language name" diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 71946ee5a5669eaac400cf49bcc799f6b4fcccc2..2d1220f64aa518be85b8c1084ff107fb0770d0dc 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -95,6 +95,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‏‎Voicemail messages‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎Wi-Fi calling‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎SIM status‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‏‏‏‎High priority SIM status‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎‏‏‎‏‎Peer requested TTY Mode FULL‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‎‎‎‎‎Peer requested TTY Mode HCO‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎Peer requested TTY Mode VCO‎‏‎‎‏‎" @@ -550,11 +551,11 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‎‏‏‏‏‎‏‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‎‎‎‎‎Fingerprint icon‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‏‎‏‎‏‎‏‎‎‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‏‎manage face authentication hardware‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‏‏‎‎‏‎‎‎‏‎‎‏‎‎‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎manage face unlock hardware‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎‏‏‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‎‏‎‎Allows the app to invoke methods to add and delete facial templates for use.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‏‏‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎use face authentication hardware‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎Allows the app to use face authentication hardware for authentication‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎Face Authentication‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‎‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‏‎‎‎use face unlock hardware‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‏‎‎Allows the app to use face unlock hardware for authentication‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‎‏‏‎‏‎‏‏‎‏‏‎‏‎‎‎‎‎‎Face unlock‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‏‏‏‎‏‏‎‎‏‎‏‎Re-enroll your face‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‏‎‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‏‎‏‏‎To improve recognition, please re-enroll your face‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‏‏‎‎‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‏‎‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎Couldn’t capture accurate face data. Try again.‎‏‎‎‏‎" @@ -567,7 +568,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‎‏‎‏‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎Move phone to the left.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎‏‏‎‎‏‏‏‎‎‏‎‎‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‏‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‎‎‎‎‎‎Move phone to the right.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎Please look more directly at your device.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‎‏‏‎‎‎‏‎‏‏‎‏‎‎‏‎Can’t see your face. Look at the phone.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‎‏‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎Position your face directly in front of the phone.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‎‎‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‎‏‏‎Too much motion. Hold phone steady.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‏‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎Please re-enroll your face.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎No longer able to recognize face. Try again.‎‏‎‎‏‎" @@ -576,19 +577,19 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎Turn your head a little less.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‎‎‎‏‎‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎Turn your head a little less.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‏‏‎‏‎‏‎‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‏‎‏‎‎‏‎‎‎‏‏‎Remove anything hiding your face.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‎‎‎‎‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎Clean the sensor at the top edge of the screen.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‏‎‏‏‎Clean the top of your screen, including the black bar‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‎‎‏‎‎‏‏‎‎‎‏‎‏‏‎‎‏‎‎‎‏‎‎‎Can’t verify face. Hardware not available.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‎Try face authentication again.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‎‏‎Try face unlock again.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‎‏‏‎‏‎‎‎‎‏‎Can’t store new face data. Delete an old one first.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‏‏‎‎‏‎‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎Face operation canceled‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‎‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎Face authentication canceled by user‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‏‎Face operation canceled.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‏‎‏‎‎‏‎‎Face unlock canceled by user.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‏‏‏‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‏‎‏‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎Too many attempts. Try again later.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‎‏‎‏‏‏‏‎‎‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‏‏‎‏‎Too many attempts. Face authentication disabled.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‏‏‎‏‏‎‎‏‎‏‎‎‎‎‎‎‎‎‎‎‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‎‎‎‏‎‎‎‏‎‎‎‏‏‏‎Too many attempts. Face unlock disabled.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‏‏‎‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎Can’t verify face. Try again.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎‎‏‎‎‏‎‎‎You haven’t set up face authentication‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎Face authentication is not supported on this device‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‎‎‏‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎You haven’t set up face unlock.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎‎Face unlock is not supported on this device.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‏‏‏‎‏‏‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‎‎Face ‎‏‎‎‏‏‎%d‎‏‎‎‏‏‏‎‎‏‎‎‏‎" @@ -1254,10 +1255,10 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‎‏‏‎‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎Tap to see all networks‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‎‏‏‎‎‎‏‏‏‏‏‎‎‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‎‎‎‎‏‎‏‎‎‎Connect‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎All networks‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‏‎‎‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎Connect to Wi‑Fi networks?‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎‏‏‎‎‏‎Suggested by ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‏‎‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎Yes‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‏‏‎‎‏‎No‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‎‎‏‏‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎‎‏‎Allow suggested Wi‑Fi networks?‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎ suggested networks. Device may connect automatically.‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎Allow‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‎No thanks‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‏‏‎‎‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎Wi‑Fi will turn on automatically‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎When you\'re near a high quality saved network‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‎‏‎‎‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‏‏‎‎‎Don\'t turn back on‎‏‎‎‏‎" @@ -1887,8 +1888,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‎‎‏‎‏‏‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎Uncategorized‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎You set the importance of these notifications.‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‎‎‏‎‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎This is important because of the people involved.‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‏‎Allow ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ to create a new User with ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ ?‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‎‎‏‏‎‎‏‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‎‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎Allow ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ to create a new User with ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ (a User with this account already exists) ?‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‏‏‏‏‏‏‎‎‎‏‏‎‏‎‏‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‏‏‎Allow ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ to create a new User with ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ (a User with this account already exists) ?‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‎‏‏‎‏‏‏‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‎‎‎‏‏‎Allow ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ to create a new User with ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎ ?‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‎‎‎‏‏‎‏‏‏‏‎‎‎‎‎‎‎Add a language‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‎‏‎Region preference‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‏‎‏‏‏‏‏‏‏‏‎‎‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‎Type language name‎‏‎‎‏‎" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 2b56aa6be7807cceabf1940dd297ae678f228cbe..36c03976b16f775a9f2328c7b473ec423e595fed 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -30,7 +30,7 @@ "<Sin título>" "(No hay número de teléfono)" "Desconocido" - "Correo de voz" + "Buzón de voz" "MSISDN1" "Problema de conexión o código incorrecto de MMI." "La operación está limitada a números de marcación fija." @@ -95,6 +95,7 @@ "Mensajes del buzón de voz" "Llamada con Wi-Fi" "Estado de SIM" + "Notificaciones de prioridad alta sobre el estado de la SIM" "El dispositivo del mismo nivel solicitó el modo TTY FULL." "El dispositivo del mismo nivel solicitó el modo TTY HCO." "El dispositivo del mismo nivel solicitó el modo TTY VCO." @@ -550,11 +551,11 @@ "Ícono de huella digital" - "administrar el hardware de autenticación facial" + "administrar el hardware de Desbloqueo facial" "Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso." - "usar el hardware de autenticación facial" - "Permite que la app use el hardware de autenticación facial para reconocerte" - "Autenticación facial" + "usar el hardware de Desbloqueo facial" + "Permite que la app use el hardware de Desbloqueo facial con fines de autenticación" + "Desbloqueo facial" "Vuelve a registrar tu rostro" "Para mejorar el reconocimiento, vuelve a registrar tu rostro" "Datos faciales imprecisos. Vuelve a intentarlo." @@ -567,7 +568,7 @@ "Mueve el teléfono hacia la izquierda." "Mueve el teléfono hacia la derecha." "Mira directamente al dispositivo." - "No se ve tu cara. Mira el teléfono." + "Ubica el rostro directamente frente al teléfono." "Te estás moviendo demasiado. No muevas el teléfono" "Vuelve a registrar tu cara." "Ya no se reconoce la cara. Vuelve a intentarlo." @@ -576,19 +577,19 @@ "Gira la cabeza un poco menos." "Gira la cabeza un poco menos." "Quítate cualquier objeto que te cubra el rostro." - "Limpiar sensor del borde superior de la pantalla." + "Limpia la parte superior de la pantalla, incluida la barra negra" "No se verificó el rostro. Hardware no disponible." - "Vuelve a realizar la autenticación de rostro." + "Vuelve a probar el Desbloqueo facial." "No hay espacio para datos faciales nuevos. Borra uno viejo." - "Se canceló el reconocimiento facial" - "El usuario canceló la autenticación facial" + "Se canceló el reconocimiento facial." + "El usuario canceló el Desbloqueo facial." "Demasiados intentos. Inténtalo de nuevo más tarde." - "Demasiados intentos. Se inhabilitó la autenticación facial." + "Demasiados intentos. Se inhabilitó el Desbloqueo facial." "No se pudo verificar la cara. Vuelve a intentarlo." - "No configuraste la autenticación facial" - "No se admite la autenticación facial en este dispositivo" + "No configuraste el Desbloqueo facial." + "No se admite el Desbloqueo facial en este dispositivo." "Rostro %d" @@ -940,7 +941,7 @@ "Permite que la aplicación modifique el historial o los favoritos del navegador almacenados en el dispositivo. La aplicación puede utilizar este permiso para borrar o modificar los datos del navegador. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." "programar una alarma" "Permite que la aplicación establezca una alarma en una aplicación de alarma instalada. Es posible que algunas aplicaciones de alarma no incluyan esta función." - "agregar correo de voz" + "agregar buzón de voz" "Permite que la aplicación agregue mensajes a la bandeja de entrada de tu buzón de voz." "Modificar los permisos de ubicación geográfica del navegador" "Permite que la aplicación modifique los permisos de ubicación geográfica del navegador. Las aplicaciones maliciosas pueden utilizar esto para permitir el envío de información de ubicación a sitios web arbitrarios." @@ -1254,10 +1255,10 @@ "Presiona para ver todas las redes" "Conectar" "Todas las redes" - "¿Quieres conectarte a redes Wi-Fi?" - "Sugerido por %s" - "Sí" - "No" + "¿Quieres permitir las redes Wi‑Fi sugeridas?" + "%s sugirió redes. Es posible que el dispositivo se conecte automáticamente." + "Permitir" + "No, gracias" "Se activará la conexión Wi-Fi automáticamente" "Cuando estés cerca de una red guardada de alta calidad" "No volver a activar" @@ -1887,8 +1888,8 @@ "Sin categoría" "Estableciste la importancia de estas notificaciones." "Es importante debido a las personas involucradas." - "¿Quieres permitir que %1$s cree un usuario nuevo con %2$s?" - "¿Quieres permitir que %1$s cree un usuario nuevo con %2$s? (Ya existe un usuario con esta cuenta)" + "¿Quieres permitir que %1$s cree un usuario nuevo con %2$s? (Ya existe un usuario con esta cuenta)" + "¿Deseas permitir que %1$s cree un usuario nuevo con %2$s?" "Agregar un idioma" "Preferencia de región" "Nombre del idioma" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 7a31b1af781f6a63bbee655956ec889fc2056c2e..7bb51b276452ec061943b98e49d3cfba3766b99a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -95,6 +95,7 @@ "Mensajes de voz" "Llamada por Wi-Fi" "Estado de la tarjeta SIM" + "Estado de SIM de alta prioridad" "Un dispositivo ha solicitado el modo TTY FULL" "Un dispositivo ha solicitado el modo TTY HCO" "Un dispositivo ha solicitado el modo TTY VCO" @@ -550,11 +551,11 @@ "Icono de huella digital" - "gestionar el hardware de autenticación facial" + "gestionar el hardware de desbloqueo facial" "Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso." - "usar el hardware de autenticación facial" - "Permite que la aplicación utilice el hardware de autenticación facial para autenticarte" - "Autenticación facial" + "Utilizar hardware de desbloqueo facial" + "Permite que la aplicación utilice el hardware de desbloqueo facial para autenticarte" + "Desbloqueo facial" "Volver a registrar la cara" "Para mejorar el reconocimiento, vuelve a registrar tu cara" "Datos faciales no reconocidos. Vuelve a intentarlo." @@ -567,7 +568,7 @@ "Mueve el teléfono hacia la izquierda." "Mueve el teléfono hacia la derecha." "Mira de forma más directa al dispositivo." - "No se detecta tu cara. Mira al teléfono." + "Coloca la cara directamente frente al teléfono." "El teléfono se mueve demasiado. Mantenlo quieto." "Vuelve a registrar tu cara." "No puede reconocer tu cara. Vuelve a intentarlo." @@ -576,19 +577,19 @@ "Gira la cabeza un poco menos." "No gires tanto la cabeza." "Retira cualquier objeto que te tape la cara." - "Limpia el sensor situado en la parte superior." + "Limpia la parte superior de la pantalla, incluida la barra de color negro" "No se puede verificar. Hardware no disponible." - "Vuelve a probar la autenticación facial." + "Vuelve a probar el desbloqueo facial." "Para guardar nuevos datos faciales, borra otros antiguos." - "Se ha cancelado el reconocimiento facial" - "El usuario ha cancelado la autenticación facial" + "Se ha cancelado el reconocimiento facial." + "El usuario ha cancelado el desbloqueo facial." "Demasiados intentos. Inténtalo de nuevo más tarde." - "Muchos intentos. Se ha inhabilitado la autenticación facial." + "Muchos intentos. Se ha inhabilitado el desbloqueo facial." "No se ha verificado tu cara. Vuelve a intentarlo." - "No has configurado la autenticación facial" - "Autenticación facial no disponible en este dispositivo" + "No has configurado el desbloqueo facial." + "El desbloqueo facial no está disponible en este dispositivo." "Cara %d" @@ -1254,10 +1255,10 @@ "Toca para ver todas las redes" "Conectarse" "Todas las redes" - "¿Quieres conectarte a redes Wi-Fi?" - "Sugerido por %s" - "Sí" - "No" + "¿Permitir sugerencias de redes Wi‑Fi?" + "%s te ha sugerido alguna red. El dispositivo puede que se conecte automáticamente." + "Permitir" + "No, gracias" "La conexión Wi‑Fi se activará automáticamente" "Cuando estés cerca de una red de alta calidad guardada" "No volver a activar" @@ -1354,7 +1355,7 @@ "Se ha detectado un accesorio de audio analógico" "El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información." "Depuración USB habilitada" - "Toca para desactivar la depuración USB." + "Tocar para desactivar depuración USB" "Seleccionar para inhabilitar la depuración USB" "Modo de agente de prueba habilitado" "Restablece los ajustes de fábrica para inhabilitar el modo de agente de prueba." @@ -1669,8 +1670,8 @@ "El acceso directo a accesibilidad ha desactivado %1$s" "Para utilizar %1$s, mantén pulsadas ambas teclas de volumen durante 3 segundos" "Selecciona el servicio que se utilizará cuando toques el botón Accesibilidad:" - "Elige el servicio que se utilizará con el gesto de accesibilidad (desliza dos dedos hacia arriba desde la parte inferior de la pantalla):" - "Elige el servicio que se utilizará con el gesto de accesibilidad (desliza tres dedos hacia arriba desde la parte inferior de la pantalla):" + "Elige el servicio que se utilizará con el gesto de accesibilidad (deslizar dos dedos hacia arriba desde la parte inferior de la pantalla):" + "Elige el servicio que se utilizará con el gesto de accesibilidad (deslizar tres dedos hacia arriba desde la parte inferior de la pantalla):" "Para cambiar de un servicio a otro, mantén pulsado el botón de accesibilidad." "Para cambiar de un servicio a otro, desliza dos dedos hacia arriba y mantén pulsada la pantalla." "Para cambiar de un servicio a otro, desliza tres dedos hacia arriba y mantén pulsada la pantalla." @@ -1887,9 +1888,9 @@ "Sin clasificar" "Tú determinas la importancia de estas notificaciones." "Esto es importante por los usuarios implicados." - "¿Permitir que %1$s cree un usuario con la cuenta %2$s?" - "¿Permitir que %1$s cree un usuario con la cuenta %2$s (ya existe un usuario con esta cuenta)?" - "Añade un idioma" + "¿Permitir que %1$s cree otro usuario con la cuenta %2$s, que ya tiene uno?" + "¿Permitir que %1$s cree otro usuario con la cuenta %2$s?" + "Añadir un idioma" "Preferencia de región" "Nombre de idioma" "Sugeridos" diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 3f37768e9b3d9b1d0a3e2b22f5a0695aa98e1c65..e2afa3b1d023e45f3a9c712c148f50c00c4e7479 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -95,6 +95,7 @@ "Kõnepostisõnumid" "WiFi-kõned" "SIM-kaardi olek" + "Kõrge prioriteediga SIM-i olek" "Partner taotles TTY-režiimi TÄIELIK" "Partner taotles TTY-režiimi HCO" "Partner taotles TTY-režiimi VCO" @@ -242,7 +243,7 @@ "Hääletu režiim" "Heli on VÄLJAS" "Heli on SEES" - "Lennurežiim" + "Lennukirežiim" "Lennurežiim on SEES" "Lennurežiim on VÄLJAS" "Seaded" @@ -550,11 +551,11 @@ "Sõrmejälje ikoon" - "hallata näo autentimise riistvara" + "hallata Face Unlocki riistvara" "Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks." - "kasutada näo autentimise riistvara" - "Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara" - "Näo autentimine" + "kasutada Face Unlocki riistvara" + "Võimaldab rakendusel autentimiseks kasutada Face Unlocki riistvara" + "Face Unlock" "Registreerige oma nägu uuesti" "Tuvastamise parandamiseks registreerige oma nägu uuesti" "Näoandmeid ei saanud jäädvustada. Proovige uuesti." @@ -567,7 +568,7 @@ "Liigutage telefoni vasakule." "Liigutage telefoni paremale." "Vaadake otse oma seadmesse." - "Teie nägu ei ole näha. Vaadake telefoni poole." + "Hoidke oma nägu otse telefoni ees." "Liiga palju liikumist. Hoidke telefoni paigal." "Registreerige oma nägu uuesti." "Nägu ei õnnestu enam tuvastada. Proovige uuesti." @@ -576,19 +577,19 @@ "Pöörake oma pead veidi vähem." "Pöörake oma pead veidi vähem." "Eemaldage kõik, mis varjab teie nägu." - "Puhastage ekraani ülaservas olev andur." + "Puhastage ekraani ülaosa, sh musta värvi riba" "Nägu ei saa kinnitada. Riistvara pole saadaval." - "Proovige uuesti näo autentimist." + "Proovige Face Unlocki uuesti." "Uue näo andmeid ei saa salvestada. Kustutage enne vanad." - "Näo autentimise toiming tühistati" - "Kasutaja tühistas näo autentimise" + "Näotuvastuse toiming tühistati." + "Kasutaja tühistas Face Unlocki." "Liiga palju katseid. Proovige hiljem uuesti." - "Liiga palju katseid. Näo autentimine on keelatud." + "Liiga palju katseid. Face Unlock on keelatud." "Nägu ei saa kinnitada. Proovige uuesti." - "Näo autentimist ei ole seadistatud." - "Seade ei toeta näo autentimist" + "Face Unlocki ei ole seadistatud." + "Seade ei toeta Face Unlocki." "Nägu %d" @@ -1254,10 +1255,10 @@ "Puudutage kõikide võrkude nägemiseks" "Ühenda" "Kõik võrgud" - "Kas soovite luua ühenduse WiFi-võrkudega?" - "Soovitas %s" - "Jah" - "Ei" + "Kas lubada soovitatud WiFi-võrgud?" + "Rakenduse %s soovitatud võrgud. Seade võib automaatselt ühenduse luua." + "Luba" + "Tänan, ei" "WiFi lülitub sisse automaatselt" "Kui olete kvaliteetse salvestatud võrgu läheduses" "Ära lülita tagasi sisse" @@ -1669,7 +1670,7 @@ "Juurdepääsetavuse otsetee lülitas teenuse %1$s välja" "Teenuse %1$s kasutamiseks hoidke kolm sekundit all mõlemat helitugevuse klahvi" "Valige, millist teenust kasutada, kui puudutate juurdepääsetavuse nuppu:" - "Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (pühkige kahe sõrmega ekraanikuval alt üles):" + "Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (kahe sõrmega ekraanikuval alt üles pühkimine):" "Valige, millist teenust kasutada koos juurdepääsetavuse liigutusega (kolme sõrmega ekraanikuval alt üles pühkimine):" "Teenuste vahel vahetamiseks vajutage pikalt juurdepääsetavuse nuppu." "Teenuste vahel vahetamiseks pühkige kahe sõrmega üles ja hoidke." @@ -1887,8 +1888,8 @@ "Kategoriseerimata" "Teie määrasite nende märguannete tähtsuse." "See on tähtis osalevate inimeste tõttu." - "Kas lubada rakendusel %1$s luua uus kasutaja kontoga %2$s?" - "Kas lubada rakendusel %1$s luua uus kasutaja kontoga %2$s (selle kontoga kasutaja on juba olemas)?" + "Kas lubada rakendusel %1$s luua uus kasutaja kontoga %2$s (selle kontoga kasutaja on juba olemas)?" + "Kas lubada rakendusel %1$s luua uus kasutaja kontoga %2$s?" "Keele lisamine" "Piirkonnaeelistus" "Sisestage keele nimi" diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index bd68b2b9d76405f9deb7f4d968c1dd61a2e6f385..fe3a7a6af2f8537d4ac427cdef14e22b953e5457 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -95,6 +95,7 @@ "Erantzungailuko mezuak" "Wi-Fi bidezko deiak" "SIMaren egoera" + "SIM txartelaren lehentasun handiko jakinarazpenak" "Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du" @@ -374,7 +375,7 @@ "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke." "Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake." "Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke." - "Exekutatu zerbitzuak aurreko planoan" + "Abiarazi zerbitzuak aurreko planoan" "Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari." "neurtu aplikazioen biltegiratzeko tokia" "Bere kodea, datuak eta cache-tamainak eskuratzeko baimena ematen die aplikazioei." @@ -421,7 +422,7 @@ "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." "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." "Atzitu kokapena atzeko planoan" - "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan exekutatu bitartean atzitu ahalko du aplikazioak kokapena." + "Baimen hau ematen bada kokapen zehatz edo gutxi gorabeherakorako sarbideaz gain, atzeko planoan abian den bitartean atzitu ahalko du aplikazioak kokapena." "aldatu audio-ezarpenak" "Audio-ezarpen orokorrak aldatzeko baimena ematen dio; besteak beste, bolumena eta irteerarako zer bozgorailu erabiltzen den." "grabatu audioa" @@ -550,11 +551,11 @@ "Hatz-markaren ikonoa" - "kudeatu aurpegi bidez autentifikatzeko hardwarea" + "kudeatu aurpegiaren bidez desblokeatzeko hardwarea" "Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari." - "erabili aurpegi bidez autentifikatzeko hardwarea" - "Aurpegi bidez autentifikatzeko hardwarea erabiltzea baimentzen dio aplikazioari" - "Aurpegi bidezko autentifikazioa" + "erabili aurpegiaren bidez desblokeatzeko hardwarea" + "Autentifikazioa egiteko aurpegiaren bidez desblokeatzeko hardwarea erabiltzeko baimena ematen dio aplikazioari" + "Aurpegiaren bidez desblokeatzeko aukera" "Erregistratu aurpegia berriro" "Ezagutzea hobetzeko, erregistratu aurpegia berriro" "Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro." @@ -567,7 +568,7 @@ "Mugitu telefonoa ezkerretara." "Mugitu telefonoa eskuinetara." "Begiratu zuzenago gailuari." - "Ez da hautematen aurpegia. Begiratu telefonoari." + "Ipini aurrez aurre aurpegia eta telefonoa." "Mugimendu gehiegi dago. Eutsi tinko telefonoari." "Erregistratu berriro aurpegia." "Ez dugu ezagutzen aurpegi hori. Saiatu berriro." @@ -576,19 +577,19 @@ "Biratu burua pixka bat gutxiago." "Biratu burua pixka bat gutxiago." "Kendu aurpegia estaltzen dizuten gauzak." - "Garbitu pantailaren goiko ertzeko sentsorea." + "Garbitu pantailaren goialdea, barra beltza barne" "Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri." - "Saiatu berriro aurpegi bidez autentifikatzen" + "Saiatu berriro aurpegiaren bidez desblokeatzen." "Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak." - "Utzi da aurpegi bidezko eragiketa" - "Erabiltzaileak utzi du aurpegi bidezko autentifikazioa" + "Utzi da aurpegiaren bidezko eragiketa." + "Erabiltzaileak bertan behera utzi du aurpegiaren bidez desblokeatzea." "Saiakera gehiegi egin dituzu. Saiatu berriro geroago." - "Saiakera gehiegi egin dira. Desgaitu egin da aurpegi bidezko autentifikazioa." + "Saiakera gehiegi egin dira. Aurpegiaren bidez desblokeatzeko aukera desgaitu egin da." "Ezin da egiaztatu aurpegia. Saiatu berriro." - "Ez duzu konfiguratu aurpegi bidezko autentifikazioa" - "Gailu honek ez du onartzen aurpegi bidezko autentifikazioa" + "Ez duzu konfiguratu aurpegiaren bidez desblokeatzeko aukera." + "Gailu honek ez du onartzen aurpegiaren bidez desblokeatzea." "%d aurpegia" @@ -1176,7 +1177,7 @@ "Itxaron" "Orriak ez du erantzuten.\n\nItxi egin nahi duzu?" "Aplikazioa birbideratu da" - "%1$s aplikazioa exekutatzen ari da." + "%1$s aplikazioa abian da." "%1$s aplikazioa lehenago abiarazi da." "Eskala" "Erakutsi beti" @@ -1202,7 +1203,7 @@ "%1$s prestatzen." "Aplikazioak abiarazten." "Bertsio-berritzea amaitzen." - "%1$s exekutatzen" + "%1$s abian da" "Sakatu jokora itzultzeko" "Aukeratu joko bat" "Funtzionamendu hobea izateko, joko hauetako bat baino ezin da egon irekita aldi berean." @@ -1254,10 +1255,10 @@ "Sakatu hau sare guztiak ikusteko" "Konektatu" "Sare guztiak" - "Wifi-sareetara konektatu nahi duzu?" - "%s aplikazioak iradoki du" - "Bai" - "Ez" + "Iradokitako wifi-sareak baimendu nahi dituzu?" + "%s aplikazioak sare batzuk iradoki ditu. Baliteke gailua automatikoki konektatzea." + "Baimendu" + "Ez, eskerrik asko" "Wi‑Fi konexioa automatikoki aktibatuko da" "Gordeta daukazun kalitate handiko sare batetik gertu zaudenean" "Ez aktibatu berriro" @@ -1354,8 +1355,8 @@ "Konektatutako gailua kargatzen ari da. Sakatu aukera gehiago ikusteko." "Audio-osagarri analogiko bat hauteman da" "Erantsitako gailua ez da telefono honekin bateragarria. Sakatu informazio gehiago lortzeko." - "USB arazketa konektatuta" - "Sakatu USB arazketa desaktibatzeko" + "USB bidezko arazketa konektatuta" + "Sakatu USB bidezko arazketa desaktibatzeko" "Hautatu USB arazketa desgaitzeko." "Proba-materialeko modua gaitu da" "Proba-materialaren modua desgaitzeko, berrezarri jatorrizko datuak." @@ -1440,7 +1441,7 @@ "Hurrengoa" "Eginda" "Atzera" - "Exekutatu" + "Abiarazi" "Markatu zenbakia \n%s erabilita" "Sortu kontaktua\n%s erabilita" "Aplikazio hauetako bat edo gehiago kontua orain eta etorkizunean atzitzeko baimena eskatzen ari dira." @@ -1635,7 +1636,7 @@ "PIN kode okerra." "Idatzi 4 eta 8 zenbaki arteko PINa." "PUK kodeak 8 zenbaki izan behar ditu." - "Idatzi berriro PUK kode zuzena. Hainbat saiakera oker eginez gero, betirako desgaituko da SIMa." + "Idatzi berriro PUK kode zuzena. Hainbat saiakera oker eginez gero, betiko desgaituko da SIMa." "PIN kodeak ez datoz bat" "Eredua marrazteko saiakera gehiegi egin dira" "Desblokeatzeko, hasi saioa Google kontuarekin." @@ -1888,8 +1889,8 @@ "Kategoriarik gabea" "Zuk ezarri duzu jakinarazpen hauen garrantzia." "Garrantzitsua da eragiten dien pertsonengatik." - "%1$s aplikazioari %2$s kontua duen erabiltzailea sortzeko baimena eman nahi diozu?" - "%1$s aplikazioari %2$s kontua duen erabiltzailea sortzeko baimena eman nahi diozu? (Badago kontu hori duen erabiltzaile bat)" + "%1$s aplikazioari %2$s kontua duen erabiltzailea sortzeko baimena eman nahi diozu? (Badago kontu hori duen erabiltzaile bat)" + "%1$s aplikazioari %2$s kontua duen erabiltzailea sortzeko baimena eman nahi diozu?" "Gehitu hizkuntza" "Lurralde-hobespena" "Adierazi hizkuntza" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index c1fc07453a98ad38c44e6be0cbaab988eb84ebbb..2f90fc967b2fd580644a4ae8ea91fd0581b4a0a8 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -95,6 +95,7 @@ "پیام‌های پست صوتی" "‏تماس ازطریق Wi-Fi" "وضعیت سیم‌کارت" + "وضعیت سیم با اولویت بالا" "‏دستگاه مرتبط درخواست TTY حالت FULL کرد" "‏دستگاه مرتبط درخواست TTY حالت HCO کرد" "‏دستگاه مرتبط درخواست TTY حالت VCO کرد" @@ -290,7 +291,7 @@ "‏به <b>%1$s</b> اجازه داده شود به تقویم شما دسترسی پیدا کند؟" "پیامک" "ارسال و مشاهده پیامک‌ها" - "‏به <b>%1$s<b> اجازه داده شود پیامک‌ها را ارسال و مشاهده کند؟" + "‏به «<b>%1$s<b>» اجازه داده شود پیامک ارسال و مشاهده کند؟" "حافظه" "دسترسی به عکس‌ها، رسانه‌ها و فایل‌های روی دستگاهتان" "‏به برنامه <b>%1$s<b> اجازه داده شود به عکس‌ها، رسانه، و فایل‌های موجود در دستگاهتان دسترسی داشته باشد؟" @@ -550,11 +551,11 @@ "نماد اثر انگشت" - "مدیریت سخت‌افزار احراز هویت با چهره" + "مدیریت سخت‌افزار «بازگشایی با چهره»" "به برنامه امکان می‌دهد روش‌هایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند." - "استفاده از سخت‌افزار احراز هویت با چهره" - "به برنامه امکان می‌دهد از سخت‌افزار احراز هویت با چهره برای احراز هویت استفاده کند" - "احراز هویت با چهره" + "استفاده از سخت‌افزار «بازگشایی با چهره»" + "به برنامه امکان می‌دهد از سخت‌افزار «بازگشایی با چهره» برای احراز هویت استفاده کند" + "بازگشایی با چهره" "ثبت مجدد چهره" "برای بهبود تشخیص، لطفاً چهره‌تان را دوباره ثبت کنید" "داده‌های دقیق چهره ضبط نشد. دوباره امتحان کنید." @@ -567,7 +568,7 @@ "تلفن را به‌سمت چپ حرکت دهید." "تلفن را به سمت راست حرکت دهید." "لطفاً مستقیم به دستگاه نگه کنید." - "چهره‌تان دیده نمی‌شود. به تلفن نگاه کنید." + "صورتتان را مستقیماً روبروی تلفن قرار دهید." "حرکت خیلی زیاد است. تلفن را ثابت نگه‌دارید." "لطفاً چهره‌تان را مجدداً ثبت کنید." "دیگر چهره را تشخیص نمی‌دهد. دوباره امتحان کنید." @@ -576,19 +577,19 @@ "سرتان را کمی پایین آورید." "سرتان را کمی پایین آورید." "هرچیزی را که حائل چهره‌تان است بردارید." - "حسگر واقع در لبه بالای صفحه را تمیز کنید." + "بالای صفحه و همچنین نوار مشکی را تمیز کنید." "چهره تأیید نشد. سخت‌افزار در دسترس نیست." - "احراز هویت با چهره با دوباره امتحان کنید." + "«بازگشایی با چهره» را دوباره امتحان کنید." "داده‌ چهره جدید ذخیره نشد. اول داده‌ چهره قدیمی را حذف کنید." - "عملیات شناسایی چهره لغو شد" - "احراز هویت چهره توسط کاربر لغو شد" + "عملیات شناسایی چهره لغو شد." + "کاربر «بازگشایی با چهره» را لغو کرد." "تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید." - "تعداد تلاش‌ها بیش‌ازحد مجاز است. احرازهویت چهره غیرفعال شد." + "تعداد تلاش‌ها بیش‌ازحد مجاز است. «بازگشایی با چهره» غیرفعال است." "چهره تأیید نشد. دوباره امتحان کنید." - "احراز هویت چهره راه‌اندازی نشده است" - "احراز هویت چهره در این دستگاه پشتیبانی نمی‌شود." + "«بازگشایی با چهره» را راه‌اندازی نکرده‌اید." + "«بازگشایی با چهره» در این دستگاه پشتیبانی نمی‌شود." "چهره %d" @@ -1254,10 +1255,10 @@ "برای دیدن همه شبکه‌ها ضربه بزنید" "اتصال" "همه شبکه‌ها" - "‏به شبکه‌های Wi-Fi متصل می‌شوید؟" - "پیشنهاد %s" - "بله" - "خیر" + "‏شبکه‌های Wi‑Fi پیشنهادی مجاز شود؟" + "شبکه‌های پیشنهادی %s. ممکن است دستگاه به‌طور خودکار متصل شود." + "مجاز" + "نه متشکرم" "‏Wi‑Fi به‌طور خودکار روشن خواهد شد" "وقتی نزدیک شبکه ذخیره‌شده با کیفیت بالا هستید" "دوباره روشن نشود" @@ -1807,8 +1808,8 @@ "توسط سرپرست سیستم به‌روزرسانی شد" "توسط سرپرست سیستم حذف شد" "تأیید" - "بهینه‌سازی باتری فعالیت پس‌زمینه، برخی جلوه‌های دیداری، و سایر ویژگی‌های با مصرف بالای نیرو را خاموش یا محدود می‌کند تا عمر باتری افزایش یابد. ""بیشتر بدانید" - "بهینه‌سازی باتری فعالیت پس‌زمینه، برخی جلوه‌های دیداری، و سایر ویژگی‌های با مصرف بالای نیرو را خاموش یا محدود می‌کند تا عمر باتری افزایش یابد." + "«بهینه‌سازی باتری» فعالیت پس‌زمینه، برخی جلوه‌های دیداری، و سایر ویژگی‌های پرمصرف نیرو را خاموش یا محدود می‌کند تا عمر باتری افزایش یابد. ""بیشتر بدانید" + "«بهینه‌سازی باتری» فعالیت پس‌زمینه، برخی جلوه‌های دیداری، و سایر ویژگی‌های پرمصرف نیرو را خاموش یا محدود می‌کند تا عمر باتری افزایش یابد." "برای کمک به کاهش مصرف داده، «صرفه‌جویی داده» از ارسال و دریافت داده در پس‌زمینه ازطرف بعضی برنامه‌ها جلوگیری می‌کند. برنامه‌ای که درحال‌حاضر استفاده می‌کنید می‌تواند به داده‌ها دسترسی داشته باشد اما دفعات دسترسی آن محدود است.این یعنی، برای مثال، تصاویر تا زمانی که روی آن‌ها ضربه نزنید نشان داده نمی‌شوند." "صرفه‌جویی داده روشن شود؟" "روشن کردن" @@ -1887,8 +1888,8 @@ "دسته‌بندی‌نشده" "شما اهمیت این اعلان‌ها را تنظیم می‌کنید." "به دلیل افراد درگیر مهم است." - "به %1$s امکان داده شود کاربر جدیدی با %2$s اضافه کند؟" - "به %1$s امکان داده شود کاربر جدیدی با %2$s ایجاد کند (کاربری با این حساب از قبل وجود دارد)؟" + "به%1$s اجازه می‌دهید با %2$s (کاربری با این حساب درحال‌حاضر وجود دارد) کاربری جدید ایجاد کند؟" + "به %1$s اجازه می‌دهید با %2$s کاربری جدید ایجاد کند؟" "افزودن زبان" "اولویت‌های منطقه" "نام زبان را تایپ کنید" @@ -2000,15 +2001,15 @@ "نمایش روی برنامه‌های دیگر در صفحه‌نمایش" "اعلان اطلاعات حالت روال معمول" "ممکن است شارژ باتری قبل از شارژ معمول تمام شود" - "جهت افزایش عمر باتری، بهینه‌سازی باتری فعال شد" + "جهت افزایش عمر باتری، «بهینه‌سازی باتری» فعال شد" "بهینه‌سازی باتری" - "تا وقتی شارژ باتری دوباره به سطح پایین نرسد، بهینه‌سازی باتری مجدداً فعال نخواهد شد" - "باتری تا سطحی کافی شارژ شده است. تا وقتی شارژ باتری دوباره به سطح پایین نرسد، بهینه‌سازی باتری مجدداً فعال نخواهد شد." + "تا وقتی شارژ باتری دوباره به سطح پایین نرسد، «بهینه‌سازی باتری» مجدداً فعال نخواهد شد" + "باتری درحد کافی شارژ شده است. تا وقتی شارژ باتری دوباره به سطح پایین نرسد، «بهینه‌سازی باتری» مجدداً فعال نخواهد شد." "تلفن %1$s شارژ شد" "رایانه لوحی %1$s شارژ شد" "دستگاه %1$s شارژ شد" - "بهینه‌سازی باتری خاموش است. ویژگی‌ها دیگر محدود نمی‌شوند." - "بهینه‌سازی باتری خاموش شد. ویژگی‌ها دیگر محدود نمی‌شوند." + "«بهینه‌سازی باتری» خاموش است. ویژگی‌ها دیگر محدود نمی‌شوند." + "«بهینه‌سازی باتری» خاموش شد. ویژگی‌ها دیگر محدود نمی‌شوند." "پوشه" "‏برنامه Android" "فایل" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 6181a271587729da90430268d0a0bdf804a4d1cc..05bd57069186e8ffdce98e4b5ab6249be574771c 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -95,6 +95,7 @@ "Vastaajaviestit" "Wi-Fi-puhelut" "SIM-kortin tila" + "Tärkeät SIM-ilmoitukset" "Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI" "Toinen käyttäjä vaihtoi TTY-tilaksi HCO" "Toinen käyttäjä vaihtoi TTY-tilaksi VCO" @@ -281,7 +282,7 @@ "Saako <b>%1$s</b> yhteystietojesi käyttöoikeuden?" "Sijainti" "käyttää laitteen sijaintia" - "Saako <b>%1$s</b> tämän laitteen sijainnin käyttöoikeuden?" + "Saako <b>%1$s</b> oikeuden nähdä tämän laitteen sijainnin?" "Sovellus saa sijainnin käyttöoikeuden vain silloin, kun käytät sovellusta" "Saako <b>%1$s</b> käyttää laitteen sijaintia <b>aina</b>?" "Sovellus saa tällä hetkellä sijainnin käyttöoikeuden vain, jos käytät sovellusta" @@ -550,11 +551,11 @@ "Sormenjälkikuvake" - "hallinnoida kasvojentodennuslaitteistoa" + "hallinnoida Face Unlock ‑laitteistoa" "Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja." - "käyttää kasvojentodennuslaitteistoa" - "Sallii sovelluksen käyttää todennuslaitteistoa todennukseen" - "Kasvojentunnistus" + "käyttää Face Unlock ‑laitteistoa" + "Sallii sovelluksen käyttää Face Unlock ‑laitteistoa todennukseen" + "Face Unlock" "Lisää kasvot uudelleen" "Lisää kasvosi uudelleen tunnistamisen parantamiseksi" "Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen." @@ -567,7 +568,7 @@ "Siirrä puhelinta vasemmalle." "Siirrä puhelinta oikealle." "Katso suoremmin laitteeseen." - "Kasvojasi ei näy. Katso puhelinta." + "Aseta kasvosi suoraan puhelimen eteen." "Laite liikkui liikaa. Pidä puhelin vakaana." "Rekisteröi kasvot uudelleen." "Ei enää tunnista kasvoja. Yritä uudelleen." @@ -576,19 +577,19 @@ "Käännä päätä vähän vähemmän." "Käännä päätä vähän vähemmän." "Poista esteet kasvojesi edestä." - "Puhdista näytön yläreunassa oleva anturi." + "Puhdista näytön yläreuna, mukaan lukien musta palkki" "Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv." - "Yritä kasvojentunnistusta uudelleen." + "Yritä käyttää Face Unlockia uudelleen." "Uutta kasvodataa ei voi tallentaa. Poista ensin vanhaa." - "Kasvotoiminto peruutettu" - "Käyttäjä peruutti kasvojentunnistuksen" + "Kasvotoiminto peruutettu" + "Käyttäjä peruutti Face Unlockin." "Liian monta yritystä. Yritä myöhemmin uudelleen." - "Liian monta yritystä. Kasvojentunnistus poistettu käytöstä." + "Liian monta yritystä. Face Unlock poistettu käytöstä." "Kasvoja ei voi vahvistaa. Yritä uudelleen." - "Et ole määrittänyt kasvojentunnistusta" - "Tämä laite ei tue kasvojentunnistusta." + "Et ole määrittänyt Face Unlockia." + "Tämä laite ei tue Face Unlockia." "Kasvot %d" @@ -1254,10 +1255,10 @@ "Napauta, niin näet kaikki verkot." "Yhdistä" "Kaikki verkot" - "Yhdistetäänkö Wi-Fi-verkkoihin?" - "Ehdottaja: %s" - "Kyllä" - "Ei" + "Sallitaanko ehdotetut Wi-Fi-verkot?" + "%s ehdotti verkkoja. Laite voi muodostaa yhteyden automaattisesti." + "Salli" + "Ei kiitos" "Wi-Fi käynnistyy automaattisesti" "Kun olet lähellä laadukasta tallennettua verkkoa" "Älä käynnistä uudelleen" @@ -1887,8 +1888,8 @@ "Luokittelematon" "Voit valita näiden ilmoitusten tärkeyden." "Tämä on tärkeää siihen liittyvien ihmisten perusteella." - "Myönnetäänkö sovellukselle %1$s oikeus luoda käyttäjä tilille %2$s?" - "Myönnetäänkö sovellukselle %1$s oikeus luoda käyttäjä tilille %2$s (tilillä on jo käyttäjä)?" + "Saako %1$s luoda uuden käyttäjän (%2$s) – tällä käyttäjällä on jo tili?" + "Saako %1$s luoda uuden käyttäjän (%2$s)?" "Lisää kieli" "Alueasetus" "Anna kielen nimi" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 3905c861ce5d197cf415fe599b74bb89c88ecbb8..ad481a929ab7913b113ef8f8b622af5cad66e8ae 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -95,11 +95,12 @@ "Messages vocaux" "Appels Wi-Fi" "État de la carte SIM" + "État SIM de priorité élevée" "Mode TTY COMPLET demandé par un pair" "Mode TTY HCO demandé par un pair" "Mode TTY VCO demandé par un pair" "Mode TTY DÉSACTIVÉ demandé par un pair" - "Google Voice" + "Voix" "Données" "Télécopie" "SMS" @@ -550,11 +551,11 @@ "Icône d\'empreinte digitale" - "gérer le matériel d\'authentification de visage" + "gérer le matériel de déverrouillage par reconnaissance faciale" "Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage." - "utiliser le matériel d\'authentification de visage" - "Permet à l\'appli d\'utiliser du matériel de reconnaissance du visage pour l\'authentification" - "Authentification du visage" + "utiliser le matériel de déverrouillage par reconnaissance faciale" + "Permet à l\'appli d\'utiliser du matériel de déverr. par reconn faciale pour l\'authentific." + "Déverrouillage par reconnaissance faciale" "Inscrivez votre visage à nouveau" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Imposs. capt. données visage précises. Réessayez." @@ -567,7 +568,7 @@ "Déplacez le téléphone vers la gauche." "Déplacez le téléphone vers la droite." "Veuillez regarder plus directement votre appareil." - "Visage non détecté. Regardez le téléphone." + "Placez votre visage directement devant le téléphone." "Trop de mouvement. Tenez le téléphone immobile." "Veuillez inscrire votre visage à nouveau." "Ce visage ne sera plus reconnu. Réessayez." @@ -576,19 +577,19 @@ "Tournez un peu moins votre tête." "Tournez un peu moins votre tête." "Retirez tout ce qui pourrait couvrir votre visage." - "Nettoyez le capteur dans le haut de l\'écran." + "Nettoyez le haut de l\'écran, y compris la barre noire" "Imposs. de vérif. visage. Matériel non accessible." - "Réessayez l\'authentification du visage." + "Réessayez le déverr. par reconnaissance faciale." "Impossible de stocker de nouveaux visages. Supprimez-en un." - "Opération de reconnaissance du visage annulée" - "Authentification du visage annulée par l\'utilisateur" + "Opération de reconnaissance du visage annulée." + "Déverr. par reconn. faciale annulé par l\'utilisateur." "Trop de tentatives. Veuillez réessayer plus tard." - "Trop de tentatives. Authentification du visage désactivée." + "Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé." "Impossible de vérifier le visage. Réessayez." - "Vous n\'avez pas configuré l\'authentific. du visage" - "Cet appareil ne prend pas en charge l\'authentific. du visage" + "Vous n\'avez pas config. le déverr. par reconn. faciale." + "Cet appar. ne prend pas en charge le déverr. par reconn. faciale." "Visage %d" @@ -1254,10 +1255,10 @@ "Touchez pour afficher tous les réseaux" "Connexion" "Tous les réseaux" - "Se connecter aux réseaux Wi-Fi?" - "Suggéré par %s" - "Oui" - "Non" + "Autoriser les suggestions de réseaux Wi‑Fi?" + "Réseaux suggérés par %s. L\'appareil peut s\'y connecter automatiquement." + "Autoriser" + "Non merci" "Le Wi-Fi s\'activera automatiquement" "Lorsque vous êtes près d\'un réseau enregistré de haute qualité" "Ne pas réactiver" @@ -1585,7 +1586,7 @@ "Lancer le navigateur?" "Prendre l\'appel?" "Toujours" - "Définir cette activité comme toujours ouverte" + "Toujours ouvrir avec cette application" "Une seule fois" "Paramètres" "%1$s ne prend pas en charge le profil professionnel" @@ -1669,10 +1670,10 @@ "Le raccourci d\'accessibilité a désactivé la fonction %1$s" "Maintenez enfoncées les deux touches de volume pendant trois secondes pour utiliser %1$s" "Choisissez un service à utiliser lorsque vous touchez le bouton d\'accessibilité :" - "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer deux doigts du bas de l\'écran vers le haut) :" - "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer trois doigts du bas de l\'écran vers le haut) :" + "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer l\'écran de bas en haut avec deux doigts) :" + "Choisissez un service à utiliser lorsque vous utilisez le geste d\'accessibilité (balayer l\'écran de bas en haut avec trois doigts) :" "Pour basculer entre les services, maintenez le doigt sur le bouton d\'accessibilité." - "Pour basculer entre les services, balayez deux doigts vers le haut et maintenez-les sur l\'écran." + "Pour basculer entre les services, balayez l\'écrfan vers le haut avec deux doigts et maintenez-les-y." "Pour changer de service, balayez trois doigts vers le haut et maintenez-les sur l\'écran." "Zoom" "Utilisateur actuel : %1$s" @@ -1887,8 +1888,8 @@ "Sans catégorie" "Vous définissez l\'importance de ces notifications." "Ces notifications sont importantes en raison des participants." - "Autoriser %1$s à créer un profil d\'utilisateur avec le compte %2$s?" - "Autoriser %1$s à créer un profil d\'utilisateur avec le compte %2$s? (Un utilisateur associé à ce compte existe déjà.)" + "Autoriser %1$s à créer un utilisateur %2$s? (Un utilisateur est déjà associé à ce compte)" + "Autoriser %1$s à créer un profil d\'utilisateur avec le compte %2$s?" "Ajouter une langue" "Préférences régionales" "Entrez la langue" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 5b6881487546126a0ef69ca076cec021744e02a1..993101b43342373e7f54df7c3805d64c1b3b8b17 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -95,6 +95,7 @@ "Messages vocaux" "Appels Wi-Fi" "État de la carte SIM" + "Notifications prioritaires de la carte SIM" "Mode TTY demandé par l\'interlocuteur : COMPLET" "Mode TTY demandé par l\'interlocuteur : HCO" "Mode TTY demandé par l\'interlocuteur : VCO" @@ -290,7 +291,7 @@ "Permettre à <b>%1$s</b> d\'accéder à votre agenda ?" "SMS" "envoyer et consulter des SMS" - "Permettre à <b>%1$s</b> d\'envoyer et d\'afficher des SMS ?" + "Autoriser l\'application <b>%1$s</b> à envoyer et afficher des SMS ?" "Stockage" "accéder aux photos, contenus multimédias et fichiers sur votre appareil" "Autoriser l\'appli <b>%1$s</b> à accéder aux photos, contenus multimédias et fichiers sur votre appareil ?" @@ -550,11 +551,11 @@ "Icône d\'empreinte digitale" - "gérer le matériel d\'authentification faciale" + "gérer les composants de Face Unlock" "Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages." - "utiliser le matériel d\'authentification faciale" - "Autorise l\'appli à utiliser le matériel d\'authentification faciale pour l\'authentification" - "Authentification faciale" + "utiliser les composants de Face Unlock" + "Autorise l\'application à utiliser les composants de Face Unlock pour l\'authentification" + "Face Unlock" "Enregistrer à nouveau votre visage" "Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage" "Capture du visage impossible. Réessayez." @@ -567,7 +568,7 @@ "Déplacez le téléphone vers la gauche." "Déplacez le téléphone vers la droite." "Veuillez regarder plus directement l\'appareil." - "Visage non détecté. Regardez le téléphone." + "Placez votre visage en face du téléphone." "Trop de mouvement. Ne bougez pas le téléphone." "Veuillez enregistrer à nouveau votre visage." "Impossible de reconnaître le visage. Réessayez." @@ -576,19 +577,19 @@ "Tournez un peu moins la tête." "Tournez un peu moins la tête." "Retirez tout ce qui cache votre visage." - "Nettoyez le capteur en haut de l\'écran." + "Nettoyez la partie supérieure de l\'écran, y compris la barre noire" "Imposs. valider visage. Matériel non disponible." - "Réessayez d\'activer l\'authentification faciale." + "Réessayez d\'activer Face Unlock." "Impossible stocker nouv. visages. Veuillez en supprimer un." - "Opération de reconnaissance faciale annulée" - "Authentification faciale annulée par l\'utilisateur" + "Opération de reconnaissance faciale annulée." + "Face Unlock annulé par l\'utilisateur." "Trop de tentatives. Réessayez plus tard." - "Trop de tentatives. Authentification faciale désactivée." + "Tentatives trop nombreuses. Désactivation de Face Unlock." "Impossible de valider votre visage. Réessayez." - "L\'authentification faciale n\'est pas configurée" - "Appareil incompatible avec l\'authentification faciale" + "Face Unlock n\'est pas configuré." + "Face Unlock n\'est pas compatible avec cet appareil." "Visage %d" @@ -1254,10 +1255,10 @@ "Appuyer pour afficher tous les réseaux" "Se connecter" "Tous les réseaux" - "Se connecter à des réseaux Wi-Fi ?" - "Suggérée par %s" - "Oui" - "Non" + "Autoriser les suggestions de réseaux Wi‑Fi ?" + "Réseaux suggérés par %s. L\'appareil pourra se connecter automatiquement." + "Autoriser" + "Non, merci" "Le Wi-Fi sera activé automatiquement" "Lorsque vous êtes à proximité d\'un réseau enregistré de haute qualité" "Ne pas réactiver" @@ -1360,8 +1361,8 @@ "Rétablissez la configuration d\'usine pour désactiver le mode Atelier de test." "Présence de liquide ou de saletés dans le port USB" "Le port USB est désactivé automatiquement. Appuyez sur cette notification pour en savoir plus." - "Autoriser l\'utilisation du port USB" - "Le téléphone ne détecte plus les liquides ni les saletés." + "Le port USB peut être utilisé" + "Aucun liquide ni corps étranger à signaler" "Création du rapport de bug…" "Partager le rapport de bug ?" "Partage du rapport de bug…" @@ -1585,7 +1586,7 @@ "Lancer le navigateur ?" "Prendre l\'appel ?" "Toujours" - "Définir cette activité comme toujours ouverte" + "Toujours ouvrir avec cette application" "Une seule fois" "Paramètres" "%1$s n\'est pas compatible avec le profil professionnel." @@ -1887,8 +1888,8 @@ "Sans catégorie" "Vous définissez l\'importance de ces notifications." "Ces notifications sont importantes en raison des participants." - "Autoriser %1$s à créer un profil utilisateur avec le compte %2$s ?" - "Autoriser %1$s à créer un profil utilisateur avec le compte %2$s (un utilisateur associé à ce compte existe déjà) ?" + "Autoriser %1$s à créer un profil utilisateur avec le compte %2$s (un utilisateur associé à ce compte existe déjà) ?" + "Autoriser %1$s à créer un profil utilisateur avec le compte %2$s ?" "Ajouter une langue" "Préférences régionales" "Saisissez la langue" diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 74722bbe767e7eea7ff3b26b205717f595dba7ef..d973c7c4b46ec56a5c3a3f7e0f91bf424ca48b73 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -95,6 +95,7 @@ "Mensaxes de correo de voz" "Chamadas por wifi" "Estado da SIM" + "Estado da SIM con prioridade alta" "Outro dispositivo solicitou o modo TTY COMPLETO" "Outro dispositivo solicitou o modo TTY HCO" "Outro dispositivo solicitou o modo TTY VCO" @@ -386,7 +387,7 @@ "Permite á aplicación executarse unha vez o sistema se inicie completamente. Isto pode provocar que o teléfono tarde máis tempo en iniciarse e permitir á aplicación reducir a velocidade xeral do teléfono ao manterse sempre en execución." "enviar difusión persistente" "Permite á aplicación enviar difusións permanentes que continúan unha vez finalizada a difusión. Un uso excesivo pode provocar que a tableta funcione con lentitude ou de forma inestable debido á necesidade de utilizar demasiada memoria." - "Permite que a aplicación envíe emisións permanentes, que continúan unha vez finalizada a emisión. O uso excesivo pode volver a televisión máis lenta ou inestable, facendo que utilice moita memoria." + "Permite que a aplicación envíe emisións atractivas, que permanecen unha vez finalizada a emisión. O uso excesivo pode volver a televisión máis lenta ou inestable, facendo que utilice moita memoria." "Permite á aplicación enviar difusións permanentes que continúan unha vez finalizada a difusión. Un uso excesivo pode provocar que o teléfono funcione con lentitude ou de forma inestable debido á necesidade de utilizar demasiada memoria." "ler os teus contactos" "Permite á aplicación ler datos acerca dos teus contactos almacenados na tableta, incluída a frecuencia coa que os chamaches, lles enviaches un correo electrónico ou te comunicaches con individuos específicos doutras formas. Con este permiso as aplicacións poden gardar os teus datos de contacto e as aplicacións maliciosas poden compartir os datos de contacto sen o teu coñecemento." @@ -550,11 +551,11 @@ "Icona de impresión dixital" - "xestionar hardware de autenticación facial" + "xestionar o hardware de desbloqueo facial" "Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso." - "usar hardware de autenticación facial" - "Permite que a aplicación utilice hardware facial para a autenticación" - "Autenticación facial" + "utilizar o hardware de desbloqueo facial" + "Permite que a aplicación utilice o hardware de desbloqueo facial para a autenticación" + "Desbloqueo facial" "Volve inscribir a túa cara" "Para mellorar o recoñecemento, inscribe de novo a túa cara" "Sen datos faciais exactos. Téntao de novo." @@ -567,7 +568,7 @@ "Move o teléfono cara á esquerda." "Move o teléfono cara á dereita." "Mira o dispositivo de forma máis directa." - "Non se ve a túa cara. Mira para o teléfono" + "Coloca a cara directamente diante do teléfono." "Demasiado movemento. Non movas o teléfono." "Volve rexistrar a túa cara." "Xa non se pode recoñecer a cara. Téntao de novo." @@ -576,19 +577,19 @@ "Xira a cabeza un pouco menos." "Xira a cabeza un pouco menos." "Quita todo o que oculte a túa cara." - "Limpa o sensor na parte superior da pantalla." + "Limpa a parte superior da pantalla, incluída a barra de cor negra" "Sen verificar a cara. Hardware non dispoñible." - "Tenta utilizar a autenticación facial de novo." + "Tenta utilizar o desbloqueo facial de novo." "Para gardar novos datos faciais, elimina os antigos." - "Cancelouse a operación relacionada coa cara" - "O usuario cancelou a autenticación facial" + "Cancelouse a operación relacionada coa cara" + "O usuario cancelou o desbloqueo facial." "Demasiados intentos. Téntao de novo máis tarde." - "Demasiados intentos. Desactivouse a autenticación facial." + "Demasiados intentos. Desactivouse o desbloqueo facial." "Non se puido verificar a cara. Téntao de novo." - "Non configuraches a autenticación facial" - "Este dispositivo non é compatible coa autenticación facial" + "Non configuraches o desbloqueo facial." + "Este dispositivo non admite o desbloqueo facial." "Cara %d" @@ -1090,27 +1091,27 @@ "Método de introdución de texto" "Accións de texto" "Correo electrónico" - "Envía un correo electrónico ao enderezo seleccionado" + "Enviar un correo electrónico ao enderezo seleccionado" "Chamar" - "Chama ao número de teléfono seleccionado" + "Chamar ao número de teléfono seleccionado" "Mapa" - "Localiza o enderezo seleccionado" + "Localizar o enderezo seleccionado" "Abrir" - "Abre o URL seleccionado" + "Abrir o URL seleccionado" "Enviar SMS" - "Envía unha mensaxe ao número de teléfono seleccionado" + "Enviar unha mensaxe ao número de teléfono seleccionado" "Engadir" - "Engade o elemento aos contactos" + "Engadir o elemento aos contactos" "Ver" - "Consulta a hora seleccionada no calendario" + "Consultar a hora seleccionada no calendario" "Programar" - "Programa un evento para a data seleccionada" + "Programar un evento para a data seleccionada" "Realizar seguimento" - "Fai un seguimento do voo seleccionado" + "Facer un seguimento do voo seleccionado" "Traducir" - "Traduce o texto seleccionado" + "Traducir o texto seleccionado" "Definir" - "Define o texto seleccionado" + "Definir o texto seleccionado" "Estase esgotando o espazo de almacenamento" "É posible que algunhas funcións do sistema non funcionen" "Non hai almacenamento suficiente para o sistema. Asegúrate de ter un espazo libre de 250 MB e reinicia o dispositivo." @@ -1254,10 +1255,10 @@ "Toca para ver todas as redes" "Conectarse" "Todas as redes" - "Queres conectarte a redes wifi?" - "Suxerido por %s" - "Si" - "Non" + "Queres permitir as redes wifi suxeridas?" + "Redes suxeridas de %s. O dispositivo pode conectarse automaticamente." + "Permitir" + "Non, grazas" "A wifi activarase automaticamente" "Cando esteas preto dunha rede gardada de alta calidade" "Non volver activar" @@ -1888,8 +1889,8 @@ "Sen clasificar" "Ti defines a importancia destas notificacións." "É importante polas persoas involucradas." - "Queres permitir que %1$s cree un usuario novo con %2$s?" - "Queres permitir que %1$s cree un usuario novo con %2$s? (Xa existe un usuario con esta conta)" + "Queres permitir que %1$s cree un usuario novo con %2$s? (Xa existe un usuario con esta conta)" + "Queres permitir que %1$s cree un usuario novo con %2$s?" "Engadir un idioma" "Preferencia de rexión" "Nome do idioma" @@ -1984,7 +1985,7 @@ "DESINSTALAR" "ABRIR IGUALMENTE" "Detectouse unha aplicación daniña" - "A aplicación %1$s quere mostrar partes de %2$s" + "%1$s quere mostrar fragmentos de aplicación de %2$s" "Editar" "As chamadas e as notificacións vibrarán" "As chamadas e as notificacións estarán silenciadas" diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index def64c50719346a3356694085cfc3ae2b2741a9a..ef915750d141868c02f80ccb04ad8fdbfc5d5eb0 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -95,6 +95,7 @@ "વૉઇસમેઇલ સંદેશા" "વાઇ-ફાઇ કૉલિંગ" "સિમનું સ્ટેટસ" + "સિમ કાર્ડનું ઉચ્ચ પ્રાધાન્યતાનું સ્ટેટસ" "પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી" "પીઅરે TTY મોડ HCO ની વિનંતી કરી" "પીઅરે TTY મોડ VCO ની વિનંતી કરી" @@ -281,7 +282,7 @@ "<b>%1$s</b>ને તમારા સંપર્કોને ઍક્સેસ કરવાની મંજૂરી આપીએ?" "સ્થાન" "આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની" - "<b>%1$s</b>ને આ ઉપકરણના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?" + "<b>%1$s</b>ને આ ડિવાઇસના સ્થાનને ઍક્સેસ કરવાની મંજૂરી આપીએ?" "જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યા હશો માત્ર ત્યારે જ ઍપ સ્થાનને ઍક્સેસ કરી શકશે" "<b>%1$s</b>ને આ ડિવાઇસનું સ્થાન <b>હંમેશાં</b> ઍક્સેસ કરવાની મંજૂરી આપીએ?" "હાલમાં માત્ર જ્યારે તમે ઍપનો ઉપયોગ કરી રહ્યા હશો હોય ત્યારે જ ઍપ સ્થાનને ઍક્સેસ કરી શકશે" @@ -550,11 +551,11 @@ "ફિંગરપ્રિન્ટ આયકન" - "ચહેરા પ્રમાણીકરણના હાર્ડવેરને મેનેજ કરો" + "ફેસ અનલૉકના હાર્ડવેરને મેનેજ કરો" "ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે." - "ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો" - "ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે" - "ચહેરાનું પ્રમાણીકરણ" + "ફેસ અનલૉક હાર્ડવેરનો ઉપયોગ કરો" + "ઍપને પ્રમાણીકરણ માટે ફેસ અનલૉકના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે" + "ફેસ અનલૉક" "તમારા ચહેરાની ફરી નોંધણી કરાવો" "ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો" "ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો." @@ -567,7 +568,7 @@ "ફોનને ડાબી બાજુ ખસેડો." "ફોનને જમણી બાજુ ખસેડો." "કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ." - "તમારો ચહેરો દેખાતો નથી. ફોનની સામે જુઓ." + "તમારો ચહેરો તમારા ફોનની બિલકુલ સામે રાખો." "ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો." "કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો." "ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો." @@ -576,19 +577,19 @@ "તમારું માથું થોડું ફેરવો." "તમારું માથું થોડું ઓછું ફેરવો." "તમારા ચહેરાને છુપાવતી કંઈપણ વસ્તુ દૂર કરો." - "સ્ક્રીનની ટોચની ધાર પરના સેન્સરને સાફ કરો." + "કાળી પટ્ટી સહિત, તમારી સ્ક્રીનની ટોચ સાફ કરો" "ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી." - "ચહેરા પ્રમાણીકરણનો ફરીથી પ્રયાસ કરી જુઓ." + "ફેસ અનલૉકને ફરી અજમાવો." "ચહેરાનો નવો ડેટા સ્ટોર કરી શકતાં નથી. પહેલા જૂનો ડિલીટ કરો." - "ચહેરા સંબંધિત પ્રક્રિયા રદ કરવામાં આવી છે" - "વપરાશકર્તાએ ચહેરાનું પ્રમાણીકરણ રદ કર્યુ" + "ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે." + "વપરાશકર્તાએ ફેસ અનલૉક રદ કર્યું." "ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો." - "ઘણા બધા પ્રયાસો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે." + "ઘણા બધા પ્રયાસો. ફેસ અનલૉક બંધ કર્યું." "ચહેરો ચકાસી શકાતો નથી. ફરી પ્રયાસ કરો." - "તમે ચહેરાના પ્રમાણીકરણનું સેટઅપ કર્યું નથી" - "આ ડિવાઇસ પર ચહેરાનું પ્રમાણીકરણ કરવાની સુવિધા નથી" + "તમે ફેસ અનલૉકનું સેટઅપ કર્યું નથી." + "આ ડિવાઇસ પર ફેસ અનલૉક કરવાની સુવિધા નથી." "ચહેરાનું %d" @@ -1254,10 +1255,10 @@ "બધા નેટવર્ક જોવા ટૅપ કરો" "કનેક્ટ કરો" "બધા નેટવર્કો" - "વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરીએ?" - "%s દ્વારા સૂચવાયેલ" - "હા" - "ના" + "સૂચવેલા વાઇ-ફાઇ નેટવર્કને મંજૂરી આપીએ?" + "%s સૂચવેલા નેટવર્ક. ડિવાઇસ ઑટોમૅટિક રીતે કનેક્ટ થાય તેમ બની શકે છે." + "મંજૂરી આપો" + "ના, આભાર" "વાઇ-ફાઇ આપમેળે ચાલુ થઈ જશે" "જ્યારે તમે એક ઉચ્ચ ક્વૉલિટીવાળા સાચવેલ નેટવર્કની નજીક હોવ" "પાછું ચાલુ કરશો નહીં" @@ -1343,7 +1344,7 @@ "કોઈ પરવાનગીઓ જરૂરી નથી" "આનાથી તમારા પૈસા ખર્ચ થઈ શકે છે" "ઓકે" - "આ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ" + "આ ડિવાઇસને USB મારફતે ચાર્જ કરી રહ્યાં છીએ" "કનેક્ટેડ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ" "USB ફાઇલ ટ્રાન્સફર ચાલુ છે" "USB મારફતે PTP ચાલુ કર્યું" @@ -1888,8 +1889,8 @@ "અવર્ગીકૃત" "તમે આ સૂચનાઓનું મહત્વ સેટ કર્યું છે." "શામેલ થયેલ લોકોને કારણે આ મહત્વપૂર્ણ છે." - "%1$s ને %2$s સાથે એક નવા વપરાશકર્તાને બનાવવાની મંજૂરી આપીએ?" - "%2$s સાથે %1$s ને એક નવા વપરાશકર્તાને બનાવવાની મંજૂરી આપીએ (આ એકાઉન્ટ સાથેના એક વપરાશકર્તા પહેલાંથી અસ્તિત્વમાં છે)?" + "%1$sને %2$s માટે એક નવા વપરાશકર્તા બનાવવાની મંજૂરી આપીએ (આ એકાઉન્ટ માટે એક વપરાશકર્તા પહેલાંથી અસ્તિત્વમાં છે) ?" + "%1$sને %2$s માટે એક નવા વપરાશકર્તા બનાવવાની મંજૂરી આપીએ ?" "ભાષા ઉમેરો" "પ્રદેશ પસંદગી" "ભાષાનું નામ ટાઇપ કરો" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 0fcc8c68821fcc8464fe74139e4a8764e7f4c9d5..28c75692b79d0893c0b0bb85a257bac2d4a41870 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -95,6 +95,7 @@ "वॉइसमेल संदेश" "वाई-फ़ाई कॉलिंग" "सिम की स्थिति" + "सिम की ज़रूरी सूचनाओं की स्थिति" "पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया" "पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीओ (VCO) का अनुरोध किया" @@ -281,9 +282,9 @@ "<b>%1$s</b> को अपने संपर्क देखने की अनुमति देना चाहते हैं?" "जगह" "इस डिवाइस की जगह तक पहुंचने दें" - "<b>%1$s</b> को इस डिवाइस की \'जगह की जानकारी\' एक्सेस करने की अनुमति देना चाहते हैं?" + "<b>%1$s</b> को इस डिवाइस की \'जगह की जानकारी\' ऐक्सेस करने की अनुमति देना चाहते हैं?" "ऐप्लिकेशन, डिवाइस की जगह की जानकारी सिर्फ़ तभी देख पाएगा जब आप इसका इस्तेमाल कर रहे हों" - "क्या आप %1$s को हमेशा के लिए जगह की जानकारी एक्सेस करने की अनुमति देना चाहते हैं?" + "क्या आप %1$s को हमेशा के लिए जगह की जानकारी ऐक्सेस करने की अनुमति देना चाहते हैं?" "इस समय ऐप्लिकेशन, डिवाइस की \'जगह की जानकारी\' सिर्फ़ तभी देख पाएगा जब आप इसका इस्तेमाल कर रहे हों" "कैलेंडर" "अपने कैलेंडर को ऐक्सेस करने" @@ -293,7 +294,7 @@ "<b>%1$s</b> को एसएमएस (मैसेज) भेजने और देखने की अनुमति देना चाहते हैं?" "मेमोरी" "अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की" - "<b>%1$s</b> को डिवाइस पर मौजूद फ़ोटो, ऑडियो-वीडियो और फ़ाइलें एक्सेस करने की अनुमति दें?" + "<b>%1$s</b> को डिवाइस पर मौजूद फ़ोटो, ऑडियो-वीडियो और फ़ाइलें ऐक्सेस करने की अनुमति दें?" "माइक्रोफ़ोन" "ऑडियो रिकॉर्ड करें" "<b>%1$s</b> को ऑडियो रिकॉर्ड करने की अनुमति देना चाहते हैं?" @@ -305,7 +306,7 @@ "<b>%1$s</b> को फ़ोटो खींचने और वीडियो रिकॉर्ड करने की अनुमति देना चाहते हैं?" "कॉल लॉग" "कॉल लॉग की जानकारी देखना और उसमें बदलाव करना" - "<b>%1$s</b> को अपने काॅल लाॅग एक्सेस करने की मंज़ूरी देना चाहते हैं?" + "<b>%1$s</b> को अपने काॅल लाॅग ऐक्सेस करने की मंज़ूरी देना चाहते हैं?" "फ़ोन" "फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें" "<b>%1$s</b> को फ़ोन कॉल करने और उन्हें प्रबंधित करने की अनुमति दें?" @@ -339,22 +340,22 @@ "फ़ोन कॉल का जवाब दें" "ऐप्लिकेशन को किसी इनकमिंग फ़ोन कॉल का जवाब देने देती है." "मैसेज (एसएमएस) पाएं" - "ऐप को मैसेज (एसएमएस) को प्राप्‍त और संसाधित करने देता है. इसका अर्थ है कि ऐप आपके डिवाइस पर भेजे गए संदेशों की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." + "एप्लिकेशन को मैसेज (एसएमएस) पाने और प्रोसेस करने देता है. इसका मतलब है कि एप्लिकेशन आपके डिवाइस पर भेजे गए मैसेज की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." "मैसेज (एमएमएस) पाएं" "ऐप को मल्टीमीडिया मैसेज (एमएमएस) को पाने और उन पर कार्रवाई करने देता है. इसका मतलब है कि ऐप आपके डिवाइस पर भेजे गए मैसेज की निगरानी आपको दिखाए बिना कर सकता है और उन्‍हें हटा सकता है." "सेल ब्रॉडकास्ट (CBC) मैसेज पढ़ें" "ऐप को, वो सेल ब्रॉडकास्ट (CBC) मैसेज पढ़ने देता है जो आपके डिवाइस को मिले हैं. सेल ब्रॉडकास्ट (CBC) अलर्ट कुछ स्थानों (लोकेशन) पर आपको आपातकालीन स्‍थितियों की चेतावनी देने के लिए दिए जाते हैं. आपातकालीन सेल ब्रॉडकास्ट (CBC) मिलने पर, धोखा देने वाले ऐप आपके डिवाइस के परफ़ॉर्मेंस या कार्यवाही में दखल दे सकते हैं." - "सदस्यता-प्राप्त फ़ीड पढ़ें" - "ऐप्स को वर्तमान में समन्वयित फ़ीड के बारे में विवरण प्राप्त करने देता है." + "सदस्यता वाली फ़ीड पढ़ें" + "एप्‍लिकेशन को मौजूदा समय में सिंक फ़ीड के बारे में जानकारी देता है." "मैसेज (एमएमएस) भेजें और देखें" "ऐप को मैसेज (एसएमएस) भेजने देता है. इसकी वजह से उम्मीद से ज़्यादा शुल्‍क लग सकते हैं. धोखा देने वाले ऐप आपकी पुष्टि के बिना मैसेज भेजकर आपका पैसा खर्च करवा सकते हैं." "अपने मैसेज (एसएमएस या एमएमएस) पढ़ें" "यह ऐप आपके टैबलेट पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." "यह ऐप आपके टीवी पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." "यह ऐप आपके फ़ोन पर सहेजे गए सभी मैसेज (एसएमएस) पढ़ सकता है." - "लेख संदेश (WAP) प्राप्त करें" - "ऐप्स को WAP संदेशों को प्राप्‍त और संसाधित करने देता है. इस अनुमति में आपको भेजे गए संदेशों की निगरानी आपको दिखाए बिना करने और हटाने की क्षमता शामिल है." - "चल रहे ऐप्स पुनर्प्राप्त करें" + "टेक्सट मैसेज (WAP) पाएं" + "एप्लिकेशन को WAP मैसेज पाने और प्रोसेस करने देता है. इस अनुमति में आपको भेजे गए मैसेज की निगरानी आपको दिए एप्लिकेशन को दिखाए बिना करने और हटाने की क्षमता शामिल है." + "चल रहे ऐप्स फिर से पाएं" "ऐप को माजूदा समय में और हाल ही में चल रही कार्रवाइयों के बारे में जानकारी निकालने देता है. इससे ऐप डिवाइस पर इस्तेमाल किए गए ऐप के बारे में जानकारी खोज सकता है." "प्रोफ़ाइल और डिवाइस स्‍वामियों को प्रबंधित करें" "ऐप्‍स को प्रोफ़ाइल स्‍वामी और डिवाइस स्‍वामी सेट करने दें." @@ -402,7 +403,7 @@ "ऐप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके टैबलेट के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले ऐप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं." "ऐप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके टीवी के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले ऐप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं." "ऐप को आने वाला कॉल (इनकमिंग) और किया जाने वाला कॉल (आउटगोइंग) डेटा सहित, आपके फ़ोन के कॉल लॉग को बदलने की अनुमति देता है. धोखा देने वाले ऐप, इसका इस्तेमाल करके आपके कॉल लॉग को मिटा या बदल सकते हैं." - "शरीर के लिए बने सेंसर (जैसे हृदय गति मॉनीटर) को एक्सेस करें" + "शरीर के लिए बने सेंसर (जैसे हृदय गति मॉनीटर) को ऐक्सेस करें" "ऐप को आपकी शारीरिक स्‍थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले सेंसर के डेटा तक पहुंचने देती है." "कैलेंडर इवेंट और विवरण पढ़ें" "यह ऐप्लिकेशन आपके टैबलेट पर संग्रहित सभी कैलेंडर इवेंट पढ़ सकता है और आपका कैलेंडर डेटा शेयर कर सकता है या सहेज सकता है." @@ -414,14 +415,14 @@ "यह ऐप्लिकेशन आपके फ़ोन पर मौजूद कैलेंडर इवेंट जोड़, निकाल या बदल सकता है. यह ऐप्लिकेशन ऐसे संदेश भेज सकता है जो कैलेंडर स्वामियों से आए हुए लग सकते हैं या यह स्वामियों को सूचित किए बिना इवेंट में बदलाव कर सकता है." "कुछ और जगह बताने वाले आदेशों तक पहुंच" "ऐप को कुछ और जगह की जानकारी देने वाले आदेशों की पहुंच पाने देता है. इससे ऐप जीपीएस या जगह की जानकारी देने वाले दूसरे स्रोतों के काम में रोक-टोक कर सकता है." - "ऐप्लिकेशन \'जगह की सटीक जानकारी\' सिर्फ़ सामने खुली होने पर एक्सेस करे" + "ऐप्लिकेशन \'जगह की सटीक जानकारी\' सिर्फ़ सामने खुली होने पर ऐक्सेस करे" "यह ऐप्लिकेशन सिर्फ़ तब आपकी \'जगह की सटीक जानकारी\' का इस्तेमाल कर सकता है जब यह स्क्रीन पर दिखाई दे रहा हो. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके फ़ोन में मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए. ऐसा करने से ज़्यादा बैटरी खर्च हो सकती है." - "स्क्रीन पर दिखाई देते समय \'जगह की अनुमानित जानकारी\' (नेटवर्क-आधारित) एक्सेस करें" + "स्क्रीन पर दिखाई देते समय \'जगह की अनुमानित जानकारी\' (नेटवर्क-आधारित) ऐक्सेस करें" "यह ऐप्लिकेशन सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपकी जगह का पता लगा सकता है, लेकिन सिर्फ़ तब, जब ऐप्लिकेशन स्क्रीन पर दिखाई दे रहा हो. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके टैबलेट में मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए." "यह ऐप्लिकेशन सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपकी जगह का पता लगा सकता है, लेकिन सिर्फ़ तब, जब ऐप्लिकेशन स्क्रीन पर दिखाई दे रहा हो. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके टीवी पर मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए." "यह ऐप्लिकेशन सेल टावर और वाई-फ़ाई नेटवर्क जैसे नेटवर्क स्रोतों के आधार पर आपकी जगह का पता लगा सकता है, लेकिन सिर्फ़ तब, जब ऐप्लिकेशन स्क्रीन पर दिखाई दे रहा हो. यह ज़रूरी है कि \'जगह की जानकारी\' वाली ये सेवाएं आपके फ़ोन में मौजूद हों और चालू की गई हों ताकि ऐप्लिकेशन उनका इस्तेमाल कर पाए." - "बैकग्राउंड में जगह की जानकारी एक्सेस करना" - "अनुमानित या बिल्कुल सही जगह की जानकारी का एक्सेस करने की अनुमति अलग से दिए जाने पर, बैकग्राउंड में चलने के दौरान ऐप्लिकेशन आपकी जगह की जानकारी एक्सेस कर सकता है." + "बैकग्राउंड में जगह की जानकारी ऐक्सेस करना" + "अनुमानित या बिल्कुल सही जगह की जानकारी का ऐक्सेस करने की अनुमति अलग से दिए जाने पर, बैकग्राउंड में चलने के दौरान ऐप्लिकेशन आपकी जगह की जानकारी ऐक्सेस कर सकता है." "अपनी ऑडियो सेटिंग बदलें" "ऐप्स को वैश्विक ऑडियो सेटिंग, जैसे वॉल्‍यूम और कौन-सा स्पीकर आउटपुट के लिए उपयोग किया गया, संशोधित करने देता है." "ऑडियो रिकॉर्ड करने" @@ -450,7 +451,7 @@ "ऐप को डिवाइस के फ़ोन नंबर का इस्तेमाल करने देती है." "टैबलेट को सोने (कम बैटरी मोड) से रोकें" "टीवी को सोने (कम बैटरी मोड) से रोकें" - "टीवी को सोने (कम बैटरी मोड) से रोकें" + "फ़ोन को सोने (कम बैटरी मोड) से रोकें" "ऐप्स को टैबलेट को प्रयोग में नहीं हो जाने से रोकता है." "ऐप को टीवी को सोने (कम बैटरी मोड) से रोकने की अनुमति देता है." "ऐप्स को फ़ोन को प्रयोग में नहीं होने से रोकता है." @@ -467,9 +468,9 @@ "ऐप को टीवी का समय क्षेत्र बदलने देती है." "ऐप्स को टैबलेट का समय क्षेत्र बदलने देता है." "डिवाइस पर खाते ढूंढें" - "ऐप्स को टैबलेट द्वारा ज्ञात खातों की सूची प्राप्‍त करने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए ऐप्स ने बनाया है." - "ऐप को टीवी द्वारा ज्ञात खातों की सूची प्राप्‍त करने देती है. इसमें इंस्‍टॉल किए गए ऐप्‍लिकेशन के द्वारा बनाए गए खाते शामिल हो सकते हैं." - "ऐप्स को फ़ोन द्वारा ज्ञात खातों की सूची प्राप्‍त करने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए ऐप्स ने बनाया है." + "एप्लिकेशन को टैबलेट से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." + "ऐप्लिकेशन को टीवी से ज्ञात खातों की सूची पाने देती है. इसमें इंस्‍टॉल किए गए ऐप्‍लिकेशन से बनाए गए खाते शामिल हो सकते हैं." + "एप्लिकेशन को फ़ोन से ज्ञात खातों की सूची पाने देता है. इसमें वे खाते शामिल हो सकते हैं जिन्‍हें इंस्‍टॉल किए गए एप्लिकेशन ने बनाया है." "नेटवर्क कनेक्‍शन देखें" "ऐप को नेटवर्क कनेक्‍शन के बारे में जानकारी देखने देता है, जैसे कौन से नेटवर्क मौजूद हैं और कनेक्‍ट हैं." "नेटवर्क को पूरी तरह इस्तेमाल करें" @@ -483,9 +484,9 @@ "वाई-फ़ाई से कनेक्‍ट और डिस्‍कनेक्‍ट करें" "ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है." "वाई-फ़ाई मल्‍टीकास्‍ट पाने को अनुमति दें" - "ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है." - "ऐप को मल्‍टीकास्‍ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्‍त करने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है." - "ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का उपयोग करता है." + "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके टैबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." + "ऐप्लिकेशन को मल्‍टीकास्‍ट पतों का उपयोग करके न सिर्फ़ आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और पाने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा ज़्यादा पावर का उपयोग होता है." + "एप्लिकेशन को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के इस्तेमाल से सिर्फ़ आपके फ़ोन पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट पाने देता है. यह गैर-मल्टीकास्ट मोड से ज़्यादा पावर का इस्तेमाल करता है." "ब्लूटूथ सेटिंग पर पहुंचें" "किसी ऐप्स को स्‍थानीय ब्लूटूथ टैबलेट कॉन्‍फ़िगर करने की और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है." "ऐप को स्‍थानीय ब्‍लूटूथ टीवी कॉन्‍फ़िगर करने देती है और दूरस्‍थ डिवाइसों को खोजने और उनसे युग्‍मित करने देती है." @@ -503,7 +504,7 @@ "नियर फ़ील्‍ड कम्‍यूनिकेशन नियंत्रित करें" "ऐप्स को नियर फ़ील्ड कम्यूनिकेशन (NFC) टैग, कार्ड, और रीडर के साथ संचार करने देता है." "अपना स्‍क्रीन लॉक अक्षम करें" - "ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा अक्षम करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल प्राप्त करते समय फ़ोन, कीलॉक को अक्षम कर देता है, फिर कॉल खत्म होने पर कीलॉक को फिर से सक्षम कर देता है." + "ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा बंद करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल पाते समय फ़ोन, कीलॉक को बंद कर देता है, फिर कॉल खत्म होने पर कीलॉक को फिर से चालू कर देता है." "जानें कि स्क्रीन लॉक कितना मुश्किल बनाया गया है" "यह मंज़ूरी मिलने के बाद ऐप्लिकेशन जान पाता है कि स्क्रीन लॉक कितना मुश्किल (बहुत ज़्यादा, मध्यम, कम या बिल्कुल नहीं) है. इस स्तर से यह पता चलता है कि स्क्रीन लॉक कितना लंबा या किस तरह का है. ऐप्लिकेशन उपयोगकर्ताओं को यह सुझाव भी दे सकता है कि वे स्क्रीन लॉक को एक तय लेवल तक अपडेट करें. लेकिन उपयोगकर्ता इसे बेझिझक अनदेखा करके छोड़ सकते हैं. ध्यान दें कि स्क्रीन लॉक को सादे टेक्स्ट में सेव नहीं किया जाता है इसलिए ऐप्लिकेशन को सटीक पासवर्ड पता नहीं होता है." "बायोमीट्रिक हार्डवेयर इस्तेमाल करने दें" @@ -518,8 +519,8 @@ "इससे ऐप्लिकेशन को आपके वीडियो संग्रह में बदलाव करने की मंज़ूरी दी जाती है." "अपने फ़ोटो संग्रह में बदलाव करने की अनुमति दें" "इससे ऐप्लिकेशन को आपके फ़ोटो संग्रह में बदलाव करने की मंज़ूरी दी जाती है." - "अपने मीडिया संग्रह से जगह की जानकारी एक्सेस करने की अनुमति दें" - "इससे ऐप्लिकेशन को आपके मीडिया संग्रह से जगह की जानकारी एक्सेस करने की अनुमति दी जाती है." + "अपने मीडिया संग्रह से जगह की जानकारी ऐक्सेस करने की अनुमति दें" + "इससे ऐप्लिकेशन को आपके मीडिया संग्रह से जगह की जानकारी ऐक्सेस करने की अनुमति दी जाती है." "अपनी पहचान की पुष्टि करें" "बायोमेट्रिक हार्डवेयर उपलब्ध नहीं है" "प्रमाणीकरण रद्द किया गया" @@ -550,11 +551,11 @@ "फ़िंगरप्रिंट आइकॉन" - "चेहरे की पुष्टि करने वाला हार्डवेयर प्रबंधित करें" + "\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर प्रबंधित करें" "ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है." - "चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें" - "ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है" - "चेहरे की पहचान" + "\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर इस्तेमाल करें" + "ऐप्लिकेशन को \'मालिक का चेहरा पहचानकर अनलॉक\' वाले हार्डवेयर के इस्तेमाल की मंज़ूरी देता है" + "मालिक का चेहरा पहचानकर अनलॉक" "अपना चेहरा फिर से दर्ज करें" "कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके" "चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें." @@ -567,7 +568,7 @@ "फ़ोन को बाईं ओर घुमाएं." "फ़ोन को दाईं ओर घुमाएं." "कृपया अपने डिवाइस की तरफ़ सीधे देखें." - "आपका चेहरा नहीं दिखाई दे रहा. फ़ोन की तरफ़ देखें." + "अपने चेहरे को फोन के ठीक सामने लाएं." "डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें." "कृपया फिर से अपने चेहरे की पहचान कराएं." "अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें." @@ -576,19 +577,19 @@ "अपना सिर थोड़ा कम घुमाएं." "अपना सिर थोड़ा कम घुमाएं." "आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं." - "स्क्रीन के ऊपरी किनारे पर मौजूद सेंसर को साफ करें." + "अपनी स्क्रीन के सबसे ऊपरी हिस्से को साफ़ करें, जिसमें काले रंग वाला बार भी शामिल है" "चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है." - "चेहरे की पुष्टि के लिए फिर से कोशिश करें." + "\'मालिक का चेहरा पहचानकर अनलॉक\' फिर से आज़माएं." "चेहरे का नया डेटा सेव नहीं हो सकता. कोई पुराना डेटा मिटाएं." - "चेहरा पहचानने की कार्रवाई रद्द की गई" - "उपयोगकर्ता ने \'चेहरे की पहचान\' रद्द कर दी." + "चेहरा पहचानने की कार्रवाई रद्द की गई." + "उपयोगकर्ता ने \'मालिक का चेहरा पहचानकर अनलॉक\' रद्द की." "कई बार कोशिश की गई. बाद में कोशिश करें." - "कई बार कोशिश की जा चुकी है. \'चेहरे की पहचान\' बंद कर दी गई." + "कई बार कोशिश की जा चुकी है. \'मालिक का चेहरा पहचानकर अनलॉक\' बंद है." "चेहरा नहीं पहचान पा रहे. फिर से कोशिश करें." - "आपने डिवाइस पर \'चेहरे की पहचान\' सेट नहीं की है." - "इस डिवाइस पर \'चेहरे की पहचान\' सुविधा काम नहीं करती." + "आपने \'मालिक का चेहरा पहचानकर अनलॉक\' सेट नहीं की है." + "इस डिवाइस पर \'मालिक का चेहरा पहचानकर अनलॉक\' काम नहीं करती है." "चेहरा %d" @@ -603,8 +604,8 @@ "ऐप्‍लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री पढ़ने देती है." "आपकी शेयर की गई मेमोरी की सामग्री में बदलाव करना या उसे मिटाना" "ऐप्लिकेशन को आपकी शेयर की गई मेमोरी की सामग्री लिखने देती है." - "SIP कॉल करें/प्राप्‍त करें" - "ऐप्स को SIP कॉल करने और प्राप्‍त करने देती है." + "SIP कॉल करें/पाएं" + "ऐप्लिकेशन को SIP कॉल करने और पाने देता है." "नए टेलिकॉम सिम कनेक्‍शन रजिस्टर करें" "ऐप को नए टेलिकॉम सिम कनेक्‍शन पंजीकृत करने देती है." "नए टेलिकॉम कनेक्‍शन रजिस्टर करें" @@ -614,7 +615,7 @@ "इन-कॉल स्क्रीन से सहभागिता करें" "ऐप को यह नियंत्रित करने देती है कि उपयोगकर्ता को इन-कॉल स्क्रीन कब और कैसी दिखाई देती है." "टेलीफ़ोनी सेवाओं के साथ सहभागिता करें" - "कॉल करने/प्राप्‍त करने के लिए ऐप्स को टेलीफ़ोनी सेवा के साथ सहभागिता करने दें." + "कॉल करने/पाने के लिए ऐप्स को टेलीफ़ोनी सेवा के साथ सहभागिता करने दें." "इन कॉल उपयोगकर्ता अनुभव लें" "ऐप को इन कॉल उपयोगकर्ता अनुभव लेने देती है." "ऐतिहासिक नेटवर्क उपयोग पढें" @@ -637,7 +638,7 @@ "ऐप्स को नेटवर्क स्थितियों के अवलोकनों को सुनने देता है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए." "इनपुट डिवाइस कैलिब्रेशन बदलें" "ऐप्स को टच स्क्रीन के कैलिब्रेशन पैरामीटर को बदलने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यक नहीं होना चाहिए." - "DRM प्रमाणपत्र एक्सेस करें" + "DRM प्रमाणपत्र ऐक्सेस करें" "ऐप्लिकेशन को DRM प्रमाणपत्रों का प्रावधान और उपयोग करने देती है. सामान्य ऐप्स के लिए कभी भी आवश्यकता नहीं होना चाहिए." "Android बीम ट्रांसफ़र की स्थिति पाएं" "इस ऐप को मौजूदा Android बीम ट्रांसफ़र के बारे में जानकारी पाने की अनुमति दें." @@ -1084,7 +1085,7 @@ "वापस लाएं" "फिर से करें" "ऑटोमैटिक भरना" - "लेख चयन" + "टेक्स्ट चुनें" "शब्दकोश में जोड़ें" "मिटाएं" "इनपुट विधि" @@ -1134,7 +1135,7 @@ "इसे इस्तेमाल करके लिंक खोलें" "%1$s इस्तेमाल करके लिंक खोलें" "%2$s इस्तेमाल करके %1$s लिंक खोलें" - "एक्सेस दें" + "ऐक्सेस दें" "इसके ज़रिये बदलाव करें" "%1$s की मदद से बदलाव करें" "बदलाव करें" @@ -1151,7 +1152,7 @@ "%1$s के साथ चित्र कैप्चर करें" "चित्र कैप्चर करें" "इस कार्रवाई के लिए डिफ़ॉल्‍ट के तौर पर इस्तेमाल करें" - "किसी भिन्न ऐप्स का उपयोग करें" + "किसी दूसरे ऐप्लिकेशन का इस्तेमाल करें" "सिस्‍टम सेटिंग और डाउनलोड किए गए ऐप में डिफ़ॉल्‍ट साफ़ करें." "कोई कार्रवाई चुनें" "USB डिवाइस के लिए कोई ऐप्स चुनें" @@ -1213,9 +1214,9 @@ "%1$s हीप डंप तैयार है" "हीप डंप (Java™ प्रोसेस मेमोरी का स्नैपशॉट) ले लिया गया है. शेयर करने के लिए टैप करें." "हीप डंप शेयर करें?" - "%1$s प्रक्रिया अपनी %2$s की मेमोरी सीमा पार कर चुकी है. एक हीप डंप इसके डेवलपर के साथ शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी निजी जानकारी भी शामिल हो सकती है जिसका एक्सेस ऐप्लिकेशन के पास हो." - "%1$s प्रक्रिया अपनी %2$s की मेमोरी सीमा पार कर चुकी है. एक हीप डंप शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी संवेदनशील निजी जानकारी भी शामिल हो सकती है जिसका एक्सेस प्रोसेस के पास हो. इसमें आपके टाइप किए गए शब्दों का डेटा भी शामिल है." - "%1$s प्रक्रिया का हीप डंप शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी संवेदनशील निजी जानकारी शामिल हो सकती है जिसका एक्सेस प्रोसेस के पास हो. इसमें आपके टाइप किए गए शब्दों का डेटा भी शामिल है." + "%1$s प्रक्रिया अपनी %2$s की मेमोरी सीमा पार कर चुकी है. एक हीप डंप इसके डेवलपर के साथ शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी निजी जानकारी भी शामिल हो सकती है जिसका ऐक्सेस ऐप्लिकेशन के पास हो." + "%1$s प्रक्रिया अपनी %2$s की मेमोरी सीमा पार कर चुकी है. एक हीप डंप शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी संवेदनशील निजी जानकारी भी शामिल हो सकती है जिसका ऐक्सेस प्रोसेस के पास हो. इसमें आपके टाइप किए गए शब्दों का डेटा भी शामिल है." + "%1$s प्रक्रिया का हीप डंप शेयर किए जाने के लिए तैयार है. सावधान रहें: इस हीप डंप में कोई ऐसी संवेदनशील निजी जानकारी शामिल हो सकती है जिसका ऐक्सेस प्रोसेस के पास हो. इसमें आपके टाइप किए गए शब्दों का डेटा भी शामिल है." "मैसेज करने के लिए कोई कार्रवाई चुनें" "रिंगर वॉल्‍यूम" "मीडिया वॉल्‍यूम" @@ -1254,10 +1255,10 @@ "सभी नेटवर्क देखने के लिए यहां पर टैप करें" "कनेक्ट करें" "सभी नेटवर्क" - "वाई-फ़ाई नेटवर्क से कनेक्ट करना चाहते हैं?" - "%s का सुझाया हुआ" - "हां" - "नहीं" + "सुझाए गए वाई-फ़ाई नेटवर्क को अनुमति देना चाहते हैं?" + "%s के सुझाए गए नेटवर्क. डिवाइस अपने आप कनेक्ट हो सकता है." + "अनुमति दें" + "रहने दें" "वाई-फ़ाई अपने आप चालू हो जाएगा" "जब आप किसी अच्छी क्वालिटी वाले सेव किए गए नेटवर्क के पास हों" "वापस चालू न करें" @@ -1344,7 +1345,7 @@ "ठीक है" "यह डिवाइस यूएसबी से चार्ज हो रहा है" "जोड़ा गया डिवाइस यूएसबी के ज़रिए चार्ज हो रहा है" - "यूएसबी फ़ाइल ट्रांसफ़र की सुविधा चालू की गई" + "यूएसबी फ़ाइल ट्रांसफ़र करने की सुविधा चालू की गई" "यूएसबी के ज़रिए पीटीपी की सुविधा चालू की गई" "यूएसबी टेदरिंग की सुविधा चालू की गई" "यूएसबी के ज़रिए एमआईडीआई (मिडी) की सुविधा चालू की गई" @@ -1353,7 +1354,7 @@ "जोड़ा गया डिवाइस चार्ज हो रहा है. ज़्यादा विकल्पों के लिए टैप करें." "एनालॉग ऑडियो एक्सेसरी का पता चला" "अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. ज़्यादा जानने के लिए टैप करें." - "डीबग करने के लिए एडीबी कनेक्ट किया गया" + "यूएसबी डीबग करने के लिए एडीबी कनेक्ट किया गया" "यूएसबी को डीबग करने की सुविधा बंद करने के लिए टैप करें" "USB डीबग करना अक्षम करने के लिए चुनें." "टेस्ट हार्नेस मोड चालू किया गया" @@ -1375,7 +1376,7 @@ "भाषा और लेआउट चुनने के लिए टैप करें" " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "दूसरे ऐप्लिकेशन के ऊपर दिखाए जाने का एक्सेस" + "दूसरे ऐप्लिकेशन के ऊपर दिखाए जाने का ऐक्सेस" "%s अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है" "%s अन्य ऐप पर दिखाई दे रहा है" "अगर आप नहीं चाहते कि %s इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें." @@ -1887,8 +1888,8 @@ "बिना किसी श्रेणी के" "आपने इन सूचनाओं की अहमियत सेट की है." "यह मौजूद व्यक्तियों के कारण महत्वपूर्ण है." - "%1$s को %2$s के ज़रिये एक नया उपयोगकर्ता बनाने दें?" - "%1$s को %2$s के ज़रिये एक नया उपयोगकर्ता बनाने दें (इस खाते वाले एक उपयोगकर्ता पहले से मौजूद हैं)?" + "%1$s को %2$s के नाम से एक नया उपयोगकर्ता बनाने की अनुमति दें (इस नाम से एक खाता पहले से मौजूद है)?" + "Allow %1$s to create a new User with %2$s?" "भाषा जोड़ें" "क्षेत्र प्राथमिकता" "भाषा का नाम लिखें" diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index abb14139bfa822e468451689c7506edb8a048e2d..f7afea5978b9de30f64a56ce05a592741a7e2213 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -96,6 +96,7 @@ "Poruke govorne pošte" "Wi-Fi pozivi" "Status SIM-a" + "Status SIM-a visokog prioriteta" "Način TTY FULL koji zahtijeva paralelni uređaj" "Način TTY HCO koji zahtijeva paralelni uređaj" "Način TTY VCO koji zahtijeva paralelni uređaj" @@ -553,11 +554,11 @@ "Ikona otiska prsta" - "upravljati hardverom za autentifikaciju lica" + "Upravljajte hardverom za otključavanje licem" "Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu." - "upotrebljavati hardver za autentifikaciju lica" - "Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije" - "Autentifikacija licem" + "Koristiti hardver za otključavanje licem" + "Aplikaciji omogućuje upotrebu hardvera za otključavanje licem radi autentifikacije" + "Otključavanje licem" "Ponovo registrirajte svoje lice" "Za poboljšanje prepoznavanja ponovo registrirajte svoje lice" "Podaci o licu nisu točni. Pokušajte ponovo." @@ -570,7 +571,7 @@ "Pomaknite telefon ulijevo." "Pomaknite telefon udesno." "Gledajte izravnije prema uređaju." - "Vaše se lice ne vidi. Pogledajte telefon." + "Postavite lice izravno ispred telefona." "Previše kretanja. Držite telefon mirno." "Ponovo registrirajte svoje lice." "Lice nije prepoznato. Pokušajte ponovo." @@ -579,19 +580,19 @@ "Nagnite glavu malo manje." "Nagnite glavu malo manje." "Uklonite sve što vam zakriva lice." - "Očistite senzor na gornjem rubu zaslona." + "Očistite vrh zaslona, uključujući crnu traku" "Lice nije potvrđeno. Hardver nije dostupan." - "Pokušajte ponovo autentificirati lice." + "Ponovo pokušajte otključavanje licem." "Podaci o novom licu nisu pohranjeni. Izbrišite neko staro." - "Otkazana je radnja s licem" - "Autentifikaciju lica otkazao je korisnik" + "Otkazana je radnja s licem." + "Otključavanje licem otkazao je korisnik." "Previše pokušaja. Pokušajte ponovo kasnije." - "Previše pokušaja. Autentifikacija lica onemogućena." + "Previše pokušaja. Onemogućeno otključavanje licem" "Lice nije potvrđeno. Pokušajte ponovo." - "Niste postavili autentifikaciju lica" - "Autentifikacija lica nije podržana na ovom uređaju" + "Niste postavili otključavanje licem" + "Otključavanje licem nije podržano na ovom uređaju." "Lice %d" @@ -1276,10 +1277,10 @@ "Dodirnite za prikaz svih mreža" "Poveži" "Sve mreže" - "Želite li se povezati s Wi-Fi mrežama?" - "Preporuka aplikacije %s" - "Da" - "Ne" + "Želite li dopustiti predložene Wi‑Fi mreže?" + "Mreže koje predlaže aplikacija %s. Uređaji se mogu povezati automatski." + "Dopusti" + "Ne, hvala" "Wi‑Fi će se uključiti automatski" "Kada ste u blizini spremljene mreže visoke kvalitete" "Više ne uključuj" @@ -1693,7 +1694,7 @@ "Prečac pristupačnosti isključio je uslugu %1$s" "Pritisnite i zadržite tipke za glasnoću na tri sekunde da biste koristili uslugu %1$s" "Odaberite uslugu koju ćete upotrebljavati kad dodirnete gumb pristupačnosti:" - "Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s dva prsta prema gore od dna zaslona):" + "Odaberite za što će se upotrebljavati pokret pristupačnosti (prelazak s dva prsta prema gore od dna zaslona):" "Odaberite uslugu koju ćete upotrebljavati uz pokret pristupačnosti (prelazak s tri prsta prema gore od dna zaslona):" "Da biste prešli na neku drugu uslugu, dodirnite i zadržite gumb pristupačnosti." "Da biste prešli na neku drugu uslugu, prijeđite s dva prsta prema gore i zadržite." @@ -1921,8 +1922,8 @@ "Nema kategorije" "Postavili ste važnost tih obavijesti." "Važno je zbog uključenih osoba." - "Želite li dopustiti aplikaciji %1$s da izradi novog korisnika s računom %2$s?" - "Želite li dopustiti aplikaciji %1$s da izradi novog korisnika s računom %2$s (korisnik s tim računom već postoji)?" + "Dopustiti aplikaciji %1$s da izradi novog korisnika s računom %2$s (korisnik s ovim računom već postoji)?" + "Dopustiti aplikaciji %1$s da izradi novog korisnika s računom %2$s?" "Dodavanje jezika" "Postavke regije" "Unesite naziv jezika" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 0ece955adbf23ad428d404ed40f47f55129c90bc..351b5b8d37b0e72b7f99470f0a58367c29faf796 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -95,6 +95,7 @@ "Hangpostaüzenetek" "Wi-Fi-hívás" "SIM-kártya állapota" + "Elsődleges SIM-kártya állapota" "Partner által kért TTY-mód: FULL" "Partner által kért TTY-mód: HCO" "Partner által kért TTY-mód: VCO" @@ -550,11 +551,11 @@ "Ujjlenyomat ikon" - "arcfelismerő hardver kezelése" + "arcalapú feloldásra szolgáló hardver kezelése" "Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon." - "arcfelismerő hardver használata" - "Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert" - "Arcfelismerés" + "arcalapú feloldásra szolgáló hardver használata" + "Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcalapú feloldás hardverét" + "Arcalapú feloldás" "Rögzítsen újra képet az arcáról" "A felismerés javítása érdekében rögzítsen újra az arcáról készített képet" "Sikertelen az arc pontos rögzítése. Próbálja újra." @@ -567,7 +568,7 @@ "Mozgassa a telefont balra." "Mozgassa a telefont jobbra." "Szemből nézzen az eszközre." - "Nem látszik az arca. Nézzen a telefonra." + "A telefont közvetlenül az arca elé tegye." "Túl sok a mozgás. Tartsa stabilan a telefont." "Rögzítsen újra képet az arcáról." "Már nem lehet felismerni az arcát. Próbálja újra." @@ -576,19 +577,19 @@ "Kicsit kevésbé fordítsa el a fejét." "Kicsit kevésbé fordítsa el a fejét." "Távolítson el mindent, ami takarja az arcát." - "Tisztítsa meg a képernyő tetején lévő érzékelőt." + "Tisztítsa meg a képernyő tetejét, a fekete sávot is beleértve." "Sikertelen arcellenőrzés. A hardver nem érhető el." - "Próbálja újra az arcfelismerést." + "Próbálja újra az arcalapú feloldást." "Nem tárolhatók újabb arcadatok. Törölje valamelyik arcot." - "Az arccal kapcsolatos művelet megszakítva" - "Az arc hitelesítését megszakította a felhasználó" + "Az arccal kapcsolatos művelet törölve." + "Az arcalapú feloldást megszakította a felhasználó." "Túl sok próbálkozás. Próbálja újra később." - "Túl sokszor próbálkozott. Arcfelismerés letiltva." + "Túl sok próbálkozás. Az arcalapú feloldás letiltva." "Nem sikerült ellenőrizni az arcát. Próbálja újra." - "Nem állította be az arcfelismerést" - "Az eszköz nem támogatja az arcfelismerést" + "Nem állította be az arcalapú feloldást." + "Az eszköz nem támogatja az arcalapú feloldást" "%d arc" @@ -1254,10 +1255,10 @@ "Koppintással megjelenítheti az összes hálózatot" "Kapcsolódás" "Összes hálózat" - "Kapcsolódik a Wi-Fi-hálózathoz?" - "%s javasolta" - "Igen" - "Nem" + "Engedélyezi a javasolt Wi-Fi-hálózatokat?" + "A(z) %s hálózatokat javasolt. Az eszköz automatikusan csatlakozhat hozzájuk." + "Engedélyezés" + "Nem, köszönöm" "A Wi-Fi automatikusan bekapcsol" "Amikor jó minőségű mentett hálózat közelében tartózkodik" "Ne kapcsolódjon vissza" @@ -1353,7 +1354,7 @@ "Folyamatban van a csatlakoztatott eszköz töltése. Koppintson a további lehetőségekhez." "Analóg audiotartozék észlelve" "A csatlakoztatott eszköz nem kompatibilis ezzel a telefonnal. További információért koppintson ide." - "USB hibakereső csatlakoztatva" + "USB-hibakereső csatlakoztatva" "Koppintson az USB-hibakeresés kikapcsolásához" "Válassza ezt az USB hibakeresés kikapcsolásához." "Tesztelési alapkörnyezet mód engedélyezve" @@ -1887,8 +1888,8 @@ "Nincs kategóriába sorolva" "Ön állította be ezen értesítések fontossági szintjét." "Ez az üzenet a résztvevők miatt fontos." - "Engedélyezi a(z) %1$s számára, hogy új felhasználót hozzon létre a(z) %2$s fiókkal?" - "Engedélyezi a(z) %1$s számára, hogy új felhasználót hozzon létre a(z) %2$s fiókkal? (Már létezik felhasználó ezzel a fiókkal.)" + "Engedélyezi a(z) %1$s számára, hogy új felhasználót hozzon létre a(z) %2$s fiókkal? (Már létezik felhasználó ezzel a fiókkal.)" + "Engedélyezi a(z) %1$s számára, hogy új felhasználót hozzon létre a(z) %2$s fiókkal?" "Nyelv hozzáadása" "Régió beállítása" "Adja meg a nyelvet" diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index a7a91635d3b14e12794c6c0e71ed13de52d2a591..21c6aa9d5659dd83f732352261be96fdfd9ee454 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -95,6 +95,7 @@ "Ձայնային փոստի հաղորդագրություններ" "Զանգեր Wi-Fi-ի միջոցով" "SIM քարտի կարգավիճակը" + "SIM քարտի բարձր առաջնահերթության ծանուցումներ" "Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը" @@ -550,11 +551,11 @@ "Մատնահետքի պատկերակ" - "կառավարել դեմքի ճանաչման սարքը" + "կառավարել դեմքով ապակողպման համար սարքը" "Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:" - "օգտագործել դեմքի ճանաչման սարքը" - "Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված սարքը" - "Նույնականացում դեմքի միջոցով" + "օգտագործել դեմքով ապակողպման համար սարքը" + "Թույլ է տալիս հավելվածին օգտագործել դեմքով ապակողպման համար նախատեսված սարքը" + "Դեմքով ապակողպում" "Նորից գրանցեք ձեր դեմքը" "Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը" "Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։" @@ -567,7 +568,7 @@ "Տեղափոխեք հեռախոսը ձախ:" "Տեղափոխեք հեռախոսը աջ:" "Նայեք ուղիղ էկրանին։" - "Ձեր դեմքը չի երևում։ Նայեք հեռախոսին։" + "Պահեք ձեր դեմքն անմիջապես հեռախոսի էկրանի դիմաց:" "Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։" "Նորից փորձեք։" "Չհաջողվեց ճանաչել դեմքը։ Նորից փորձեք:" @@ -576,19 +577,19 @@ "Գլուխն ուղիղ պահեք։" "Գլուխն ուղիղ պահեք։" "Հեռացրեք այն ամենը, ինչը թաքցնում է ձեր երեսը:" - "Մաքրեք էկրանի վերևի անկյունում գտնվող տվիչը:" + "Մաքրեք էկրանի վերևի մասը, ներառյալ սև գոտին" "Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:" - "Նորից փորձեք դեմքի ճանաչումը։" + "Նորից փորձեք դեմքով ապակողպումը։" "Չհաջողվեց պահել նոր դեմքը։ Ջնջեք հին տարբերակը։" - "Դեմքի ճանաչումը չեղարկվել է" - "Դեմքի ճանաչումը չեղարկվել է օգտատիրոջ կողմից" + "Դեմքի ճանաչումը չեղարկվել է։" + "Դեմքով ապակողմումը չեղարկվել է օգտատիրոջ կողմից:" "Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:" - "Չափազանց շատ փորձեր են արվել։ Դեմքի ճանաչումն անջատված է։" + "Չափազանց շատ փորձեր են արվել։ Դեմքով ապակողպումն անջատված է:" "Չհաջողվեց հաստատել դեմքը։ Նորից փորձեք։" - "Դուք չեք կարգավորել դեմքի ճանաչումը" - "Դեմքի ճանաչումն այս սարքում չի աջակցվում" + "Դուք չեք կարգավորել դեմքով ապակողպումը:" + "Դեմքով ապակողպումն այս սարքում չի աջակցվում" "Դեմք %d" @@ -1254,10 +1255,10 @@ "Հպեք՝ բոլոր ցանցերը տեսնելու համար" "Միանալ" "Բոլոր ցանցերը" - "Միանա՞լ Wi-Fi ցանցերին" - "Առաջարկվել է %s-ի կողմից" - "Այո" - "Ոչ" + "Թույլատրե՞լ առաջարկվող Wi‑Fi ցանցերի օգտագործումը" + "%s հավելվածի առաջարկվող ցանցեր: Սարքը կարող է ավտոմատ միանալ:" + "Թույլատրել" + "Ոչ, շնորհակալություն" "Wi‑Fi-ն ավտոմատ կմիանա" "Լավ ազդանշանով պահված ցանցի տարածքում գտնվելիս" "Նորից չմիացնել" @@ -1353,9 +1354,9 @@ "Միացված սարքի լիցքավորում: Հպեք՝ ավելի շատ ընտրանքների համար:" "Հայտնաբերված է անալոգային աուդիո լրասարք" "Կցված սարքը համատեղելի չէ այս հեռախոսի հետ: Հպեք` ավելին իմանալու համար:" - "USB վրիպազերծումը միացված է" - "Հպեք՝ USB-ի վրիպազերծումն անջատելու համար" - "Ընտրել` USB կարգաբերումը կասեցնելու համար:" + "USB-ով վրիպազերծումը միացված է" + "Հպեք՝ USB-ով վրիպազերծումն անջատելու համար" + "Սեղմեք՝ USB-ով վրիպազերծումն անջատելու համար:" "Թեստային ռեժիմը միացված է" "Թեստային ռեժիմն անջատելու համար զրոյացրեք կարգավորումները։" "USB միացքում ջուր կամ աղտ է հայտնաբերվել" @@ -1613,7 +1614,7 @@ "Ներկառուցված էկրան" "HDMI էկրան" "Վերածածկ #%1$d" - "%1$s. %2$dx%3$d, %4$d կմվ" + "%1$s. %2$dx%3$d, %4$d կմչ" ", անվտանգ" "Մոռացել եմ սխեման" "Սխալ սխեմա" @@ -1887,8 +1888,8 @@ "Չդասակարգված" "Դուք սահմանել եք այս ծանուցումների կարևորությունը:" "Կարևոր է, քանի որ որոշակի մարդիկ են ներգրավված:" - "Թույլատրե՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտատեր ստեղծել:" - "Թույլատրե՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտատեր ստեղծել (նման հաշվով Օգտատեր արդեն գոյություն ունի):" + "Թույլատրե՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտատեր ստեղծել (նման հաշվով Օգտատեր արդեն գոյություն ունի):" + "Թույլատրե՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտատեր ստեղծել:" "Ավելացնել լեզու" "Նախընտրելի տարածաշրջան" "Մուտքագրեք լեզուն" @@ -1927,7 +1928,7 @@ "Քարտեզներ և նավարկում" "Արդյունավետություն" "Սարքի հիշողություն" - "USB վրիպազերծում" + "USB-ով վրիպազերծում" "ժամ" "րոպե" "Ժամը" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 05f70c0b19698e9366c3438abd555a1841532bf5..afdce0e0141ad99997e86971e9b589ca4faa3bbb 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -95,6 +95,7 @@ "Notifikasi pesan suara" "Panggilan Wi-Fi" "Status SIM" + "Status SIM prioritas tinggi" "Rekan meminta Mode TTY PENUH" "Rekan meminta Mode TTY HCO" "Rekan meminta Mode TTY VCO" @@ -550,11 +551,11 @@ "Ikon sidik jari" - "kelola hardware autentikasi wajah" + "kelola hardware face unlock" "Mengizinkan apl memicu metode untuk menambah & menghapus template wajah untuk digunakan." - "gunakan hardware autentikasi wajah" - "Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi" - "Autentikasi Wajah" + "gunakan hardware face unlock" + "Mengizinkan aplikasi untuk menggunakan hardware face unlock untuk autentikasi" + "Face unlock" "Daftarkan kembali wajah Anda" "Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda" "Tidak bisa mengambil data wajah akurat. Coba lagi." @@ -567,7 +568,7 @@ "Gerakkan ponsel ke kiri." "Gerakkan ponsel ke kanan." "Lihat langsung ke perangkat." - "Tidak dapat melihat wajah Anda. Lihat ke ponsel." + "Posisikan wajah Anda langsung di depan ponsel." "Terlalu banyak gerakan. Stabilkan ponsel." "Daftarkan ulang wajah Anda." "Tidak lagi dapat mengenali wajah. Coba lagi." @@ -576,19 +577,19 @@ "Putar sedikit kepala Anda." "Putar sedikit kepala Anda." "Singkirkan apa saja yang menutupi wajah Anda." - "Bersihkan sensor di tepi atas layar." + "Bersihkan bagian atas layar, termasuk kotak hitam" "Tidak dapat memverifikasi wajah. Hardware tidak tersedia." - "Coba autentikasi wajah lagi." + "Coba face unlock lagi." "Tidak dapat menyimpan data wajah. Hapus dahulu data lama." - "Pemrosesan wajah dibatalkan" - "Autentikasi wajah dibatalkan oleh pengguna" + "Pemrosesan wajah dibatalkan." + "Face unlock dibatalkan oleh pengguna." "Terlalu banyak percobaan. Coba lagi nanti." - "Terlalu banyak percobaan. Autentikasi wajah dinonaktifkan." + "Terlalu banyak gagal. Face unlock dinonaktifkan." "Tidak dapat memverifikasi wajah. Coba lagi." - "Anda belum menyiapkan autentikasi wajah" - "Autentikasi wajah tidak didukung di perangkat ini" + "Anda belum menyiapkan face unlock." + "Face unlock tidak didukung di perangkat ini." "%d wajah" @@ -1254,10 +1255,10 @@ "Ketuk untuk melihat semua jaringan" "Hubungkan" "Semua jaringan" - "Sambungkan perangkat ke jaringan Wi-Fi?" - "Disarankan oleh %s" - "Ya" - "Tidak" + "Izinkan jaringan Wi-Fi yang disarankan?" + "Jaringan yang disarankan %s. Perangkat dapat terhubung secara otomatis." + "Izinkan" + "Lain kali" "Wi‑Fi akan aktif otomatis" "Saat berada di dekat jaringan berkualitas tinggi yang tersimpan" "Jangan aktifkan kembali" @@ -1887,8 +1888,8 @@ "Belum dikategorikan" "Anda menyetel nilai penting notifikasi ini." "Ini penting karena orang-orang yang terlibat." - "Izinkan %1$s membuat Pengguna baru dengan %2$s ?" - "Izinkan %1$s membuat Pengguna baru dengan %2$s (Pengguna dengan akun ini sudah ada) ?" + "Izinkan %1$s membuat Pengguna baru dengan %2$s (Pengguna dengan akun ini sudah ada) ?" + "Izinkan %1$s membuat Pengguna baru dengan %2$s ?" "Tambahkan bahasa" "Preferensi wilayah" "Ketik nama bahasa" @@ -1976,7 +1977,7 @@ "Jendela Pop-up" "+ %1$d" "Versi aplikasi di-downgrade, atau tidak kompatibel dengan pintasan ini" - "Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung backup dan pulihkan" + "Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung pencadangan dan pemulihan" "Tidak dapat memulihkan pintasan karena tanda tangan aplikasi tidak cocok" "Tidak dapat memulihkan pintasan." "Pintasan dinonaktifkan" diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 956c052e427d9a23df5f3219c7fe9d09b55c0744..299f26c1f92891b2dcd87b58c35c9bba87ab4043 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -95,6 +95,7 @@ "Talhólfsskilaboð" "Wi-Fi símtöl" "Staða SIM-korts" + "Áríðandi staða SIM-korts" "Jafningi bað um FULLA stillingu fjarrita" "Jafningi bað um HCO-stillingu fjarrita" "Jafningi bað um VCO-stillingu fjarrita" @@ -550,11 +551,11 @@ "Fingrafaratákn" - "stjórna vélbúnaði andlitsgreiningar" + "stjórna vélbúnaði andlitsopnunar" "Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar." - "nota vélbúnað andlitsgreiningar" - "Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar" - "Andlitsgreining" + "nota vélbúnað andlitsopnunar" + "Leyfir forritinu að nota andlitsopnunarvélbúnað til auðkenningar" + "Andlitsopnun" "Skráðu andlitið þitt aftur" "Skráðu andlitið þitt til að bæta kennsl" "Nákvæm andlitsgögn fengust ekki. Reyndu aftur." @@ -567,7 +568,7 @@ "Færðu símann til vinstri." "Færðu símann til hægri." "Horfðu beint á tækið." - "Sé ekki andlit þitt. Horfðu á símann." + "Hafðu andlitið beint fyrir framan símann." "Of mikil hreyfing. Haltu símanum stöðugum." "Skráðu nafnið þitt aftur." "Andlit þekkist ekki lengur. Reyndu aftur." @@ -576,19 +577,19 @@ "Hallaðu höfðinu aðeins minna." "Snúðu höfðinu aðeins minna." "Fjarlægðu það sem kann að hylja andlitið." - "Hreinsaðu skynjarann á efri brún skjásins." + "Hreinsaðu efsta hluta skjásins þíns, þ.m.t. svörtu stikuna" "Andlit ekki staðfest. Vélbúnaður er ekki tiltækur." - "Prófaðu andlitsgreiningu aftur." + "Prófaðu andlitsopnun aftur." "Ekki er hægt að vista ný andlitsgögn. Eyddu gömlu fyrst." - "Hætt við andlitsgreiningu" - "Notandi hætti við andlitsgreiningu" + "Hætt við andlitsgreiningu." + "Notandi hætti við andlitsopnun." "Of margar tilraunir. Reyndu aftur síðar." - "Of margar tilraunir. Slökkt á andlitsgreiningu." + "Of margar tilraunir. Slökkt á andlitsopnun." "Ekki tókst að staðfesta andlit. Reyndu aftur." - "Þú hefur ekki sett upp andlitsgreiningu" - "Andlitsgreining er ekki studd í þessu tæki." + "Þú hefur ekki sett upp andlitsopnun." + "Andlitsopnun er ekki studd í þessu tæki." "Andlit %d" @@ -1254,10 +1255,10 @@ "Ýttu til að sjá öll netkerfi" "Tengjast" "Öll netkerfi" - "Tengjast Wi-Fi neti?" - "Tillaga frá %s" - "Já" - "Nei" + "Leyfa ráðlögð Wi‑Fi net?" + "%s kom með tillögur að netkerfum. Tækið gæti tengst sjálfkrafa." + "Leyfa" + "Nei, takk" "Kveikt verður sjálfkrafa á Wi‑Fi" "Þegar þú ert nálægt vistuðu hágæðaneti" "Ekki kveikja aftur" @@ -1888,8 +1889,8 @@ "Óflokkað" "Þú stilltir mikilvægi þessara tilkynninga." "Þetta er mikilvægt vegna fólksins sem tekur þátt í þessu." - "Leyfa %1$s að stofna nýjan notanda með %2$s?" - "Leyfa %1$s að stofna nýjan notanda með %2$s (notandi með þennan reikning er þegar fyrir hendi)?" + "Viltu leyfa %1$s að stofna nýjan notanda með %2$s (notandi með þennan reikning er þegar fyrir hendi)?" + "Leyfa %1$s að stofna nýjan notanda með %2$s ?" "Bæta við tungumáli" "Svæðisval" "Sláðu inn heiti tungumáls" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 748248ee026430660bbd37e5b4eb642f4b3f0469..1ca3237ba7a6643c44b6980e20af5ef89daa4df9 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -95,6 +95,7 @@ "Messaggi vocali" "Chiamate Wi-Fi" "Stato SIM" + "Stato SIM con priorità elevata" "Peer ha richiesto la modalità TTY FULL" "Peer ha richiesto la modalità TTY HCO" "Peer ha richiesto la modalità TTY VCO" @@ -550,11 +551,11 @@ "Icona dell\'impronta digitale" - "gestione di hardware per l\'autenticazione dei volti" + "gestione dell\'hardware per Sblocco col sorriso" "Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti." - "utilizzo di hardware per l\'autenticazione dei volti" - "Consente all\'app di utilizzare hardware per l\'autenticazione dei volti" - "Autenticazione volti" + "utilizzo dell\'hardware per Sblocco col sorriso" + "Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso" + "Sblocco col sorriso" "Registra di nuovo il volto" "Per migliorare il riconoscimento, registra di nuovo il tuo volto" "Impossibile acquisire dati viso accurati. Riprova." @@ -567,7 +568,7 @@ "Sposta il telefono verso sinistra." "Sposta il telefono verso destra." "Guarda più direttamente verso il dispositivo." - "Impossibile vedere il volto. Guarda il telefono." + "Posiziona il viso davanti al telefono." "Troppo movimento. Tieni fermo il telefono." "Ripeti l\'acquisizione del volto." "Non è più possibile riconoscere il volto. Riprova." @@ -576,19 +577,19 @@ "Gira un po\' meno la testa." "Gira un po\' meno la testa." "Rimuovi tutto ciò che ti nasconde il viso." - "Pulisci sensore sul bordo superiore dello schermo." + "Pulisci la parte superiore dello schermo, inclusa la barra nera" "Imposs. verificare volto. Hardware non disponibile." - "Riprova l\'autenticazione volti." + "Riprova Sblocco col sorriso." "Imposs. salvare dati nuovi volti. Elimina un volto vecchio." - "Operazione associata al volto annullata" - "Autenticazione volti annullata dall\'utente" + "Operazione associata al volto annullata." + "Sblocco col sorriso annullato dall\'utente." "Troppi tentativi. Riprova più tardi." - "Troppi tentativi. Autenticazione volti disattivata." + "Troppi tentativi. Sblocco col sorriso disattivato" "Impossibile verificare il volto. Riprova." - "Non hai configurato l\'autenticazione volti" - "Autenticazione volti non supportata su questo dispositivo" + "Non hai configurato Sblocco col sorriso." + "Sblocco col sorriso non supportato su questo dispositivo." "Volto %d" @@ -1254,10 +1255,10 @@ "Tocca per vedere tutte le reti" "Connetti" "Tutte le reti" - "Connettersi a reti Wi-Fi?" - "Consigliato da %s" - "Sì" - "No" + "Vuoi consentire le reti Wi-Fi suggerite?" + "%s ha suggerito delle reti. Il dispositivo potrebbe collegarsi automaticamente." + "Consenti" + "No, grazie" "Il Wi‑Fi verrà attivato automaticamente" "Quando ti trovi nell\'area di una rete salvata di alta qualità" "Non riattivare" @@ -1887,8 +1888,8 @@ "Senza categoria" "Stabilisci tu l\'importanza di queste notifiche." "Importante a causa delle persone coinvolte." - "Consentire a %1$s di creare un nuovo utente con %2$s?" - "Consentire a %1$s di creare un nuovo utente con %2$s? (Esiste già un utente con questo account)" + "Consentire a %1$s di creare un nuovo utente con l\'account %2$s (esiste già un utente con questo account)?" + "Consentire a %1$s di creare un nuovo utente con l\'account %2$s?" "Aggiungi una lingua" "Area geografica preferita" "Digita nome lingua" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 8afd95a48357696540055bce0475e0ba0b49e44f..c8c4f7236918ae06a18f7217c50886ff9eb32ca8 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -97,11 +97,12 @@ "הודעות קוליות" "‏שיחות Wi-Fi" "‏סטטוס SIM" + "‏סטטוס התראות SIM בעדיפות גבוהה" "‏העמית ביקש TTY במצב FULL" "‏העמית ביקש TTY במצב HCO" "‏העמית ביקש TTY במצב VCO" "‏העמית ביקש TTY במצב OFF" - "Google Voice" + "קול" "Google Data" "פקס" "SMS" @@ -556,11 +557,11 @@ "סמל טביעת אצבע" - "ניהול של חומרה של זיהוי פנים לצורך אימות" + "ניהול החומרה לשחרור נעילה על ידי זיהוי פנים" "מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש." - "שימוש בחומרה של זיהוי פנים לצורך אימות" - "מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות" - "אימות פנים" + "שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים" + "מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות" + "שחרור נעילה על ידי זיהוי פנים" "יש לבצע רישום מחדש של הפנים שלך" "לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך" "לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב." @@ -573,7 +574,7 @@ "צריך להזיז את הטלפון שמאלה." "צריך להזיז את הטלפון ימינה." "יש להביט ישירות אל המכשיר." - "אי אפשר לראות את הפנים שלך. צריך להביט אל הטלפון." + "עליך למקם את הפנים ישירות מול הטלפון." "יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה." "יש לרשום מחדש את הפנים." "כבר לא ניתן לזהות פנים. יש לנסות שוב." @@ -582,19 +583,19 @@ "עליך ליישר קצת את הראש." "עליך ליישר קצת את הראש." "יש להסיר כל דבר שמסתיר את הפנים." - "יש לנקות את החיישן שבקצה העליון של המסך." + "עליך לנקות את החלק העליון של המסך, כולל הסרגל השחור" "לא ניתן לאמת את הפנים. החומרה לא זמינה." - "יש לנסות שוב את זיהוי הפנים לצורך אימות." + "יש לנסות שוב את שחרור הנעילה על ידי זיהוי פנים." "לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים." - "פעולת הפנים בוטלה" - "זיהוי הפנים בוטל על ידי המשתמש" + "פעולת הפנים בוטלה." + "שחרור הנעילה על ידי זיהוי פנים בוטל על ידי המשתמש." "יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר." - "יותר מדי ניסיונות. אימות פנים הושבת." + "יותר מדי ניסיונות. שחרור נעילה על ידי זיהוי פנים מושבת." "לא ניתן לאמת את הפנים. יש לנסות שוב." - "לא הגדרת אימות פנים" - "המכשיר הזה לא תומך באימות פנים" + "לא הגדרת שחרור נעילה על ידי זיהוי פנים." + "המכשיר הזה לא תומך בשחרור נעילה על ידי זיהוי פנים." "פנים %d" @@ -1298,10 +1299,10 @@ "יש להקיש כדי לראות את כל הרשתות" "התחבר" "כל הרשתות" - "‏להתחבר לרשתות Wi‑Fi?" - "הוצע על-ידי %s" - "כן" - "לא" + "‏לאפשר הצעות לרשתות Wi-Fi?" + "הצעות לרשתות %s. ייתכן שחיבור המכשיר ייעשה באופן אוטומטי." + "אישור" + "לא תודה" "‏ה-Wi-Fi יופעל אוטומטית" "כשתימצאו בקרבת רשת באיכות גבוהה ששמרתם" "אל תפעיל שוב" @@ -1955,8 +1956,8 @@ "ללא שיוך לקטגוריה" "עליך להגדיר את החשיבות של ההתראות האלה." "ההודעה חשובה בשל האנשים המעורבים." - "האם לאפשר ל-%1$s ליצור משתמש חדש לחשבון %2$s ?" - "האם לאפשר ל-%1$s ליצור משתמש חדש לחשבון %2$s (כבר קיים משתמש לחשבון הזה) ?" + "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s (כבר קיים משתמש לחשבון הזה) ?" + "האם לאפשר לאפליקציה %1$s ליצור משתמש חדש באמצעות %2$s ?" "הוספת שפה" "העדפת אזור" "הקלד שם שפה" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index af6f3c666c9b45fd43c626178daeff5eee7d2c62..c7b3b9e1385ce4675d9ed46724159fc2366bb8cc 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -95,6 +95,7 @@ "ボイスメール メッセージ" "Wi-Fi 通話" "SIM のステータス" + "高優先度: SIM のステータス" "ピアから、TTY モードを FULL にするようリクエストされました" "ピアから、TTYモードをHCOにするようリクエストされました" "ピアから、TTYモードをVCOにするようリクエストされました" @@ -297,9 +298,9 @@ "マイク" "音声の録音" "音声の録音を「<b>%1$s</b>」に許可しますか?" - "運動データ" - "運動データにアクセス" - "運動データへのアクセスを「<b>%1$s</b>」に許可しますか?" + "身体活動" + "身体活動にアクセス" + "身体活動へのアクセスを「<b>%1$s</b>」に許可しますか?" "カメラ" "写真と動画の撮影" "写真と動画の撮影を「<b>%1$s</b>」に許可しますか?" @@ -428,8 +429,8 @@ "このアプリは、いつでもマイクを使用して録音できます。" "SIMへのコマンド送信" "SIMにコマンドを送信することをアプリに許可します。この許可は非常に危険です。" - "運動の認識" - "このアプリで運動が認識されるようにします。" + "身体活動の認識" + "このアプリで身体活動が認識されるようにします。" "写真と動画の撮影" "このアプリは、いつでもカメラを使用して写真や動画を撮影できます。" "バイブレーションの制御" @@ -550,11 +551,11 @@ "指紋アイコン" - "顔認証ハードウェアの管理" + "顔認証ハードウェアの管理" "使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。" - "顔認証ハードウェアの使用" - "顔認証ハードウェアを認証に使用することをアプリに許可します" - "顔認証" + "顔認証ハードウェアの使用" + "顔認証ハードウェアを認証に使用することをアプリに許可します" + "顔認証" "顔の再登録" "認識を改善するには、顔を再登録してください" "顔を認識できませんでした。もう一度お試しください。" @@ -567,7 +568,7 @@ "スマートフォンを左に動かしてください。" "スマートフォンを右に動かしてください。" "もっとまっすぐデバイスに顔を向けてください。" - "顔を確認できません。スマートフォンを見てください。" + "顔をスマートフォンの真正面に向けてください。" "あまり動かさないでください。安定させてください。" "顔を登録し直してください。" "顔を認識できなくなりました。もう一度お試しください。" @@ -576,19 +577,19 @@ "顔の向きを少し戻してください。" "顔の向きを少し戻してください。" "顔を隠しているものをすべて外してください" - "画面の上端にあるセンサーの汚れを落としてください。" + "黒いバーを含め、画面の上部をきれいにしてください" "顔を確認できません。ハードウェアを利用できません。" - "顔認証をもう一度お試しください。" + "顔認証をもう一度お試しください。" "新しい顔データを保存できません。古いデータを削除してください。" - "顔の操作をキャンセルしました" - "顔の認証がユーザーによりキャンセルされました" + "顔の操作をキャンセルしました。" + "顔認証はユーザーによりキャンセルされました。" "試行回数の上限です。後でもう一度お試しください。" - "入力回数が上限を超えました。顔認証が無効になりました。" + "試行回数が上限を超えたため、顔認証を無効にしました。" "顔を確認できません。もう一度お試しください。" - "顔認証を設定していません" - "顔認証はこのデバイスではご利用いただけません" + "顔認証を設定していません。" + "このデバイスでは、顔認証はご利用いただけません。" "顔 %d" @@ -817,7 +818,7 @@ "もう一度お試しください" "もう一度お試しください" "すべての機能とデータを利用するにはロック解除" - "フェイスアンロックの最大試行回数を超えました" + "顔認証の最大試行回数を超えました" "SIMカードが挿入されていません" "タブレット内にSIMカードがありません。" "テレビにSIMカードが挿入されていません。" @@ -887,7 +888,7 @@ "ロック解除エリアを拡大します。" "スライドロックを解除します。" "パターンロックを解除します。" - "フェイスアンロックを行います。" + "顔認証を行います。" "PINロックを解除します。" "SIM PIN のロックを解除します。" "SIM PUK のロックを解除します。" @@ -1254,10 +1255,10 @@ "すべてのネットワークを表示するにはタップします" "接続" "すべてのネットワーク" - "Wi-Fi ネットワークに接続しますか?" - "%s によるおすすめ" - "はい" - "いいえ" + "Wi‑Fi ネットワーク候補を許可しますか?" + "%s からのネットワーク候補に、デバイスが自動的に接続される可能性があります。" + "許可" + "許可しない" "Wi-Fi は自動的にオンになります" "高品質の保存済みネットワークの検出時" "再度オンにしない" @@ -1354,7 +1355,7 @@ "アナログのオーディオ アクセサリを検出" "接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。" "USBデバッグが接続されました" - "タップして USB デバッグを無効にしてください" + "USB デバッグを無効にするにはここをタップしてください" "USBデバッグを無効にする場合に選択します。" "テストハーネス モード有効" "出荷時設定にリセットしてテストハーネス モードを無効にしてください。" @@ -1887,8 +1888,8 @@ "カテゴリなし" "このような通知の重要度を設定します。" "関係するユーザーのため、この設定は重要です。" - "%1$s%2$s で新しいユーザーを作成できるようにしますか?" - "%1$s%2$s で新しいユーザーを作成できるようにしますか?(このアカウントのユーザーはすでに存在します)" + "%1$s%2$s で新しいユーザーを作成できるようにしますか?(このアカウントのユーザーはすでに存在します)" + "%1$s%2$s で新しいユーザーを作成できるようにしますか?" "言語を追加" "地域設定" "言語名を入力" diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 23fdad44864bd06325ba3a263b2f937cf7ee47bb..bd4e4dccbdc52147f00a4a90e51876c547707983 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -95,6 +95,7 @@ "ხმოვანი ფოსტის შეტყობინებები" "დარეკვა Wi-Fi-ს მეშვეობით" "SIM სტატუსი" + "მაღალპრიორიტეტული SIM სტატუსი" "მოთხოვნილია კვანძი TTY რეჟიმი FULL" "მოთხოვნილია კვანძი TTY რეჟიმი HCO" "მოთხოვნილია კვანძი TTY რეჟიმი VCO" @@ -550,11 +551,11 @@ "თითის ანაბეჭდის ხატულა" - "სახის ამოცნობის აპარატურის მართვა" + "სახით განბლოკვის აპარატურის მართვა" "საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები." - "სახის ამოცნობის აპარატურის გამოყენება" - "საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა" - "სახის ამოცნობა" + "სახით განბლოკვის აპარატურის გამოყენება" + "საშუალებას აძლევს აპს, ამოცნობისთვის გამოიყენოს სახით განბლოკვის აპარატურა" + "განბლოკვა სახით" "დაარეგისტრირეთ თქვენი სახე ხელახლა" "ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე" "სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა." @@ -567,7 +568,7 @@ "გადაანაცვლეთ ტელეფონი მარცხნივ." "გადაანაცვლეთ ტელეფონი მარჯვნივ." "გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას." - "თქვენი სახე არ ჩანს. შეხედეთ ტელეფონს." + "დაიჭირეთ სახე უშუალოდ ტელეფონის წინ." "მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი." "გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე." "სახის ამოცნობა ვეღარ ხერხდება. ცადეთ ხელახლა." @@ -576,19 +577,19 @@ "თავი ცოტა ნაკლებად მიაბრუნეთ." "თავი ცოტა ნაკლებად მიაბრუნეთ." "მოაშორეთ ყველაფერი, რაც სახეს გიფარავთ." - "გაწმინდეთ სენსორი ეკრანის ზედა კიდეზე." + "გაწმინდეთ ეკრანის ზედა ნაწილი, შავი ზოლის ჩათვლით." "სახე ვერ დასტურდება. აპარატი მიუწვდომელია." - "ცადეთ ხელახლა სახის ამოცნობა." + "ცადეთ ხელახლა სახით განბლოკვა." "სახის ახალი მონაცემები ვერ ინახება. ჯერ ძველი წაშალეთ." - "სახის ოპერაცია გაუქმდა." - "სახის ავთენტიფიკაცია გაუქმდა მომხმარებლის მიერ" + "სახის ამოცნობა გაუქმდა." + "განბლოკვა სახით გაუქმდა მომხმარებლის მიერ." "დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით." - "მეტისმეტად ბევრი მცდელობა იყო. სახის ამოცნობა გათიშულია." + "მეტისმეტად ბევრი მცდელობა იყო. სახით განბლოკვა გათიშულია." "სახის დადასტურება ვერ ხერხდება. ცადეთ ხელახლა." - "თქვენ არ დაგიყენებიათ სახის ავთენტიფიკაცია" - "სახის ავთენტიფიკაცია ამ მოწყობილობაზე მხარდაჭერილი არ არის" + "თქვენ არ დაგიყენებიათ სახით განბლოკვა." + "განბლოკვა სახით ამ მოწყობილობაზე მხარდაჭერილი არ არის." "სახე %d" @@ -1254,10 +1255,10 @@ "შეეხეთ ყველა ქსელის სანახავად" "დაკავშირება" "ყველა ქსელი" - "გსურთ Wi-Fi ქსელებთან დაკავშირება?" - "შეთავაზებულია %s-ის მიერ" - "დიახ" - "არა" + "გსურთ, დაუშვათ შემოთავაზებული Wi‑Fi ქსელები?" + "%s შემოთავაზებული ქსელები. მოწყობილობა შეიძლება ავტომატურად დაუკავშირდეს." + "დაშვება" + "არა, გმადლობთ" "Wi-Fi ავტომატურად ჩაირთვება" "როცა შენახულ მაღალხარისხიან ქსელებთან ახლოს იმყოფებით" "ხელახლა ნუ ჩართავ" @@ -1887,8 +1888,8 @@ "კატეგორიის გარეშე" "ამ შეტყობინებების მნიშვნელობის დონე განისაზღვრა თქვენ მიერ." "მნიშვნელოვანია ჩართული მომხმარებლების გამო." - "მიეცეს უფლება %1$s-ს, %2$s-ის მეშვეობით ახალი მომხმარებელი შექმნას ?" - "მიეცეს უფლება %1$s-ს, %2$s-ის მეშვეობით ახალი მომხმარებელი შექმნას (ამ ანგარიშის მქონე მომხმარებელი უკვე არსებობს) ?" + "მიეცეს უფლება %1$s-ს %2$s-ის მეშვეობით ახალი მომხმარებელი შექმნას (ამ ანგარიშის მქონე მომხმარებელი უკვე არსებობს)?" + "მიეცეს უფლება %1$s-ს %2$s-ის მეშვეობით ახალი მომხმარებელი შექმნას?" "ენის დამატება" "რეგიონის პარამეტრები" "აკრიფეთ ენის სახელი" diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 9a6dc6baad9a31c27be53dcf35d1e39a873363e5..0b69c882fb1e20d7b28b6a79ee5d930b270ac1ba 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -95,6 +95,7 @@ "Дауыстық пошта хабарлары" "Wi-Fi қоңыраулары" "SIM күйі" + "SIM картасы туралы маңызды хабарландырулар" "Пир TTY режимі ТОЛЫҚ сұрады" "Пир TTY режимінің HCO сұрады" "Пир TTY режимінің VCO сұрады" @@ -550,11 +551,11 @@ "Саусақ ізі белгішесі" - "бетті тану жабдығын басқару" + "Face Unlock жабдығын басқару" "Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді." - "бетті тану жабдығын пайдалану" - "Қолданбаға бетті тану жабдығын қолдануға рұқсат етеді" - "Бетті тану" + "Face Unlock жабдығын пайдалану" + "Аутентификациялау үшін қолданбаға Face Unlock жабдығын пайдалануға рұқсат береді." + "Face Unlock" "Бетті қайта тіркеу" "Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз." "Бет деректері дұрыс алынбады. Әрекетті қайталаңыз." @@ -567,7 +568,7 @@ "Телефонды солға жылжытыңыз." "Телефонды оңға жылжытыңыз." "Құрылғының камерасына тура қараңыз." - "Бетіңіз көрінбейді. Телефонға қараңыз." + "Бетіңізді телефонға тура қаратыңыз." "Қозғалыс тым көп. Телефонды қозғалтпаңыз." "Қайта тіркеліңіз." "Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз." @@ -576,19 +577,19 @@ "Басыңызды түзурек ұстаңыз." "Басыңызды кішкене бұрыңыз." "Бетіңізді жауып тұрған нәрсені алып тастаңыз." - "Экранның жоғарғы жиегіндегі датчикті тазалаңыз." + "Экранның жоғарғы жағын, сонымен қатар қара жолақты өшіріңіз." "Бетті тану мүмкін емес. Жабдық қолжетімді емес." - "Құрылғы бетіңізді танымады. Қайталап көріңіз." + "Face Unlock функциясын қайта қолданып көріңіз." "Жаңа бетті сақтау мүмкін емес. Алдымен ескісін жойыңыз." - "Бетті танудан бас тартылды." - "Пайдаланушы бетті тану әрекетінен бас тартты." + "Бетті танудан бас тартылды." + "Пайдаланушы Face Unlock функциясынан бас тартты." "Тым көп әрекет жасалды. Кейінірек қайталаңыз." - "Тым көп әрекет жасалды. Бетті тану функциясы өшірілді." + "Тым көп әрекет жасалды. Face Unlock функциясы өшірілді." "Бетті тану мүмкін емес. Әрекетті қайталаңыз." - "Бетті тану функциясы реттелмеген." - "Бетті тану функциясын бұл құрылғы қолдамайды." + "Face Unlock реттелмеді." + "Бұл құрылғыда Face Unlock функциясы істемейді." "%d беті" @@ -1254,10 +1255,10 @@ "Барлық желілерді көру үшін түртіңіз" "Қосылу" "Барлық желілер" - "Wi-Fi желісіне жалғансын ба?" - "%s ұсынған." - "Иә" - "Жоқ" + "Ұсынылған Wi‑Fi желілеріне рұқсат беру керек пе?" + "%s ұсынған желілер. Құрылғы автоматты түрде қосылуы мүмкін." + "Рұқсат беру" + "Жоқ, рақмет" "Wi‑Fi автоматты түрде қосылады" "Сақталған жоғары сапалы желіге жақын болғанда" "Қайта қоспау" @@ -1888,8 +1889,8 @@ "Санатқа жатқызылмаған" "Сіз осы хабарландырулардың маңыздылығын орнатасыз." "Қатысты адамдарға байланысты бұл маңызды." - "%1$s %2$s есептік жазбасы бар жаңа пайдаланушы жасауға рұқсат ету керек пе?" - "%1$s %2$s есептік жазбасында жаңа пайдаланушы жасауға рұқсат ету керек пе (осы есептік жазбасы бар пайдаланушы әлдеқашан бар) ?" + "%1$s қолданбасына %2$s есептік жазбасы бар жаңа пайдаланушы (мұндай есептік жазбаға ие пайдаланушы бұрыннан бар) жасауға рұқсат етілсін бе?" + "%1$s қолданбасына %2$s есептік жазбасы бар жаңа пайдаланушы жасауға рұқсат етілсін бе?" "Тілді қосу" "Аймақ параметрі" "Тіл атауын теріңіз" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 1275e14186830552006d903a4bf92ce5d12566dc..9b9a69d76099b82ae50742f486fb10237102d9dc 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -95,6 +95,7 @@ "សារ​ជា​សំឡេង" "ការហៅ​ទូរសព្ទ​តាម Wi-Fi" "ស្ថានភាព​ស៊ីម" + "ស្ថានភាពស៊ីម​ដែលមាន​អាទិភាព​ខ្ពស់" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO" @@ -550,11 +551,11 @@ "រូបតំណាងស្នាមម្រាមដៃ" - "គ្រប់គ្រង​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ" + "គ្រប់គ្រង​ហាតវែរ​ដោះសោតាមទម្រង់មុខ" "អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បី​បញ្ចូល និងលុបទម្រង់​គំរូ​ផ្ទៃមុខសម្រាប់ប្រើប្រាស់។" - "ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃ​មុខ" - "អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ផ្នែករឹង​ផ្ទៀងផ្ទាត់​ផ្ទៃមុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់" - "ការផ្ទៀងផ្ទាត់មុខ" + "ប្រើ​ហាតវែរ​ដោះសោ​តាមទម្រង់មុខ" + "អនុញ្ញាត​ឱ្យ​កម្មវិធី​ប្រើ​ហាតវែរ​ដោះសោតាមទម្រង់មុខ​សម្រាប់​ការផ្ទៀងផ្ទាត់" + "ការដោះសោ​តាមទម្រង់មុខ" "ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "ដើម្បី​ធ្វើឱ្យ​ការសម្គាល់មុខ​ប្រសើរជាងមុន សូមស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត" "មិនអាច​ថត​ទិន្នន័យទម្រង់មុខ​បាន​ត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។" @@ -567,7 +568,7 @@ "ផ្លាស់ទី​ទូរសព្ទទៅខាងឆ្វេង។" "ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។" "សូមមើល​ឱ្យចំ​ឧបករណ៍​របស់អ្នក​ជាងមុន។" - "មើលមិនឃើញ​មុខ​របស់អ្នកទេ។ សូមសម្លឹងមើល​ទូរសព្ទ។" + "បែរមុខ​របស់អ្នក​ឱ្យចំ​ពីមុខ​ទូរសព្ទ​ផ្ទាល់។" "មាន​ចលនា​ខ្លាំងពេក។ សូមកាន់​ទូរសព្ទ​ឱ្យនឹង។" "សូម​​ស្កេន​បញ្ចូល​មុខរបស់អ្នក​ម្ដងទៀត។" "មិន​អាច​សម្គាល់មុខ​បាន​ទៀតទេ។ សូមព្យាយាមម្ដងទៀត។" @@ -576,19 +577,19 @@ "ងាកក្បាល​របស់អ្នកតិចជាងមុន​បន្តិច។" "ងាកក្បាល​របស់អ្នក​បន្តិចទៀត។" "យកអ្វី​ដែលបាំង​មុខ​របស់អ្នកចេញ។" - "សម្អាត​ឧបករណ៍ចាប់សញ្ញា​នៅគែម​ខាងលើ​នៃអេក្រង់។" + "សម្អាតផ្នែកខាង​លើនៃ​អេក្រង់​របស់​អ្នក រួមទាំង​របារខ្មៅ" "មិនអាច​ផ្ទៀងផ្ទាត់​មុខបានទេ។ មិនមាន​ហាតវែរទេ។" - "សាកល្បង​ផ្ទៀងផ្ទាត់​មុខម្ដងទៀត។" + "សាកល្បង​ដោះសោតាមទម្រង់មុខ​ម្ដងទៀត។" "មិនអាច​ផ្ទុកទិន្នន័យទម្រង់​មុខថ្មី​បានទេ។ សូមលុបទិន្នន័យទម្រង់​មុខចាស់ជាមុនសិន។" - "បាន​បោះបង់​ប្រតិបត្តិការចាប់​ទម្រង់មុខ" - "ការផ្ទៀងផ្ទាត់មុខ​ត្រូវបានបោះបង់​ដោយអ្នកប្រើប្រាស់" + "បាន​បោះបង់​ប្រតិបត្តិការចាប់​ផ្ទៃមុខ។" + "អ្នកប្រើប្រាស់​បានបោះបង់​ការដោះសោ​តាមទម្រង់មុខ។" "ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។" - "ព្យាយាមចូលច្រើនពេក។ បានបិទ​ការផ្ទៀងផ្ទាត់មុខ។" + "ការដោះសោ​តាមទម្រង់មុខត្រូវបាន​បិទ ដោយ​សារ​ព្យាយាម​ច្រើនដង​ពេក។" "មិន​អាច​ផ្ទៀងផ្ទាត់​មុខ​បាន​ទេ។ សូមព្យាយាមម្ដងទៀត។" - "អ្នក​មិនទាន់​រៀបចំ​ការផ្ទៀងផ្ទាត់​មុខនៅឡើយទេ" - "មិន​អាច​ប្រើ​ការផ្ទៀងផ្ទាត់​មុខ​នៅលើ​ឧបករណ៍​នេះ​បានទេ" + "អ្នក​មិនទាន់​រៀបចំ​ការដោះសោតាមទម្រង់មុខ​នៅឡើយទេ។" + "មិនអាចប្រើ​ការដោះសោតាមទម្រង់មុខ​នៅលើ​ឧបករណ៍​នេះ​បានទេ។" "ផ្ទៃមុខទី %d" @@ -1256,10 +1257,10 @@ "ចុចដើម្បីមើលបណ្តាញទាំងអស់" "ភ្ជាប់" "បណ្ដាញ​ទាំងអស់" - "ភ្ជាប់​ប​ណ្តា​ញ Wi​-Fi?" - "បាន​ណែនាំដោយ %s" - "បាទ/ចាស" - "ទេ" + "អនុញ្ញាតឱ្យ​ភ្ជាប់​បណ្ដាញ Wi‑Fi ដែលបាន​ណែនាំ?" + "បណ្ដាញ​ដែលបាន​ណែនាំ​របស់ %s ។ ឧបករណ៍​អាច​ភ្ជាប់​ដោយស្វ័យប្រវត្តិ។" + "អនុញ្ញាត" + "ទេ អរគុណ" "Wi‑Fi នឹង​បើក​ដោយ​ស្វ័យប្រវត្តិ" "នៅពេល​ដែល​អ្នក​នៅ​ជិត​បណ្តាញ​គុណភាព​ខ្ពស់​ដែល​បាន​រក្សាទុក" "កុំ​បើក​ឡើង​វិញ" @@ -1889,8 +1890,8 @@ "មិន​​បែងចែក​ប្រភេទ" "អ្នកបានកំណត់សារៈសំខាន់នៃការជូនដំណឹងទាំងនេះ" "វាមានសារៈសំខាន់ដោយសារតែមនុស្សដែលពាក់ព័ន្ធ" - "អនុញ្ញាតឲ្យ %1$s បង្កើតអ្នកប្រើថ្មីដោយប្រើ %2$s ឬទេ?" - "អនុញ្ញាតឲ្យ %1$s បង្កើតអ្នកប្រើថ្មីដោយប្រើ %2$s (មានអ្នកប្រើសម្រាប់គណនីនេះរួចហើយ) ឬទេ?" + "អនុញ្ញាតឱ្យ %1$s បង្កើតអ្នកប្រើប្រាស់​ថ្មីដោយប្រើ %2$s (អ្នកប្រើប្រាស់ដែលមានគណនីនេះមានរួចហើយ) ដែរឬទេ?" + "អនុញ្ញាតឱ្យ %1$s បង្កើតអ្នកប្រើប្រាស់​ថ្មីដោយប្រើ %2$s ដែរឬទេ?" "បន្ថែមភាសា" "ចំណូលចិត្តតំបន់" "វាយបញ្ចូលឈ្មោះភាសា" diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 20d077cdbedee0ecf0d677e6146b30fc164561ca..90ed851e246d9205f03ecdaad3ca957663430735 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -95,6 +95,7 @@ "ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು" "ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ" "ಸಿಮ್‌ ಸ್ಥಿತಿ" + "ಹೆಚ್ಚಿನ ಆದ್ಯತೆಯ ಸಿಮ್ ಸ್ಥಿತಿ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO" @@ -268,7 +269,7 @@ "USB ಸಂಪರ್ಕ" "App ರನ್ ಆಗುತ್ತಿದೆ" "ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಬ್ಯಾಟರಿಯನ್ನು ಉಪಯೋಗಿಸುತ್ತಿವೆ" - "%1$s ಬ್ಯಾಟರಿ ಬಳಸುತ್ತಿದೆ" + "%1$s ಆ್ಯಪ್, ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿದೆ" "%1$d ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಬ್ಯಾಟರಿ ಬಳಸುತ್ತಿವೆ" "ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ" "%1$s, %2$s" @@ -550,11 +551,11 @@ "ಬೆರಳಚ್ಚು ಐಕಾನ್" - "ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ನಿರ್ವಹಿಸಿ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ" "ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." - "ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ಬಳಸಿ" - "ಧೃಡೀಕರಣಕ್ಕಾಗಿ ಮುಖದ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ" - "ಮುಖ ಗುರುತಿಸುವಿಕೆ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಿ" + "ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಹಾರ್ಡ್‌ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ" + "ಫೇಸ್ ಅನ್‌ಲಾಕ್" "ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ" "ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ" "ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." @@ -567,7 +568,7 @@ "ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ." "ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ." "ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ." - "ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ಫೋನ್ ಕಡೆಗೆ ನೋಡಿ." + "ನಿಮ್ಮ ಮುಖವನ್ನು ಫೋನ್‌ಗೆ ನೇರವಾಗಿ ಇರಿಸಿ." "ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ." "ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ." "ಮುಖ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." @@ -576,19 +577,19 @@ "ನಿಮ್ಮ ತಲೆಯನ್ನು ಹೆಚ್ಚು ತಿರುಗಿಸಬೇಡಿ." "ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ವಲ್ಪ ಕಡಿಮೆ ತಿರುಗಿಸಿ." "ನಿಮ್ಮ ಮುಖವನ್ನು ಮರೆಮಾಡುವ ಯಾವುದನ್ನಾದರೂ ತೆಗೆದುಹಾಕಿ." - "ಸ್ಕ್ರೀನ್ ಮೇಲ್ಬಾಗದ ಅಂಚಿನಲ್ಲಿನ ಸೆನ್ಸರ್ ಸ್ವಚ್ಚಗೊಳಿಸಿ." + "ಬ್ಲ್ಯಾಕ್ ಬಾರ್ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನ ಮೇಲ್ಭಾಗವನ್ನು ತೆರವುಗೊಳಿಸಿ" "ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್‌ವೇರ್ ಲಭ್ಯವಿಲ್ಲ." - "ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್‌ವೇರ್‌ ಅನ್ನು ಬಳಸಿ ನೋಡಿ." + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." "ಹೊಸ ಮುಖ ಡೇಟಾ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮೊದಲು ಹಳೆಯದನ್ನು ಅಳಿಸಿ" - "ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ" - "ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ" + "ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ." + "ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ." "ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ." - "ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ಮುಖ ಗುರುತಿಸುವಿಕೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." + "ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." "ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ." - "ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ನೀವು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ" - "ಈ ಸಾಧನದಲ್ಲಿ ಮುಖ ಗುರುತಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ" + "ನೀವು ಫೇಸ್ ಅನ್‌ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ." + "ಈ ಸಾಧನದಲ್ಲಿ ಫೇಸ್ ಅನ್‌ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ." "ಮುಖದ %d" @@ -1151,7 +1152,7 @@ "%1$s ಜೊತೆ ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ" "ಚಿತ್ರ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ" "ಈ ಕ್ರಿಯೆಗೆ ಡಿಫಾಲ್ಟ್ ಆಗಿ ಬಳಸಿ." - "ಬೇರೆಯ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿ" + "ಬೇರೊಂದು ಆ್ಯಪ್ ಬಳಸಿ" "ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳು > ಅಪ್ಲಿಕೇಶನ್‌ಗಳು > ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾದ ಡಿಫಾಲ್ಟ್‌‌ ಅನ್ನು ತೆರವುಗೊಳಿಸಿ." "ಕ್ರಿಯೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" "USB ಸಾಧನಕ್ಕೆ ಅಪ್ಲಿಕೇಶನ್‌‌ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ" @@ -1254,10 +1255,10 @@ "ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ಸಂಪರ್ಕಿಸಿ" "ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕ್‌ಗಳು" - "ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಸಂಪರ್ಕಿಸುವುದೇ?" - "ಸೂಚಿಸಿದವರು: %s" - "ಹೌದು" - "ಇಲ್ಲ" + "ಸೂಚಿಸಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಅನುಮತಿಸುವುದೇ?" + "%s ಸೂಚಿಸಿರುವ ನೆಟ್‌ವರ್ಕ್‌ಗಳು. ಸಾಧನಗಳು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸಂಪರ್ಕಗೊಳ್ಳಬಹುದು." + "ಅನುಮತಿಸಿ" + "ಬೇಡ" "ವೈ‑ಫೈ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಆಗುತ್ತದೆ" "ನೀವು ಉಳಿಸಿದ ಅಧಿಕ ಗುಣಮಟ್ಟದ ನೆಟ್‌ವರ್ಕ್‌ ಸಮೀಪದಲ್ಲಿದ್ದಾಗ" "ಮತ್ತೆ ಆನ್ ಮಾಡಲು ಹಿಂತಿರುಗಬೇಡಿ" @@ -1888,8 +1889,8 @@ "ವರ್ಗೀಕರಿಸದಿರುವುದು" "ನೀವು ಈ ಅಧಿಸೂಚನೆಗಳ ಪ್ರಾಮುಖ್ಯತೆಯನ್ನು ಹೊಂದಿಸಿರುವಿರಿ." "ಜನರು ತೊಡಗಿಕೊಂಡಿರುವ ಕಾರಣ ಇದು ಅತ್ಯಂತ ಪ್ರಮುಖವಾಗಿದೆ." - "%2$s ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು %1$s ಗೆ ಅನುಮತಿಸುವುದೇ ?" - "%2$s (ಈ ಖಾತೆಯ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ) ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು %1$s ಗೆ ಅನುಮತಿಸುವುದೇ ?" + "%2$s (ಈ ಖಾತೆಯ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ) ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು %1$s ಗೆ ಅನುಮತಿಸಬೇಕೆ ?" + "%2$s ಮೂಲಕ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು %1$s ಗೆ ಅನುಮತಿಸುವುದೇ ?" "ಭಾಷೆ ಸೇರಿಸಿ" "ಪ್ರದೇಶ ಪ್ರಾಶಸ್ತ್ಯ" "ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ" diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 33ce9944d7cbeb8e15d03f10759c1ba7e5429cd8..f866e218b8aaa304675840d12aaa0dff4ded05c9 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -95,6 +95,7 @@ "음성사서함 메시지" "Wi-Fi 통화" "SIM 상태" + "우선순위가 높은 SIM 상태" "피어가 TTY 모드 FULL을 요청했습니다." "피어가 TTY 모드 HCO를 요청했습니다." "피어가 TTY 모드 VCO를 요청했습니다." @@ -550,11 +551,11 @@ "지문 아이콘" - "얼굴 인증 하드웨어 관리" + "얼굴인식 잠금해제 하드웨어 관리" "사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다." - "얼굴 인증 하드웨어 사용" - "앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다." - "얼굴 인증" + "얼굴인식 잠금해제 하드웨어 사용" + "앱에서 얼굴인식 잠금해제 하드웨어를 인증에 사용하도록 허용합니다." + "얼굴인식 잠금해제" "얼굴 재등록 필요" "인식률을 개선하려면 얼굴을 다시 등록하세요." "정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요." @@ -567,7 +568,7 @@ "휴대전화를 왼쪽으로 이동하세요." "휴대전화를 오른쪽으로 이동하세요." "기기에서 더 똑바로 바라보세요." - "얼굴이 보이지 않습니다. 휴대전화를 바라보세요." + "휴대전화가 얼굴 정면을 향하도록 두세요." "너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요." "얼굴을 다시 등록해 주세요." "더 이상 얼굴을 인식할 수 없습니다. 다시 시도하세요." @@ -576,19 +577,19 @@ "고개를 조금 덜 돌려 보세요." "고개를 조금 덜 돌려 보세요." "얼굴이 가려지지 않도록 해 주세요." - "화면 상단 가장자리의 센서를 깨끗하게 닦아 주세요." + "검은색 바를 포함한 화면 상단을 청소하세요." "얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다." - "얼굴 인증을 다시 시도해 보세요." + "얼굴인식 잠금해제를 다시 시도해 주세요." "새 얼굴 데이터를 저장할 수 없습니다. 먼저 기존 얼굴 데이터를 삭제하세요." - "얼굴 인식 작업이 취소되었습니다." - "사용자가 얼굴 인증을 취소했습니다." + "얼굴 인식 작업이 취소되었습니다." + "사용자가 얼굴인식 잠금해제를 취소했습니다." "시도 횟수가 너무 많습니다. 나중에 다시 시도하세요." - "시도 횟수가 너무 많습니다. 얼굴 인증이 사용 중지되었습니다." + "시도 횟수가 너무 많습니다. 얼굴인식 잠금해제가 사용 중지되었습니다." "얼굴을 확인할 수 없습니다. 다시 시도하세요." - "얼굴 인증을 설정하지 않았습니다." - "이 기기에서는 얼굴 인증이 지원되지 않습니다." + "얼굴인식 잠금해제를 설정하지 않았습니다." + "이 기기에서는 얼굴인식 잠금해제가 지원되지 않습니다." "얼굴 %d" @@ -1254,10 +1255,10 @@ "모든 네트워크를 보려면 탭하세요." "연결" "모든 네트워크" - "Wi-Fi 네트워크에 연결하시겠습니까?" - "%s에서 추천" - "예" - "아니요" + "제안된 Wi‑Fi 네트워크를 허용하시겠습니까?" + "%s에서 네트워크를 제안했습니다. 기기가 자동으로 연결될 수 있습니다." + "허용" + "허용 안함" "Wi‑Fi가 자동으로 사용 설정됨" "저장된 고품질 네트워크가 가까이 있는 경우" "다시 사용 설정하지 않음" @@ -1342,7 +1343,7 @@ "권한 필요 없음" "비용이 부과될 수 있습니다." "확인" - "이 기기를 USB로 충전" + "이 기기를 USB로 충전 중" "USB를 통해 연결된 기기 충전" "USB 파일 전송 사용 설정됨" "USB를 통해 PTP 사용 설정됨" @@ -1854,8 +1855,8 @@ "다운타임" "평일 밤" "주말" - "캘린더 일정 중" - "수면 중" + "캘린더 일정" + "수면 시간" "%1$s(이)가 일부 소리를 음소거함" "사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다." "사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요." @@ -1887,8 +1888,8 @@ "지정된 카테고리 없음" "이러한 알림의 중요도를 설정했습니다." "관련된 사용자가 있으므로 중요합니다." - "%1$s이(가) %2$s(으)로 신규 사용자를 만들도록 허용하시겠습니까?" - "%1$s이(가) %2$s(이 계정의 사용자가 이미 있음)(으)로 신규 사용자를 만들도록 허용하시겠습니까?" + "%1$s에서 %2$s 계정으로 신규 사용자를 만들도록 허용하시겠습니까? 이 계정으로 등록된 사용자가 이미 존재합니다." + "%1$s에서 %2$s 계정으로 신규 사용자를 만들도록 허용하시겠습니까?" "언어 추가" "지역 환경설정" "언어 이름 입력" diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index b34fcf2c66646c9e0b323c047622438ddc4b4011..6c247871b7fa2dd645e348dd97e4f206a3696a20 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -95,6 +95,7 @@ "Үн почтасынын билдирүүлөрү" "Wi-Fi аркылуу чалуу" "SIM-картанын абалы" + "SIM картадагы өтө маанилүү билдирмелер" "Peer TTY режимин FULL кылууну суранды" "Peer TTY режимин HCO кылууну суранды" "Peer TTY режимин VCO кылууну суранды" @@ -550,11 +551,11 @@ "Манжа изинин сүрөтчөсү" - "жүздүн аныктыгын текшерүүчү аппараттык камсыздоону башкаруу" + "жүзүнөн таануу функциясынын аппараттык камсыздоосун башкаруу" "Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет." - "жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу" - "Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет" - "Жүздүн аныктыгын текшерүү" + "аппараттык камсыздоо үчүн жүзүнөн таанууну колдонуу" + "Колдонмо аныктыкты текшерүүдө Жүзүнөн таануу функциясынын аппараттык камсыздоосун колдонот" + "Жүзүнөн таануу" "Жүзүңүздү кайра таанытыңыз." "Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз" "Жүзүңүз жакшы тартылган жок. Кайра аракет кылыңыз." @@ -567,7 +568,7 @@ "Телефонду солго жылдырыңыз." "Телефонду оңго жылдырыңыз." "Түзмөгүңүзгө түз караңыз." - "Жүзүңүз көрүнбөй жатат. Телефонду караңыз." + "Телефонду жүзүңүздүн маңдайында кармаңыз." "Кыймылдап жибердиңиз. Телефонду түз кармаңыз." "Жүзүңүздү кайра таанытыңыз." "Жүз таанылган жок. Кайра аракет кылыңыз." @@ -576,19 +577,19 @@ "Башыңызды бир аз гана эңкейтиңиз." "Башыңызды бир аз гана эңкейтиңиз." "Жүзүңүздү жашырып турган нерселерди алып салыңыз." - "Экрандын жогору жагындагы сенсорду тазалаңыз." + "Экраныңыздын жогору жагын, анын ичинде тилкени да тазалаңыз" "Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз." - "Жүздүн аныктыгын кайра текшерип көрүңүз" + "Жүзүнөн таануу функциясын кайра текшерип көрүңүз." "Жаңы жүздү сактоо мүмкүн эмес. Адегенде эскисин өчүрүңүз." - "Жүздүн аныктыгын текшерүү жокко чыгарылды" - "Жүздүн аныктыгын текшерүү колдонуучу аркылуу жокко чыгарылды" + "Жүздүн аныктыгын текшерүү жокко чыгарылды." + "Жүзүнөн таануу функциясын колдонуучу өчүрүп салды." "Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз." - "Өтө көп аракеттер аткарылды. Жүздүн аныктыгын текшерүү өчүк." + "Өтө көп жолу аракет кылдыңыз. Жүзүнөн таануу функциясы өчүрүлдү." "Жүз ырасталбай жатат. Кайра аракет кылыңыз." - "Жүздүн аныктыгын текшерүүнү жөндөй элексиз" - "Жүздүн аныктыгын текшерүү бул түзмөктө колдоого алынбайт" + "Жүзүнөн таануу функциясын жөндөй элексиз." + "Жүзүнөн таануу функциясы бул түзмөктө иштебейт." "Жүз %d" @@ -1254,10 +1255,10 @@ "Бардык тармактарды көрүү үчүн басыңыз" "Туташуу" "Бардык тармактар" - "Wi-Fi тармактарына туташсынбы?" - "%s сунуштайт" - "Ооба" - "Жок" + "Сунушталган Wi‑Fi тармактарына туташасызбы?" + "%s сунуштаган тармактар. Түзмөк автоматтык түрдө туташышы мүмкүн." + "Уруксат берүү" + "Жок, рахмат" "Wi‑Fi автоматтык түрдө күйөт" "Байланыш сигналы күчтүү тармактарга жакындаганда" "Өзү кайра күйбөйт" @@ -1343,7 +1344,7 @@ "Эч уруксаттын кереги жок" "бул үчүн акы алынышы мүмкүн" "Жарайт" - "Бул түзмөк USB аркылуу кубатталууда" + "USB аркылуу кубатталууда" "USB аркылуу туташкан түзмөк кубатталууда" "USB аркылуу файл өткөрүү режими күйгүзүлдү" "USB аркылуу PTP режими күйгүзүлдү" @@ -1355,7 +1356,7 @@ "Аналогдук аудио жабдуу табылды" "Тиркелген түзмөк бул телефонго шайкеш келбейт. Көбүрөөк маалымат алуу үчүн таптап коюңуз." "Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген" - "USB аркылуу мүчүлүштүктөрдү оңдоону өчүрүү үчүн таптаңыз" + "USB арклуу мүчүлштктрдү оңдоону өчрүү үчүн басып коюңуз" "Сыноо программасынын режими иштетилди" @@ -1889,8 +1890,8 @@ "Категорияларга бөлүнгөн эмес" "Бул эскертмелердин маанилүүлүгүн белгиледиңиз." "Булар сиз үчүн маанилүү адамдар." - "%1$s колдонмосу %2$s аккаунту менен жаңы колдонуучу түзө берсинби?" - "%1$s колдонмосуна %2$s аккаунту үчүн жаңы колдонуучу түзгөнгө уруксат бересизби (мындай аккаунту бар колдонуучу мурунтан эле бар)?" + "%1$s колдонмосуна %2$s аккаунту менен жаңы колдонуучу түзүүгө уруксат бересизби (мындай аккаунту бар колдонуучу мурунтан эле бар)?" + "%1$s колдонмосуна %2$s аккаунту менен жаңы колдонуучу түзүүгө уруксат бересизби?" "Тил кошуу" "Чөлкөмдүк жөндөөлөр" "Тилди киргизиңиз" @@ -1898,7 +1899,7 @@ "Бардык тилдер" "Бардык аймактар" "Издөө" - "Колдонмо жеткиликтсиз" + "Колдонмо жеткиликсиз" "%1$s колдонмосу учурда жеткиликсиз. Анын жеткиликтүүлүгү %2$s тарабынан башкарылат." "Кеңири маалымат" "Жумуш профили күйгүзүлсүнбү?" diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 3b887a2131e75fe6ce20fb1fba374f871ffabe3d..a9e90862da613c9159f0aa8eaa6fea544841ae13 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -95,6 +95,7 @@ "ຂໍ້ຄວາມສຽງ" "ການ​ໂທ Wi-Fi" "ສະຖານະ SIM" + "ສະຖານະ SIM ຄວາມສຳຄັນສູງ" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ​ນັ້ນ​ເຕັມ​ແລ້ວ" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ HCO" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ VCO" @@ -550,11 +551,11 @@ "ໄອຄອນລາຍນິ້ວມື" - "ຈັດການຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ" + "ຈັດການຮາດແວປົດລັອກດ້ວຍໜ້າ" "ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້." - "ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ" - "ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ" - "ການພິສູດຢືນຢັນດ້ວຍໃບໜ້າ" + "ໃຊ້ຮາດແວການປົດລັອກໃບໜ້າ" + "ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການປົດລັອກດ້ວຍໜ້າເພື່ອພິສູດຢືນຢັນ" + "ປົດລັອກດ້ວຍໜ້າ" "ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່" "ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່." "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່." @@ -567,7 +568,7 @@ "ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ." "ຍ້າຍໂທລະສັບໄປທາງຂວາ." "ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ." - "ບໍ່ສາມາດເບິ່ງເຫັນໜ້າຂອງທ່ານໄດ້. ກະລຸນາເບິ່ງໂທລະສັບ." + "ຫັນໜ້າຂອງທ່ານໄປໃສ່ໜ້າໂທລະສັບໂດຍກົງ." "ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ." "ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ." "ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່." @@ -576,19 +577,19 @@ "ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ." "ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ." "ນຳສິ່ງທີ່ກີດຂວາງໃບໜ້າທ່ານອອກ." - "ທຳຄວາມສະອາດເຊັນເຊີຢູ່ເທິງສຸດຂອງຂອບຈໍ." + "ທຳຄວາມສະອາດສ່ວນເທິງສຸດຂອງໜ້າຈໍທ່ານ, ຮວມທັງແຖບດຳນຳ" "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້." - "ລອງໃຊ້ການພິສູດຢືນຢັນໃບໜ້າອີກເທື່ອໜຶ່ງ" + "ລອງປົດລັອກດ້ວຍໜ້າອີກເທື່ອໜຶ່ງ." "ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າໃໝ່ໄດ້. ກະລຸນາລຶບຂໍ້ມູນເກົ່າອອກກ່ອນ." - "ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ" - "ຜູ້ໃຊ້ຍົກເລີກການພິສູດຢືນຢັນໃບໜ້າແລ້ວ" + "ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ." + "ຜູ້ໃຊ້ຍົກເລີກການປົດລັອກດ້ວຍໜ້າແລ້ວ." "ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ." - "ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດການພິສູດຢືນຢັນດ້ວຍໃບໜ້າແລ້ວ." + "ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດນຳໃຊ້ການປົດລັອກດ້ວຍໜ້າແລ້ວ." "ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່." - "ທ່ານຍັງບໍ່ໄດ້ຕັ້ງຄ່າການພິສູດຢືນຢັນດ້ວຍໃບໜ້າເທື່ອ" - "ບໍ່ຮອງຮັບການພິສູດຢືນຢັນໃບໜ້າຢູ່ອຸປະກອນນີ້" + "ທ່ານຍັງບໍ່ໄດ້ຕັ້ງການປົດລັອກດ້ວຍໜ້າເທື່ອ." + "ບໍ່ຮອງຮັບການປົດລັອກດ້ວຍໜ້າຢູ່ອຸປະກອນນີ້." "ໃບໜ້າ %d" @@ -1254,10 +1255,10 @@ "ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ" "ເຊື່ອມ​ຕໍ່" "ເຄືອຂ່າຍທັງໝົດ" - "ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ບໍ?" - "ແນະນຳໂດຍ %s" - "ແມ່ນ" - "ບໍ່ແມ່ນ" + "ອະນຸຍາດເຄືອຂ່າຍ Wi‑Fi ທີ່ແນະນຳບໍ?" + "ເຄືອຂ່າຍ %s ທີ່ແນະນຳ. ອຸປະກອນອາດເຊື່ອມຕໍ່ເອງໂດຍອັດຕະໂນມັດ." + "ອະນຸຍາດ" + "ບໍ່, ຂອບໃຈ" "ຈະມີການເປີດໃຊ້ Wi‑Fi ອັດຕະໂນມັດ" "ເມື່ອທ່ານຢູ່ໃກ້ເຄືອຂ່າຍຄຸນນະພາບສູງທີ່ບັນທຶກໄວ້" "ບໍ່ຕ້ອງເປີດໃຊ້ຄືນໃໝ່" @@ -1887,8 +1888,8 @@ "ບໍ່​ມີ​ໝວດ​ໝູ່" "ທ່ານຕັ້ງຄວາມສຳຄັນຂອງການແຈ້ງເຕືອນເຫຼົ່ານີ້." "ຂໍ້ຄວາມນີ້ສຳຄັນເນື່ອງຈາກບຸກຄົນທີ່ກ່ຽວຂ້ອງ." - "ອະນຸຍາດໃຫ້ %1$s ສ້າງຜູ້ໃຊ້ໃໝ່ສຳລັບ %2$s ບໍ?" - "ອະນຸຍາດໃຫ້ %1$s ສ້າງຜູ້ໃຊ້ໃໝ່ສຳລັບ %2$s (ຜູ້ໃຊ້ສຳລັບບັນຊີນີ້ມີຢູ່ແລ້ວ) ບໍ?" + "ອະນຸຍາດໃຫ້ %1$s ສ້າງຜູ້ໃຊ້ໃໝ່ກັບ %2$s ໄດ້ບໍ່ (ມີຜູ້ໃຊ້ທີ່ໃຊ້ບັນຊີນີ້ຢູ່ກ່ອນແລ້ວ) ?" + "ອະນຸຍາດໃຫ້ %1$s ສ້າງຜູ້ໃຊ້ໃໝ່ກັບ %2$s ໄດ້ບໍ?" "ເພີ່ມພາສາ" "ການຕັ້ງຄ່າພາກພື້ນ" "ພິມຊື່ພາສາ" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index e3163cf8bfc871321094dd8f046ab373f567b992..c1b0aa9642cd7b407290c2b5e9fb63f657e91b61 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -97,6 +97,7 @@ "Balso pašto pranešimai" "„Wi-Fi“ skambinimas" "SIM būsena" + "Didelio prioriteto SIM kortelės būsena" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO" @@ -556,11 +557,11 @@ "Piršto antspaudo piktograma" - "tvarkyti veido autentifikavimo aparatinę įrangą" + "tvarkyti Atrakinimo pagal veidą aparatinę įrangą" "Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus." - "naudoti veido autentifikavimo aparatinę įrangą" - "Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti" - "Veido autentifikavimas" + "naudoti Atrakinimo pagal veidą aparatinę įrangą" + "Programai leidžiama naudoti Atrakinimo pagal veidą aparatinę įrangą tapatybei nustatyti" + "Atrakinimas pagal veidą" "Pakartotinis veido registravimas" "Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą" "Neužfiks. tikslūs veido duom. Bandykite dar kartą." @@ -573,7 +574,7 @@ "Pasukite telefoną kairėn." "Pasukite telefoną dešinėn." "Žiūrėkite tiesiai į įrenginį." - "Nematau jūsų veido. Žiūrėkite į telefoną." + "Veidas turi būti prieš telefoną." "Įrenginys per daug judinamas. Nejudink. telefono." "Užregistruokite veidą iš naujo." "Nebegalima atpažinti veido. Bandykite dar kartą." @@ -582,19 +583,19 @@ "Nesukite tiek galvos." "Nesukite tiek galvos." "Patraukite viską, kas užstoja jūsų veidą." - "Nuvalykite jutiklį, esantį ekrano viršuje." + "Išvalykite ekrano viršų, įskaitant juodą juostą" "Nepavyko patv. veido. Aparatinė įranga negalima." - "Bandykite naudoti veido autentifikavimą dar kartą." + "Band. naudoti Atrakinimą pagal veidą dar kartą." "Nepavyko išs. naujų veido duomenų. Pirm. ištrinkite senus." - "Veido atpažinimo operacija atšaukta" - "Veido autentifikavimą atšaukė naudotojas" + "Veido atpažinimo operacija atšaukta." + "Atrakinimą pagal veidą atšaukė naudotojas." "Per daug bandymų. Vėliau bandykite dar kartą." - "Per daug bandymų. Veido autentifikavimas išjungtas." + "Per daug bandymų. Atrakinimas pagal veidą išjungtas." "Nepavyko patvirtinti veido. Bandykite dar kartą." - "Nenustatėte veido autentifikavimo" - "Veido autentifikavimo funkcija šiame įrenginyje nepalaikoma" + "Nenustatėte Atrakinimo pagal veidą." + "Atrakinimas pagal veidą šiame įrenginyje nepalaikomas." "%d veidas" @@ -1298,10 +1299,10 @@ "Palieskite, jei norite matyti visus tinklus" "Prisijungti" "Visi tinklai" - "Prisijungti prie „Wi-Fi“ tinklų?" - "Pasiūlė „%s“" - "Taip" - "Ne" + "Leisti siūlomus „Wi‑Fi“ tinklus?" + "„%s“ siūlomi tinklai. Įrenginys gali prisijungti automatiškai." + "Leisti" + "Ne, ačiū" "„Wi‑Fi“ bus įjungtas automatiškai" "Kai būsite netoli išsaugoto aukštos kokybės tinklo" "Neįjunkite vėl" @@ -1955,8 +1956,8 @@ "Be kategorijos" "Galite nustatyti šių pranešimų svarbą." "Tai svarbu dėl susijusių žmonių." - "Leisti „%1$s“ kurti naują %2$s naudotoją?" - "Leisti „%1$s“ kurti naują %2$s naudotoją (šią paskyrą naudojantis naudotojas jau yra)?" + "Leisti „%1$s“ kurti naują %2$s naudotoją (šią paskyrą naudojantis naudotojas jau yra)?" + "Leisti „%1$s“ kurti naują %2$s naudotoją?" "Pridėkite kalbą" "Regiono nuostata" "Įveskite kalbos pav." diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index e5e9dfc903c1001572fe808d7364e4855d1949b8..457dbbc2784d9bc721e43461d8a9ba4e11e15674 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -96,6 +96,7 @@ "Balss pasta ziņojumi" "Wi-Fi zvani" "SIM kartes statuss" + "Augstas prioritātes SIM kartes statuss" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO" @@ -553,11 +554,11 @@ "Pirksta nospieduma ikona" - "pārvaldīt sejas autentifikācijas aparatūru" + "pārvaldīt aparatūru, kas paredzēta autorizācijai pēc sejas" "Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai." - "izmantot sejas autentifikācijas aparatūru" - "Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai" - "Sejas autentificēšana" + "lietot aparatūru, kas paredzēta autorizācijai pēc sejas" + "Atļauj lietotnei izmantot autentificēšanai aparatūru, ar ko veic autorizāciju pēc sejas" + "Autorizācija pēc sejas" "Atkārtoti reģistrējiet seju" "Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju" "Neizdevās tvert sejas datus. Mēģiniet vēlreiz." @@ -570,7 +571,7 @@ "Pārvietojiet tālruni pa kreisi." "Pārvietojiet tālruni pa labi." "Lūdzu, tiešāk skatieties uz savu ierīci." - "Jūsu seja nav redzama. Paskatieties uz tālruni." + "Novietojiet savu seju tieši pretī tālrunim." "Pārāk daudz kustību. Nekustīgi turiet tālruni." "Lūdzu, atkārtoti reģistrējiet savu seju." "Seju vairs nevar atpazīt. Mēģiniet vēlreiz." @@ -579,19 +580,19 @@ "Pagrieziet galvu nedaudz mazāk." "Pagrieziet galvu nedaudz mazāk." "Noņemiet visu, kas aizsedz jūsu seju." - "Notīriet sensoru ekrāna augšējā malā." + "Notīriet ekrāna augšdaļu, tostarp melno joslu." "Nevar verificēt seju. Aparatūra nav pieejama." - "Vēlreiz veiciet sejas autentificēšanu." + "Vēlreiz mēģiniet veikt autorizāciju pēc sejas." "Nevar saglabāt jaunās sejas datus. Dzēsiet kādu no vecajām." - "Darbība ar sejas datiem atcelta" - "Lietotājs atcēla sejas autentificēšanu" + "Darbība ar sejas datiem atcelta." + "Lietotājs atcēla autorizāciju pēc sejas." "Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz." - "Pārāk daudz mēģinājumu. Sejas autentificēšana ir atspējota." + "Pārāk daudz mēģinājumu. Autorizācija pēc sejas ir atspējota." "Nevar verificēt seju. Mēģiniet vēlreiz." - "Sejas autentifikācija nav iestatīta" - "Sejas autentificēšana šajā ierīcē netiek atbalstīta" + "Autorizācija pēc sejas nav iestatīta." + "Autorizācija pēc sejas šajā ierīcē netiek atbalstīta" "Seja %d" @@ -1276,10 +1277,10 @@ "Pieskarieties, lai skatītu visus tīklus" "Izveidot savienojumu" "Visi tīkli" - "Vai veidot savienojumus ar Wi-Fi tīkliem?" - "Iesaka %s" - "Jā" - "Nē" + "Vai atļaut ieteiktos Wi‑Fi tīklus?" + "Lietotnes %s ieteiktie tīkli. Ierīcē var tikt automātiski izveidots savienojums." + "Atļaut" + "Nē, paldies" "Wi‑Fi tiks automātiski ieslēgts" "Kad atrodaties saglabāta augstas kvalitātes tīkla tuvumā" "Neieslēgt atkārtoti" @@ -1921,8 +1922,8 @@ "Nav kategorijas" "Jūs iestatījāt šo paziņojumu svarīguma līmeni." "Tas ir svarīgi iesaistīto personu dēļ." - "Vai atļaut lietotnei %1$s izveidot jaunu lietotāju, izmantojot e-pasta adresi %2$s?" - "Vai atļaut lietotnei %1$s izveidot jaunu lietotāju, izmantojot e-pasta adresi %2$s (lietotājs ar šādu kontu jau pastāv)?" + "Vai atļaut lietotnei %1$s izveidot jaunu lietotāju, izmantojot e-pasta adresi %2$s (lietotājs ar šādu kontu jau pastāv)?" + "Vai atļaut lietotnei %1$s izveidot jaunu lietotāju, izmantojot e-pasta adresi %2$s?" "Pievienot valodu" "Reģiona preference" "Ierakstiet valodas nosaukumu" diff --git a/core/res/res/values-mcc313-mnc100/config.xml b/core/res/res/values-mcc313-mnc100/config.xml new file mode 100644 index 0000000000000000000000000000000000000000..ccd03f10616ae2c46984a2a020d4ccd231f6caa0 --- /dev/null +++ b/core/res/res/values-mcc313-mnc100/config.xml @@ -0,0 +1,45 @@ + + + + + + "0" + "00" + "*0" + "*1" + "*2" + "*3" + "*4" + "*5" + "*6" + "*7" + "*8" + "*9" + "#0" + "#1" + "#2" + "#3" + "#4" + "#5" + "#6" + "#7" + "#8" + "#9" + + diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 8bac7f612abe4c1ecce9e5040e7370e9d169ae12..d41ce25f3a41f32d933459ca972ded1f8aa47202 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -71,10 +71,10 @@ "Одбивање несакани вознемирувачки повици" "Испорака на повикувачки број" "Не вознемирувај" - "Стандардно, повикувачот со овој ID е ограничен. Следен повик: ограничен" - "Стандардно, повикувачот со овој ID е ограничен. Следен повик: не е ограничен" - "Стандардно, повикувачот со овој ID не е ограничен. Следен повик: ограничен" - "Стандардно, повикувачот со овој ID не е ограничен. Следен повик: не е ограничен" + "Стандардно, ID на повикувач е скриен. Следен повик: скриен" + "Стандардно, ID на повикувач е скриен. Следен повик: не е скриен" + "Стандардно, ID на повикувач не е скриен. Следен повик: скриен" + "Стандардно, ID на повикувач не е скриен. Следен повик: не е скриен" "Услугата не е предвидена." "Не може да го промените поставувањето за ID на повикувач." "Нема услуга за мобилен интернет" @@ -95,6 +95,7 @@ "Пораки од говорна пошта" "Повикување преку Wi-Fi" "Статус на SIM-картичка" + "Статус на SIM-известувања со висок приоритет" "Рамноправен уред го побара режимот на TTY „FULL“" "Рамноправен уред го побара режимот на TTY „HCO“" "Рамноправен уред го побара режимот на TTY „VCO“" @@ -242,7 +243,7 @@ "Тивок режим" "Звукот е исклучен" "Звукот е вклучен" - "Режим на работа во авион" + "Авионски режим" "Режимот на работа во авион е вклучен" "Режимот на работа во авион е исклучен" "Поставки" @@ -550,11 +551,11 @@ "Икона за отпечатоци" - "управува со хардвер за проверка на лице" + "управува со хардвер за „Отклучување со лик“" "Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење." - "користи хардвер за проверка на лице" - "Дозволува апликацијата да користи хардвер за лице за проверка" - "Проверка на лик" + "користи хардвер за „Отклучување со лик“" + "Дозволува апликацијата да користи хардвер за „Отклучување со лик“ за проверка" + "Отклучување со лик" "Повторно регистрирајте го ликот" "За да се подобри препознавањето, повторно регистрирајте го ликот" "Не се сними прецизна слика. Обидете се повторно." @@ -567,7 +568,7 @@ "Поместете го телефонот налево." "Поместете го телефонот надесно." "Погледнете подиректно во уредот." - "Не ви се гледа ликот. Гледајте во телефонот." + "Наместете го лицето директно пред телефонот." "Премногу движење. Држете го телефонот стабилно." "Повторно регистрирајте го лицето." "Ликот не се препознава. Обидете се повторно." @@ -576,19 +577,19 @@ "Не вртете ја главата толку многу." "Не вртете ја главата толку многу." "Отстранете ги работите што ви го покриваат лицето." - "Исчистете го сензорот на горниот врв од екранот." + "Исчистете го врвот на екранот, вклучувајќи ја црната лента" "Ликот не може да се потврди. Хардвер - недостапен." - "Пробајте ја проверката на лице повторно." + "Пробајте „Отклучување со лик“ повторно." "Не се зачуваа податоците за нов лик. Избришете го стариот." - "Операцијата со лик се откажа" - "Проверката на ликот е откажана од корисникот" + "Операцијата со лице се откажа." + "„Отклучувањето со лик“ е откажано од корисникот." "Премногу обиди. Обидете се повторно подоцна." - "Премногу обиди. Проверката на лик е оневозможена." + "Премногу обиди. „Отклучувањето со лик“ е оневозможено." "Ликот не може да се потврди. Обидете се повторно." - "Не сте поставиле проверка на лик" - "Проверката на лик не е поддржана на уредов" + "Не сте поставиле „Отклучување со лик“." + "„Отклучувањето со лик“ не е поддржано на уредов." "Лице %d" @@ -1254,10 +1255,10 @@ "Допрете за да ги видите сите мрежи" "Поврзете се" "Сите мрежи" - "Да се поврзе со Wi-Fi мрежи?" - "Предложено од %s" - "Да" - "Не" + "Да се дозволат предложените Wi‑Fi мрежи?" + "Предложени мрежи од %s. Уредот може да се поврзе автоматски." + "Дозволи" + "Не, фала" "Wi‑Fi ќе се вклучи автоматски" "Кога сте во близина на зачувана мрежа со висок квалитет" "Не вклучувај повторно" @@ -1355,7 +1356,7 @@ "Откриен е аналоген аудиододаток" "Приложениот уред не е компатибилен со телефонов. Допрете за да дознаете повеќе." "Поврзано е отстранување грешки преку USB" - "Допрете за да го исклучите отстранувањето грешки преку USB" + "Допрете за да го исклучите" "Изберете за да се оневозможи отстранување грешки на USB." "Овозможен е режимот на рамка за тестирање" "Извршете фабричко ресетирање за да го оневозможите режимот на рамка за тестирање." @@ -1890,8 +1891,8 @@ "Некатегоризирано" "Ја поставивте важноста на известувањава." "Ова е важно заради луѓето кои се вклучени." - "Дозволувате ли %1$s да создаде нов корисник со %2$s?" - "Дозволувате ли %1$s да создаде нов корисник со %2$s (веќе постои корисник со оваа сметка)?" + "Дозволувате %1$s да создаде нов корисник со %2$s? (Веќе постои корисник со оваа сметка.)" + "Дозволувате %1$s да создаде нов корисник со %2$s?" "Додај јазик" "Претпочитувања за регион" "Внеси име на јазик" diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index cf49ab2134dfcfaa1c1b3fbd22ae148d0dad69c0..7dc0ec388212c3e66e0ad59c20f4ba2bfb420efe 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -95,6 +95,7 @@ "വോയ്‌സ്‌മെയിൽ സന്ദേശങ്ങൾ" "വൈഫൈ കോളിംഗ്" "സിം നില" + "ഉയർന്ന മുൻഗണനയുള്ള സിം നില" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO" @@ -550,11 +551,11 @@ "വിരലടയാള ഐക്കൺ" - "മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ മാനേജ് ചെയ്യുക" + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ മാനേജ് ചെയ്യുക" "ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു." - "മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക" - "പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു" - "മുഖം പരിശോധിച്ചുറപ്പിക്കൽ" + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ ഉപയോഗിക്കുക" + "പരിശോധിച്ചുറപ്പിക്കാൻ മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്‌വെയർ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നു" + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്" "നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ" "തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ" "കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ." @@ -567,7 +568,7 @@ "ഫോൺ ഇടത്തോട്ട് നീക്കുക." "ഫോൺ വലത്തോട്ട് നീക്കുക." "നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക." - "നിങ്ങളുടെ മുഖം കാണാനാവുന്നില്ല. ഫോണിലേക്ക് നോക്കൂ." + "നിങ്ങളുടെ മുഖം ക്യാമറയ്‌ക്ക് നേരെയാക്കുക." "വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക." "നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക." "ഇനി മുഖം തിരിച്ചറിയാനാവില്ല. വീണ്ടും ശ്രമിക്കൂ." @@ -576,19 +577,19 @@ "നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട." "നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട." "നിങ്ങളുടെ മുഖം മറയ്‌ക്കുന്നത് എല്ലാം നീക്കം ചെയ്യൂ." - "സ്‌ക്രീനിന്റെ മുകളിലെ സെൻസർ വൃത്തിയാക്കുക." + "കറുപ്പ് ബാർ ഉൾപ്പെടെ നിങ്ങളുടെ സ്ക്രീനിന്റെ മുകൾഭാഗം വൃത്തിയാക്കുക" "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്‌വെയർ ലഭ്യമല്ല." - "മുഖം പരിശോധിച്ചുറപ്പിക്കാൻ വീണ്ടും ശ്രമിക്കുക." + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് വീണ്ടും പരീക്ഷിക്കൂ" "പുതിയ മുഖ ഡാറ്റ സംഭരിക്കാനാകില്ല. ആദ്യം പഴയത് ഇല്ലാതാക്കുക." - "മുഖം തിരിച്ചറിയൽ പ്രവർത്തനം റദ്ദാക്കി" - "മുഖം പരിശോധിച്ചുറപ്പിക്കൽ ഉപയോക്താവ് റദ്ദാക്കി" + "മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി." + "ഉപയോക്താവ് മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് റദ്ദാക്കി" "നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക." - "വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി." + "വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് പ്രവർത്തനരഹിതമാക്കി" "മുഖം പരിശോധിക്കാൻ കഴിയില്ല. വീണ്ടും ശ്രമിക്കൂ." - "നിങ്ങൾ മുഖം പരിശോധിച്ചുറപ്പിക്കൽ സജ്ജീകരിച്ചില്ല" - "ഈ ഉപകരണം മുഖം പരിശോധിച്ചുറപ്പിക്കൽ പിന്തുണയ്ക്കുന്നില്ല" + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് സജ്ജീകരിച്ചില്ല." + "മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല." "മുഖം %d" @@ -1254,10 +1255,10 @@ "എല്ലാ നെറ്റ്‌വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക" "കണക്റ്റുചെയ്യുക" "എല്ലാ നെറ്റ്‌വർക്കുകളും" - "വൈഫൈ നെറ്റ്‌വർക്കുകളിലേക്ക് കണക്റ്റ് ചെയ്യണോ?" - "%s നിർദ്ദേശിച്ചത്" - "ഉവ്വ്" - "ഇല്ല" + "നിർദ്ദേശിച്ച വെെഫെെ നെറ്റ്‌വർക്കുകൾ അനുവദിക്കണോ?" + "%s നിർദ്ദേശിച്ച നെറ്റ്‌വർക്കുകൾ. ഉപകരണം സ്വയമേവ കണക്‌റ്റ് ചെയ്‌തേക്കാം." + "അനുവദിക്കുക" + "വേണ്ട" "വൈഫൈ സ്വമേധയാ ഓണാകും" "നിങ്ങൾ ഉയർന്ന നിലവാരമുള്ള സംരക്ഷിക്കപ്പെട്ട നെറ്റ്‌വർക്കിനരികിലെത്തുമ്പോൾ" "തിരികെ ഓണാക്കരുത്" @@ -1888,8 +1889,8 @@ "വർഗ്ഗീകരിച്ചിട്ടില്ലാത്ത" "ഈ അറിയിപ്പുകളുടെ പ്രാധാന്യം നിങ്ങൾ സജ്ജീകരിച്ചു." "ഉൾപ്പെട്ടിട്ടുള്ള ആളുകളെ കണക്കിലെടുക്കുമ്പോള്‍ ഇത് പ്രധാനപ്പെട്ടതാണ്‌." - "%2$s എന്ന അക്കൗണ്ട് ഉപയോഗിച്ച് പുതിയൊരു ഉപയോക്താവിനെ സൃഷ്ടിക്കാൻ %1$s എന്ന ആപ്പിനെ അനുവദിക്കണോ?" - "%2$s എന്ന അക്കൗണ്ട് (ഈ അക്കൗണ്ട് ഉപയോഗിച്ചുള്ള ഒരു ഉപയോക്താവ് ഇതിനകം തന്നെ നിലവിലുണ്ട്) ഉപയോഗിച്ച് പുതിയൊരു ഉപയോക്താവിനെ സൃഷ്ടിക്കാൻ %1$s എന്ന ആപ്പിനെ അനുവദിക്കണോ?" + "%2$s എന്ന അക്കൗണ്ട് (ഈ അക്കൗണ്ട് ഉപയോഗിക്കുന്ന ഒരു ഉപയോക്താവ് നിലവിലുണ്ട്) ഉപയോഗിച്ച് പുതിയ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാൻ %1$s എന്നതിനെ അനുവദിക്കണോ?" + "%2$s എന്ന അക്കൗണ്ട് ഉപയോഗിച്ച് പുതിയ ഉപയോക്താവിനെ സൃഷ്‌ടിക്കാൻ %1$s എന്നതിനെ അനുവദിക്കണോ?" "ഒരു ഭാഷ ചേർക്കുക" "മേഖലാ മുൻഗണന" "ഭാഷയുടെ പേര് ടൈപ്പുചെയ്യുക" diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index c8cea4956bc808acc93a7253b0d55bad4ecf644f..4a2cf6314126170028ae33889082dfc1b8ba5d2d 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -95,6 +95,7 @@ "Дуут шуудангийн мессеж" "Wi-Fi дуудлага" "SIM статус" + "Өндөр ач холбогдолтой SIM-н статус" "Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL" "Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO" "Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO" @@ -550,11 +551,11 @@ "Хурууны хээний дүрс" - "царай танилтын техник хангамжийг удирдах" + "царайгаар тайлах техник хангамжийг удирдах" "Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг." - "царай танилтын техник хангамжийг ашиглах" - "Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг" - "Царайн нотолгоо" + "царайгаар тайлах техник хангамж ашиглах" + "Аппад царайгаар тайлах техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг" + "Царайгаар тайлах" "Царайгаа дахин бүртгүүлнэ үү" "Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү" "Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу." @@ -567,7 +568,7 @@ "Утсаа зүүн тийш болгоно уу." "Утсаа баруун тийш болгоно уу." "Төхөөрөмж рүүгээ аль болох эгц харна уу." - "Таны царайг харахгүй байна. Утас руу харна уу." + "Царайгаа утасны урд эгц байрлуулна уу" "Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу." "Нүүрээ дахин бүртгүүлнэ үү." "Царайг таних боломжгүй боллоо. Дахин оролдоно уу." @@ -576,19 +577,19 @@ "Толгойгоо арай багаар эргүүлнэ үү." "Толгойгоо арай багаар эргүүлнэ үү." "Таны нүүрийг далдалж буй аливаа зүйлийг хасна уу." - "Дэлгэцийн дээд ирмэгт байрлах мэдрэгчийг цэвэрлэнэ үү." + "Хар хэсэг зэрэг дэлгэцийнхээ дээд хэсгийг цэвэрлэнэ үү" "Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна." - "Царайн нотолгоог дахин оролдоно уу." + "Царайгаар тайлахыг дахин оролдоно уу." "Царайн шинэ өгөгдлийг хадгалж чадсангүй. Эхлээд хуучин өгөгдлийг устгана уу." - "Царайн үйл ажиллагааг цуцаллаа" - "Хэрэглэгч царайн нотолгоог цуцалсан байна" + "Царайны үйл ажиллагааг цуцаллаа." + "Хэрэглэгч царайгаар тайлахыг цуцалсан." "Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу." - "Хэт олон удаа оролдлоо. Царайн нотолгоог идэвхгүй болголоо." + "Хэтэрхий олон удаа оролдлоо. Царайгаар тайлахыг идэвхгүй болголоо." "Царайг бататгаж чадсангүй. Дахин оролдоно уу." - "Та царайн нотолгоог тохируулаагүй байна" - "Царайн нотолгоог энэ төхөөрөмж дээр дэмждэггүй" + "Та царайгаар тайлахыг тохируулаагүй байна." + "Царайгаар тайлахыг энэ төхөөрөмж дээр дэмждэггүй." "Царай %d" @@ -1254,10 +1255,10 @@ "Бүх сүлжээг харахын тулд товшино уу" "Холбогдох" "Бүх сүлжээ" - "Wi-Fi сүлжээнд холбогдох уу?" - "%s санал болгосон" - "Тийм" - "Үгүй" + "Санал болгосон Wi‑Fi сүлжээг зөвшөөрөх үү?" + "%s сүлжээ санал болголоо. Төхөөрөмж автоматаар холбогдож магадгүй." + "Зөвшөөрөх" + "Үгүй, баярлалаа" "Wi‑Fi автоматаар асна" "Таныг хадгалсан, өндөр чанартай сүлжээний ойролцоо байх үед" "Буцааж асаахгүй" @@ -1887,8 +1888,8 @@ "Ангилаагүй" "Та эдгээр мэдэгдлийн ач холбогдлыг тогтоосон." "Оролцсон хүмүүсээс шалтгаалан энэ нь өндөр ач холбогдолтой." - "%1$s%2$s-р шинэ Хэрэглэгч үүсгэхийг зөвшөөрөх үү?" - "%1$s%2$s-р шинэ хэрэглэгч үүсгэхийг зөвшөөрөх үү (ийм бүртгэлтэй хэрэглэгч аль хэдийн байна) ?" + "%1$s%2$s-тай (ийм бүртгэлтэй хэрэглэгч аль хэдийн байна) шинэ хэрэглэгч үүсгэхийг зөвшөөрөх үү ?" + "%1$s%2$s-тай шинэ хэрэглэгч үүсгэхийг зөвшөөрөх үү?" "Хэл нэмэх" "Бүс нутгийн тохиргоо" "Улсын хэлийг бичнэ үү" diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index b50cc567f470a09a42d6bba1698a9429f44cf791..495f5ffb1304220365bbb6baba5eb85150b34e28 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -95,6 +95,7 @@ "व्हॉइसमेल मेसेज" "वाय-फाय कॉलिंग" "सिम स्थिती" + "उच्च प्राधान्य सिम स्थिती" "समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली" @@ -301,8 +302,8 @@ "शारीरिक अ‍ॅक्टिव्हिटी अ‍ॅक्सेस करा" "<b>%1$s</b> ला तुमची शारीरिक अ‍ॅक्टिव्हिटी अ‍ॅक्सेस करण्याची अनुमती द्यायची का?" "कॅमेरा" - "चित्रे घेण्याची आणि व्हिडिओ रेकॉर्ड" - "<b>%1$s</b> ला फोटो घेऊ आणि व्हिडिओ रेकॉर्ड करू द्यायचे?" + "चित्रे काढण्याची आणि व्हिडिओ रेकॉर्ड करण्याची" + "<b>%1$s</b> ला फोटो काढू आणि व्हिडिओ रेकॉर्ड करू द्यायचे?" "कॉल लॉग" "फोन कॉल लॉग वाचा आणि लिहा" "<b>%1$s</b> ला तुमचे फोन कॉल लॉग अ‍ॅक्सेस करण्याची अनुमती द्यायची का?" @@ -550,11 +551,11 @@ "फिंगरप्रिंट आयकन" - "चेहरा ऑथेंटिकेशन हार्डवेअर व्यवस्थापित करा" + "फेस अनलॉक हार्डवेअर व्यवस्थापित करा" "अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते." - "चेहरा ऑथेंटिकेशन हार्डवेअर वापरा" - "अॅपला चेहरा ऑथेंटिकेशनसाठी ऑथेंटिकेशन हार्डवेअर वापरू देते" - "फेस ऑथेंटिकेशन" + "फेस अनलॉक हार्डवेअर वापरा" + "अ‍ॅपला ऑथेंटिकेशनसाठी फेस अनलॉक हार्डवेअर वापरण्याची अनुमती देते" + "फेस अनलॉक" "तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा" "अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा." @@ -567,7 +568,7 @@ "फोन डावीकडे हलवा." "फोन उजवीकडे हलवा." "कृपया तुमच्या डिव्हाइसकडे थेट पाहा" - "तुमचा चेहरा दिसत नाही. फोनकडे पहा." + "तुमचा चेहरा थेट फोन समोर आणा." "खूप हलत आहे. फोन स्थिर धरून ठेवा." "कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा." "चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा." @@ -576,19 +577,19 @@ "तुमचे डोके थोडे कमी फिरवा." "तुमचे डोके थोडे कमी फिरवा." "तुमचा चहेरा लपवणारे काहीही काढून टाका." - "स्क्रीनच्या वरील उजव्या कडेवरील सेन्सर साफ करा." + "ब्लॅक बार सह तुमच्या स्क्रीनची वरची बाजू साफ करा" "चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही." - "चेहरा ऑथेंटिकेशनचा पुन्हा प्रयत्न करा" + "फेस अनलॉकचा पुन्हा प्रयत्न करा." "नवीन फेस डेटा स्टोअर करू शकत नाही. आधी जुना हटवा." - "फेस ऑपरेशन रद्द केले आहे" - "वापरकर्त्याने फेस ऑथेंटिकेशन रद्द केले आहे" + "चेहरा ऑपरेशन रद्द केले गेले." + "वापरकर्त्याने फेस अनलॉक रद्द केले आहे." "खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा." - "बरेच प्रयत्न. फेस ऑथेंटिकेशन बंद केले आहे." + "बरेच प्रयत्न. फेस अनलॉक बंद केले आहे." "चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा." - "तुम्ही फेस ऑथेंटिकेशन सेट केले नाही" - "या डिव्हाइसवर फेस ऑथेंटिकेशन ला सपोर्ट होत नाही" + "तुम्ही फेस अनलॉक सेट केले नाही." + "या डिव्हाइसवर फेस अनलॉकला सपोर्ट नाही." "चेहरा %d" @@ -1254,10 +1255,10 @@ "सर्व नेटवर्क पाहण्यासाठी टॅप करा" "कनेक्ट करा" "सर्व नेटवर्क" - "वाय-फाय नेटवर्कशी कनेक्ट करायचे?" - "%s ने सुचवले" - "होय" - "नाही" + "सुचवलेल्या वाय-फाय नेटवर्कना अनुमती द्यायची का?" + "%s सुचवलेली नेटवर्क. डिव्हाइस आपोआप कनेक्ट होऊ शकते." + "अनुमती द्या" + "नाही, नको" "वाय-फाय आपोआप चालू होईल" "तुम्ही जेव्हा सेव्ह केलेल्या उच्च दर्जाच्या नेटवर्कजवळ असाल तेव्हा" "पुन्हा चालू करू नका" @@ -1354,7 +1355,7 @@ "चार्जर लावलेले डिव्हाइस. आणखी पर्यायांसाठी टॅप करा" "अॅनालॉग ऑडिओ अॅक्‍सेसरी आढळली" "या फोनसह संलग्‍न केलेले डीव्‍हाइस सुसंगत नाही. अधिक जाणून घेण्‍यासाठी टॅप करा." - "USB डीबग करणे कनेक्‍ट केले" + "USB डीबगिंग कनेक्‍ट केले" "USB डीबगिंग बंद करण्यासाठी टॅप करा" "USB डीबगिंग बंद करण्यासाठी निवडा." "टेस्ट हार्नेस मोड सुरू केला आहे" @@ -1670,7 +1671,7 @@ "प्रवेशयोग्यता शॉर्टकटने %1$s बंद केली" "%1$s वापरण्यासाठी दोन्ही व्हॉल्युम की तीन सेकंद दाबा आणि धरून ठेवा" "तुम्ही अ‍ॅक्सेसिबिलिटी बटण दाबल्यावर वापरण्यासाठी वैशिष्ट्य निवडा:" - "अ‍ॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने दोन बोटांनी स्वाइप करा):" + "अ‍ॅक्सेसिबिलिटी जेश्चर ज्यासोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने दोन बोटांनी स्वाइप करा):" "अ‍ॅक्सेसिबिलिटी जेश्चर ज्या सोबत वापराचे आहे अशी सेवा निवडा (स्क्रीनच्या खालच्या बाजूने तीन बोटांनी स्वाइप करा):" "सेवांदरम्यान स्विच करण्यासाठी, अ‍ॅक्सेसिबिलिटी बटणाला स्पर्श करा आणि धरून ठेवा." "सेवांदरम्यान स्विच करण्यासाठी, दोन बोटांनी वरच्या दिशेला स्वाइप करा आणि धरून ठेवा." @@ -1888,8 +1889,8 @@ "वर्गीकरण न केलेले" "तुम्ही या सूचनांचे महत्त्व सेट केले." "सामील असलेल्या लोकांमुळे हे महत्वाचे आहे." - "%2$s सह नवीन वापरकर्ता तयार करण्याची %1$s ला अनुमती द्यायची?" - "%2$s सह नवीन वापरकर्ता तयार करण्याची (हे खाते असलेला वापरकर्ता आधीपासून विद्यमान आहे) %1$s ला अनुमती द्यायची?" + "%2$s सह नवीन वापरकर्ता तयार करण्याची (हे खाते असलेला वापरकर्ता आधीपासून अस्तित्वात आहे) %1$s ला अनुमती द्यायची आहे का?" + "%2$s सह नवीन वापरकर्ता तयार करण्याची %1$s ला अनुमती द्यायची आहे का?" "एक भाषा जोडा" "प्रदेश प्राधान्य" "भाषा नाव टाइप करा" diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 7c19f44b4aea5cbebb974236885a0851814241a6..cfbe2ab7550527cdcda2ff93539c9fc9ac58b265 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -95,6 +95,7 @@ "Mesej mel suara" "Panggilan Wi-Fi" "Status SIM" + "Status SIM keutamaan tinggi" "Rakan meminta Mod TTY PENUH" "Rakan meminta Mod TTY HCO" "Rakan meminta Mod TTY VCO" @@ -550,11 +551,11 @@ "Ikon cap jari" - "urus perkakasan pengesahan wajah" + "urus perkakasan wajah buka kunci" "Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan." - "gunakan perkakasan pengesahan wajah" - "Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan" - "Pengesahan Wajah" + "gunakan perkakasan wajah buka kunci" + "Membenarkan apl menggunakan perkakasan wajah buka kunci untuk pengesahan" + "Wajah buka kunci" "Daftarkan semula wajah anda" "Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda" "Gagal menangkap data wajah dgn tepat. Cuba lagi." @@ -567,7 +568,7 @@ "Alihkan telefon ke kiri." "Alihkan telefon ke kanan." "Sila lihat terus pada peranti anda." - "Gagal mengesan wajah anda. Lihat telefon." + "Letakkan wajah anda betul-betul di depan telefon." "Terlalu bnyk gerakan. Pegang telefon dgn stabil." "Sila daftarkan semula wajah anda." "Tidak lagi dapat mengecam wajah. Cuba lagi." @@ -576,19 +577,19 @@ "Pusingkan kepala anda kurang sedikit." "Pusingkan kepala anda kurang sedikit." "Alih keluar apa saja yang melindungi wajah anda." - "Bersihkan penderia di tepi bahagian atas skrin." + "Bersihkan bahagian atas skrin anda, termasuk bar hitam" "Tdk dpt sahkan wajah. Perkakasan tidak tersedia." - "Cuba pengesahan wajah sekali lagi." + "Cuba wajah buka kunci sekali lagi." "Tdk dpt menyimpan data wajah baharu. Padamkan yg lama dahulu." - "Pengendalian wajah dibatalkan" - "Pengesahan wajah dibatalkan oleh pengguna" + "Pengendalian wajah dibatalkan." + "Wajah buka kunci dibatalkan oleh pengguna." "Terlalu banyak percubaan. Cuba sebentar lagi." - "Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan." + "Terlalu banyak percubaan. Wajah buka kunci dilumpuhkan." "Tidak dapat mengesahkan wajah. Cuba lagi." - "Anda belum menyediakan pengesahan wajah" - "Pengesahan wajah tidak disokong pada peranti ini" + "Anda belum menyediakan wajah buka kunci." + "Wajah buka kunci tidak disokong pada peranti ini." "Wajah %d" @@ -1254,10 +1255,10 @@ "Ketik untuk melihat semua rangkaian" "Sambung" "Semua rangkaian" - "Sambung ke rangkaian Wi-Fi?" - "Dicadangkan oleh %s" - "Ya" - "Tidak" + "Benarkan rangkaian Wi-Fi yang dicadangkan?" + "Rangkaian yang dicadangkan oleh %s. Peranti mungkin disambungkan secara automatik." + "Benarkan" + "Tidak perlu" "Wi‑Fi akan dihidupkan secara automatik" "Apabila anda berada berdekatan dengan rangkaian disimpan yang berkualiti tinggi" "Jangan hidupkan kembali" @@ -1887,8 +1888,8 @@ "Tidak dikategorikan" "Anda menetapkan kepentingan pemberitahuan ini." "Mesej ini penting disebabkan orang yang terlibat." - "Benarkan %1$s membuat Pengguna baharu dengan %2$s?" - "Benarkan %1$s membuat Pengguna baharu dengan %2$s (Pengguna dengan akaun ini sudah wujud)?" + "Benarkan %1$s membuat Pengguna baharu dengan %2$s (Pengguna dengan akaun ini sudah wujud) ?" + "Benarkan %1$s membuat Pengguna baharu dengan %2$s?" "Tambahkan bahasa" "Pilihan wilayah" "Taipkan nama bahasa" diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index d590e2538e3437af8f33be6d3b7f486aa3f577e4..951108a8414ff894a4ff21c527f5bbd362c1cbe1 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -95,6 +95,7 @@ "အသံမေးလ် မက်ဆေ့ဂျ်များ" "Wi-Fi ခေါ်ဆိုမှု" "ဆင်းမ်ကဒ် အခြေအနေ" + "အထူးဦးစားပေး ဆင်းမ်ကတ်အခြေအနေ" "အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏" "အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏" "TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏" @@ -550,11 +551,11 @@ "လက်ဗွေ အိုင်ကွန်" - "မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို စီမံပါ" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို စီမံခြင်း" "အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။" - "မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ" - "အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်" - "မျက်နှာ စိစစ်ခြင်း" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို သုံးပါ" + "အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာမှတ်သော့ဖွင့်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်း" "သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ" "ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ" "မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။" @@ -567,7 +568,7 @@ "ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။" "ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။" "သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။" - "သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကိုကြည့်ပါ။" + "မျက်နှာကို ဖုန်းရှေ့တွင် တည့်အောင်ထားပါ။" "လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။" "သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။" "မျက်နှာ မမှတ်သားနိုင်တော့ပါ။ ထပ်စမ်းကြည့်ပါ။" @@ -576,19 +577,19 @@ "ခေါင်းကို သိပ်မလှည့်ပါနှင့်။" "ခေါင်းကို သိပ်မလှည့်ပါနှင့်။" "သင့်မျက်နှာကို ကွယ်နေသည့်အရာအားလုံး ဖယ်ပါ။" - "မျက်နှာပြင်ထိပ်ရှိ အာရုံခံဆင်ဆာကို သန့်ရှင်းပါ။" + "အနက်ရောင်ဘားအပါအဝင် ဖန်သားပြင်ထိပ်ကို သန့်ရှင်းရေး လုပ်ပါ" "မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။" - "မျက်နှာဖြင့် ထပ်မံ၍ အထောက်အထား စိစစ်ကြည့်ပါ။" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထပ်စမ်းကြည့်ပါ။" "မျက်နှာဒေတာအသစ် သိမ်း၍မရပါ။ အဟောင်းကို အရင်ဖျက်ပါ။" - "မျက်နှာဆိုင်ရာ ဆောင်ရွက်မှုကို ပယ်ဖျက်လိုက်ပါပြီ" - "အသုံးပြုသူက မျက်နှာအထောက်အထားစိစစ်မှု မလုပ်တော့ပါ" + "မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။" + "မှတ်နှာမှတ် သော့ဖွင့်ခြင်းကို အသုံးပြုသူက မလုပ်တော့ပါ။" "အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။" - "စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာစိစစ်ခြင်း ပိတ်လိုက်သည်။" + "စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ပိတ်လိုက်ပါပြီ။" "မျက်နှာကို အတည်ပြု၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။" - "မျက်နှာ အထောက်အထားစိစစ်ခြင်းကို ထည့်သွင်းမထားပါ" - "ဤစက်ပစ္စည်းတွင် မျက်နှာအထောက်အထား စိစစ်ခြင်းကို သုံး၍မရပါ" + "မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထည့်သွင်းမထားပါ" + "ဤစက်ပစ္စည်းတွင် မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို သုံး၍မရပါ။" "မျက်နှာ %d" @@ -1254,10 +1255,10 @@ "ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ" "ချိတ်ဆက်ရန်" "ကွန်ရက်အားလုံး" - "Wi‑Fi ကွန်ရက်များသို့ ချိတ်ဆက်လိုပါသလား။" - "%s က အကြံပြုထားသည်" - "Yes" - "No" + "အကြံပြုထားသည့် Wi‑Fi ကွန်ရက်များ ခွင့်ပြုမလား။" + "%s သည် ကွန်ရက်များကို အကြံပြုထားသည်။ စက်သည် အလိုအလျောက် ချိတ်ဆက်နိုင်သည်။" + "ခွင့်ပြုရန်" + "မလိုပါ" "Wi‑Fi ကို အလိုအလျောက်​ ပြန်ဖွင့်ပေးလိမ့်ပါမည်" "သိမ်းဆည်းထားသည့် အရည်အသွေးမြင့်ကွန်ရက်များအနီးသို့ ရောက်ရှိသည့်အခါ" "ပြန်မဖွင့်ပါနှင့်" @@ -1343,7 +1344,7 @@ "ခွင့်ပြုချက်မလိုအပ်ပါ" "သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်" "OK" - "ဤစက်ပစ္စည်းကို USB မှတစ်ဆင့် အားသွင်းနေသည်" + "ဤစက်ကို USB ဖြင့် အားသွင်းနေသည်" "USB မှတစ်ဆင့် ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်" "USB ဖြင့် ဖိုင်လွှဲပြောင်းခြင်းကို ဖွင့်ထားသည်" "USB မှတစ်ဆင့် PTP ကို အသုံးပြုရန် ဖွင့်ထားသည်" @@ -1888,8 +1889,8 @@ "အမျိုးအစားမခွဲရသေးပါ" "ဤသတိပေးချက်များ၏ အရေးပါမှုကိုသတ်မှတ်ပြီးပါပြီ။" "ပါဝင်သည့်လူများကြောင့် အရေးပါပါသည်။" - "%1$s ကို %2$s ဖြင့်အသုံးပြုသူအသစ်ဖန်တီးခွင့်ပြုမလား။" - "%1$s ကို %2$s ဖြင့်အသုံးပြုသူအသစ် ဖန်တီးခွင့်ပြုမလား (ဤအကောင့်ဖြင့် အသုံးပြုသူ ရှိနှင့်ပြီးဖြစ်သည်)။" + "%2$s ဖြင့်အသုံးပြုသူအသစ်ကို %1$s အား ဖန်တီးခွင့်ပြုလိုပါသလား (ဤအကောင့်ဖြင့် အသုံးပြုသူ ရှိနှင့်ပြီးဖြစ်သည်) ။" + "%2$s ဖြင့်အသုံးပြုသူအသစ်ကို %1$s အား ဖန်တီးခွင့်ပြုလိုပါသလား ။" "ဘာသာစကားတစ်ခု ထည့်ပါ" "ဒေသရွေးချယ်မှု" "ဘာသာစကားအမည် ထည့်ပါ" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 42139422529ced7624b6cc0a344f02e6c526be1e..f6f7bf4e3bdc121872e3e9acc9059f91039325a0 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -95,6 +95,7 @@ "Talepostmeldinger" "Wi-Fi-anrop" "SIM-status" + "SIM-status er satt til høy prioritet" "Motpart ba om TTY-modus FULL" "Motpart ba om TTY-modus HCO" "Motpart ba om TTY-modus VCO" @@ -225,7 +226,7 @@ "Telefoninnstillinger" "Lås skjermen" "Slå av" - "Nødsituasjon" + "Nødssituasjon" "Feilrapport" "Avslutt økten" "Skjermdump" @@ -290,7 +291,7 @@ "Vil du gi <b>%1$s</b> tilgang til kalenderen din?" "SMS" "sende og lese SMS-meldinger" - "Vil du la <b>%1$s</b> sende og se SMS-meldinger?" + "Vil du la <b>%1$s</b> sende og se tekstmeldinger?" "Lagring" "åpne bilder, medieinnhold og filer på enheten din" "Vil du gi <b>%1$s</b> tilgang til bilder, medier og filer på enheten din?" @@ -550,11 +551,11 @@ "Ikon for fingeravtrykk" - "administrere maskinvare for ansiktsautentisering" + "administrere maskinvare for Ansiktslås" "Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk." - "bruke maskinvare for ansiktsautentisering" - "Lar appen bruke maskinvare for ansiktsautentisering til autentisering" - "Ansiktsautentisering" + "bruke maskinvare for Ansiktslås" + "Lar appen bruke maskinvare for Ansiktslås til autentisering" + "Ansiktslås" "Registrer ansiktet ditt på nytt" "For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt" "Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen" @@ -567,7 +568,7 @@ "Flytt telefonen til venstre." "Flytt telefonen til høyre." "Se mer direkte på enheten din." - "Kan ikke se ansiktet ditt. Se på telefonen." + "Hold ansiktet ditt rett foran telefonen." "For mye bevegelse. Hold telefonen stødig." "Registrer ansiktet ditt på nytt." "Kan ikke gjenkjenne ansiktet lenger. Prøv igjen." @@ -576,19 +577,19 @@ "Vri hodet ditt litt mindre." "Vri hodet ditt litt mindre." "Fjern alt som skjuler ansiktet ditt." - "Rengjør sensoren på toppkanten av skjermen." + "Rengjør den øverste delen av skjermen, inkludert den svarte linjen" "Kan ikke bekrefte ansikt. Utilgjengelig maskinvare." - "Prøv ansiktsautentisering igjen." + "Prøv Ansiktslås igjen." "Kan ikke lagre nye ansiktsdata. Slett gamle data først." - "Ansiktsoperasjonen ble avbrutt" - "Ansiktsautentiseringen ble avbrutt av brukeren" + "Ansikt-operasjonen ble avbrutt." + "Ansiktslås ble avbrutt av brukeren." "For mange forsøk. Prøv igjen senere." - "For mange forsøk. Ansiktsautentisering er slått av." + "For mange forsøk. Ansiktslås er slått av." "Kan ikke bekrefte ansiktet. Prøv igjen." - "Du har ikke konfigurert ansiktsautentisering" - "Ansiktsautentisering støttes ikke på denne enheten" + "Du har ikke konfigurert Ansiktslås." + "Ansiktslås støttes ikke på denne enheten" "Ansikt %d" @@ -811,7 +812,7 @@ "Trykk på menyknappen for å låse opp eller ringe et nødnummer." "Trykk på menyknappen for å låse opp." "Tegn mønster for å låse opp" - "Nødsituasjon" + "Nødssituasjon" "Tilbake til samtale" "Riktig!" "Prøv på nytt" @@ -1254,10 +1255,10 @@ "Trykk for å se alle nettverkene" "Koble til" "Alle nettverk" - "Vil du koble til Wi-Fi-nettverk?" - "Foreslått av %s" - "Ja" - "Nei" + "Vil du tillate foreslåtte Wi-Fi nettverk?" + "%s-foreslåtte nettverk. Enheten kan koble til automatisk." + "Tillat" + "Nei takk" "Wi‑Fi slås på automatisk" "Når du er i nærheten av et lagret nettverk av høy kvalitet" "Ikke slå på igjen" @@ -1887,8 +1888,8 @@ "Uten kategori" "Du angir viktigheten for disse varslene." "Dette er viktig på grunn av folkene som er involvert." - "Vil du la %1$s opprette en ny bruker med %2$s?" - "Vil du la %1$s opprette en ny bruker med %2$s? (Det finnes allerede en bruker med denne kontoen.)" + "Vil du la %1$s opprette en ny bruker med %2$s (en bruker med denne kontoen eksisterer allerede)?" + "Vil du la %1$s opprette en ny bruker med %2$s?" "Legg til et språk" "Regionsinnstilling" "Skriv inn språknavn" diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 717d7d8c4866caae0aa87a6194310375f1dd4af7..ff0eadee410a001bb747891e761ec31cd84886f4 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -95,6 +95,7 @@ "भ्वाइस मेल सन्देशहरू" "Wi-Fi कल" "SIM को स्थिति" + "उच्च प्राथमिकता रहेको SIM को स्थिति" "सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण" "सहकर्मी अनुरोध गरियो। TTY मोड HCO" "सहकर्मी अनुरोध गरियो। TTY मोड VCO" @@ -550,11 +551,11 @@ "फिंगरप्रिन्ट आइकन" - "अनुहार प्रमाणिकरण हार्डवेयर व्यवस्थापन गर्नुहोस्" + "फेस अनलकको हार्डवेयर व्यवस्थित गर्नुहोस्" "अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।" - "अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्" - "अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ" - "अनुहार प्रमाणीकरण" + "फेस अनलकको हार्डवेयर प्रयोग गर्नुहोस्" + "अनुप्रयोगलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ" + "फेस अनलक" "आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्" "अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।" @@ -567,7 +568,7 @@ "फोन बायाँतिर सार्नुहोस्।" "फोन दायाँतिर सार्नुहोस्।" "कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।" - "तपाईंको अनुहार देखिएन। फोनमा हेर्नुहोस्।" + "आफ्नो अनुहार फोनको सीधा अगाडि पार्नुहोस्।" "अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।" "कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।" "अब उप्रान्त अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।" @@ -576,19 +577,19 @@ "आफ्नो टाउको अलि थोरै घुमाउनुहोस्।" "आफ्नो टाउको अलि थोरै घुमाउनुहोस्।" "तपाईंको अनुहार लुकाउने सबै कुरा लुकाउनुहोस्।" - "स्क्रिनको शीर्ष कुनामा रहेको सेन्सर सफा गर्नुहोस्।" + "कालो रङको पट्टीलगायत आफ्नो स्क्रिनको माथिल्लो भाग सफा गर्नुहोस्" "अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।" - "फेरि अनुहारको प्रमाणीकरण गरी हेर्नुहोस्।" + "फेरि फेस अनलक प्रयोग गरी हेर्नुहोस्।" "अनुहारसम्बन्धी नयाँ डेटा भण्डारण गर्न सकिएन। पहिले कुनै पुरानो डेटा मेटाउनुहोस्।" - "अनुहार पहिचान गर्ने सुविधा रद्द गरियो" - "प्रयोगकर्ताले अनुहार प्रमाणीकरण सेवा रद्द गर्नुभयो" + "अनुहार पहिचान रद्द गरियो।" + "प्रयोगकर्ताले फेस अनलकको कार्य रद्द गर्नुभयो।" "धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्‌।" - "अत्यधिक प्रयासहरू भए। अनुहार प्रमाणीकरण गर्ने सुविधा असक्षम पारियो।" + "अत्यधिक प्रयासहरू भए। फेस अनलक असक्षम पारियो।" "अनुहार पुष्टि गर्न सकिएन। फेरि प्रयास गर्नुहोस्।" - "तपाईंले अनुहार प्रमाणीकरण गर्ने सुविधा सेट अप गर्नुभएको छैन" - "यस यन्त्रमा अनुहार प्रमाणीकरण गर्ने सुविधा प्रयोग गर्न मिल्दैन" + "तपाईंले फेस अनलक सुविधा सेट अप गर्नुभएको छैन।" + "यस यन्त्रमा फेस अनलक सुविधा प्रयोग गर्न मिल्दैन।" "अनुहार %d" @@ -1260,10 +1261,10 @@ "सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्" "जडान गर्नुहोस्" "सबै नेटवर्कहरू" - "Wi-Fi नेटवर्कसँग जोड्ने हो?" - "%s ले सुझाव दिएको" - "हो" - "होइन" + "सिफारिस गरिएका Wi‑Fi नेटवर्कहरूलाई अनुमति दिनुहोस्?" + "%s ले सिफारिस गरेका नेटवर्कहरू। यन्त्र स्वतः जडान हुन सक्छ।" + "अनुमति दिनुहोस्" + "पर्दैन, धन्यवाद" "Wi‑Fi स्वतः सक्रिय हुनेछ" "तपाईं कुनै सुरक्षित गरिएको उच्च गुणस्तरीय नेटवर्कको नजिक हुनुभएको अवस्थामा" "फेरि सक्रिय नगर्नुहोला" @@ -1893,8 +1894,8 @@ "वर्गीकरण नगरिएको" "तपाईंले यी सूचनाहरूको महत्त्व सेट गर्नुहोस् ।" "यसमा सङ्लग्न भएका मानिसहरूको कारणले गर्दा यो महत्वपूर्ण छ।" - "%2$s सँगै नयाँ प्रयोगकर्ता सिर्जना गर्न %1$s लाई अनुमति दिने हो?" - "%2$s सँगै नयाँ प्रयोगकर्ता सिर्जना गर्न %1$s लाई अनुमति दिने (यस खाताको प्रयोगकर्ता पहिले नै अवस्थित छ) ?" + "%2$s (यस खाताको प्रयोगकर्ता पहिले नै अवस्थित छ) मा नयाँ प्रयोगकर्ता सिर्जना गर्न %1$s लाई अनुमति दिने हो?" + "%2$s मा नयाँ प्रयोगकर्ता सिर्जना गर्न %1$s लाई अनुमति दिने हो?" "भाषा थप्नुहोस्" "क्षेत्रको प्राथमिकता" "भाषाको नाम टाइप गर्नुहोस्" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d0dff88d86a7b83bbbd61af16691d6b692153a2c..e27ad0d583ad4ba1281bc70dbdf3683520f7be3f 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -95,6 +95,7 @@ "Voicemailberichten" "Bellen via wifi" "Simkaartstatus" + "Meldingen met hoge prioriteit voor de simkaartstatus" "Door peer aangevraagde TTY-modus VOL" "Door peer aangevraagde TTY-modus HCO" "Door peer aangevraagde TTY-modus VCO" @@ -550,11 +551,11 @@ "Vingerafdruk-pictogram" - "hardware voor gezichtsherkenning beheren" + "hardware voor ontgrendelen via gezichtsherkenning beheren" "Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik." - "hardware voor gezichtsherkenning gebruiken" - "Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie" - "Gezichtsherkenning" + "hardware voor ontgrendelen via gezichtsherkenning gebruiken" + "Hiermee kan de app hardware voor ontgrendelen via gezichtsherkenning gebruiken voor verificatie" + "Ontgrendelen via gezichtsherkenning" "Je gezicht opnieuw registreren" "Registreer je gezicht opnieuw om de herkenning te verbeteren" "Geen accurate gegevens. Probeer het nog eens." @@ -567,7 +568,7 @@ "Beweeg je telefoon meer naar links." "Beweeg je telefoon meer naar rechts." "Kijk rechter naar je apparaat." - "Je gezicht is niet te zien. Kijk naar de telefoon." + "Houd je gezicht recht voor de telefoon." "Te veel beweging. Houd je telefoon stil." "Registreer je gezicht opnieuw." "Herkent gezicht niet meer. Probeer het nog eens." @@ -576,19 +577,19 @@ "Draai je hoofd iets minder." "Draai je hoofd iets minder." "Zorg dat je gezicht volledig zichtbaar is." - "Maak de sensor bovenaan het scherm schoon." + "Reinig de bovenkant van je scherm, inclusief de zwarte balk" "Kan gezicht niet verifiëren. Hardware niet beschikbaar." - "Probeer de gezichtsverificatie opnieuw." + "Probeer ontgrendelen via gezichtsherkenning opnieuw." "Kan nieuwe gezichten niet opslaan. Verwijder eerst een oude." - "Gezichtsbewerking geannuleerd" - "Gezichtsverificatie geannuleerd door gebruiker" + "Bewerking voor gezichtsherkenning geannuleerd." + "Ontgrendelen via gezichtsherkenning geannuleerd door gebruiker." "Te veel pogingen. Probeer het later opnieuw." - "Te veel pogingen. Gezichtsherkenning uitgeschakeld." + "Te veel pogingen. Ontgrendelen via gezichtsherkenning uitgeschakeld." "Kan gezicht niet verifiëren. Probeer het nog eens." - "Je hebt gezichtsverificatie niet ingesteld" - "Gezichtsverificatie wordt niet ondersteund op dit apparaat" + "Je hebt ontgrendelen via gezichtsherkenning niet ingesteld." + "Ontgrendelen via gezichtsherkenning wordt niet ondersteund op dit apparaat." "Gezicht %d" @@ -1254,10 +1255,10 @@ "Tik om alle netwerken te bekijken" "Verbinding maken" "Alle netwerken" - "Verbinding maken met wifi-netwerken?" - "Voorgesteld door %s" - "Ja" - "Nee" + "Voorgestelde wifi-netwerken toestaan?" + "%s heeft netwerken voorgesteld. Apparaat kan automatisch verbinding maken." + "Toestaan" + "Nee, bedankt" "Wifi wordt automatisch ingeschakeld" "Wanneer je in de buurt van een opgeslagen netwerk van hoge kwaliteit bent" "Niet weer inschakelen" @@ -1887,8 +1888,8 @@ "Geen categorie" "Je stelt het belang van deze meldingen in." "Dit is belangrijk vanwege de betrokken mensen." - "Toestaan dat %1$s een nieuwe gebruiker met %2$s maakt?" - "Toestaan dat %1$s een nieuwe gebruiker met %2$s maakt (er is al een gebruiker met dit account)?" + "Toestaan dat %1$s een nieuwe gebruiker met %2$s maakt (er is al een gebruiker met dit account)?" + "Toestaan dat %1$s een nieuwe gebruiker met %2$s maakt?" "Een taal toevoegen" "Regiovoorkeur" "Typ een taalnaam" diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 93fdbf9b6287df86245425e3aa1613cd2720dfa4..5192adb8ebd53a2999cfdfbf8ab30e5416aa3436 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -95,6 +95,7 @@ "ଭଏସମେଲ୍‍ ମେସେଜ୍‍" "ୱାଇ-ଫାଇ କଲିଙ୍ଗ" "SIM ଷ୍ଟାଟସ୍" + "ଉଚ୍ଚ ପ୍ରାଥମିକତା SIM ସ୍ଥିତି" "ପୀଆର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ FULL ଅଟେ" "ପୀଅର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ HCO ଅଟେ" "ପୀଅର୍‌ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍‍ VCO ଅଟେ" @@ -550,11 +551,11 @@ "ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପରିଚାଳନା କରନ୍ତୁ" + "ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ" "ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଫେସିଆଲ୍‍ ଟେମ୍ପଲେଟ୍‍ ଯୋଡିବା ଓ ଡିଲିଟ୍‍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ ବ୍ୟବହାର କରନ୍ତୁ" - "ଫେସ୍‍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍‌ର ପ୍ରମାଣ ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।" - "ମୁହଁ ପ୍ରାମାଣିକତା" + "ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ" + "ପ୍ରାମାଣିକତା ପାଇଁ ଫେସ୍ ଅନ୍‌ଲକ୍ ହାର୍ଡୱେର୍‌ର ବ୍ୟବହାର ପାଇଁ ଆପ୍‍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।" + "ଫେସ୍ ଅନ୍‌ଲକ୍" "ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ" "ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।" "ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" @@ -567,7 +568,7 @@ "ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।" "ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।" "ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍‌କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।" - "ଆପଣଙ୍କର ମୁହଁ ଦେଖି ପାରୁନାହିଁ। ଫୋନ୍‌କୁ ଦେଖନ୍ତୁ।" + "ଆପଣଙ୍କ ମୁହଁକୁ ଫୋନ୍ ସାମ୍ନାରେ ସିଧାସଳଖ ରଖନ୍ତୁ।" "ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍‍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।" "ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍‍ରୋଲ୍ କରନ୍ତୁ।" "ଆଉ ମୁହଁ ଚିହ୍ନଟ କରିହେଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" @@ -576,19 +577,19 @@ "ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।" "ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।" "ଆପଣଙ୍କର ମୁହଁ ଲୁଚାଉଥିବା ଜିନିଷକୁ କାଢ଼ି ଦିଅନ୍ତୁ।" - "ସ୍କ୍ରିନ୍‍ର ଉପର ପ୍ରାନ୍ତରେ ଥିବା ସେନ୍ସର୍‍କୁ ଖାଲି କରନ୍ତୁ।" + "କଳା ବାର୍ ସମେତ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍‌ର ଶୀର୍ଷକୁ ସଫା କରନ୍ତୁ" "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।" - "ପୁଣି ମୁହଁ ପ୍ରାମାଣିକତା କରନ୍ତୁ।" + "ଫେସ୍ ଅନ୍‌ଲକ୍ ପୁଣି ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ" "ନୂଆ ମୁହଁ ଡାଟା ଷ୍ଟୋର୍ ହେବ ନାହିଁ। ପ୍ରଥମେ ପୁରୁଣାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।" - "ମୁହଁ ପ୍ରମାଣିକିକରଣ ପ୍ରକ୍ରିୟା ବାତିଲ୍ ହୋଇଛି" - "ଉପଯୋଗକର୍ତ୍ତା ମୁହଁ ପ୍ରମାଣିକିକରଣ ବାତିଲ୍‌ କରିଛନ୍ତି" + "ଫେସ୍‍ର ଅପରେଶନ୍‍ କ୍ୟାନ୍ସଲ୍‍ ହୋ‍ଇଗଲା" + "ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ଫେସ୍ ଅନଲକ୍ ବାତିଲ୍ କରାଯାଇଛି।" "ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।" - "ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ମୁହଁ ପ୍ରମାଣିକିକରଣ ଅକ୍ଷମ ହୋଇଛି।" + "ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ଫେସ୍ ଅନ୍‌ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ" "ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" - "ଆପଣ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି" - "ଏହି ଡିଭାଇସ୍‌ରେ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସମର୍ଥିତ ନୁହେଁ" + "ଆପଣ ଫେସ୍ ଅନ୍‌ଲକ୍ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି" + "ଏହି ଡିଭାଇସ୍‌ରେ ଫେସ୍ ଅନ୍‌ଲକ୍ ସମର୍ଥିତ ନୁହେଁ।" "%dଙ୍କ ଫେସ୍‍" @@ -1254,10 +1255,10 @@ "ସମସ୍ତ ନେଟ୍‌ୱର୍କ ଦେଖିବାକୁ ଟାପ୍‍ କରନ୍ତୁ" "କନେକ୍ଟ କରନ୍ତୁ" "ସମସ୍ତ ନେଟ୍‌ୱର୍କ" - "ୱାଇ-ଫାଇ ନେଟ୍‍ୱର୍କଗୁଡ଼ିକୁ ସଂଯୁକ୍ତ କରିବେ?" - "%sଙ୍କ ଦ୍ୱାରା ପ୍ରସ୍ତାବିତ" - "ହଁ" - "ନାହିଁ" + "ପ୍ରସ୍ତାବିତ ୱାଇ-ଫାଇ ନେଟ୍‌ୱାର୍କଗୁଡ଼ିକୁ ଅନୁମତି ଦେବେ?" + "%s ପ୍ରସ୍ତାବିତ ନେଟ୍‌ୱାର୍କଗୁଡ଼ିକ। ଡିଭାଇସ୍ ହୁଏତ ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୋଗ ହୋଇପାରେ।" + "ଅନୁମତି ଦିଅନ୍ତୁ" + "ନାହିଁ, ଥାଉ" "ୱାଇ-ଫାଇ ସ୍ୱଚାଳିତ ଭାବେ ଅନ୍ ହେବ" "ଆପଣ ଏକ ଉଚ୍ଚ-କ୍ୱାଲିଟୀ ବିଶିଷ୍ଟ ସେଭ୍‌ କରାଯାଇଥିବା ନେଟ୍‌ୱର୍କ ପାଖରେ ଥିବା ସମୟରେ" "ପୁଣି ଅନ୍‍ କରନ୍ତୁ ନାହିଁ" @@ -1342,7 +1343,7 @@ "କୌଣସି ଅନୁମତିର ଆବଶ୍ୟକତା ନାହିଁ" "ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ" "ଠିକ୍‍ ଅଛି" - "USB ମାଧ୍ୟମରେ ଏହି ଡିଭାଇସ୍‌କୁ ଚାର୍ଜ କରନ୍ତୁ" + "USB ମାଧ୍ୟମରେ ଏହି ଡିଭାଇସ୍‌ ଚାର୍ଜ ହେଉଛି" "USB ମାଧ୍ୟମରେ ଯୋଡ଼ାଯାଇଥିବା ଡିଭାଇସ୍ ଚାର୍ଜ ହେଉଛି" "USB ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ଚାଲୁ କରାଗଲା" "USB ମାଧ୍ୟମରେ PTPକୁ ଚାଲୁ କରାଗଲା" @@ -1658,7 +1659,7 @@ "ଆପଣଙ୍କ ଅନଲକ୍‍ ପାଟର୍ନକୁ ଆପଣ %1$d ଥର ଭୁଲ ଭାବେ ଅଙ୍କନ କରିଛନ୍ତି। ଆଉ %2$dଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଏକ ଇମେଲ୍‍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ନିଜ ଫୋନ୍‌କୁ ଅନଲକ୍‌ କରିବା ପାଇଁ କୁହାଯିବ।\n\n%3$d ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।" " — " "ବାହାର କରନ୍ତୁ" - "ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିସ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।" + "ମାତ୍ରା ବଢ଼ାଇ ସୁପାରିଶ ସ୍ତର ବଢ଼ାଉଛନ୍ତି? \n\n ଲମ୍ବା ସମୟ ପର୍ଯ୍ୟନ୍ତ ଉଚ୍ଚ ଶବ୍ଦରେ ଶୁଣିଲେ ଆପଣଙ୍କ ଶ୍ରବଣ ଶକ୍ତି ଖରାପ ହୋଇପାରେ।" "ଆକ୍ସେସବିଲିଟି ଶର୍ଟକଟ୍‍ ବ୍ୟବହାର କରିବେ?" "ସର୍ଟକଟ୍‌ ଅନ୍‌ ଥିବା ବେଳେ, ଉଭୟ ଭଲ୍ୟୁମ୍‍ ବଟନ୍‍ 3 ସେକେଣ୍ଡ ପାଇଁ ଦବାଇବା ଦ୍ୱାରା ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ ଆରମ୍ଭ ହେବ।\n\n ସମ୍ପ୍ରତି ଆକ୍ସେସବିଲିଟି ବୈଶିଷ୍ଟ୍ୟ:\n %1$s\n\n ସେଟିଙ୍ଗ ଓ ଆକ୍ସେସବିଲିଟିରେ ଆପଣ ବୈଶିଷ୍ଟ୍ୟ ବଦଳାଇ ପାରିବେ।" "ଶର୍ଟକଟ୍‍ ବନ୍ଦ କରନ୍ତୁ" @@ -1887,8 +1888,8 @@ "ଅବର୍ଗୀକୃତ" "ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ପ୍ରମୁଖତା ଆପଣ ସେଟ୍‍ କରନ୍ତି।" "ସମ୍ପୃକ୍ତ ଲୋକଙ୍କ କାରଣରୁ ଏହା ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଅଟେ।" - "%2$s ସହ ଏକ ନୂଆ ୟୁଜର୍‌ ତିଆରି କରିବା ପାଇଁ %1$sକୁ ଅନୁମତି ଦେବେ?" - "%2$s ସହ ଏକ ନୂଆ ୟୁଜର୍‌ ତିଆରି କରିବାକୁ %1$sକୁ ଅନୁମତି ଦେବେ (ଏହି ଆକାଉଣ୍ଟରେ ଜଣେ ୟୁଜର୍‌ ପୂର୍ବରୁ ରହିଛନ୍ତି)?" + "%1$sରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ %2$sକୁ (ପୂର୍ବରୁ ଏହି ଆକାଉଣ୍ଟ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ନାମରେ ଅଛି) ଅନୁମତି ଦେବେ?" + "%1$sରେ ଏକ ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବା ପାଇଁ %2$sକୁ ଅନୁମତି ଦେବେ?" "ଏକ ଭାଷା ଯୋଡ଼ନ୍ତୁ" "ପସନ୍ଦର ଅଞ୍ଚଳ" "ଭାଷାର ନାମ ଟାଇପ୍‍ କରନ୍ତୁ" diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index f605c3c50f6e19e117764e499b0db55382204f64..fe0fada71894a0dea791327671228a8690a16369 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -95,6 +95,7 @@ "ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ" "ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ" "ਸਿਮ ਅਵਸਥਾ" + "ਉੱਚ ਤਰਜੀਹੀ ਸਿਮ ਸਥਿਤੀ" "ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" @@ -550,11 +551,11 @@ "ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ" + "ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ" "ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ" - "ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ" + "ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤੋ" + "ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ" + "ਚਿਹਰਾ ਅਣਲਾਕ" "ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ" "ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" @@ -567,7 +568,7 @@ "ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।" "ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।" "ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।" - "ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ।" + "ਆਪਣਾ ਚਿਹਰਾ ਫ਼ੋਨ ਦੇ ਬਿਲਕੁਲ ਸਾਹਮਣੇ ਰੱਖੋ।" "ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।" "ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।" "ਹੁਣ ਚਿਹਰਾ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" @@ -576,19 +577,19 @@ "ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।" "ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।" "ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੁਕਾਉਣ ਵਾਲੀ ਕੋਈ ਵੀ ਚੀਜ਼ ਹਟਾਓ।" - "ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰਲੇ ਕਿਨਾਰੇ ਦਾ ਸੈਂਸਰ ਸਾਫ਼ ਕਰੋ।" + "ਕਾਲੀ ਪੱਟੀ ਸਮੇਤ, ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ ਨੂੰ ਸਾਫ਼ ਕਰੋ" "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।" - "ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।" + "ਚਿਹਰਾ ਅਣਲਾਕ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।" "ਨਵਾਂ ਚਿਹਰਾ ਡਾਟਾ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪਹਿਲਾਂ ਪੁਰਾਣਾ ਹਟਾਓ।" - "ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ" - "ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ" + "ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।" + "ਵਰਤੋਂਕਾਰ ਨੇ ਚਿਹਰਾ ਅਣਲਾਕ ਰੱਦ ਕੀਤਾ।" "ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਕੀਤਾ ਗਿਆ।" + "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਅਣਲਾਕ ਬੰਦ ਕੀਤਾ ਗਿਆ।" "ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" - "ਤੁਸੀਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ" - "ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ" + "ਤੁਸੀਂ ਚਿਹਰਾ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ।" + "ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਚਿਹਰਾ ਅਣਲਾਕ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ।" "ਚਿਹਰਾ %d" @@ -1254,10 +1255,10 @@ "ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ" "ਕਨੈਕਟ ਕਰੋ" "ਸਾਰੇ ਨੈੱਟਵਰਕ" - "ਕੀ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨਾ ਹੈ?" - "%s ਵਲੋਂ ਸੁਝਾਇਆ ਗਿਆ" - "ਹਾਂ" - "ਨਹੀਂ" + "ਕੀ ਸੁਝਾਏ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਵਰਤਣੇ ਹਨ?" + "%s ਦੇ ਸੁਝਾਏ ਨੈੱਟਵਰਕ। ਸ਼ਾਇਦ ਡੀਵਾਈਸ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਕਨੈਕਟ ਹੋਵੇ।" + "ਵਰਤਣ ਦਿਓ" + "ਨਹੀਂ ਧੰਨਵਾਦ" "ਵਾਈ‑ਫਾਈ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਚੱਲ ਪਵੇਗਾ" "ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਰੱਖਿਅਤ ਕੀਤੇ ਉੱਚ-ਗੁਣਵੱਤਾ ਵਾਲੇ ਨੈੱਟਵਰਕ ਦੇ ਨੇੜੇ ਹੋਵੋ" "ਵਾਪਸ ਚਾਲੂ ਨਾ ਕਰੋ" @@ -1343,7 +1344,7 @@ "ਕੋਈ ਅਨੁਮਤੀਆਂ ਲੁੜੀਂਦੀਆਂ ਨਹੀਂ" "ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ" "ਠੀਕ" - "USB ਰਾਹੀਂ ਇਸ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" + "ਇਹ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ" "USB ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਚਾਲੂ ਹੈ" "USB ਰਾਹੀਂ PTP ਚਾਲੂ ਹੈ" @@ -1888,8 +1889,8 @@ "ਗੈਰ-ਸ਼੍ਰੇਣੀਕਿਰਤ" "ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਦੀ ਮਹੱਤਤਾ ਸੈੱਟ ਕੀਤੀ।" "ਇਹ ਸ਼ਾਮਲ ਲੋਕਾਂ ਦੇ ਕਾਰਨ ਮਹੱਤਵਪੂਰਨ ਹੈ।" - "ਕੀ %1$s ਨੂੰ %2$s ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਮਨਜ਼ੂਰੀ ਦੇਣੀ ਹੈ?" - "ਕੀ %1$s ਨੂੰ %2$s ਨਾਲ ਇੱਕ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ (ਇਸ ਖਾਤੇ ਨਾਲ ਇੱਕ ਵਰਤੋਂਕਾਰ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ) ?" + "ਕੀ %1$s ਨੂੰ %2$s ਨਾਲ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ (ਇਸ ਖਾਤੇ ਨਾਲ ਇੱਕ ਵਰਤੋਂਕਾਰ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ)?" + "ਕੀ %1$s ਨੂੰ %2$s ਨਾਲ ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਹੈ?" "ਇੱਕ ਭਾਸ਼ਾ ਸ਼ਾਮਲ ਕਰੋ" "ਖੇਤਰ ਤਰਜੀਹ" "ਭਾਸ਼ਾ ਨਾਮ ਟਾਈਪ ਕਰੋ" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 99f448b6ad7d93de2953ef43b1c072131907a60a..c4d32179d398d86c118e6149dab23dec75bfbf29 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -97,6 +97,7 @@ "Wiadomości poczty głosowej" "Połączenia przez Wi-Fi" "Stan karty SIM" + "Stan karty SIM – wysoki priorytet" "Drugie urządzenie zażądało trybu „TTY pełny”" "Drugie urządzenie zażądało trybu „TTY HCO”" "Drugie urządzenie zażądało trybu „TTY VCO”" @@ -556,11 +557,11 @@ "Ikona odcisku palca" - "zarządzanie sprzętem do uwierzytelniania za pomocą twarzy" + "zarządzanie sprzętem do rozpoznawania twarzy" "Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy." - "używanie sprzętu do uwierzytelniania za pomocą twarzy" - "Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania" - "Uwierzytelnianie twarzą" + "używanie sprzętu do rozpoznawania twarzy" + "Zezwala na używanie przez aplikację sprzętu do rozpoznawania twarzy w uwierzytelniania" + "Rozpoznanie twarzy" "Zarejestruj swoją twarz ponownie" "Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz" "Nie udało się zarejestrować danych twarzy. Spróbuj ponownie." @@ -573,7 +574,7 @@ "Przesuń telefon w lewo." "Przesuń telefon w prawo." "Patrz prosto na urządzenie." - "Nie widzę Twojej twarzy. Spójrz na telefon." + "Ustaw twarz dokładnie na wprost telefonu." "Telefon się porusza. Trzymaj go nieruchomo." "Zarejestruj swoją twarz ponownie." "Nie można już rozpoznać twarzy. Spróbuj ponownie." @@ -582,19 +583,19 @@ "Trochę mniej obróć głowę." "Trochę mniej obróć głowę." "Usuń wszystko, co zasłania Ci twarz." - "Wyczyść czujnik na górnej krawędzi ekranu." + "Wyczyść górną krawędź ekranu, w tym czarny pasek" "Nie można zweryfikować twarzy. Sprzęt niedostępny." - "Spróbuj uwierzytelniania twarzą ponownie." + "Spróbuj rozpoznania twarzy ponownie." "Nie można przechowywać nowych danych twarzy. Usuń stare." - "Analiza twarzy została anulowana" - "Użytkownik anulował uwierzytelnianie twarzą" + "Analiza twarzy została anulowana." + "Użytkownik anulował rozpoznanie twarzy." "Zbyt wiele prób. Spróbuj ponownie później." - "Zbyt wiele prób. Uwierzytelnianie twarzą zostało wyłączone." + "Zbyt wiele prób. Rozpoznanie twarzy zostało wyłączone." "Nie można zweryfikować twarzy. Spróbuj ponownie." - "Uwierzytelnianie twarzą nie jest skonfigurowane" - "To urządzenie nie obsługuje uwierzytelniania twarzą" + "Rozpoznanie twarzy nie jest skonfigurowane." + "To urządzenie nie obsługuje rozpoznania twarzy." "Twarz %d" @@ -1298,10 +1299,10 @@ "Kliknij, by zobaczyć wszystkie sieci" "Połącz" "Wszystkie sieci" - "Nawiązywać połączenia z sieciami Wi-Fi?" - "Sugestia: %s" - "Tak" - "Nie" + "Zezwalać na sugerowane sieci Wi‑Fi?" + "Sugerowane sieci: %s. Urządzenie może łączyć się automatycznie." + "Zezwól" + "Nie, dziękuję" "Wi‑Fi włączy się automatycznie" "Gdy znajdziesz się w pobliżu zapisanej sieci o mocnym sygnale" "Nie włączaj ponownie" @@ -1711,7 +1712,7 @@ "Gdy skrót jest włączony, jednoczesne naciśnięcie przez trzy sekundy obu klawiszy sterowania głośnością uruchomi funkcję ułatwień dostępu.\n\nBieżąca funkcja ułatwień dostępu:\n%1$s\n\nFunkcję możesz zmienić, wybierając Ustawienia > Ułatwienia dostępu." "Wyłącz skrót" "Użyj skrótu" - "Inwersja kolorów" + "Odwrócenie kolorów" "Korekcja kolorów" "Skrót ułatwień dostępu wyłączył usługę %1$s" "Skrót ułatwień dostępu wyłączył usługę %1$s" @@ -1955,8 +1956,8 @@ "Bez kategorii" "Ustawiłeś ważność tych powiadomień." "Ta wiadomość jest ważna ze względu na osoby uczestniczące w wątku." - "Zezwalasz aplikacji %1$s na utworzenie nowego użytkownika dla konta %2$s?" - "Zezwalasz aplikacji %1$s na utworzenie nowego użytkownika dla konta %2$s)? Użytkownik z tym kontem już istnieje." + "Zezwolić aplikacji %1$s na utworzenie nowego użytkownika dla konta %2$s (użytkownik dla tego konta już istnieje)?" + "Zezwolić aplikacji %1$s na utworzenie nowego użytkownika dla konta %2$s?" "Dodaj język" "Ustawienie regionu" "Wpisz nazwę języka" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4f24abcd2d722e72bdcc2b995091f2cf5cc5e66d..d239d7693cd1deb52b7a3682af0e6c9a13335c9d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -95,6 +95,7 @@ "Mensagens do correio de voz" "Chamadas por Wi-Fi" "Status do chip" + "Status de prioridade alta do chip" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -550,11 +551,11 @@ "Ícone de impressão digital" - "gerenciar hardware de autenticação facial" + "gerenciar hardware de desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de autenticação facial" - "Permite que o app use o hardware de autenticação facial para autenticação" - "Autenticação facial" + "usar hardware de desbloqueio facial" + "Permite que o app use o hardware de desbloqueio facial para autenticação" + "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -567,7 +568,7 @@ "Mova o smartphone para a esquerda." "Mova o smartphone para a direita." "Olhe mais diretamente para o dispositivo." - "Não é possível ver o rosto. Olhe para o telefone." + "Deixe o rosto diretamente na frente do smartphone." "Muito movimento. Não mova o smartphone." "Registre seu rosto novamente." "O rosto não é mais reconhecido. Tente novamente." @@ -576,19 +577,19 @@ "Incline a cabeça um pouco menos." "Incline a cabeça um pouco menos." "Remova tudo que esteja ocultando seu rosto." - "Limpe o sensor na borda superior da tela." + "Limpe a parte superior da tela, inclusive a barra preta" "Impossível verificar rosto. Hardware indisponível." - "Tente realizar a autenticação facial novamente." + "Tente usar o desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." - "Operação facial cancelada" - "Autenticação facial cancelada pelo usuário" + "Operação facial cancelada." + "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." - "Muitas tentativas. Autenticação facial desativada." + "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "Autenticação facial não configurada" - "A autenticação facial não é permitida neste dispositivo" + "O desbloqueio facial não foi configurado." + "O desbloqueio facial não é compatível com este dispositivo." "Rosto %d" @@ -1254,10 +1255,10 @@ "Toque para ver todas as redes" "Conectar" "Todas as redes" - "Conectar a redes Wi-Fi?" - "Sugerido por %s" - "Sim" - "Não" + "Permitir redes Wi-Fi sugeridas?" + "Redes sugeridas pelo app %s. O dispositivo pode se conectar automaticamente." + "Permitir" + "Não" "O Wi‑Fi será ativado automaticamente" "Quando você estiver perto de uma rede salva de alta qualidade" "Não ativar novamente" @@ -1475,7 +1476,7 @@ "Enviar" "O app para carro está sendo usado" "Toque para sair do app para carro." - "Vínculo ou ponto de acesso ativo" + "Ponto de acesso ou tethering ativo" "Toque para configurar." "Tethering desativado" "Fale com seu administrador para saber detalhes" @@ -1669,8 +1670,8 @@ "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" "Escolha um serviço a ser usado quando você toca no botão Acessibilidade:" - "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" - "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" + "Escolha um serviço para usar com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" + "Escolha um serviço para usar com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" "Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado." "Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos sem soltar." "Para alternar entre serviços, deslize de baixo para cima na tela com três dedos sem soltar." @@ -1887,8 +1888,8 @@ "Sem classificação" "Você definiu a importância dessas notificações." "Isso é importante por causa das pessoas envolvidas." - "Permitir que %1$s crie um novo usuário com %2$s?" - "Permitir que %1$s crie um novo usuário com %2$s (já existe um usuário com essa conta)?" + "Permitir que o app %1$s crie um novo usuário com %2$s (já existe um usuário com essa conta)?" + "Permitir que o app %1$s crie um novo usuário com %2$s?" "Adicionar um idioma" "Preferência de região" "Digitar nome do idioma" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c4ae520d75a5fb1316b2969e8ca649be3cc4e9ab..edcf3c77b8df6d5c148fb91b30c0c1b14d5a6555 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -95,6 +95,7 @@ "Mensagens de correio de voz" "Chamadas Wi-Fi" "Estado do SIM" + "Estado do SIM de elevada prioridade" "O par solicitou o modo COMPLETO de teletipo" "O par solicitou o modo HCO de teletipo" "O par solicitou o modo VCO de teletipo" @@ -228,7 +229,7 @@ "Emergência" "Relatório de erros" "Terminar sessão" - "Captura de ecrã" + "Capt. ecrã" "Relatório de erro" "Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco." "Relatório interativo" @@ -550,11 +551,11 @@ "Ícone de impressão digital" - "gerir hardware de autenticação facial" + "gerir hardware de Desbloqueio Através do Rosto" "Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso." - "utilizar hardware de autenticação facial" - "Permite que a aplicação utilize hardware de autenticação facial para autenticação." - "Autenticação facial" + "utilizar hardware de Desbloqueio Através do Rosto" + "Permite que a aplicação utilize hardware de Desbloqueio Através do Rosto para autenticação" + "Desbloqueio Através do Rosto" "Volte a inscrever o seu rosto" "Para melhorar o reconhecimento, volte a inscrever o seu rosto." "Imp. capt. dados rosto precisos. Tente novamente." @@ -567,7 +568,7 @@ "Mova o telemóvel para a esquerda." "Mova o telemóvel para a direita." "Olhe mais diretamente para o dispositivo." - "Não consigo ver o rosto. Olhe para o telemóvel." + "Posicione o rosto em frente ao telemóvel." "Demasiado movimento. Mantenha o telemóvel firme." "Volte a inscrever o rosto." "Impossível reconhecer o rosto. Tente novamente." @@ -576,19 +577,19 @@ "Rode a cabeça um pouco menos." "Rode a cabeça um pouco menos." "Remova tudo o que esteja a ocultar o seu rosto." - "Limpe o sensor na extremidade superior do ecrã." + "Limpe a parte superior do ecrã, incluindo a barra preta." "Não pode validar o rosto. Hardware não disponível." - "Tente efetuar a autenticação facial novamente." + "Experimente de novo o Desbloqueio Através do Rosto" "Não pode guardar novos dados de rostos. Elimine um antigo." - "Operação de rosto cancelada." - "Autenticação facial cancelada pelo utilizador." + "Operação de rosto cancelada." + "Desbloqueio Através do Rosto cancelado pelo utilizador" "Demasiadas tentativas. Tente novamente mais tarde." - "Demasiadas tentativas. Autenticação facial desativada." + "Demasiadas tentativas. O Desbloqueio Através do Rosto está desativado." "Não é possível validar o rosto. Tente novamente." - "Não configurou a autenticação facial." - "A autenticação facial não é suportada neste dispositivo." + "Não configurou o Desbloqueio Através do Rosto." + "Desbloqueio Através do Rosto não suportado neste dispositivo." "Rosto %d" @@ -1254,10 +1255,10 @@ "Toque para ver todas as redes" "Ligar" "Todas as redes" - "Pretende estabelecer ligação a redes Wi-Fi?" - "Sugerida por %s" - "Sim" - "Não" + "Pretende permitir redes Wi-Fi sugeridas?" + "Redes sugeridas por %s. O dispositivo pode estabelecer ligação automaticamente." + "Permitir" + "Não, obrigado" "O Wi‑Fi será ativado automaticamente" "Quando estiver próximo de uma rede de alta qualidade guardada." "Não reativar" @@ -1354,7 +1355,7 @@ "Acessório de áudio analógico detetado" "O dispositivo ligado não é compatível com este telemóvel. Toque para saber mais." "Depuração USB ligada" - "Toque para desativar a depuração USB." + "Toque para desativar a depuração USB" "Selecione para desativar a depuração por USB." "Modo de estrutura de teste ativado" "Efetue uma reposição de dados de fábrica para desativar o Modo de estrutura de teste." @@ -1505,7 +1506,7 @@ "Eliminar os itens" "Anular as eliminações" "Não fazer nada por agora" - "Selecionar uma conta" + "Selecione uma conta" "Adicionar uma conta" "Adicionar conta" "Aumentar" @@ -1887,8 +1888,8 @@ "Sem categoria" "Definiu a importância destas notificações." "É importante devido às pessoas envolvidas." - "Pretende permitir que o %1$s crie um novo utilizador com %2$s?" - "Pretende permitir que o %1$s crie um novo utilizador com %2$s (já existe um utilizador com esta conta)?" + "Pretende permitir que a aplicação %1$s crie um novo utilizador com a conta %2$s (já existe um utilizador com esta conta)?" + "Pretende permitir que a aplicação %1$s crie um novo utilizador com a conta %2$s?" "Adicionar um idioma" "Preferência de região" "Intr. nome do idioma" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4f24abcd2d722e72bdcc2b995091f2cf5cc5e66d..d239d7693cd1deb52b7a3682af0e6c9a13335c9d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -95,6 +95,7 @@ "Mensagens do correio de voz" "Chamadas por Wi-Fi" "Status do chip" + "Status de prioridade alta do chip" "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -550,11 +551,11 @@ "Ícone de impressão digital" - "gerenciar hardware de autenticação facial" + "gerenciar hardware de desbloqueio facial" "Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso." - "usar hardware de autenticação facial" - "Permite que o app use o hardware de autenticação facial para autenticação" - "Autenticação facial" + "usar hardware de desbloqueio facial" + "Permite que o app use o hardware de desbloqueio facial para autenticação" + "Desbloqueio facial" "Registre seu rosto novamente" "Para melhorar o reconhecimento, registre seu rosto novamente" "Dados precisos não capturados. Tente novamente." @@ -567,7 +568,7 @@ "Mova o smartphone para a esquerda." "Mova o smartphone para a direita." "Olhe mais diretamente para o dispositivo." - "Não é possível ver o rosto. Olhe para o telefone." + "Deixe o rosto diretamente na frente do smartphone." "Muito movimento. Não mova o smartphone." "Registre seu rosto novamente." "O rosto não é mais reconhecido. Tente novamente." @@ -576,19 +577,19 @@ "Incline a cabeça um pouco menos." "Incline a cabeça um pouco menos." "Remova tudo que esteja ocultando seu rosto." - "Limpe o sensor na borda superior da tela." + "Limpe a parte superior da tela, inclusive a barra preta" "Impossível verificar rosto. Hardware indisponível." - "Tente realizar a autenticação facial novamente." + "Tente usar o desbloqueio facial novamente." "Não é possível salvar dados faciais. Exclua dados antigos." - "Operação facial cancelada" - "Autenticação facial cancelada pelo usuário" + "Operação facial cancelada." + "Desbloqueio facial cancelado pelo usuário." "Excesso de tentativas. Tente novamente mais tarde." - "Muitas tentativas. Autenticação facial desativada." + "Muitas tentativas. Desbloqueio facial desativado." "Não é possível verificar o rosto. Tente novamente." - "Autenticação facial não configurada" - "A autenticação facial não é permitida neste dispositivo" + "O desbloqueio facial não foi configurado." + "O desbloqueio facial não é compatível com este dispositivo." "Rosto %d" @@ -1254,10 +1255,10 @@ "Toque para ver todas as redes" "Conectar" "Todas as redes" - "Conectar a redes Wi-Fi?" - "Sugerido por %s" - "Sim" - "Não" + "Permitir redes Wi-Fi sugeridas?" + "Redes sugeridas pelo app %s. O dispositivo pode se conectar automaticamente." + "Permitir" + "Não" "O Wi‑Fi será ativado automaticamente" "Quando você estiver perto de uma rede salva de alta qualidade" "Não ativar novamente" @@ -1475,7 +1476,7 @@ "Enviar" "O app para carro está sendo usado" "Toque para sair do app para carro." - "Vínculo ou ponto de acesso ativo" + "Ponto de acesso ou tethering ativo" "Toque para configurar." "Tethering desativado" "Fale com seu administrador para saber detalhes" @@ -1669,8 +1670,8 @@ "O atalho de acessibilidade desativou o %1$s" "Toque nos dois botões de volume e os mantenha pressionados por três segundo para usar o %1$s" "Escolha um serviço a ser usado quando você toca no botão Acessibilidade:" - "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" - "Escolha um serviço a ser usado com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" + "Escolha um serviço para usar com o gesto de acessibilidade (deslizar de baixo para cima na tela com dois dedos):" + "Escolha um serviço para usar com o gesto de acessibilidade (deslizar de baixo para cima na tela com três dedos):" "Para alternar entre serviços, toque no botão de acessibilidade e mantenha-o pressionado." "Para alternar entre serviços, deslize de baixo para cima na tela com dois dedos sem soltar." "Para alternar entre serviços, deslize de baixo para cima na tela com três dedos sem soltar." @@ -1887,8 +1888,8 @@ "Sem classificação" "Você definiu a importância dessas notificações." "Isso é importante por causa das pessoas envolvidas." - "Permitir que %1$s crie um novo usuário com %2$s?" - "Permitir que %1$s crie um novo usuário com %2$s (já existe um usuário com essa conta)?" + "Permitir que o app %1$s crie um novo usuário com %2$s (já existe um usuário com essa conta)?" + "Permitir que o app %1$s crie um novo usuário com %2$s?" "Adicionar um idioma" "Preferência de região" "Digitar nome do idioma" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 50d6a495e147d7cf3e5009fbca15ed6cea7cffd4..1fdf162e8c42b4c91051bda5357e7f45dae32b3b 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -96,6 +96,7 @@ "Mesaje din mesageria vocală" "Apelare prin Wi-Fi" "Starea cardului SIM" + "Notificări de la SIM cu prioritate ridicată" "Cealaltă persoană a solicitat modul TTY cu setarea COMPLET" "Cealaltă persoană a solicitat modul TTY cu setarea HCO" "Cealaltă persoană a solicitat modul TTY cu setarea VCO" @@ -553,11 +554,11 @@ "Pictograma amprentă" - "să gestioneze hardware-ul de autentificare facială" + "să gestioneze hardware de deblocare facială" "Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare." - "să folosească hardware de autentificare facială" - "Permite aplicației să folosească hardware de autentificare facială pentru autentificare" - "Autentificare facială" + "să folosească hardware de deblocare facială" + "Permite aplicației să folosească hardware de deblocare facială pentru autentificare" + "Deblocare facială" "Reînregistrați-vă chipul" "Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul" "Nu s-a putut fotografia fața cu precizie. Încercați din nou." @@ -570,7 +571,7 @@ "Mutați telefonul spre stânga." "Mutați telefonul spre dreapta." "Priviți mai direct spre dispozitiv." - "Nu vi se vede fața. Uitați-vă la telefon." + "Stați cu capul direct în fața telefonului." "Prea multă mișcare. Țineți telefonul nemișcat." "Reînregistrați-vă chipul." "Nu se mai poate recunoaște fața. Încercați din nou." @@ -579,19 +580,19 @@ "Întoarceți capul mai puțin." "Întoarceți capul mai puțin." "Eliminați orice vă ascunde chipul." - "Curățați senzorul de la marginea de sus a ecranului." + "Curățați partea de sus a ecranului, inclusiv bara neagră" "Nu se poate confirma fața. Hardware-ul nu este disponibil." - "Încercați din nou autentificarea facială." + "Încercați din nou deblocarea facială." "Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi." - "Operațiunea privind fața a fost anulată" - "Autentificarea chipului este anulată de utilizator" + "Operațiunea privind chipul a fost anulată." + "Deblocarea facială este anulată de utilizator." "Prea multe încercări. Reîncercați mai târziu." - "Prea multe încercări. Autentificarea facială este dezactivată" + "Prea multe încercări. Deblocarea facială este dezactivată." "Nu se poate confirma fața. Încercați din nou." - "Nu ați configurat autentificarea facială" - "Autentificarea facială nu este acceptată pe dispozitiv" + "Nu ați configurat deblocarea facială." + "Deblocarea facială nu este acceptată pe dispozitiv." "Chip %d" @@ -1276,10 +1277,10 @@ "Atingeți pentru a vedea toate rețelele" "Conectați-vă" "Toate rețelele" - "Vă conectați la rețele Wi-Fi?" - "Sugerat de %s" - "Da" - "Nu" + "Permiteți rețelele Wi-Fi sugerate?" + "%s a sugerat rețele. Dispozitivul se poate conecta automat." + "Permiteți" + "Nu, mulțumesc" "Wi‑Fi se va activa automat" "Când vă aflați lângă o rețea salvată, de înaltă calitate" "Nu reactivați" @@ -1921,8 +1922,8 @@ "Neclasificate" "Dvs. setați importanța acestor notificări." "Notificarea este importantă având în vedere persoanele implicate." - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s?" - "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" + "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s? (există deja un utilizator cu acest cont)" + "Permiteți ca %1$s să creeze un nou utilizator folosind %2$s?" "Adăugați o limbă" "Regiunea preferată" "Numele limbii" diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 2d668f6a905ef055f5fd58c12b7b1b06c7b4e533..7cba3dfa015bb0b58184b68ad60e735617a712a0 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -97,6 +97,7 @@ "Голосовые сообщения" "Звонки по Wi-Fi" "Статус SIM-карты" + "Важные уведомления SIM-карты" "На устройстве абонента выбран режим телетайпа \"ВСЕ\"" "На устройстве абонента выбран режим телетайпа HCO" "На устройстве абонента выбран режим телетайпа VCO" @@ -556,11 +557,11 @@ "Значок отпечатка пальца" - "Управлять оборудованием для распознавания лиц" + "Управление аппаратным обеспечением для функции \"Фейсконтроль\"" "Приложение сможет добавлять и удалять шаблоны лиц." - "Использовать оборудование для распознавания лиц" - "Приложение сможет использовать распознающее оборудование для аутентификации." - "Распознавание лица" + "Использование аппаратного обеспечения для функции \"Фейсконтроль\"" + "Приложение сможет использовать для аутентификации аппаратное обеспечение Фейсконтроля." + "Фейсконтроль" "Зарегистрируйте лицо ещё раз" "Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз" "Не удалось собрать данные. Повторите попытку." @@ -573,7 +574,7 @@ "Переместите телефон влево." "Переместите телефон вправо." "Смотрите прямо на устройство." - "Вашего лица не видно. Смотрите на телефон." + "Держите телефон прямо перед лицом." "Не перемещайте устройство. Держите его неподвижно." "Повторите попытку." "Не удалось распознать лицо. Повторите попытку." @@ -582,19 +583,19 @@ "Держите голову ровнее." "Держите голову ровнее." "Ваше лицо плохо видно." - "Очистите сканер в верхней части экрана." + "Протрите верхнюю часть экрана (в том числе черную панель)." "Не удалось распознать лицо. Сканер недоступен." - "Лицо не распознано. Попробуйте ещё раз." + "Попробуйте воспользоваться функцией ещё раз." "Недостаточно места. Удалите старые данные для распознавания." - "Распознавание отменено." - "Распознавание лица отменено пользователем." + "Распознавание отменено" + "Фейсконтроль: операция отменена пользователем." "Слишком много попыток. Повторите позже." - "Слишком много попыток. Распознавание лица отключено." + "Слишком много попыток. Функция \"Фейсконтроль\" отключена." "Не удалось распознать лицо. Повторите попытку." - "Вы не настроили распознавание лица." - "Это устройство не поддерживает распознавание лица." + "Вы не настроили фейсконтроль." + "Это устройство не поддерживает функцию \"Фейсконтроль\"." "Лицо %d" @@ -1298,10 +1299,10 @@ "Нажмите, чтобы увидеть список сетей" "Подключиться" "Все сети" - "Подключиться к сети Wi-Fi?" - "Предложено приложением \"%s\"" - "Да" - "Нет" + "Подключаться к предложенным сетям Wi‑Fi?" + "Приложение \"%s\" рекомендует сети, к которым устройство может подключаться автоматически." + "Разрешить" + "Нет, спасибо" "Wi-Fi включится автоматически" "Когда вы будете в зоне действия сохраненной сети с хорошим сигналом." "Не включать снова" @@ -1717,8 +1718,8 @@ "Сервис %1$s отключен" "Чтобы использовать сервис \"%1$s\", нажмите и удерживайте обе клавиши громкости в течение трех секунд." "Выберите сервис, который будет запускаться при нажатии кнопки специальных возможностей:" - "Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх двумя пальцами):" - "Выберите сервис, который будет запускаться жестом для доступа к специальным возможностям (провести по экрану снизу вверх тремя пальцами):" + "Выберите сервис, который будет запускаться жестом (провести по экрану снизу вверх двумя пальцами):" + "Выберите сервис, который будет запускаться жестом (провести по экрану снизу вверх тремя пальцами):" "Для переключения между сервисами нажмите и удерживайте кнопку специальных возможностей." "Для переключения между сервисами проведите по экрану снизу вверх двумя пальцами и задержите их." "Для переключения между сервисами проведите по экрану снизу вверх тремя пальцами и задержите их." @@ -1955,8 +1956,8 @@ "Без категории" "Вы определяете важность этих уведомлений." "Важное (люди)" - "Разрешить приложению \"%1$s\" создать пользователя для аккаунта %2$s?" - "Разрешить приложению \"%1$s\" создать нового пользователя для аккаунта %2$s (пользователь c таким аккаунтом уже есть)?" + "Разрешить приложению \"%1$s\" создать нового пользователя с аккаунтом %2$s (пользователь с этим аккаунтом уже существует)?" + "Разрешить приложению \"%1$s\" создать нового пользователя с аккаунтом %2$s?" "Добавьте язык" "Региональные настройки" "Введите язык" diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index fdf4d53f15b491b4295e9d2a43df7ef7ddae307f..4d9c143e54ddb9f94ee34b825e0417e971a2df9e 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -95,6 +95,7 @@ "හඬ තැපැල් පණිවිඩ" "Wi-Fi ඇමතීම" "SIM තත්ත්වය" + "ඉහළ ප්‍රමුඛතා SIM තත්ත්වය" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය පූර්ණයි" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය HCO" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය VCO" @@ -550,11 +551,11 @@ "ඇඟිලි සලකුණු නිරූපකය" - "මුහුණු සත්‍යාපක දෘඪාංග කළමනාකරණය කරන්න" + "මුහුණු අඟුලු ඇරීමේ දෘඪාංග කළමනා කරන්න" "මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්‍රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි." - "මුහුණු සත්‍යාපක දෘඪාංග භාවිතා කරන්න" - "සත්‍යාපනය සඳහා සත්‍යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි" - "මුහුණු සත්‍යාපනය" + "මුහුණු අඟුලු ඇරීමේ දෘඪාංග භෘවිත කරන්න" + "සත්‍යාපනය සඳහා මුහුණු අඟුලු ඇරීමේ දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි" + "මුහුණු අඟුලු ඇරීම" "ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න" "හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න" "නිරවද්‍ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න." @@ -567,7 +568,7 @@ "දුරකථනය වමට ගෙන යන්න." "දුරකථනය දකුණට ගෙන යන්න." "ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න." - "ඔබේ මුහුණ දැකිය නොහැක. දුරකථනය වෙත බලන්න." + "ඔබේ මුහුණ දුරකථනයට සෘජුවම ඉදිරියෙන් ස්ථානගත කරන්න." "චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න." "ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න." "තවදුරටත් මුහුණ හඳුනාගත නොහැක. නැවත උත්සාහ කරන්න." @@ -576,19 +577,19 @@ "ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න." "ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න." "ඔබේ මුහුණ සඟවන කිසිවක් ඉවත් කරන්න." - "තිරයේ ඉහළ කෙළවරේ සංවේදකය පිරිසිදු කරන්න." + "කලු තීරුව ඇතුළුව, ඔබේ තිරයෙහි මුදුන පිරිසිදු කරන්න" "මුහුණ සත්‍යාපනය කළ නොහැක. දෘඩාංගය නොමැත." - "මුහුණු සත්‍යාපනයට උත්සාහ කරන්න." + "නැවතත් මුහුණු අඟුලු ඇරීම උත්සාහ කරන්න." "නව මුහුණු දත්ත ගබඩා කළ නොහැක. පළමුව පැරණි එකක් මකන්න." - "මුහුණු මෙහෙයුම අවලංගුයි" - "පරිශීලකයා විසින් මුහුණ සත්‍යාපනය අවලංගු කර ඇත" + "මුහුණු මෙහෙයුම අවලංගු කරන ලදී." + "පරිශීලකයා මුහුණු අඟුලු ඇරීම අවලංගු කර ඇත." "උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න." - "ප්‍රයත්නයන් බොහෝමයකි. මුහුණු සත්‍යාපනය අබලයි." + "ප්‍රයත්න ගණන වැඩියි. මුහුණු අඟුලු ඇරීම අබලයි." "මුහුණ සත්‍යාපන කළ නොහැක. නැවත උත්සාහ කරන්න." - "ඔබ මුහුණු සත්‍යාපනය පිහිටුවා නැත" - "මෙම උපාංගයෙහි මුහුණු සත්‍යාපනයට සහාය නොදක්වයි" + "ඔබ මුහුණු අඟුලු ඇරීම සකසා නැත" + "මෙම උපාංගයෙහි මුහුණු අඟුලු ඇරීමට සහය නොදැක්වේ" "මුහුණු %d" @@ -1256,10 +1257,10 @@ "සියලු ජාල බැලීමට තට්ටු කරන්න" "සම්බන්ධ කරන්න" "සියලු ජාල" - "Wi-Fi ජාල වෙත සම්බන්ධ කරන්නේද?" - "%s විසින් යෝජනා කරන ලදි" - "ඔව්" - "නැත" + "යෝජිත Wi-Fi ජාල ඉඩ දෙන්නද?" + "%s යෝජිත ජාල. උපාංගය ස්වයංක්‍රියව සම්බන්ධ වනු ඇත." + "ඉඩ දෙන්න" + "එපා, ස්තූතියි" "Wi‑Fi ස්වයංක්‍රියව ක්‍රියාත්මක වනු ඇත" "ඔබ උසස් තත්ත්වයේ සුරැකි ජාලයක් අවට සිටින විට" "නැවත ක්‍රියාත්මක නොකරන්න" @@ -1889,8 +1890,8 @@ "වර්ගීකරණය නොකළ" "ඔබ මෙම දැනුම්දීම්වල වැදගත්කම සකසා ඇත." "සම්බන්ධ වූ පුද්ගලයන් නිසා මෙය වැදගත් වේ." - "%1$s හට %2$s සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද?" - "%1$s හට %2$s සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද (මෙම ගිණුම සහිත පරිශීලකයෙකු දැනටමත් සිටී) ?" + "%1$s හට %2$s සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද (මෙම ගිණුම සහිත පරිශීලකයෙකු දැනටමත් සිටී) ?" + "%1$s හට %2$s සමගින් නව පරිශීලකයෙකු සෑදීමට ඉඩ දෙන්නද ?" "භාෂාවක් එක් කරන්න" "ප්‍රදේශ මනාපය" "භාෂා නම ටයිප් කරන්න" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 874b247d7621462d92e690910b6e68c3b068e86c..102b0d1f2e1b067d311634e2dd4b60410cbf0140 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -97,6 +97,7 @@ "Správy hlasovej schránky" "Volanie cez Wi‑Fi" "Stav SIM karty" + "Stav SIM karty: vysoká priorita" "Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu" @@ -556,11 +557,11 @@ "Ikona odtlačku prsta" - "správa hardvéru na overenie tváre" + "spravovať hardvér odomknutia tvárou" "Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí." - "používanie hardvéru na overenie tváre" - "Umožňuje aplikácii používať na overenie totožnosti hardvér na overenie tváre" - "Overenie tváre" + "používať hardvér Odomknutia tvárou" + "Umožňuje aplikácii používať na overenie totožnosti hardvér Odomknutia tvárou" + "Odomknutie tvárou" "Znova zaregistrujte svoju tvár" "Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie" "Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova." @@ -573,7 +574,7 @@ "Posuňte telefón doľava." "Posuňte telefón doprava." "Pozrite sa priamejšie na zariadenie." - "Nie je vidieť vašu tvár. Pozrite sa na telefón." + "Umiestnite svoju tvár priamo pred telefón." "Priveľa pohybu. Nehýbte telefónom." "Znova zaregistrujte svoju tvár." "Tvár už nie je možné rozpoznať. Skúste to znova." @@ -582,19 +583,19 @@ "Otočte hlavu o niečo menej." "Otočte hlavu o niečo menej." "Odstráňte všetko, čo vám zakrýva tvár." - "Vyčistite senzor v hornom okraji obrazovky." + "Vyčistite hornú časť obrazovky vrátane čierneho panela" "Tvár sa nedá overiť. Hardvér nie je k dispozícii." - "Vyskúšajte znova overenie tváre." + "Skúste znova použiť odomknutie tvárou." "Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov." - "Operácia týkajúca sa tváre bola zrušená" - "Overenie tváre bolo zrušené používateľom" + "Operácia týkajúca sa tváre bola zrušená" + "Odomknutie tvárou zrušil používateľ." "Príliš veľa pokusov. Skúste to znova neskôr." - "Príliš veľa pokusov. Overenie tváre bolo deaktivované." + "Príliš veľa pokusov. Odomknutie tvárou bolo zakázané." "Nedá sa overiť tvár. Skúste to znova." - "Overenie tváre ste nenastavili" - "Toto zariadenie nepodporuje overenie tváre" + "Nenastavili ste odomknutie tvárou." + "Toto zariadenie nepodporuje odomknutie tvárou." "Tvár %d" @@ -1298,10 +1299,10 @@ "Klepnutím zobrazíte všetky siete" "Pripojiť" "Všetky siete" - "Chcete sa pripojiť k sieťam Wi‑Fi?" - "Navrhuje %s" - "Áno" - "Nie" + "Chcete povoliť navrhované siete Wi‑Fi?" + "Siete navrhuje aplikácia %s. Zariadenie sa môže pripájať automaticky." + "Povoliť" + "Nie, ďakujem" "Wi‑Fi sa zapne automaticky" "Keď budete v blízkosti kvalitnej uloženej siete" "Znova nezapínať" @@ -1955,8 +1956,8 @@ "Nekategorizované" "Nastavili ste dôležitosť týchto upozornení." "Táto správa je dôležitá vzhľadom na osoby, ktorých sa to týka." - "Povoliť aplikácii %1$s vytvoriť nového používateľa pomocou účtu %2$s?" - "Povoliť aplikácii %1$s vytvoriť nového používateľa pomocou účtu %2$s (používateľ s týmto účtom už existuje)?" + "Chcete povoliť aplikácii %1$s vytvoriť nového používateľa pomocou účtu %2$s (používateľ s týmto účtom už existuje)?" + "Chcete povoliť aplikácii %1$s vytvoriť nového používateľa pomocou účtu %2$s?" "Pridať jazyk" "Preferovaný región" "Zadajte názov jazyka" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 2dc10edcee400110ac1a9fc797cfa798784cc47f..252ab4ceff5a46a5f526e401204316999d93b96b 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -97,6 +97,7 @@ "Sporočila v odzivniku" "Klicanje prek Wi-Fi-ja" "Stanje kartice SIM" + "Stanje kartice SIM z visoko stopnjo prednosti" "Enakovredna naprava je zahtevala način TTY FULL" "Enakovredna naprava je zahtevala način TTY HCO" "Enakovredna naprava je zahtevala način TTY VCO" @@ -556,11 +557,11 @@ "Ikona prstnih odtisov" - "upravljanje strojne opreme za preverjanje pristnosti obraza" + "upravljanje strojne opreme za odklepanje z obrazom" "Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo." - "uporaba strojne opreme za preverjanje pristnosti obraza" - "Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza" - "Preverjanje pristnosti z obrazom" + "uporaba strojne opreme za odklepanje z obrazom" + "Aplikaciji omogoča uporabo strojne opreme za odklepanje z obrazom za preverj. pristnosti" + "Odklepanje z obrazom" "Znova prijavite obraz" "Za izboljšanje prepoznavanja znova prijavite svoj obraz" "Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova." @@ -573,7 +574,7 @@ "Telefon premaknite v levo." "Telefon premaknite v desno." "Glejte bolj naravnost v napravo." - "Obraz ni viden. Poglejte v telefon." + "Obraz nastavite naravnost pred telefon." "Preveč se premikate. Držite telefon pri miru." "Znova prijavite svoj obraz." "Obraza ni več mogoče prepoznati. Poskusite znova." @@ -582,19 +583,19 @@ "Malce manj nagnite glavo." "Glejte malce bolj naravnost." "Umaknite vse, kar vam morda zakriva obraz." - "Očistite tipalo na zgornjem robu zaslona." + "Očistite vrhnji del zaslona, vključno s črno vrstico" "Obraza ni mogoče preveriti. Str. opr. ni na voljo." - "Znova izvedite preverjanje pristnosti z obrazom." + "Znova izvedite odklepanje z obrazom." "Novega obraza ni mogoče shraniti. Najprej izbrišite starega." - "Dejanje z obrazom je bilo preklicano" - "Preverjanje pristnosti obraza preklical uporabnik" + "Dejanje z obrazom je bilo preklicano." + "Odklepanje z obrazom je preklical uporabnik." "Preveč poskusov. Poskusite znova pozneje." - "Preveč poskusov. Preverjanje pristnosti obraza onemogočeno." + "Preveč poskusov. Odklepanje z obrazom je onemogočeno." "Obraza ni mogoče preveriti. Poskusite znova." - "Preverjanje pristnosti obraza ni nastavljeno" - "Ta naprava ne podpira preverjanja pristnosti obraza" + "Odklepanja z obrazom niste nastavili." + "Ta naprava ne podpira odklepanja z obrazom." "Obraz %d" @@ -1059,10 +1060,10 @@ pred %d minutami - pred %d uro - pred %d urama - pred %d urami - pred %d urami + pred %d h + pred %d h + pred %d h + pred %d h pred %d dnevom @@ -1298,10 +1299,10 @@ "Dotaknite se, če si želite ogledati vsa omrežja" "Vzpostavi povezavo" "Vsa omrežja" - "Želite vzpostaviti povezavo z omrežji Wi-Fi?" - "Predlagala aplikacija %s" - "Da" - "Ne" + "Želite dovoliti predlagana omrežja Wi-Fi?" + "%s – predlagana omrežja. Naprava se lahko poveže samodejno." + "Dovoli" + "Ne, hvala" "Povezava Wi‑Fi se bo samodejno vklopila" "Ko ste v bližini zanesljivega shranjenega omrežja" "Ne vklopi znova" @@ -1398,7 +1399,7 @@ "Zaznana je analogna dodatna zvočna oprema" "Priključena naprava ni združljiva s tem telefonom. Dotaknite se za več informacij." "Iskanje napak prek USB je povezano" - "Dotaknite se, če želite izklopiti odpravljanje napak prek USB-ja" + "Dotaknite se, če želite izklop. odpravlj. napak prek USB-ja" "Izberite, če želite onemogočiti iskanje in odpravljanje napak prek vrat USB." "Način preizkusnega ogrodja je omogočen" "Če želite onemogočiti način preizkusnega ogrodja, ponastavite napravo na tovarniške nastavitve." @@ -1536,7 +1537,7 @@ "Končano" "Brisanje skupne shrambe …" - "Deli z dr." + "Deli" "Najdi" "Spletno iskanje" "Najdi naslednje" @@ -1955,8 +1956,8 @@ "Nekategorizirano" "Vi določite raven pomembnosti teh obvestil." "Pomembno zaradi udeleženih ljudi." - "Dovolite, da aplikacija %1$s ustvari novega uporabnika za račun %2$s?" - "Dovolite aplikaciji %1$s, da ustvari novega uporabnika za račun %2$s (uporabnik s tem računom že obstaja)?" + "Ali aplikaciji %1$s dovolite, da ustvari novega uporabnika za račun %2$s (uporabnik s tem računom že obstaja)?" + "Ali aplikaciji %1$s dovolite, da ustvari novega uporabnika za račun %2$s?" "Dodajanje jezika" "Nastavitev območja" "Vnesite ime jezika" @@ -2050,7 +2051,7 @@ "Bližnjice ni bilo mogoče obnoviti zaradi neujemanja podpisa aplikacije" "Bližnjice ni bilo mogoče obnoviti" "Bližnjica je onemogočena" - "ODSTRANI" + "ODMESTI" "VSEENO ODPRI" "Zaznana je bila škodljiva aplikacija" "Aplikacija %1$s želi prikazati izreze aplikacije %2$s" diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 1c2f64ef900da26dd539a73fd5948b44c677c340..a92d1ee18aa490c409dbbc76bb4d1613ecb2c4cf 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -95,6 +95,7 @@ "Mesazhet e postës zanore" "Telefonata me Wi-Fi" "Statusi i kartës SIM" + "Statusi i kartës SIM me përparësi të lartë" "Homologu yt kërkoi modalitet \"TTY\" të plotë" "Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\"" "Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\"" @@ -550,11 +551,11 @@ "Ikona e gjurmës së gishtit" - "menaxho harduerin për vërtetimin e fytyrës" + "menaxho harduerin për shkyçjen me fytyrën" "Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura." - "përdor harduerin për vërtetimin e fytyrës" - "Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit" - "Vërtetimi me fytyrë" + "përdor harduerin e shkyçjes me fytyrën" + "Lejon aplikacionin të përdorë harduerin e shkyçjes me fytyrën për procesin e vërtetimit" + "Shkyçja me fytyrë" "Regjistro përsëri fytyrën tënde" "Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde" "S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri." @@ -567,7 +568,7 @@ "Lëvize telefonin majtas." "Lëvize telefonin djathtas" "Shiko më drejt në pajisjen tënde." - "Fytyra jote nuk shfaqet. Shiko te telefoni." + "Pozicionoje fytyrën tënde direkt përpara telefonit." "Ka shumë lëvizje. Mbaje telefonin të palëvizur." "Regjistroje përsëri fytyrën tënde." "Fytyra nuk mund të njihet më. Provo përsëri." @@ -576,19 +577,19 @@ "Ktheje kokën pak më pak." "Ktheje kokën pak më pak." "Hiq gjithçka që fsheh fytyrën tënde." - "Pastro sensorin në anën e sipërme të ekranit." + "Pastro kreun e ekranit, duke përfshirë shiritin e zi" "Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet." - "Provo përsëri vërtetimin e fytyrës." + "Provo përsëri shkyçjen me fytyrën." "S\'mund të ruhen të dhëna të reja fytyre. Fshi një të vjetër në fillim." - "Veprimi me fytyrën u anulua" - "Vërtetimi me fytyrë u anulua nga përdoruesi" + "Veprimi me fytyrën u anulua." + "Shkyçja me fytyrë u anulua nga përdoruesi." "Shumë përpjekje. Provo sërish më vonë." - "Shumë përpjekje. Vërtetimi me fytyrë u çaktivizua." + "Shumë përpjekje. Shkyçja me fytyrë u çaktivizua." "Fytyra nuk mund të verifikohet. Provo përsëri." - "Nuk e ke konfiguruar vërtetimin me fytyrë." - "Vërtetimi me fytyrë nuk mbështetet në këtë pajisje" + "Nuk e ke konfiguruar shkyçjen me fytyrë." + "Shkyçja me fytyrë nuk mbështetet në këtë pajisje" "Fytyra %d" @@ -1254,10 +1255,10 @@ "Trokit për të parë të gjitha rrjetet" "Lidhu" "Të gjitha rrjetet" - "Do të lidhesh me rrjetet Wi-Fi?" - "Sugjeruar nga %s" - "Po" - "Jo" + "Të lejohen rrjetet e sugjeruara Wi‑Fi?" + "Rrjet e sugjeruara të %s. Pajisja mund të lidhet automatikisht." + "Lejo" + "Jo, faleminderit" "Wi‑Fi do të aktivizohet automatikisht" "Kur ndodhesh pranë një rrjeti të ruajtur me cilësi të lartë" "Mos e aktivizo përsëri" @@ -1672,7 +1673,7 @@ "Zgjidh një shërbim për ta përdorur kur troket butonin e qasshmërisë:" "Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me dy gishta):" "Zgjidh një shërbim për ta përdorur me gjestin e qasshmërisë (rrëshqit shpejt lart nga fundi i ekranit me tre gishta):" - "Për të kaluar mes shërbimeve, prek dhe mbaj prekur butonin e qasshmërisë." + "Për të kaluar mes shërbimeve, prek dhe mbaj të shtypur butonin e qasshmërisë." "Për të kaluar mes pajisjeve, rrëshqit shpejt lart me dy gishta dhe mbaje prekur." "Për të kaluar mes pajisjeve, rrëshqit shpejt lart me tre gishta dhe mbaje prekur." "Zmadhimi" @@ -1888,8 +1889,8 @@ "E pakategorizuara" "Ke caktuar rëndësinë e këtyre njoftimeve." "Është i rëndësishëm për shkak të personave të përfshirë." - "Të lejohet %1$s që të krijojë një përdorues të ri me %2$s ?" - "Të lejohet %1$s që të krijojë një përdorues të ri me %2$s (një përdorues me këtë llogari ekziston tashmë) ?" + "Të lejohet %1$s që të krijojë një përdorues të ri me %2$s (një përdorues me këtë llogari ekziston tashmë) ?" + "Të lejohet %1$s që të krijojë një përdorues të ri me %2$s ?" "Shto një gjuhë" "Preferenca e rajonit" "Shkruaj emrin e gjuhës" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 0b3656e1cb897a554a7e717b432699621bbccbfd..3d646689a82d267c6ea0bf77c32272edf428b172 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -27,7 +27,7 @@ "TB" "PB" "%1$s %2$s" - "<Без наслова>" + "<Без имена>" "(Нема броја телефона)" "Непознато" "Гласовна пошта" @@ -96,6 +96,7 @@ "Поруке говорне поште" "Позивање преко Wi-Fi мреже" "Статус SIM-а" + "Обавештења SIM картице са статусом „висок приоритет“" "Корисник захтева ПОТПУН режим TTY" "Корисник захтева ПРЕНОС ЗВУКА за режим TTY" "Корисник захтева ПРЕНОС ГЛАСА за режим TTY" @@ -553,11 +554,11 @@ "Икона отиска прста" - "управљање хардв. за потврду идентитета помоћу лица" + "управљање хардв. за откључавање лицем" "Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења." - "коришћење хардв. за потврду идентитета помоћу лица" - "Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица" - "Потврда идентитета лицем" + "коришћење хардвера за откључавање лицем" + "Дозвољава да апликација користи хардвер за откључавање лицем ради потврде идентитета" + "Откључавање лицем" "Поново региструјте лице" "Да бисте побољшали препознавање, поново региструјте лице" "Снимање лица није успело. Пробајте поново." @@ -570,7 +571,7 @@ "Померите телефон улево." "Померите телефон удесно." "Гледајте право у уређај." - "Не види се лице. Гледајте у телефон." + "Поставите лице директно испред телефона" "Много се померате. Држите телефон мирно." "Поново региструјте лице." "Више не може да се препозна лице. Пробајте поново." @@ -579,19 +580,19 @@ "Мало мање померите главу." "Мало мање померите главу." "Уклоните све што вам заклања лице." - "Очистите сензор на горњој ивици екрана." + "Очистите горњи део екрана, укључујући црну траку" "Провера лица није успела. Хардвер није доступан." - "Пробајте поново потврду идентитета помоћу лица." + "Пробајте поново откључавање лицем." "Нови подаци о лицу нису сачувани. Прво избришете претходне." - "Обрада лица је отказана" - "Корисник је отказао потврду идентитета лицем" + "Обрада лица је отказана." + "Корисник је отказао откључавање лицем" "Превише покушаја. Пробајте поново касније." - "Превише покушаја. Потврда идентитета лицем је онемогућена." + "Превише покушаја. Откључавање лицем је онемогућено." "Провера лица није успела. Пробајте поново." - "Нисте подесили потврду идентитета лицем" - "Препознавање лица није подржано на овом уређају" + "Нисте подесили откључавање лицем" + "Откључавање лицем није подржано на овом уређају" "Лице %d" @@ -1276,10 +1277,10 @@ "Додирните да бисте видели све мреже" "Повежи" "Све мреже" - "Желите ли да се повежете са Wi-Fi мрежама?" - "%s предлаже" - "Да" - "Не" + "Желите да дозволите предложене Wi‑Fi мреже?" + "Мреже које предлаже %s. Уређај ће се можда повезати аутоматски." + "Дозволи" + "Не, хвала" "Wi‑Fi ће се аутоматски укључити" "Када сте у близини сачуване мреже високог квалитета" "Не укључуј поново" @@ -1921,8 +1922,8 @@ "Некатегоризовано" "Ви подешавате важност ових обавештења." "Ово је важно због људи који учествују." - "Желите ли да дозволите апликацији %1$s да направи новог корисника за %2$s?" - "Желите ли да дозволите апликацији %1$s да направи новог корисника за %2$s (корисник са овим налогом већ постоји)?" + "Желите ли да дозволите да %1$s направи новог корисника са налогом %2$s (корисник са тим налогом већ постоји)?" + "Желите ли да дозволите да %1$s направи новог корисника са налогом %2$s?" "Додајте језик" "Подешавање региона" "Унесите назив језика" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 66256fa550de08742fd4ffc40b2ee8b352f6ec25..8c0ef5bad5c2c16d20e709aca13c26fc41fc88c7 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -95,6 +95,7 @@ "Röstmeddelanden" "Wi-Fi-samtal" "Status för SIM-kort" + "SIM-aviseringar med hög prioritet" "Peer-enheten begärde texttelefonläget FULL" "Peer-enheten begärde texttelefonläget HCO" "Peer-enheten begärde texttelefonläget VCO" @@ -550,11 +551,11 @@ "Ikon för fingeravtryck" - "hantera maskinvara för ansiktsautentisering" + "hantera maskinvara för ansiktslås" "Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar." - "använda maskinvara för ansiktsautentisering" - "Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering" - "Ansiktsautentisering" + "använd maskinvara för ansiktslås" + "Tillåter att appen använder maskinvara för ansiktslås vid autentisering" + "Ansiktslås" "Registrera ansiktet på nytt" "Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre" "Det gick inte att fånga ansiktsdata. Försök igen." @@ -567,7 +568,7 @@ "Flytta mobilen åt vänster." "Flytta mobilen åt höger." "Titta rakt på enheten." - "Ansiktet syns inte. Titta på mobilen." + "Ha ansiktet direkt framför telefonen." "För mycket rörelse. Håll mobilen stilla." "Registrera ansiktet på nytt." "Ansiktet kan inte längre kännas igen. Försök igen." @@ -576,19 +577,19 @@ "Vrid mindre på huvudet." "Vrid mindre på huvudet." "Ta bort allt som täcker ansiktet." - "Rengör sensorn på skärmens överkant." + "Rengör skärmens överkant, inklusive det svarta fältet" "Ansiktsverifiering går ej. Otillgänglig maskinvara." - "Testa ansiktsautentiseringen igen." + "Försök att använda ansiktslåset igen." "Kan inte lagra ny ansiktsdata. Radera först gammal data." - "Ansiktsåtgärden har avbrutits" - "Autentiseringen av ansiktet avbröts av användaren" + "Ansiktsåtgärden har avbrutits." + "Ansiktslås avbröts av användaren." "Du har gjort för många försök. Försök igen senare." - "För många försök. Ansiktsautentisering har inaktiverats." + "För många försök. Ansiktslås har inaktiverats." "Det gick inte att verifiera ansiktet. Försök igen." - "Du har inte konfigurerat ansiktsautentisering" - "Ansiktsautentisering stöds inte på den här enheten" + "Du har inte konfigurerat ansiktslås." + "Ansiktslås stöds inte på den här enheten." "Ansikte %d" @@ -1254,10 +1255,10 @@ "Tryck för att visa alla nätverk" "Anslut" "Alla nätverk" - "Vill du ansluta till Wi-Fi-nätverk?" - "Förslag från %s" - "Ja" - "Nej" + "Vill du tillåta föreslagna Wi-Fi-nätverk?" + "Nätverk som föreslagits av %s. Enheten kan anslutas automatiskt." + "Tillåt" + "Nej tack" "Wi-Fi aktiveras automatiskt" "När du är i närheten av ett sparat nätverk av hög kvalitet" "Återaktivera inte" @@ -1887,8 +1888,8 @@ "Okategoriserad" "Du anger hur viktiga aviseringarna är." "Detta är viktigt på grund av personerna som deltar." - "Tillåter du att %1$s skapar en ny användare för %2$s?" - "Tillåter du att %1$s skapar en ny användare för %2$s (det finns redan en användare med det här kontot)?" + "Tillåter du att %1$s skapar en ny användare för %2$s (det finns redan en användare med det här kontot)?" + "Tillåter du att %1$s skapar en ny användare för %2$s?" "Lägg till ett språk" "Regionsinställningar" "Ange språket" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1071aef3cc306c19369bb0745ba60b75b44fac87..632076815d2b9b3ecd12e1aa97b0d753e7a5ea33 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -95,6 +95,7 @@ "Ujumbe wa sauti" "Kupiga simu kupitia Wi-Fi" "Hali ya SIM" + "Hali ya SIM ya kipaumbele cha juu" "Hali ya TTY iliyoombwa na mtandao mwenza KAMILI" "Hali ya TTY iliyoombwa na mtandao mwenza HCO" "Hali ya TTY iliyoombwa na mtandao mwenza VCO" @@ -363,7 +364,7 @@ "Wezesha mtindo wa gari" "Inaruhusu programu kuwawezesha mtindo wa gari." "funga programu zingine" - "Inaruhusu programu kukamilisha michakato ya usuli ya programu nyingine. Hii inaweza kusababisha programu nyingine kukoma kufanyakazi." + "Huruhusu programu kukamilisha michakato ya chinichini ya programu nyingine. Hii inaweza kusababisha programu nyingine kuacha kufanya kazi." "Programu hii inaweza kuonekana juu ya programu zingine" "Programu hii inaweza kuonekana juu ya programu zingine au sehemu zingine za skrini. Hii huenda ikaathiri matumizi ya kawaida ya programu na kubadilisha jinsi ambavyo programu zingine zinavyoonekana." "tumia chini chini" @@ -550,11 +551,11 @@ "Aikoni ya kitambulisho" - "dhibiti maunzi ya kuthibitisha uso" + "dhibiti maunzi ya kufungua kwa uso" "Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa." - "tumia maunzi ya kuthibistiha uso" - "Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha" - "Utambuzi wa Uso" + "tumia maunzi ya kufungua kwa uso" + "Huruhusu programu itumie maunzi ya kufungua kwa uso ili kuthibitisha" + "Kufungua kwa uso" "Sajili uso wako tena" "Ili kuimarisha utambuzi, tafadhali sajili uso wako tena" "Imeshindwa kunasa data sahihi ya uso. Jaribu tena." @@ -567,7 +568,7 @@ "Sogeza simu upande wa kushoto." "Sogeza simu upande wa kulia." "Tafadhali angalia kifaa chako moja kwa moja." - "Uso wako hauonekani. Angalia simu." + "Weka uso wako moja kwa moja mbele ya simu." "Inatikisika sana. Ishike simu iwe thabiti." "Tafadhali sajili uso wako tena." "Haiwezi tena kutambua uso. Jaribu tena." @@ -576,19 +577,19 @@ "Geuza kichwa chako kidogo." "Geuza kichwa chako kidogo." "Ondoa kitu chochote kinachoficha uso wako." - "Safisha kitambuzi kwenye ukingo wa juu wa skrini." + "Safisha sehemu ya juu ya skrini yako, ikiwa ni pamoja na upau mweusi" "Imeshindwa kuthibitisha uso. Maunzi hayapatikani." - "Jaribu tena uthibitishaji wa uso." + "Jaribu kufungua kwa uso tena." "Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza." - "Utendaji wa kitambulisho umeghairiwa" - "Mtumiaji ameghairi uthibitishaji wa uso" + "Utendaji wa kitambulisho umeghairiwa." + "Kufungua kwa uso kumeghairiwa na mtumiaji." "Umejaribu mara nyingi mno. Jaribu tena baadaye." - "Umejaribu mara nyingi mno. Uthibitishaji wa uso umezimwa." + "Umejaribu mara nyingi mno. Kipengele cha kufungua kwa uso kimezimwa." "Imeshindwa kuthibitisha uso. Jaribu tena." - "Hujaweka mipangilio ya uthibitishaji wa uso" - "Uthibitishaji wa uso hautumiki kwenye kifaa hiki" + "Hujaweka mipangilio ya kufungua kwa uso." + "Kufungua kwa uso hakutumiki kwenye kifaa hiki." "Uso wa %d" @@ -1192,7 +1193,7 @@ "Kompyuta kibao inasasishwa…" "Kifaa kinasasishwa…" "Simu inawaka…" - "Inaanzisha Android..." + "Inawasha Android..." "Kompyuta kibao inawaka…" "Kifaa kiwaka…" "Inaboresha hifadhi." @@ -1254,10 +1255,10 @@ "Gusa ili uone mitandao yote" "Unganisha" "Mitandao yote" - "Je, ungependa kuunganisha kwenye mitandao ya Wi-Fi?" - "Imependekezwa na %s" - "Ndiyo" - "Hapana" + "Ungependa kuruhusu mitandao inayopendekezwa ya Wi-Fi?" + "Mitandao inayopendekezwa kwa ajili ya %s. Huenda kifaa kikaunganisha kiotomatiki." + "Ruhusu" + "Hapana, asante" "Wi‑Fi itawashwa kiotomatiki" "Unapokuwa karibu na mtandao uliohifadhiwa wenye ubora wa juu" "Usiwashe tena" @@ -1887,8 +1888,8 @@ "Ambazo aina haijabainishwa" "Uliweka mipangilio ya umuhimu wa arifa hizi." "Hii ni muhimu kwa sababu ya watu waliohusika." - "Ungependa kuruhusu %1$s iunde Mtumiaji mpya ikitumia %2$s?" - "Ungependa kuruhusu %1$s iunde Mtumiaji mpya ikitumia %2$s (Je, akaunti hii tayari ina Mtumiaji)?" + "Ruhusu %1$s iweke Mtumiaji mpya ikitumia %2$s (Je, tayari kuna mtumiaji anayetumia akaunti hii)?" + "Ungependa kuruhusu %1$s iweke Mtumiaji mpya ikitumia %2$s?" "Ongeza lugha" "Mapendeleo ya eneo" "Weka jina la lugha" diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 51d0ffa84a908ed8375d14806c238d1872060385..a76538bf3cbfc476ad8da4d62892e0a26b104f00 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -95,6 +95,7 @@ "குரலஞ்சல் செய்திகள்" "வைஃபை அழைப்பு" "சிம் நிலை" + "அதிக முன்னுரிமையுடைய சிம்மின் நிலை" "TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது" "TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது" @@ -219,7 +220,7 @@ "பாதுகாப்பான பயன்முறைக்கு மீண்டும் தொடங்கவும்" "பாதுகாப்பான பயன்முறைக்குச் செல்ல மீண்டும் துவக்க விரும்புகிறீர்களா? நீங்கள் நிறுவிய எல்லா மூன்றாம் தரப்பு பயன்பாடுகளையும் இது முடக்கும். நீங்கள் மீண்டும் மறுதொடக்கம் செய்யும்போது அவை மீட்டமைக்கப்படும்." "சமீபத்தியவை" - "சமீபத்திய பயன்பாடுகள் எதுவுமில்லை." + "சமீபத்திய ஆப்ஸ் எதுவுமில்லை." "டேப்லெட் விருப்பங்கள்" "டிவி விருப்பங்கள்" "தொலைபேசி விருப்பங்கள்" @@ -269,7 +270,7 @@ "ஆப்ஸ் இயங்குகிறது" "பேட்டரியைப் பயன்படுத்தும் ஆப்ஸ்" "%1$s ஆப்ஸ் பேட்டரியைப் பயன்படுத்துகிறது" - "%1$d பயன்பாடுகள் பேட்டரியைப் பயன்படுத்துகின்றன" + "%1$d ஆப்ஸ் பேட்டரியைப் பயன்படுத்துகின்றன" "பேட்டரி மற்றும் டேட்டா உபயோக விவரங்களைக் காண, தட்டவும்" "%1$s, %2$s" "பாதுகாப்பு பயன்முறை" @@ -339,33 +340,33 @@ "ஃபோன் அழைப்புகளுக்குப் பதிலளி" "உள்வரும் ஃபோன் அழைப்பிற்குப் பதிலளிக்க, ஆப்ஸை அனுமதிக்கும்." "உரைச் செய்திகளை (SMS) பெறுதல்" - "SMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிப்பதற்கு அல்லது நீக்குவதற்குப் பயன்பாட்டால் முடியும் என்பதாகும்." + "SMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிப்பதற்கு அல்லது நீக்குவதற்கு ஆப்ஸால் முடியும் என்பதாகும்." "உரைச் செய்திகளை (MMS) பெறுதல்" - "MMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்கவோ, நீக்கவோ பயன்பாட்டால் முடியும் என்பதாகும்." + "MMS செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்கவோ, நீக்கவோ ஆப்ஸால் முடியும் என்பதாகும்." "செல் அலைபரப்புச் செய்திகளைப் படித்தல்" - "உங்கள் சாதனத்தில் பெறப்படும் செல் அலைபரப்புச் செய்திகளைப் படிப்பதற்குப் ஆப்ஸை அனுமதிக்கிறது. அவசரநிலை சூழ்நிலைகளை உங்களுக்கு எச்சரிக்கைச் செய்வதற்கு சில இடங்களில் செல் அலைபரப்பு விழிப்பூட்டல்கள் வழங்கப்படும். அவசரநிலை மொபைல் அலைபரப்புப் பெறப்படும்போது உங்கள் சாதனத்தின் செயல்திறன் அல்லது செயல்பாட்டுடன் தீங்கிழைக்கும் பயன்பாடுகள் அதைத் தடுக்கலாம்." + "உங்கள் சாதனத்தில் பெறப்படும் செல் அலைபரப்புச் செய்திகளைப் படிப்பதற்குப் ஆப்ஸை அனுமதிக்கிறது. அவசரநிலை சூழ்நிலைகளை உங்களுக்கு எச்சரிக்கைச் செய்வதற்கு சில இடங்களில் செல் அலைபரப்பு விழிப்பூட்டல்கள் வழங்கப்படும். அவசரநிலை மொபைல் அலைபரப்புப் பெறப்படும்போது உங்கள் சாதனத்தின் செயல்திறன் அல்லது செயல்பாட்டுடன் தீங்கிழைக்கும் ஆப்ஸ் அதைத் தடுக்கலாம்." "குழுசேர்ந்த ஊட்டங்களைப் படித்தல்" "தற்போது ஒத்திசைந்த ஊட்டங்களைப் பற்றிய விவரங்களைப் பெற ஆப்ஸை அனுமதிக்கிறது." "SMS செய்திகளை அனுப்புதல் மற்றும் பார்த்தல்" - "SMS செய்திகளை அனுப்ப ஆப்ஸை அனுமதிக்கிறது. இதற்கு எதிர்பாராத பேமெண்ட்கள் விதிக்கப்படலாம். தீங்கு விளைவிக்கும் பயன்பாடுகள் உங்களின் உறுதிப்படுத்தல் எதுவுமின்றி செய்திகளை அனுப்பி உங்களுக்குக் கட்டணம் விதிக்கலாம்." + "SMS செய்திகளை அனுப்ப ஆப்ஸை அனுமதிக்கிறது. இதற்கு எதிர்பாராத பேமெண்ட்கள் விதிக்கப்படலாம். தீங்கு விளைவிக்கும் ஆப்ஸ் உங்களின் உறுதிப்படுத்தல் எதுவுமின்றி செய்திகளை அனுப்பி உங்களுக்குக் கட்டணம் விதிக்கலாம்." "உங்கள் உரைச் செய்திகளை (SMS அல்லது MMS) படித்தல்" "இந்த ஆப்ஸ் உங்கள் டேப்லெட்டில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்." "இந்த ஆப்ஸ் உங்கள் டிவியில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்." "இந்த ஆப்ஸ் உங்கள் மொபைலில் சேமிக்கப்பட்டுள்ள எல்லா SMS (உரை) செய்திகளையும் படிக்கலாம்." "உரைச் செய்திகளைப் (WAP) பெறுதல்" "WAP செய்திகளைப் பெற, செயற்படுத்தப் ஆப்ஸை அனுமதிக்கிறது. உங்களுக்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்க அல்லது நீக்குவதற்கான திறன் இந்த அனுமதியில் உள்ளடங்கும்." - "இயங்கும் பயன்பாடுகளை மீட்டெடுத்தல்" - "நடப்பில் மற்றும் சமீபத்தில் இயங்கும் காரியங்களின் தகவலைப் பெற ஆப்ஸை அனுமதிக்கிறது. சாதனத்தில் எந்தப் பயன்பாடுகள் பயன்படுத்தப்படுகின்றன என்பது குறித்த தகவலைக் கண்டறிய ஆப்ஸை இது அனுமதிக்கலாம்." + "இயங்கும் ஆப்ஸை மீட்டெடுத்தல்" + "நடப்பில் மற்றும் சமீபத்தில் இயங்கும் காரியங்களின் தகவலைப் பெற ஆப்ஸை அனுமதிக்கிறது. சாதனத்தில் எந்த ஆப்ஸ் பயன்படுத்தப்படுகின்றன என்பது குறித்த தகவலைக் கண்டறிய ஆப்ஸை இது அனுமதிக்கலாம்." "சுயவிவரத்தையும் சாதன உரிமையாளர்களையும் நிர்வகித்தல்" - "சுயவிவர உரிமையாளர்களையும் சாதன உரிமையாளரையும் அமைக்க, பயன்பாடுகளை அனுமதிக்கிறது." - "இயங்கும் பயன்பாடுகளை மறுவரிசைப்படுத்தல்" + "சுயவிவர உரிமையாளர்களையும் சாதன உரிமையாளரையும் அமைக்க, ஆப்ஸை அனுமதிக்கிறது." + "இயங்கும் ஆப்ஸை மறுவரிசைப்படுத்தல்" "பின்புலத்திலும், முன்புலத்திலும் காரியங்களை நகர்த்த ஆப்ஸை அனுமதிக்கிறது. உங்கள் உள்ளீடு இல்லாமலே ஆப்ஸ் இதைச் செய்யலாம்." "கார் பயன்முறையை இயக்குதல்" "கார் முறையை இயக்க, ஆப்ஸை அனுமதிக்கிறது." - "பிற பயன்பாடுகளை மூடுதல்" - "பிற பயன்பாடுகளின் பின்புலச் செயல்முறைகளை நிறுத்த ஆப்ஸை அனுமதிக்கிறது. இதனால் பிற பயன்பாடுகள் இயங்குவதை நிறுத்தலாம்." - "இந்த ஆப்ஸ் பிற பயன்பாடுகளின் மேலே தோன்றலாம்" - "இந்த ஆப்ஸ் பிற பயன்பாடுகளின் மேலே அல்லது திரையின் பிற பகுதிகளில் தோன்றலாம். இது வழக்கமான பயன்பாட்டு உபயோகத்தில் குறுக்கிட்டு, பிற பயன்பாடுகள் தோன்றும் விதத்தை மாற்றக்கூடும்." + "பிற ஆப்ஸை மூடுதல்" + "பிற ஆப்ஸின் பின்புலச் செயல்முறைகளை நிறுத்த ஆப்ஸை அனுமதிக்கிறது. இதனால் பிற ஆப்ஸ் இயங்குவதை நிறுத்தலாம்." + "இந்த ஆப்ஸ் பிற ஆப்ஸின் மேலே தோன்றலாம்" + "இந்த ஆப்ஸ் பிற ஆப்ஸின் மேலே அல்லது திரையின் பிற பகுதிகளில் தோன்றலாம். இது வழக்கமான ஆப்ஸ் உபயோகத்தில் குறுக்கிட்டு, பிற ஆப்ஸ் தோன்றும் விதத்தை மாற்றக்கூடும்." "பின்னணியில் இயக்கு" "இந்த ஆப்ஸ், பின்னணியில் இயங்கலாம். இதனால் பேட்டரி விரைவாகத் தீர்ந்துவிடக்கூடும்." "பின்னணியில் தரவைப் பயன்படுத்து" @@ -379,7 +380,7 @@ "பயன்பாட்டுச் சேமிப்பு இடத்தை அளவிடல்" "ஆப்ஸ், அதன் குறியீடு, தரவு, மற்றும் தற்காலிகச் சேமிப்பு அளவுகளை மீட்டெடுக்க அனுமதிக்கிறது" "சாதன அமைப்புகளை மாற்றுதல்" - "முறைமையின் அமைப்பு தரவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள், முறைமையின் உள்ளமைவைச் சிதைக்கலாம்." + "முறைமையின் அமைப்பு தரவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் ஆப்ஸ், முறைமையின் உள்ளமைவைச் சிதைக்கலாம்." "தொடக்கத்தில் இயக்குதல்" "மறுஇயக்கம் முடிந்தது, விரைவில் தானாகவே தொடங்க, ஆப்ஸை அனுமதிக்கிறது. இதனால் டேப்லெட் நீண்ட நேரம் கழித்து தொடங்கும் மற்றும் எப்போதும் இயங்குகின்ற டேப்லெட்டின் ஒட்டுமொத்தச் செயல்பாட்டையும் தாமதமாகும்." "சாதனம் தொடங்குவது முடிந்தவுடன், ஆப்ஸ் தானாகவே விரைவில் தொடங்க அனுமதிக்கிறது. இது டிவி தொடங்குவதற்கான நேரத்தைத் தாமதமாக்குவதோடு, எப்போதும் இயங்கிக்கொண்டிருப்பதன் மூலம் ஒட்டுமொத்த டேப்லெட்டின் வேகத்தைக் குறைக்க, ஆப்ஸை அனுமதிக்கிறது." @@ -389,21 +390,21 @@ "அலைபரப்பு முடிந்த பின்னரும் தங்கிவிடும் ஸ்டிக்கி அலைபரப்புகளை அனுப்ப, ஆப்ஸை அனுமதிக்கிறது. அளவுக்கதிகமான உபயோகமானது, டிவியின் வேகத்தைக் குறைக்கலாம் அல்லது அதிகமான நினைவகம் பயன்பட்டால் நிலையற்றதாகலாம்." "அலைபரப்பு முடிந்த பின்னும் இருக்கும், தொடர்ந்து அணுகத்தக்க அலைபரப்பை அனுப்பப் ஆப்ஸை அனுமதிக்கிறது. அதிகமாகப் பயன்படுத்தினால், மொபைலானது நினைவகத்தை மிக அதிகமாகப் பயன்படுத்துவதால் வேகம் குறைந்ததாகவும், நிலையற்றதாகவும் ஆகலாம்." "உங்கள் தொடர்புகளைப் படித்தல்" - "குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உட்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்." - "உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தனிநபர் எண்ணை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இந்த அனுமதியானது உங்கள் தொடர்புத் தரவைச் சேமிக்கப் ஆப்ஸை அனுமதிக்கிறது மற்றும் தீங்குவிளைவிக்கும் பயன்பாடுகள் உங்கள் அனுமதியின்றி தொடர்புத் தரவைப் பகிரலாம்." - "குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்ட எண்ணிக்கை உட்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க பயன்பாடுகளை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் பயன்பாடுகள் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்." + "குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உட்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க ஆப்ஸை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் ஆப்ஸ் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்." + "உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவைப் படிக்க, ஆப்ஸை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தனிநபர் எண்ணை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இந்த அனுமதியானது உங்கள் தொடர்புத் தரவைச் சேமிக்கப் ஆப்ஸை அனுமதிக்கிறது மற்றும் தீங்குவிளைவிக்கும் ஆப்ஸ் உங்கள் அனுமதியின்றி தொடர்புத் தரவைப் பகிரலாம்." + "குறிப்பிட்டவர்களுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்ட எண்ணிக்கை உட்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைப் படிக்க ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதி, உங்கள் தொடர்பு தரவைச் சேமிக்க ஆப்ஸை அனுமதிக்கிறது, மேலும் தீங்கிழைக்கும் ஆப்ஸ் உங்களுக்குத் தெரியாமல் தொடர்பு தரவைப் பகிரலாம்." "உங்கள் தொடர்புகளை மாற்றுதல்" - "குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது." + "குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்க ஆப்ஸை அனுமதிக்கிறது." "உங்கள் டிவியில் சேமிக்கப்பட்ட தொடர்புகள் பற்றிய தரவை மாற்ற, ஆப்ஸை அனுமதிக்கிறது, இதில் குறிப்பிட்ட தொடர்பை எத்தனைமுறை அழைத்தீர்கள், மின்னஞ்சல் செய்தீர்கள் அல்லது பிறவழிகளில் தொடர்புகொண்டீர்கள் என்பதும் அடங்கும். இது தொடர்புத் தரவை நீக்க, ஆப்ஸை அனுமதிக்கிறது." - "குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்கப் பயன்பாடுகளை அனுமதிக்கிறது." + "குறிப்பிட்ட தொடர்புகளுடன் நீங்கள் அழைத்த, மின்னஞ்சல் அனுப்பிய அல்லது வேறு வழியில் தொடர்புகொண்டதின் எண்ணிக்கை உள்பட, உங்கள் மொபைலில் சேமிக்கப்பட்ட உங்கள் தொடர்புகள் குறித்த தரவைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இந்த அனுமதியானது தொடர்புத் தரவை நீக்க ஆப்ஸை அனுமதிக்கிறது." "அழைப்புப் பதிவைப் படித்தல்" "இந்த ஆப்ஸ் உங்கள் அழைப்பு வரலாற்றைப் படிக்கலாம்." "அழைப்புப் பதிவை எழுதுதல்" - "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் டேப்லெட்டின் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்." - "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்ளிட்ட உங்கள் டிவியின் அழைப்பு பதிவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பு பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்." - "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் மொபைல் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்." + "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் டேப்லெட்டின் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தலாம்." + "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்ளிட்ட உங்கள் டிவியின் அழைப்பு பதிவைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பு பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தலாம்." + "உள்வரும் மற்றும் வெளிச்செல்லும் அழைப்புகள் குறித்த தகவல் உள்பட உங்கள் மொபைல் அழைப்புப் பதிவைத் திருத்துவதற்குப் ஆப்ஸை அனுமதிக்கிறது. உங்கள் அழைப்பின் பதிவை அழிக்க அல்லது திருத்த தீங்கு விளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தலாம்." "உடல் உணர்விகளை (இதயத் துடிப்பு மானிட்டர்கள் போன்றவை) அணுகுதல்" - "உங்கள் இதயத்துடிப்பு விகிதம் போன்ற உங்கள் உடல்நிலையைக் கண்காணிக்கும் உணர்விகளில் இருந்து தரவை அணுக பயன்பாடுகளை அனுமதிக்கும்." + "உங்கள் இதயத்துடிப்பு விகிதம் போன்ற உங்கள் உடல்நிலையைக் கண்காணிக்கும் உணர்விகளில் இருந்து தரவை அணுக ஆப்ஸை அனுமதிக்கும்." "கேலெண்டர் நிகழ்வுகளையும் விவரங்களையும் படிக்கலாம்" "இந்த ஆப்ஸ் உங்கள் டேப்லெட்டில் சேமிக்கப்பட்டுள்ள கேலெண்டர் நிகழ்வுகள் அனைத்தையும் படிக்கலாம், உங்கள் கேலெண்டர் தரவைப் பகிரலாம் அல்லது சேமிக்கலாம்." "இந்த ஆப்ஸ் உங்கள் டிவியில் சேமிக்கப்பட்டுள்ள எல்லா கேலெண்டர் நிகழ்வுகளையும் படிக்கலாம், உங்கள் கேலெண்டர் தரவைப் பகிரலாம் அல்லது சேமிக்கலாம்." @@ -435,7 +436,7 @@ "அதிர்வைக் கட்டுப்படுத்துதல்" "அதிர்வைக் கட்டுப்படுத்தப் ஆப்ஸை அனுமதிக்கிறது." "தொலைபேசி எண்களை நேரடியாக அழைத்தல்" - "உங்கள் தலையீட்டின்றி மொபைல் எண்களை அழைக்கப் ஆப்ஸை அனுமதிக்கிறது. இதன் விளைவாக எதிர்பாராத கட்டணங்களோ அழைப்புகளோ ஏற்படலாம். அவசரகால எண்களை அழைக்க இது ஆப்ஸை அனுமதிக்காது என்பதை நினைவில்கொள்ளவும். தீங்கிழைக்கும் பயன்பாடுகள், உங்கள் உறுதிப்படுத்தல் இன்றி அழைப்புகளைச் செய்வதால் உங்களுக்குச் செலவு ஏற்படக்கூடும்." + "உங்கள் தலையீட்டின்றி மொபைல் எண்களை அழைக்கப் ஆப்ஸை அனுமதிக்கிறது. இதன் விளைவாக எதிர்பாராத கட்டணங்களோ அழைப்புகளோ ஏற்படலாம். அவசரகால எண்களை அழைக்க இது ஆப்ஸை அனுமதிக்காது என்பதை நினைவில்கொள்ளவும். தீங்கிழைக்கும் ஆப்ஸ், உங்கள் உறுதிப்படுத்தல் இன்றி அழைப்புகளைச் செய்வதால் உங்களுக்குச் செலவு ஏற்படக்கூடும்." "IMS அழைப்புச் சேவையை அணுகுதல்" "உங்கள் குறுக்கீடின்றி IMS சேவையைப் பயன்படுத்தி அழைப்பதற்கு, ஆப்ஸை அனுமதிக்கும்." "மொபைல் நிலை மற்றும் அடையாளத்தைப் படித்தல்" @@ -550,11 +551,11 @@ "கைரேகை ஐகான்" - "முக அங்கீகாரத்திற்கான வன்பொருளை நிர்வகித்தல்" + "\'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளை நிர்வகித்தல்" "உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்." - "முக அங்கீகாரத்திற்கான வன்பொருளைப் பயன்படுத்துதல்" - "அடையாளம் காண்பதற்கு, முக அங்கீகார வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கிறது" - "முக அங்கீகாரம்" + "’முகம் காட்டித் திறத்தல்’ அம்சத்திற்கான வன்பொருளைப் பயன்படுத்துதல்" + "அடையாளம் காண \'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கும்" + "முகம் காட்டித் திறத்தல்" "முகத்தை மீண்டும் பதிவுசெய்யவும்" "அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்" "முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்." @@ -567,7 +568,7 @@ "மொபைலை இடப்புறம் நகர்த்தவும்." "மொபைலை வலப்புறம் நகர்த்தவும்." "முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்." - "முகம் சரியாகத் தெரியவில்லை. மொபைலைப் பார்க்கவும்." + "முகத்தை மொபைலுக்கு நேராக வைக்கவும்." "அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்." "உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்." "முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்." @@ -576,19 +577,19 @@ "தலையை லேசாகத் திருப்பவும்." "உங்கள் தலையைச் சற்றுத் திருப்பவும்." "உங்கள் முகத்தை மறைக்கும் அனைத்தையும் நீக்குக." - "திரையின் மேல்முனையிலுள்ள சென்சாரைச் சுத்தம் செய்க." + "திரையையும் அதிலுள்ள கருப்புப் பட்டியையும் சுத்தம் செய்யவும்" "முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை." - "முக அங்கீகாரத்தை மீண்டும் முயலவும்." + "\'முகம் காட்டித் திறத்தலை\' மீண்டும் முயலவும்." "புதிய முகங்களைச் சேர்க்க இயலவில்லை. பழையது ஒன்றை நீக்கவும்." - "முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது" - "முக அங்கீகாரம் பயனரால் ரத்துசெய்யப்பட்டது" + "முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது." + "\'முகம் காட்டித் திறத்தல்\' பயனரால் ரத்துசெய்யப்பட்டது." "பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்." - "பலமுறை முயன்றுவிட்டீர்கள். முக அங்கீகாரம் முடக்கப்பட்டது." + "பலமுறை முயன்றுவிட்டீர்கள். \'முகம் காட்டித் திறத்தல்’ முடக்கப்பட்டது." "முகத்தைச் சரிபார்க்க இயலவில்லை. மீண்டும் முயலவும்." - "முக அங்கீகாரத்தை இன்னும் நீங்கள் அமைக்கவில்லை" - "இந்தச் சாதனத்தில் முக அங்கீகாரம் ஆதரிக்கப்படவில்லை" + "’முகம் காட்டித் திறத்தலை’ நீங்கள் அமைக்கவில்லை." + "இந்த சாதனத்தில் ’முகம் காட்டித் திறத்தல்’ ஆதரிக்கப்படவில்லை." "முகம் %d" @@ -935,15 +936,15 @@ "உங்கள் இணையப் புத்தக்கக்குறிகள் மற்றும் வரலாற்றைப் படித்தல்" "உலாவி மூலம் பார்வையிட்ட எல்லா URLகளின் வரலாற்றையும், உலாவியில் குறிக்கப்பட்ட எல்லா புத்தகக்குறிகளையும் படிக்கப் ஆப்ஸை அனுமதிக்கிறது. குறிப்பு: மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகளால் இந்த அனுமதி செயற்படுத்தப்படாமல் போகலாம்." "இணையப் புத்தகக்குறிகளையும், வரலாற்றையும் எழுதுதல்" - "உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது." - "டிவியில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்க அல்லது திருத்த ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இந்த அனுமதி, மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற பயன்பாடுகள் போன்றவற்றில் செயல்படாமல் போகலாம்." - "உங்கள் மொபைலில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற பயன்பாடுகள் இந்த அனுமதியைச் செயற்படுத்த முடியாது." + "உங்கள் டேப்லெட்டில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற ஆப்ஸ் இந்த அனுமதியைச் செயற்படுத்த முடியாது." + "டிவியில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்க அல்லது திருத்த ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இந்த அனுமதி, மூன்றாம் தரப்பு உலாவிகள் அல்லது இணைய உலாவல் திறன்களுடன் கூடிய பிற ஆப்ஸ் போன்றவற்றில் செயல்படாமல் போகலாம்." + "உங்கள் மொபைலில் சேமிக்கப்பட்ட உலாவியின் வரலாறு அல்லது புத்தகக்குறிகளைத் திருத்த ஆப்ஸை அனுமதிக்கிறது. இது உலாவியின் தரவை அழிக்கவோ, திருத்தவோ ஆப்ஸை அனுமதிக்கலாம். குறிப்பு: இணைய உலாவல் செயல்திறன்கள் மூலம் மூன்றாம் தரப்பு உலாவிகள் அல்லது பிற ஆப்ஸ் இந்த அனுமதியைச் செயற்படுத்த முடியாது." "அலாரத்தை அமைத்தல்" "நிறுவிய அலார கடிகாரப் பயன்பாட்டில் அலாரத்தை அமைக்க, ஆப்ஸை அனுமதிக்கிறது. சில அலார கடிகார பயன்பாடுகளில் இந்த அம்சம் இல்லாமல் இருக்கலாம்." "குரலஞ்சலைச் சேர்த்தல்" "குரலஞ்சல் இன்பாக்ஸில் செய்திகளைச் சேர்க்க, ஆப்ஸை அனுமதிக்கிறது." "உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்துதல்" - "உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இடத் தகவலை தன்னிச்சையான இணையதளங்களுக்கு அனுப்புவதை அனுமதிக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்." + "உலாவியின் புவியியல் இருப்பிடம் சார்ந்த அனுமதிகளைத் திருத்த, ஆப்ஸை அனுமதிக்கிறது. இடத் தகவலை தன்னிச்சையான இணையதளங்களுக்கு அனுப்புவதை அனுமதிக்க, தீங்குவிளைவிக்கும் ஆப்ஸ் இதைப் பயன்படுத்தலாம்." "இந்தக் கடவுச்சொல்லை உலாவி நினைவில்கொள்ள விரும்புகிறீர்களா?" "இப்போது இல்லை" "நினைவில்கொள்" @@ -1152,10 +1153,10 @@ "படமெடு" "இந்தச் செயலுக்கு இயல்பாகப் பயன்படுத்து." "வேறு ஆப்ஸைப் பயன்படுத்தவும்" - "முறைமை அமைப்பு > பயன்பாடுகள் > பதிவிறக்கியவை என்பதில் உள்ள இயல்பை அழிக்கவும்." + "முறைமை அமைப்பு > ஆப்ஸ் > பதிவிறக்கியவை என்பதில் உள்ள இயல்பை அழிக்கவும்." "செயலைத் தேர்ந்தெடுக்கவும்" "USB சாதனத்திற்கான பயன்பாட்டைத் தேர்வுசெய்க" - "இந்தச் செயலைச் செய்ய பயன்பாடுகள் எதுவுமில்லை." + "இந்தச் செயலைச் செய்ய ஆப்ஸ் எதுவுமில்லை." "%1$s செயலிழந்தது" "%1$s செயலிழந்தது" "%1$s தொடர்ந்து செயலிழக்கிறது" @@ -1180,7 +1181,7 @@ "%1$s உண்மையாக வெளியிடப்பட்டது." "அளவு" "எப்போதும் காட்டு" - "சிஸ்டம் அமைப்பு > பயன்பாடுகள் > பதிவிறக்கம் என்பதில் இதை மீண்டும் இயக்கவும்." + "சிஸ்டம் அமைப்பு > ஆப்ஸ் > பதிவிறக்கம் என்பதில் இதை மீண்டும் இயக்கவும்." "தற்போதைய திரை அளவு அமைப்பை %1$s ஆதரிக்காததால், அது வழக்கத்திற்கு மாறாகச் செயல்படக்கூடும்." "எப்போதும் காட்டு" "%1$s பயன்பாடானது, இந்தச் சாதனத்தின் Android OSக்கு இணக்கமற்ற பதிப்பிற்காக உருவாக்கப்பட்டதால், இதில் சரியாகச் செயல்படாது. இந்த ஆப்ஸின் புதுப்பிக்கப்பட்ட பதிப்பானது தற்போது கிடைக்கக்கூடும்." @@ -1200,7 +1201,7 @@ "%1$sஐ மேம்படுத்துகிறது…" "%1$d / %2$d ஆப்ஸை ஒருங்கிணைக்கிறது." "%1$sஐத் தயார்செய்கிறது." - "பயன்பாடுகள் தொடங்கப்படுகின்றன." + "ஆப்ஸ் தொடங்கப்படுகின்றன." "துவக்குதலை முடிக்கிறது." "%1$s இயங்குகிறது" "கேமிற்குச் செல்ல, தட்டவும்" @@ -1254,10 +1255,10 @@ "எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்" "இணை" "எல்லா நெட்வொர்க்குகளும்" - "வைஃபை நெட்வொக்குகளுடன் இணைக்கவா?" - "%s ஆப்ஸால் பரிந்துரைக்கப்பட்டது" - "சரி" - "வேண்டாம்" + "பரிந்துரைக்கப்பட்ட வைஃபை நெட்வொர்க்குகளை அனுமதிக்க வேண்டுமா?" + "%s பரிந்துரைக்கும் நெட்வொர்க்குகள். சாதனம் தானாக இணைக்கப்படக்கூடும்." + "அனுமதி" + "வேண்டாம்" "வைஃபை தானாக ஆன் ஆகும்" "சேமித்த, உயர்தர நெட்வொர்க்கிற்கு அருகில் இருக்கும்போது" "மீண்டும் ஆன் செய்யாதே" @@ -1319,7 +1320,7 @@ "அனுப்பு" "ரத்துசெய்" "எனது விருப்பத்தேர்வை நினைவில்கொள்" - "அமைப்பு > பயன்பாடுகள் என்பதில் பிறகு நீங்கள் மாற்றலாம்" + "அமைப்பு > ஆப்ஸ் என்பதில் பிறகு நீங்கள் மாற்றலாம்" "எப்போதும் அனுமதி" "ஒருபோதும் அனுமதிக்காதே" "சிம் கார்டு அகற்றப்பட்டது" @@ -1377,7 +1378,7 @@ " ABCDEFGHIJKLMNOPQRSTUVWXYZ" " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "பிற ஆப்ஸின் மேலே காட்டு" - "%s பிற பயன்பாடுகளின் மீது தோன்றுகிறது" + "%s பிற ஆப்ஸின் மீது தோன்றுகிறது" "%s பிற ஆப்ஸின் மீது தோன்றுகிறது" "%s இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்." "ஆஃப் செய்" @@ -1443,7 +1444,7 @@ "செயலாக்கு" "%s ஐப் பயன்படுத்தி\nஅழை" "%s ஐப்\nபயன்படுத்தி தொடர்பை உருவாக்கு" - "பின்வரும் ஒன்று அல்லது அதற்கு மேற்பட்ட பயன்பாடுகள், இப்போதும் எதிர்காலத்திலும் உங்கள் கணக்கை அணுகுவதற்கான அனுமதியைக் கோருகின்றன." + "பின்வரும் ஒன்று அல்லது அதற்கு மேற்பட்ட ஆப்ஸ், இப்போதும் எதிர்காலத்திலும் உங்கள் கணக்கை அணுகுவதற்கான அனுமதியைக் கோருகின்றன." "இந்தக் கோரிக்கையை அனுமதிக்க விரும்புகிறீர்களா?" "‍அணுகல் கோரிக்கை" "அனுமதி" @@ -1888,8 +1889,8 @@ "வகைப்படுத்தப்படாதவை" "இந்த அறிவிப்புகளின் முக்கியத்துவத்தை அமைத்துள்ளீர்கள்." "ஈடுபட்டுள்ளவர்களின் காரணமாக, இது முக்கியமானது." - "%2$s மூலம் புதிய பயனரை உருவாக்க %1$sஐ அனுமதிக்கவா?" - "%2$s (இந்தக் கணக்கில் ஏற்கனவே ஒரு பயனர் உள்ளார்) மூலம் புதிய பயனரை உருவாக்க %1$sஐ அனுமதிக்கவா?" + "%2$s மூலம் புதிய பயனரை உருவாக்க %1$s ஆப்ஸை அனுமதிக்கவா (இந்தக் கணக்கில் ஏற்கெனவே ஒரு பயனர் உள்ளார்) ?" + "%2$s மூலம் புதிய பயனரை உருவாக்க %1$s ஆப்ஸை அனுமதிக்கவா?" "மொழியைச் சேர்" "மண்டல விருப்பம்" "மொழி பெயரை உள்ளிடுக" @@ -1998,7 +1999,7 @@ "அமைப்புகள்" "கேமரா" "மைக்ரோஃபோன்" - "உங்கள் திரையில் உள்ள பிற பயன்பாடுகளின் மேல் காட்டுகிறது" + "உங்கள் திரையில் உள்ள பிற ஆப்ஸின் மேல் காட்டுகிறது" "வழக்கமான பேட்டரி சேமிப்பானுக்கான விவர அறிவிப்பு" "வழக்கமாகச் சார்ஜ் செய்வதற்கு முன்பே பேட்டரி தீர்ந்துபோகக்கூடும்" "பேட்டரி நிலையை நீட்டிக்க பேட்டரி சேமிப்பான் இயக்கப்பட்டுள்ளது" diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 1556b1739fb729fb8b478bca1ef7dc82bbe3195f..6112bc596c23c39f8664523275a836ebc3c37b34 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -95,6 +95,7 @@ "వాయిస్ మెయిల్ సందేశాలు" "Wi-Fi కాలింగ్" "SIM స్థితి" + "అధిక ప్రాధాన్యత గల SIM స్థితి" "అవతలి వారు FULL TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు HCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు VCO TTY మోడ్‌ని అభ్యర్థించారు" @@ -290,7 +291,7 @@ "మీ క్యాలెండర్‌ని యాక్సెస్ చేయడానికి <b>%1$s</b>ని అనుమతించాలా?" "SMS" "SMS సందేశాలను పంపడం మరియు వీక్షించడం" - "SMS సందేశాలు పంపడానికి మరియు వీక్షించడానికి <b>%1$s</b>ని అనుమతించాలా?" + "SMS సందేశాలు పంపడం, చూడటం చేయగలిగేలా <b>%1$s</b>ను అనుమతించాలా?" "నిల్వ" "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి" "మీ పరికరంలోని ఫోటోలు, మీడియా మరియు ఫైల్‌లను యాక్సెస్ చేయడానికి <b>%1$s</b>ను అనుమతించాలా?" @@ -330,7 +331,7 @@ "స్థితి బార్‌ ఉండేలా చేయడానికి యాప్‌ను అనుమతిస్తుంది." "స్థితి పట్టీని విస్తరింపజేయడం/కుదించడం" "స్థితి బార్‌ను విస్తరింపజేయడానికి లేదా కుదించడానికి యాప్‌ను అనుమతిస్తుంది." - "సత్వరమార్గాలను ఇన్‌స్టాల్ చేయడం" + "షార్ట్‌కట్‌లను ఇన్‌స్టాల్ చేయడం" "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను జోడించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." "సత్వరమార్గాలను అన్ఇన్‌స్టాల్ చేయడం" "వినియోగదారు ప్రమేయం లేకుండానే హోమ్‌స్క్రీన్ సత్వరమార్గాలను తీసివేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది." @@ -358,7 +359,7 @@ "ప్రస్తుతం మరియు ఇటీవల అమలవుతున్న విధుల గురించి వివరణాత్మక సమాచారాన్ని తిరిగి పొందడానికి యాప్‌ను అనుమతిస్తుంది. ఇది పరికరంలో ఉపయోగించబడిన యాప్‌ల గురించి సమాచారాన్ని కనుగొనడానికి యాప్‌ను అనుమతించవచ్చు." "ప్రొఫైల్ మరియు పరికర యజమానులను నిర్వహించడం" "ప్రొఫైల్ యజమానులను మరియు పరికరం యజమానిని సెట్ చేయడానికి అనువర్తనాలను అనుమతిస్తుంది." - "అమలవుతున్న అనువర్తనాలను మళ్లీ క్రమం చేయడం" + "అమలవుతోన్న యాప్‌లను మళ్లీ క్రమం చేయడం" "విధులను ముందుకు మరియు నేపథ్యానికి తరలించడానికి యాప్‌ను అనుమతిస్తుంది. యాప్ మీ ప్రమేయం లేకుండానే దీన్ని చేయవచ్చు." "కారు మోడ్‌ను ప్రారంభించడం" "కారు మోడ్‌ను ప్రారంభించడానికి యాప్‌ను అనుమతిస్తుంది." @@ -450,7 +451,7 @@ "పరికరం యొక్క ఫోన్ నంబర్‌లను యాక్సెస్ చేయడానికి యాప్‌ను అనుమతిస్తుంది." "టాబ్లెట్‌ను నిద్రావస్థకు వెళ్లనీయకుండా నిరోధించడం" "టీవీ నిద్రావస్థకు వెళ్లకుండా నిరోధించడం" - "ఫోన్‌ను నిద్రావస్థకు వెళ్లనీయకుండా నిరోధించడం" + "ఫోన్‌ను స్లీప్ మోడ్‌లోకి వెళ్లనీయకుండా నిరోధించగలగడం" "నిద్రావస్థకి వెళ్లకుండా టాబ్లెట్‌ను నిరోధించడానికి యాప్‌ను అనుమతిస్తుంది." "టీవీ నిద్రావస్థకు వెళ్లకుండా నిరోధించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." "నిద్రావస్థకి వెళ్లకుండా ఫోన్‌ను నిరోధించడానికి యాప్‌ను అనుమతిస్తుంది." @@ -472,7 +473,7 @@ "ఫోన్‌కు తెలిసిన ఖాతాల జాబితాను పొందడానికి యాప్‌ను అనుమతిస్తుంది. దీనిలో మీరు ఇన్‌స్టాల్ చేసిన యాప్‌ల ద్వారా సృష్టించబడిన ఖాతాలు ఏవైనా ఉండవచ్చు." "నెట్‌వర్క్ కనెక్షన్‌లను వీక్షించడం" "ఏ నెట్‌వర్క్‌లు ఉన్నాయి మరియు కనెక్ట్ చేయబడ్డాయి వంటి నెట్‌వర్క్ కనెక్షన్‌ల గురించి సమాచారాన్ని వీక్షించడానికి యాప్‌ను అనుమతిస్తుంది." - "పూర్తి నెట్‌వర్క్ ప్రాప్యతను కలిగి ఉండటం" + "నెట్‌వర్క్‌ను పూర్తిగా యాక్సెస్ చేయగలగడం" "నెట్‌వర్క్ సాకెట్‌లను సృష్టించడానికి మరియు అనుకూల నెట్‌వర్క్ ప్రోటోకాల్‌లను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది. బ్రౌజర్ మరియు ఇతర యాప్‌లు ఇంటర్నెట్‌కు డేటా పంపడానికి మార్గాలను అందిస్తాయి, కనుక ఇంటర్నెట్‌కు డేటా పంపడానికి ఈ అనుమతి అవసరం లేదు." "నెట్‌వర్క్ కనెక్టివిటీని మార్చడం" "నెట్‌వర్క్ కనెక్టివిటీ యొక్క స్థితిని మార్చడానికి యాప్‌ను అనుమతిస్తుంది." @@ -550,11 +551,11 @@ "వేలిముద్ర చిహ్నం" - "ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను నిర్వహించండి" + "ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్ నిర్వహణ" "వినియోగం కోసం ముఖ టెంప్లేట్‌లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్‌ను అనుమతిస్తుంది." - "ముఖ ప్రమాణీకరణ హార్డ్‌వేర్‌ను వాడండి" - "ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ని అనుమతిస్తుంది" - "ముఖ ప్రామాణీకరణ" + "ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్ వినియోగం" + "ప్రమాణీకరణ కోసం ముఖంతో అన్‌లాక్ చేయగల హార్డ్‌వేర్‌ను ఉపయోగించడానికి యాప్‌ను అనుమతిస్తుంది" + "ముఖంతో అన్‌లాక్" "మీ ముఖాన్ని తిరిగి నమోదు చేయండి" "గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి" "ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి." @@ -567,7 +568,7 @@ "ఫోన్‌ను ఎడమవైపునకు జరపండి." "ఫోన్‌ను కుడివైపునకు జరపండి." "దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి." - "మీ ముఖం కనిపించడం లేదు. ఫోన్ వైపు చూడండి." + "మీ ముఖాన్ని ఫోన్‌కు ఎదురుగా ఉంచండి." "బాగా కదుపుతున్నారు. ఫోన్‌ను స్థిరంగా పట్టుకోండి" "దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి." "ఇక ముఖం గుర్తించలేదు. మళ్లీ ప్రయత్నించండి." @@ -576,28 +577,28 @@ "మీ తలను ఇంకాస్త తక్కువ తిప్పండి." "మీ తలను ఎడమ/కుడి వైపుగా ఇంకాస్త తిప్పండి." "మీ ముఖానికి అడ్డుగా ఉన్నవాటిని తీసివేస్తుంది." - "స్క్రీన్ ఎగువన ఉన్న సెన్సార్‌ను శుభ్రం చేస్తుంది." + "నల్లని పట్టీతో సహా మీ స్క్రీన్ పైభాగం అంతటినీ శుభ్రంగా తుడవండి" "ముఖం ధృవీకరించలేరు. హార్డ్‌వేర్ అందుబాటులో లేదు." - "ముఖ ప్రామాణీకరణను మళ్ళీ ప్రయత్నించండి." + "ముఖంతో అన్‌లాక్‌ను మళ్లీ ప్రయత్నించండి." "కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి." - "ముఖ కార్యకలాపం రద్దయింది" - "వినియోగదారు ద్వారా ముఖ ప్రామాణీకరణ రద్దు చేయబడింది" + "ముఖ కార్యకలాపం రద్దయింది." + "ముఖంతో అన్‌లాక్‌ను వినియోగదారు రద్దు చేశారు." "చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి." - "అనేకసార్లు ప్రయత్నించారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది." + "అనేకసార్లు ప్రయత్నించారు. ముఖంతో అన్‌లాక్ నిలిపివేయబడింది." "ముఖం ధృవీకరించలేకపోయింది. మళ్లీ ప్రయత్నించండి." - "మీరు ముఖ ప్రామాణీకరణను సెటప్ చేయలేదు" - "ఈ పరికరంలో ముఖ ప్రమాణీకరణకు మద్దతు లేదు" + "మీరు ముఖంతో అన్‌లాక్‌ను సెటప్ చేయలేదు." + "ఈ పరికరంలో ముఖంతో అన్‌లాక్‌ను ఉపయోగించడానికి మద్దతు లేదు." "ముఖ %d" "ముఖ చిహ్నం" - "సమకాలీకరణ సెట్టింగ్‌లను చదవడం" + "సింక్ సెట్టింగ్‌లను చదవగలగడం" "ఖాతా యొక్క సమకాలీకరణ సెట్టింగ్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది. ఉదాహరణకు, వ్యక్తుల యాప్‌ ఖాతాతో సమకాలీకరించబడాలా లేదా అనే విషయాన్ని ఇది నిశ్చయించవచ్చు." - "సమకాలీకరణను ఆన్ మరియు ఆఫ్‌కు టోగుల్ చేయడం" + "\'సింక్\'ను ఆన్, ఆఫ్‌ల మధ్య టోగుల్ చేయడం" "ఖాతా యొక్క సమకాలీకరణ సెట్టింగ్‌లను సవరించడానికి యాప్‌ను అనుమతిస్తుంది. ఉదాహరణకు, ఇది ఒక ఖాతాతో వ్యక్తుల యాప్ యొక్క సమకాలీకరణను ప్రారంభించడానికి ఉపయోగించబడవచ్చు." - "సమకాలీకరణ గణాంకాలను చదవడం" + "సింక్ గణాంకాలను చదవగలగడం" "ఖాతా యొక్క సమకాలీకరణ గణాంకాలను అలాగే సమకాలీకరణ ఈవెంట్‌ల చరిత్రను మరియు ఎంత డేటా సమకాలీకరించబడింది అనేవాటిని చదవడానికి యాప్‌ను అనుమతిస్తుంది." "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదువుతుంది" "మీ షేర్ చేసిన నిల్వ యొక్క కంటెంట్‌లను చదవడానికి యాప్‌ను అనుమతిస్తుంది." @@ -1254,10 +1255,10 @@ "అన్ని నెట్‌వర్క్‌లు చూడటానికి నొక్కండి" "కనెక్ట్ చేయి" "అన్ని నెట్‌వర్క్‌లు" - "Wi‑Fi నెట్‌వర్క్‌లకు కనెక్ట్ చేయాలా?" - "%s ద్వారా సూచించబడింది" - "అవును" - "లేదు" + "సూచించిన Wi‑Fi నెట్‌వర్క్‌లను అనుమతించాలా?" + "%s సూచించిన నెట్‌వర్క్‌లు. పరికరం ఆటోమేటిక్‌గా కనెక్ట్ అవచ్చు." + "అనుమతించు" + "వద్దు" "Wi‑Fi స్వయంచాలకంగా ఆన్ అవుతుంది" "మీరు అధిక నాణ్యత గల సేవ్ చేసిన నెట్‌వర్క్‌కు సమీపంగా ఉన్నప్పుడు" "తిరిగి ఆన్ చేయవద్దు" @@ -1327,7 +1328,7 @@ "పూర్తయింది" "సిమ్ కార్డు జోడించబడింది" "మొబైల్ నెట్‌వర్క్‌ను యాక్సెస్ చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి." - "పునఃప్రారంభించు" + "రీస్టార్ట్ చేయి" "మొబైల్ సేవను సక్రియం చేయండి" "మీ కొత్త SIMని సక్రియం చేయడానికి క్యారియర్ యాప్‌ను డౌన్‌లోడ్ చేయండి" "మీ కొత్త SIMని సక్రియం చేయడం కోసం %1$s యాప్‌ని డౌన్‌లోడ్ చేయండి" @@ -1603,7 +1604,7 @@ "ప్రసారం చేయండి" "పరికరానికి కనెక్ట్ చేయండి" "స్క్రీన్‌ను పరికరానికి ప్రసారం చేయండి" - "పరికరాల కోసం శోధిస్తోంది…" + "పరికరాల కోసం వెతుకుతోంది…" "సెట్టింగ్‌లు" "డిస్‌కనెక్ట్ చేయి" "స్కాన్ చేస్తోంది..." @@ -1664,13 +1665,13 @@ "షార్ట్‌కట్ ఆన్‌లో ఉన్నప్పుడు, రెండు వాల్యూమ్ బటన్‌లను 3 సెకన్ల పాటు నొక్కితే యాక్సెస్ సామర్థ్య ఫీచర్ ప్రారంభం అవుతుంది.\n\n ప్రస్తుత యాక్సెస్ సామర్థ్య ఫీచర్:\n %1$s\n\n సెట్టింగ్‌లు > యాక్సెస్ సామర్థ్యంలో మీరు ఫీచర్‌ను మార్చవచ్చు." "సత్వరమార్గాన్ని ఆఫ్ చేయి" "సత్వరమార్గాన్ని ఉపయోగించు" - "వర్ణ విలోమం" + "రంగుల మార్పిడి" "రంగు సవరణ" "యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా %1$s ఆన్ చేయబడింది" "యాక్సెస్ సామర్థ్య షార్ట్‌కట్ ద్వారా %1$s ఆఫ్ చేయబడింది" "%1$sని ఉపయోగించడానికి వాల్యూమ్ కీలు రెండింటినీ 3 సెకన్లు నొక్కి ఉంచండి" "యాక్సెసిబిలిటీ బటన్‌ను మీరు నొక్కినప్పుడు ఉపయోగించాల్సిన ఒక ఫీచర్‌ను ఎంచుకోండి:" - "యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (రెండు చేతి వేళ్లతో స్క్రీన్‌ను కింద నుండి పైకి స్వైప్ చేయండి):" + "యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (రెండు వేళ్లతో స్క్రీన్‌ను కింద నుండి పైకి స్వైప్ చేయండి):" "యాక్సెసిబిలిటీ సంజ్ఞతో ఉపయోగించడానికి ఒక సేవను ఎంచుకోండి (మూడు చేతి వేళ్లతో స్క్రీన్‌ను కింద నుండి పైకి స్వైప్ చేయండి):" "సేవల మధ్య మారడానికి, యాక్సెసిబిలిటీ బటన్‌ను నొక్కి & పట్టుకోండి." "సేవల మధ్య మారడానికి, రెండు చేతి వేళ్ళతో పైకి స్వైప్ చేసి పట్టుకోండి." @@ -1888,8 +1889,8 @@ "వర్గీకరించబడలేదు" "మీరు ఈ నోటిఫికేషన్‌ల ప్రాముఖ్యతను సెట్ చేసారు." "ఇందులో పేర్కొనబడిన వ్యక్తులను బట్టి ఇది చాలా ముఖ్యమైనది." - "%2$sతో కొత్త వినియోగదారుని సృష్టించడానికి %1$sని అనుమతించాలా ?" - "%2$sతో (ఈ ఖాతాతో ఇప్పటికే ఒక వినియోగదారు ఉన్నారు) కొత్త వినియోగదారుని సృష్టించడానికి %1$sని అనుమతించాలా?" + "%2$sతో కొత్త వినియోగదారుని సృష్టించడానికి %1$sను అనుమతించాలా (ఈ ఖాతాతో ఇప్పటికే ఒక వినియోగదారు ఉన్నారు) ?" + "%2$sతో కొత్త వినియోగదారుని సృష్టించడానికి %1$sను అనుమతించాలా?" "భాషను జోడించండి" "ప్రాంతం ప్రాధాన్యత" "భాష పేరును టైప్ చేయండి" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 8328af53957819b686329c1ec647c568513565b4..9258d4271a7e1c487f610f0a43558f234a0e4fc9 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -95,6 +95,7 @@ "ข้อความเสียง" "การโทรผ่าน Wi-Fi" "สถานะซิม" + "สถานะซิมลำดับความสำคัญสูง" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\"" @@ -297,7 +298,7 @@ "ไมโครโฟน" "บันทึกเสียง" "อนุญาตให้ <b>%1$s</b> บันทึกเสียงไหม" - "กิจกรรมการเคลื่อนไหวร่างกาย" + "การเคลื่อนไหวร่างกาย" "เข้าถึงกิจกรรมการเคลื่อนไหวร่างกายของคุณ" "อนุญาตให้ <b>%1$s</b> เข้าถึงกิจกรรมการเคลื่อนไหวร่างกายของคุณไหม" "กล้องถ่ายรูป" @@ -550,11 +551,11 @@ "ไอคอนลายนิ้วมือ" - "จัดการฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า" + "จัดการฮาร์ดแวร์ Face Unlock" "อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน" - "ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า" - "อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์" - "การตรวจสอบสิทธิ์ด้วยใบหน้า" + "ใช้ฮาร์ดแวร์ Face Unlock" + "อนุญาตให้แอปใช้ฮาร์ดแวร์ Face Unlock เพื่อตรวจสอบสิทธิ์" + "Face Unlock" "ลงทะเบียนใบหน้าอีกครั้ง" "โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ" "บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง" @@ -567,7 +568,7 @@ "เลื่อนโทรศัพท์ไปทางซ้าย" "เลื่อนโทรศัพท์ไปทางขวา" "โปรดมองตรงมาที่อุปกรณ์" - "ไม่เห็นหน้าเลย ลองมองที่โทรศัพท์" + "หันหน้าให้ตรงกับโทรศัพท์" "มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ" "โปรดลงทะเบียนใบหน้าอีกครั้ง" "จำใบหน้าไม่ได้แล้ว ลองอีกครั้ง" @@ -576,19 +577,19 @@ "จัดตำแหน่งศีรษะให้ตรง" "จัดตำแหน่งศีรษะให้ตรง" "เอาสิ่งที่ปิดบังใบหน้าออก" - "ทำความสะอาดเซ็นเซอร์ที่ขอบด้านบนของหน้าจอ" + "ทำความสะอาดด้านบนของหน้าจอ รวมถึงแถบสีดำ" "ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน" - "ลองใช้การตรวจสอบสิทธิ์ด้วยใบหน้าอีกครั้ง" + "ลองใช้ Face Unlock อีกครั้ง" "จัดเก็บข้อมูลใบหน้าใหม่ไม่ได้ ลบข้อมูลเก่าออกไปก่อน" - "ยกเลิกการดำเนินการด้วยใบหน้าแล้ว" - "ผู้ใช้ยกเลิกการตรวจสอบสิทธิ์ด้วยใบหน้า" + "ยกเลิกการดำเนินการกับใบหน้าแล้ว" + "ผู้ใช้ยกเลิกการใช้ Face Unlock" "ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง" - "ลองหลายครั้งเกินไป การตรวจสอบสิทธิ์ด้วยใบหน้าถูกปิดใช้" + "ลองหลายครั้งเกินไป ปิดใช้ Face Unlock แล้ว" "ยืนยันใบหน้าไม่ได้ ลองอีกครั้ง" - "คุณยังไม่ได้ตั้งค่าการตรวจสอบสิทธิ์ด้วยใบหน้า" - "อุปกรณ์นี้ไม่รองรับการตรวจสอบสิทธิ์ด้วยใบหน้า" + "คุณยังไม่ได้ตั้งค่า Face Unlock" + "อุปกรณ์นี้ไม่รองรับ Face Unlock" "ใบหน้า %d" @@ -1254,10 +1255,10 @@ "แตะเพื่อดูเครือข่ายทั้งหมด" "เชื่อมต่อ" "เครือข่ายทั้งหมด" - "เชื่อมต่อเครือข่าย Wi-Fi ไหม" - "แนะนำโดย %s" - "ใช่" - "ไม่" + "อนุญาตให้เชื่อมต่อเครือข่าย Wi-Fi ที่แนะนำไหม" + "เครือข่ายที่แนะนำโดย %s และอุปกรณ์อาจเชื่อมต่อโดยอัตโนมัติ" + "อนุญาต" + "ไม่เป็นไร" "Wi‑Fi จะเปิดโดยอัตโนมัติ" "เมื่อคุณอยู่ใกล้เครือข่ายคุณภาพสูงที่บันทึกไว้" "ไม่ต้องเปิดอีกครั้ง" @@ -1887,8 +1888,8 @@ "ไม่จัดอยู่ในหมวดหมู่ใดๆ" "คุณตั้งค่าความสำคัญของการแจ้งเตือนเหล่านี้" "ข้อความนี้สำคัญเนื่องจากบุคคลที่เกี่ยวข้อง" - "อนุญาตให้ %1$s สร้างผู้ใช้ใหม่ด้วย %2$s ไหม" - "อนุญาตให้ %1$s สร้างผู้ใช้ใหม่ด้วย %2$s (มีผู้ใช้ที่มีบัญชีนี้อยู่แล้ว) ไหม" + "อนุญาตให้ %1$s สร้างผู้ใช้ใหม่ด้วย %2$s ไหม (มีผู้ใช้ที่มีบัญชีนี้อยู่แล้ว)" + "อนุญาตให้ %1$s สร้างผู้ใช้ใหม่ด้วย %2$s ไหม" "เพิ่มภาษา" "ค่ากำหนดภูมิภาค" "พิมพ์ชื่อภาษา" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index db96753de7c426d333c9db93e0f49a26c796be4f..3caa9cc2766e6fa97deccf4da73207e0c6c51836 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -95,6 +95,7 @@ "Mga mensahe sa voicemail" "Pagtawag gamit ang Wi-Fi" "Status ng SIM" + "High priority na status ng SIM" "Hiniling ng peer ang TTY Mode FULL" "Hiniling ng peer ang TTY Mode HCO" "Hiniling ng peer ang TTY Mode VCO" @@ -550,11 +551,11 @@ "Icon ng fingerprint" - "pamahalaan ang hardware sa authentication ng mukha" + "pamahalaan ang hardware ng face unlock" "Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha." - "gumamit ng hardware sa pag-authenticate ng mukha" - "Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate" - "Pag-authenticate ng Mukha" + "gamitin ang hardware ng face unlock" + "Pinapayagan ang app na gamitin ang hardware ng face unlock para sa pag-authenticate" + "Face unlock" "I-enroll ulit ang iyong mukha" "Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha" "Hindi makakuha ng tamang face data. Subukang muli." @@ -567,7 +568,7 @@ "Igalaw ang telepono pakaliwa." "Igalaw ang telepono pakanan." "Tumingin nang mas direkta sa iyong device." - "Hindi makita ang mukha mo. Tumingin sa telepono." + "Itapat ang mukha mo sa mismong harap ng telepono." "Masyadong magalaw. Hawakang mabuti ang telepono." "Paki-enroll muli ang iyong mukha." "Hindi na makilala ang mukha. Subukang muli." @@ -576,19 +577,19 @@ "Huwag masyadong tumingala o yumuko." "Huwag masyadong lumingon." "Alisin ang anumang humaharang sa iyong mukha." - "Linisinin ang sensor sa itaas na gilid ng screen." + "Linisin ang itaas ng iyong screen, kasama ang itim na bar" "Di ma-verify ang mukha. Di available ang hardware." - "Subukan ulit ang pag-authenticate sa mukha." + "Subukan ulit ang face unlock." "Hindi ma-store ang data ng mukha. Mag-delete muna ng iba." - "Nakansela ang operation kaugnay ng mukha" - "Kinansela ng user ang pag-authenticate ng mukha" + "Nakansela ang operation kaugnay ng mukha." + "Kinansela ng user ang face unlock." "Masyadong maraming pagsubok. Subukang muli mamaya." - "Sumobra ang pagsubok. Na-disable ang face authentication." + "Masyadong maraming pagsubok. Na-disable ang face unlock." "Hindi ma-verify ang mukha. Subukang muli." - "Hindi pa na-set up ang pag-authenticate ng mukha" - "Hindi sinusuportahan ang pag-authenticate ng mukha sa device" + "Hindi mo pa nase-set up ang face unlock." + "Hindi sinusuportahan ang face unlock sa device na ito." "Mukha %d" @@ -1254,10 +1255,10 @@ "I-tap upang makita ang lahat ng network" "Kumonekta" "Lahat ng network" - "Kumonekta sa mga Wi-Fi network?" - "Iminumungkahi ng %s" - "Oo" - "Hindi" + "Payagan ang mga iminumungkahing Wi‑Fi network?" + "Mga iminumungkahing network ng %s. Posibleng awtomatikong kumonekta ang device." + "Payagan" + "Hindi, salamat na lang" "Awtomatikong mag-o-on ang Wi‑Fi" "Kapag malapit ka sa naka-save na network na mataas ang kalidad" "Huwag i-on muli" @@ -1887,8 +1888,8 @@ "Di-nakategorya" "Ikaw ang magtatakda sa kahalagahan ng mga notification na ito." "Mahalaga ito dahil sa mga taong kasangkot." - "Payagan ang %1$s na gumawa ng bagong User sa %2$s ?" - "Payagan ang %1$s na gumawa ng bagong User sa %2$s (mayroon nang User sa account na ito) ?" + "Payagan ang %1$s na gumawa ng bagong User sa %2$s (mayroon nang User sa account na ito) ?" + "Payagan ang %1$s na gumawa ng bagong User sa %2$s ?" "Magdagdag ng wika" "Kagustuhan sa rehiyon" "I-type ang wika" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 4dfb34874493b9b3dde9b51adddca8041f0b3213..1f110d6c151fa93efe58473a061c7138ac76ff6a 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -95,6 +95,7 @@ "Sesli mesajlar" "Kablosuz çağrı" "SIM durumu" + "Yüksek öncelikli SIM durumu" "Karşı taraf TTY Modunu TAM yaptı" "Karşı taraf TTY Modunu HCO yaptı" "Karşı taraf TTY Modunu VCO yaptı" @@ -550,11 +551,11 @@ "Parmak izi simgesi" - "yüz kimlik doğrulaması donanımını yönetme" + "yüz tanıma kilidi donanımı yönet" "Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir." - "yüz kimlik doğrulaması donanımını kullanma" - "Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir" - "Yüzle Kimlik Doğrulama" + "yüz tanıma kilidi donanımını kullan" + "Uygulamanın yüz tanıma kilidi donanımı kullanmasına izin verir" + "Yüz tanıma kilidi" "Yüzünüzü yeniden kaydedin" "Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin" "Doğru yüz verileri yakalanamadı. Tekrar deneyin." @@ -567,7 +568,7 @@ "Telefonu sola hareket ettirin." "Telefonu sağa hareket ettirin." "Lütfen cihazınıza daha doğrudan bakın." - "Yüzünüz görülmüyor. Telefona bakın." + "Yüzünüz telefonun tam karşısına gelmelidir." "Çok fazla hareket ediyorsunuz. Telefonu sabit tutun." "Lütfen yüzünüzü yeniden kaydedin." "Yüz artık tanınamıyor. Tekrar deneyin." @@ -576,19 +577,19 @@ "Başınızı biraz daha az çevirin." "Başınızı biraz daha az çevirin." "Yüzünüzün görünmesini engelleyen şeyleri kaldırın." - "Ekranın üst kenarındaki sensörü temizleyin." + "Siyah çubuk da dahil olmak üzere ekranınızın üst kısmını temizleyin" "Yüz doğrulanamıyor. Donanım kullanılamıyor." - "Yüzle kimlik doğrulamayı tekrar deneyin." + "Yüz tanıma kilidini yeniden deneyin." "Yeni yüz verisi depolanamıyor. Önce eski bir tanesini silin." - "Yüz işlemi iptal edildi" - "Yüz kimlik doğrulama işlemini kullanıcı iptal etti" + "Yüz işlemi iptal edildi." + "Yüz tanıma kilidi kullanıcı tarafından iptal edildi." "Çok fazla deneme yapıldı. Daha sonra tekrar deneyin." - "Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı." + "Çok fazla deneme yapıldı. Yüz tanıma kilidi devredışı." "Yüz doğrulanamıyor. Tekrar deneyin." - "Yüz kimlik doğrulaması ayarlamadınız" - "Bu cihazda yüz kimlik doğrulaması desteklenmiyor" + "Yüz tanıma kilidi ayarlamadınız." + "Bu cihazda yüz tanıma kilidi desteklenmiyor" "Yüz %d" @@ -1254,10 +1255,10 @@ "Tüm ağları görmek için dokunun" "Bağlan" "Tüm ağlar" - "Kablosuz ağlara bağlanılsın mı?" - "Öneren: %s" - "Evet" - "Hayır" + "Önerilen kablosuz ağlara izin verilsin mi?" + "%s tarafından önerilen ağlar. Cihaz otomatik olarak bağlanabilir." + "İzin ver" + "Hayır, teşekkürler" "Kablosuz özelliği otomatik olarak açılacak" "Daha önce kaydedilmiş yüksek kaliteli bir ağın yakınında olduğunuzda" "Tekrar açılmasın" @@ -1887,8 +1888,8 @@ "Kategorize edilmemiş" "Bu bildirimlerin önem derecesini ayarladınız." "Bu, dahil olan kişiler nedeniyle önemlidir." - "%1$s uygulamasının %2$s hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi?" - "%1$s uygulamasının %2$s hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi (bu hesaba sahip bir kullanıcı zaten var)?" + "%1$s uygulamasının %2$s hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi (bu hesaba sahip bir kullanıcı zaten var)?" + "%1$s uygulamasının %2$s hesabına sahip yeni bir Kullanıcı eklemesine izin verilsin mi?" "Dil ekleyin" "Bölge tercihi" "Dil adını yazın" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 565021fd918dc4e4d4ff2dbb9e0663df1f3634d0..49e1de1018e33ef311e815f46dbf1a0a00cfd08c 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -97,6 +97,7 @@ "Повідомлення голосової пошти" "Дзвінки через Wi-Fi" "Статус SIM-карти" + "Високопріоритетні сповіщення із SIM-карти" "Пристрій змінив режим TTY на FULL" "Пристрій змінив режим TTY на HCO" "Пристрій змінив режим TTY на VCO" @@ -556,11 +557,11 @@ "Значок відбитка пальця" - "керувати обладнанням для автентифікації облич" + "керувати апаратним забезпечення для Фейсконтролю" "Додаток може активувати способи додавання й видалення шаблонів облич." - "застосовувати обладнання для автентифікації облич" - "Додаток може застосовувати обладнання для автентифікації облич" - "Автентифікація за обличчям" + "використовувати апаратне забезпечення для Фейсконтролю" + "Додаток може використовувати апаратне забезпечення для Фейсконтролю" + "Фейсконтроль" "Повторно проскануйте обличчя" "Повторно проскануйте обличчя для ефективнішого розпізнавання" "Не вдалося чітко зняти обличчя. Повторіть спробу." @@ -573,7 +574,7 @@ "Тримайте телефон лівіше." "Тримайте телефон правіше." "Дивіться просто на пристрій." - "Обличчя не видно. Дивіться на телефон." + "Тримайте телефон просто перед обличчям." "Забагато рухів. Тримайте телефон нерухомо." "Повторно проскануйте обличчя." "Розпізнати обличчя вже не вдається. Повторіть спробу." @@ -582,19 +583,19 @@ "Трохи перемістіть обличчя." "Трохи поверніть обличчя." "Приберіть об’єкти, які затуляють ваше обличчя." - "Очистьте датчик угорі екрана." + "Очистьте верхню частину екрана, зокрема чорну панель" "Не вдається перевірити обличчя. Апаратне забезпечення недоступне." - "Повторіть автентифікацію за обличчям." + "Скористайтеся Фейсконтролем ще раз." "Не вдається зберегти нові дані про обличчя. Видаліть старі." - "Дію з обличчям скасовано" - "Користувач скасував автентифікацію за обличчям" + "Дію з обличчям скасовано." + "Користувач скасував Фейсконтроль." "Забагато спроб. Повторіть пізніше." - "Забагато спроб. Автентифікацію за обличчям вимкнено." + "Забагато спроб. Фейсконтроль вимкнено." "Не вдається перевірити обличчя. Повторіть спробу." - "Ви не налаштували автентифікацію за обличчям" - "На цьому пристрої автентифікація за обличчям не підтримується" + "Ви не налаштували Фейсконтроль" + "На цьому пристрої не підтримується Фейсконтроль." "Обличчя %d" @@ -1298,10 +1299,10 @@ "Торкніться, щоб побачити всі мережі" "Під’єднатися" "Усі мережі" - "Підключатися до мереж Wi-Fi?" - "Запропоновано додатком %s" - "Так" - "Ні" + "Дозволити пропоновані мережі Wi‑Fi?" + "Мережі, пропоновані додатком %s. Пристрій може підключитися автоматично." + "Дозволити" + "Ні, дякую" "Wi-Fi вмикатиметься автоматично" "Коли ви поблизу збереженої мережі високої якості" "Не вмикати знову" @@ -1388,7 +1389,7 @@ "OK" "Пристрій заряджається через USB" "Під’єднаний пристрій заряджається через USB" - "Передавання файлів через USB ввімкнено" + "USB-передавання файлів увімк." "Режим PTP через USB ввімкнено" "Режим USB-модема ввімкнено" "Режим MIDI через USB ввімкнено" @@ -1397,7 +1398,7 @@ "Під’єднаний пристрій заряджається. Торкніться, щоб побачити більше опцій." "Виявлено аналоговий аксесуар для аудіо" "Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше." - "Налагодження USB завершено" + "Налагодження USB підключено" "Торкніться, щоб вимкнути налагоджувач USB" "Виберіть, щоб вимкнути налагодження за USB" "Увімкнено режим автоматизованого тестування" @@ -1955,8 +1956,8 @@ "Без категорії" "Ви вказуєте пріоритет цих сповіщень." "Важливе з огляду на учасників." - "Дозволити додатку %1$s створити нового користувача з обліковим записом %2$s?" - "Дозволити додатку %1$s створити нового користувача з обліковим записом %2$s (користувач із таким обліковим записом уже існує)?" + "Дозволити додатку %1$s створити нового користувача з обліковим записом %2$s (користувач із таким обліковим записом уже існує)?" + "Дозволити додатку %1$s створити нового користувача з обліковим записом %2$s?" "Додати мову" "Вибір регіону" "Введіть назву мови" diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index b510ed72b4199050e4e22a20a813d4cd5fe38b06..a54fa9cabddaca3fa6d032d325d99cbf6b41ab01 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -95,6 +95,7 @@ "صوتی میل پیغامات" "‏Wi-Fi کالنگ" "‏SIM کا اسٹیٹس" + "‏اعلی ترجیحی SIM کی صورتحال" "‏ہمسر نے TTY وضع مکمل کی درخواست کی" "‏ہمسر نے TTY وضع HCO کی درخواست کی" "‏ہمسر نے TTY وضع VCO کی درخواست کی" @@ -550,11 +551,11 @@ "فنگر پرنٹ آئیکن" - "چہرے کی توثیق کے ہارڈویئر کا نظم کریں" + "چہرے کے ذریعے غیر مقفل کرنے والے ہارڈ ویئر کا نظم کریں" "ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔" - "چہرے کی توثیق کا ہارڈویئر استعمال کریں" - "ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے" - "چہرے سے تصدیق" + "چہرے کے ذریعے غیر مقفل کرنے والا ہارڈ ویئر استعمال کریں" + "ایپ کو تصدیق کے لیے چہرے کے ذریعے غیر مقفل کرنے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتی ہے" + "چہرے کے ذریعے غیر مقفل کریں" "اپنے چہرے کو دوبارہ مندرج کریں" "شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں" "چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔" @@ -567,7 +568,7 @@ "فون کو بائیں جانب لے جائيں۔" "فون کو دائیں جانب لے جائیں۔" "براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔" - "آپ کا چہرہ دکھائی نہیں دے رہا۔ فون کی طرف دیکھیں۔" + "اپنے چہرے کو براہ راست فون کے سامنے رکھیں۔" "کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔" "براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔" "اب چہرے کی شناخت نہیں کر سکتے۔ پھر آزمائيں۔" @@ -576,19 +577,19 @@ "اپنا سر تھوڑا کم کریں۔" "اپنا سر تھوڑا کم کریں۔" "آپ کے چہرہ کو چھپانے والی ہر چیز کو ہٹائیں۔" - "اسکرین کے بالائی کنارے پر سنسر کو صاف کریں۔" + "سیاہ بار سمیت، اپنی اسکرین کے اوپری حصے کو صاف کریں" "چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔" - "چہرے سے تصدیق دوبارہ آزمائيں۔" + "چہرے کے ذریعے غیر مقفل کرنے کو دوبارہ آزمائیں۔" "چہرے کا نیا ڈیٹا اسٹور نہیں کر سکتے۔ پہلے پرانا حذف کریں۔" - "چہرے پر آپریشن منسوخ ہو گئی" - "صارف نے چہرے کی تصدیق کو منسوخ کر دیا" + "چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔" + "صارف نے چہرے کے ذریعے غیر مقفل کرنے کو منسوخ کر دیا۔" "کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔" - "کافی زیادہ کوششیں۔ چہرے سے تصدیق غیر فعال کر دی گئی ہے۔" + "کافی زیادہ کوششیں۔ چہرے کے ذریعے غیر مقفل کرنا غیر فعال کر دیا گیا۔" "چہرے کی توثیق نہیں کی جا سکی۔ پھر آزمائيں۔" - "آپ نے چہرے سے تصدیق سیٹ اپ نہیں کیا ہے" - "اس آلہ پر چہرے سے تصدیق تعاون یافتہ نہیں ہے" + "آپ نے بذریعہ چہرہ غیر مقفل کرنے کو سیٹ نہیں کیا ہے۔" + "اس آلہ پر چہرے کے ذریعے غیر مقفل کرنا تعاون یافتہ نہیں ہے۔" "چہرہ %d" @@ -1254,10 +1255,10 @@ "تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں" "منسلک کریں" "سبھی نیٹ ورکس" - "‏Wi-Fi نیٹ ورکس سے منسلک کریں؟" - "%s کی طرف سے تجویز کردہ" - "ہاں" - "نہیں" + "‏تجویز کردہ Wi‑Fi نیٹ ورکس کو اجازت دیں؟" + "%s تجویز کردہ نیٹ ورکس۔ آلہ خودکار طور پر منسلک ہو سکتا ہے۔" + "اجازت ہیں" + "نہیں شکریہ" "‏Wi‑Fi از خود آن ہو جائے گا" "جب آپ اعلی معیار کے محفوظ کردہ نیٹ ورک کے قریب ہوں" "دوبارہ آن نہ کریں" @@ -1888,8 +1889,8 @@ "غیر زمرہ بند" "ان اطلاعات کی اہمیت آپ مقرر کرتے ہیں۔" "اس میں موجود لوگوں کی وجہ سے یہ اہم ہے۔" - "%1$s کو %2$s کے ساتھ ایک نیا صارف بنانے کی اجازت دیں؟" - "%1$s کو %2$s کے ساتھ ایک نیا صارف بنانے کی اجازت دیں (اس اکاؤنٹ کے ساتھ ایک صارف پہلے سے موجود ہے) ؟" + "%1$s کو %2$s کے ساتھ ایک نیا صارف بنانے کی اجازت دیں (اس اکاؤنٹ کے ساتھ ایک صارف پہلے سے موجود ہے) ؟" + "%2$s کے ساتھ نئے صارف کو تخلیق کرنے کے لیے %1$s کو اجازت دیں ؟" "ایک زبان شامل کریں" "علاقہ کی ترجیح" "زبان کا نام ٹائپ کریں" diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 04672e4de0d6ffa40b436cdb94016be4347dad62..b17b84ba51948e00c00797290240a5dc152469fc 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -95,6 +95,7 @@ "Ovozli xabarlar" "Wi-Fi chaqiruv" "SIM karta holati" + "SIM kartadagi muhim bildirishnomalar" "Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi" @@ -550,11 +551,11 @@ "Barmoq izi belgisi" - "yuzni aniqlash qurilmasini boshqarish" + "yuz bilan ochish qurilmasini boshqarish" "Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin." - "yuzni aniqlash qurilmasidan foydalanish" - "Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi" - "Yuz tekshiruvi" + "yuz bilan ochish qurilmasidan foydalanish" + "Haqiqiylikni tekshirish uchun yuz bilan ochishdan foydalanish imkonini beradi" + "Yuz bilan ochish" "Yuzingizni yana qayd qiling" "Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling" "Yuz ravshan suratga olinmadi. Qaytadan urining." @@ -567,7 +568,7 @@ "Telefonni chapga suring." "Telefonni oʻngga suring." "Qurilmaga tik qarang." - "Yuzingiz koʻrinmayapti. Telefonga qarang." + "Telefoningizga yuzingizni tik tuting." "Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang." "Yuzingizni qaytadan qayd qildiring." "Yuz tanilmadi. Qaytadan urining." @@ -576,19 +577,19 @@ "Boshingizni asta buring." "Boshingizni asta buring." "Yuzingizni berkitayotgan narsalarni olib tashlang." - "Ekranning tepasidagi sensorni tozalang." + "Ekranning yuqori qismini, shuningdek, qora panelni ham tozalang" "Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti." - "Yana yuz tekshiruvini amalga oshirish." + "Yana yuz bilan ochishga urining." "Yuzga oid axborot saqlanmadi. Avval eskilari tozalansin." - "Yuzni aniqlash bekor qilindi" - "Yuz tekshiruvi bekor qilindi." + "Yuzni aniqlash bekor qilindi." + "Yuz bilan ochishni foydalanuvchi bekor qildi." "Juda ko‘p urinildi. Keyinroq qaytadan urining." - "Juda koʻp urinildi. Yuz tekshiruvi faolsizlantirildi." + "Juda koʻp urinildi. Yuz bilan ochish faolsizlantirildi." "Yuzingiz tasdiqlanmadi. Qaytadan urining." - "Hali yuz tekshiruvini sozlamagansiz" - "Yuz tekshiruvi bu qurilmada ishlamaydi" + "Hali yuz bilan ochishni sozlamagansiz" + "Yuz bilan ochish bu qurilmada ishlamaydi" "Yuz %d" @@ -1223,12 +1224,12 @@ "Ovozsiz rejim tanlandi" "Suhbat vaqtidagi tovush balandligi" "Kiruvchi bluetooth tovushi" - "Signal tovushi balandligi" + "Signal tovushi" "Eslatma tovushi" "Tovush balandligi" "Bluetooth tovushi" "Rington balandligi" - "Qo‘ng‘iroq tovushi balandligi" + "Suhbat tovushi" "Multimedia tovushi" "Eslatma tovushi" "Standart rington" @@ -1254,10 +1255,10 @@ "Barcha tarmoqlarni ko‘rish uchun bosing" "Ulanish" "Barcha tarmoqlar" - "Wi-Fi tarmoqlarga ulanilsinmi?" - "%s tomonidan taklif etilgan" - "Ha" - "Yoʻq" + "Tavsiya qilingan Wi‑Fi tarmoqlarga ruxsat berilsinmi?" + "%s tavsiya qilgan tarmoqlar. Qurilma avtomatik ulanishi mumkin." + "Ruxsat" + "Kerak emas" "Wi‑Fi avtomatik ravishda yoqiladi" "Saqlangan tarmoqlar ichidan signali yaxshisi hududida ekaningizda" "Qayta yoqilmasin" @@ -1354,7 +1355,7 @@ "Ulangan qurilma quvvatlanmoqda. Boshqa parametrlar uchun bosing." "Analogli audio uskuna aniqlandi" "Biriktirilgan qurilma mazkur telefon bilan mos emas. Batafsil axborot olish uchun bu yerga bosing." - "USB orqali nosozliklarni tuzatish" + "USB orqali nosozliklarni aniqlash" "USB orqali nosozliklarni aniqlashni faolsizlantirish uchun bosing" "USB orqali nosozliklarni tuzatishni o‘chirib qo‘yish uchun bosing." "Xavfsizlik sinovi rejimi yoqildi" @@ -1888,8 +1889,8 @@ "Turkumlanmagan" "Siz ushbu bildirishnomalarning muhimligini belgilagansiz." "Bu odamlar siz uchun muhim." - "%1$s ilovasiga %2$s hisobi bilan yangi foydalanuvchi yaratishiga ruxsat berilsinmi ?" - "%1$s ilovasiga %2$s hisobi bilan yangi foydalanuvchi yaratishiga ruxsat berilsinmi (bunday hisobdagi foydalanuvchi allaqachon mavjud) ?" + "%1$s ilovasiga %2$s hisobi bilan yangi foydalanuvchi yaratishiga ruxsat berilsinmi (bunday hisobdagi foydalanuvchi allaqachon mavjud) ?" + "%1$s ilovasiga %2$s hisobi bilan yangi foydalanuvchi yaratishiga ruxsat berilsinmi ?" "Til qoʻshish" "Hudud sozlamalari" "Til nomini kiriting" @@ -1928,7 +1929,7 @@ "Xaritalar va navigatsiya" "Ish va unumdorlik" "Qurilma xotirasi" - "USB orqali nosozliklarni tuzatish" + "USB orqali nosozliklarni aniqlash" "soat" "daqiqa" "Vaqtni sozlash" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 2631d87cd67c2e689aa69cf49563a58cee13ccf0..42dfee5434480f363e3e19eb735fadf55844ac5f 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -95,6 +95,7 @@ "Thư thoại" "Gọi qua Wi-Fi" "Trạng thái SIM" + "Trạng thái SIM có mức ưu tiên cao" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO" @@ -520,7 +521,7 @@ "Cho phép ứng dụng này sửa đổi bộ sưu tập ảnh của bạn." "đọc vị trí từ bộ sưu tập phương tiện" "Cho phép ứng dụng này đọc vị trí từ bộ sưu tập phương tiện của bạn." - "Hãy xác minh đó là bạn" + "Xác minh danh tính của bạn" "Không có phần cứng sinh trắc học" "Đã hủy xác thực" "Không nhận dạng được" @@ -550,11 +551,11 @@ "Biểu tượng vân tay" - "quản lý phần cứng xác thực khuôn mặt" + "quản lý phần cứng mở khóa bằng khuôn mặt" "Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng." - "sử dụng phần cứng xác thực khuôn mặt" - "Cho phép ứng dụng sử dụng phần cứng xác thực khuôn mặt để tiến hành xác thực" - "Xác thực khuôn mặt" + "sử dụng phần cứng mở khóa bằng khuôn mặt" + "Cho phép ứng dụng dùng phần cứng mở khóa bằng khuôn mặt để tiến hành xác thực" + "Mở khóa bằng khuôn mặt" "Đăng ký lại khuôn mặt của bạn" "Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn" "Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại." @@ -567,7 +568,7 @@ "Đưa điện thoại sang bên trái." "Đưa điện thoại sang bên phải." "Vui lòng nhìn thẳng vào thiết bị." - "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." + "Hướng thẳng khuôn mặt về phía trước điện thoại." "Thiết bị di chuyển quá nhiều. Giữ yên thiết bị." "Vui lòng đăng ký lại khuôn mặt của bạn." "Không nhận ra khuôn mặt. Hãy thử lại." @@ -576,19 +577,19 @@ "Hãy bớt di chuyển đầu." "Hãy bớt di chuyển đầu." "Hãy loại bỏ mọi thứ che khuất khuôn mặt bạn." - "Hãy lau sạch cảm biến ở cạnh trên của màn hình." + "Vệ sinh phần đầu màn hình, bao gồm cả thanh màu đen" "Không thể xác minh khuôn mặt. Phần cứng không có sẵn." - "Thử xác thực lại khuôn mặt." + "Thử lại thao tác mở khóa bằng khuôn mặt." "Không lưu được dữ liệu khuôn mặt mới. Hãy xóa dữ liệu cũ trước." - "Đã hủy thao tác dùng khuôn mặt" - "Người dùng đã hủy thao tác xác thực khuôn mặt" + "Đã hủy thao tác dùng khuôn mặt." + "Người dùng đã hủy thao tác mở khóa bằng khuôn mặt." "Bạn đã thử quá nhiều lần. Hãy thử lại sau." - "Quá nhiều lần thử. Tính năng xác thực khuôn mặt đã tắt." + "Quá nhiều lần thử. Đã tắt tính năng mở khóa bằng khuôn mặt." "Không thể xác minh khuôn mặt. Hãy thử lại." - "Bạn chưa thiết lập tính năng xác thực khuôn mặt" - "Thiết bị này không hỗ trợ tính năng xác thực khuôn mặt" + "Bạn chưa thiết lập tính năng mở khóa bằng khuôn mặt." + "Thiết bị này không hỗ trợ tính năng mở khóa bằng khuôn mặt." "Khuôn mặt %d" @@ -1254,10 +1255,10 @@ "Nhấn để xem tất cả các mạng" "Kết nối" "Tất cả các mạng" - "Bạn muốn kết nối với mạng Wi‑Fi?" - "Do %s đề xuất" - "Có" - "Không" + "Cho phép các mạng Wi‑Fi được đề xuất?" + "Các mạng do %s đề xuất. Thiết bị có thể kết nối tự động." + "Cho phép" + "Không, cảm ơn" "Wi-Fi sẽ tự động bật" "Khi bạn ở gần mạng đã lưu chất lượng cao" "Không bật lại" @@ -1353,9 +1354,9 @@ "Đang sạc thiết bị được kết nối. Hãy nhấn để biết thêm các tùy chọn." "Đã phát hiện phụ kiện âm thanh analog" "Thiết bị được kết nối không tương thích với điện thoại này. Nhấn để tìm hiểu thêm." - "Đã kết nối gỡ lỗi USB" - "Nhấn để tắt tính năng gỡ lỗi USB" - "Chọn để vô hiệu hóa gỡ lỗi USB." + "Đã kết nối chế độ gỡ lỗi qua USB" + "Nhấn để tắt chế độ gỡ lỗi qua USB" + "Chọn để tắt chế độ gỡ lỗi qua USB." "Đã bật Chế độ khai thác kiểm thử" "Khôi phục cài đặt gốc để tắt Chế độ khai thác kiểm thử." "Có chất lỏng hoặc mảnh vỡ trong cổng USB" @@ -1669,8 +1670,8 @@ "Đã tắt phím tắt trợ năng %1$s" "Nhấn và giữ đồng thời cả hai phím âm lượng trong 3 giây để sử dụng %1$s" "Chọn dịch vụ sẽ sử dụng khi bạn nhấn vào nút hỗ trợ tiếp cận:" - "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 2 ngón tay):" - "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận (vuốt lên từ cuối màn hình bằng 3 ngón tay):" + "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận này (vuốt lên từ cuối màn hình bằng 2 ngón tay):" + "Chọn dịch vụ sẽ sử dụng với cử chỉ hỗ trợ tiếp cận này (vuốt lên từ cuối màn hình bằng 3 ngón tay):" "Để chuyển đổi giữa các dịch vụ, hãy chạm và giữ nút hỗ trợ tiếp cận." "Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 2 ngón tay." "Để chuyển đổi giữa các dịch vụ, hãy vuốt lên và giữ bằng 3 ngón tay." @@ -1887,8 +1888,8 @@ "Chưa được phân loại" "Bạn đặt tầm quan trọng của các thông báo này." "Thông báo này quan trọng vì những người có liên quan." - "Cho phép %1$s tạo người dùng mới bằng %2$s?" - "Cho phép %1$s tạo người dùng mới bằng %2$s (người dùng có tài khoản này đã tồn tại)?" + "Cho phép %1$s tạo người dùng mới bằng %2$s (đã tồn tại người dùng có tài khoản này)?" + "Cho phép %1$s tạo người dùng mới bằng %2$s?" "Thêm ngôn ngữ" "Tùy chọn khu vực" "Nhập tên ngôn ngữ" @@ -1927,7 +1928,7 @@ "Bản đồ và dẫn đường" "Sản xuất" "Bộ nhớ của thiết bị" - "Gỡ lỗi USB" + "Gỡ lỗi qua USB" "giờ" "phút" "Đặt giờ" diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ccbd5d2932414d52c51254a8b48fa2a3ee15bc0d..4f21cc20aca40f1c9c3ce5d783df1b738b4603ee 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -95,6 +95,7 @@ "语音邮件" "WLAN 通话" "SIM 卡状态" + "高优先顺序 SIM 卡状态" "对方请求使用“TTY 完整”模式" "对方请求使用“TTY HCO”模式" "对方请求使用“TTY VCO”模式" @@ -281,7 +282,7 @@ "允许<b>%1$s</b>访问您的通讯录吗?" "位置信息" "获取此设备的位置信息" - "允许“%1$s”获取此设备的位置信息吗?" + "要允许“%1$s”获取此设备的位置信息吗?" "只有当您使用该应用时,该应用才有权访问位置信息" "要<b>一律允许</b>允许<b>%1$s</b>访问此设备的位置信息吗?" "目前只有当您使用该应用时,该应用才能访问位置信息" @@ -290,16 +291,16 @@ "允许<b>%1$s</b>访问您的日历吗?" "短信" "发送和查看短信" - "允许<b>%1$s</b>发送和查看短信吗?" + "要允许<b>%1$s</b>发送和查看短信吗?" "存储空间" "访问您设备上的照片、媒体内容和文件" "允许“%1$s”<b></b>访问您设备上的照片、媒体内容和文件吗?" "麦克风" "录制音频" "允许<b>%1$s</b>录音吗?" - "健身运动" - "访问您的健身运动" - "允许<b>%1$s</b>访问您的健身运动吗?" + "身体活动" + "获取您的身体活动数据" + "允许<b>%1$s</b>获取您的身体活动数据吗?" "相机" "拍摄照片和录制视频" "允许<b>%1$s</b>拍摄照片和录制视频吗?" @@ -428,8 +429,8 @@ "此应用可随时使用麦克风进行录音。" "向 SIM 卡发送命令" "允许应用向SIM卡发送命令(此权限具有很高的危险性)。" - "识别健身运动" - "此应用可以识别您的健身运动。" + "识别身体活动" + "此应用可以识别您的身体活动。" "拍摄照片和视频" "此应用可随时使用相机拍摄照片和录制视频。" "控制振动" @@ -550,11 +551,11 @@ "指纹图标" - "管理人脸身份验证硬件" + "管理人脸解锁硬件" "允许该应用调用方法来添加和删除可用的人脸模板。" - "使用人脸身份验证硬件" - "允许该应用使用人脸身份验证硬件进行身份验证" - "面孔身份验证" + "使用人脸解锁硬件" + "允许该应用使用人脸解锁硬件进行身份验证" + "人脸解锁" "重新注册您的面孔" "要提升识别精确度,请重新注册您的面孔" "无法捕获准确的人脸数据,请重试。" @@ -567,7 +568,7 @@ "请将手机向左移动。" "请将手机向右移动。" "请直视您的设备。" - "看不到您的脸部,请直视手机。" + "请将你的面部正对手机。" "摄像头过于晃动。请将手机拿稳。" "请重新注册您的面孔。" "已无法识别人脸,请重试。" @@ -576,19 +577,19 @@ "请将您的头稍微上下倾斜。" "请将您的头稍微左右旋转。" "请移除所有遮挡您面部的物体。" - "请将屏幕顶部边缘的传感器擦拭干净。" + "请将屏幕顶部(包括黑色条栏)清理干净" "无法验证人脸。硬件无法使用。" - "请重新尝试面孔身份验证。" + "请重新尝试人脸解锁。" "无法存储新的人脸数据。请先删除旧的人脸数据。" - "人脸处理操作已取消" - "用户已取消人脸身份验证" + "面孔处理操作已取消。" + "用户已取消人脸解锁。" "尝试次数过多,请稍后重试。" - "尝试次数过多,人脸身份验证已停用。" + "尝试次数过多,人脸解锁已停用。" "无法验证人脸,请重试。" - "您尚未设置人脸身份验证" - "此设备不支持人脸身份验证" + "您尚未设置人脸解锁。" + "此设备不支持人脸解锁。" "面孔 %d" @@ -1254,10 +1255,10 @@ "点按即可查看所有网络" "连接" "所有网络" - "要连接到 WLAN 网络吗?" - "由%s推荐" - "是" - "否" + "是否允许系统连接到建议的 WLAN 网络?" + "%s建议的网络。设备可能会自动连接到这些网络。" + "允许" + "不用了" "WLAN 将自动开启" "当您位于已保存的高品质网络信号范围内时" "不要重新开启" @@ -1887,8 +1888,8 @@ "未分类" "这些通知的重要程度由您来设置。" "这条通知涉及特定的人,因此被归为重要通知。" - "允许%1$s使用 %2$s 创建新用户吗?" - "允许%1$s使用 %2$s(目前已有用户使用此帐号)创建新用户吗?" + "允许%1$s使用 %2$s(目前已有用户使用此帐号)创建新用户吗?" + "允许%1$s使用 %2$s 创建新用户吗?" "添加语言" "区域偏好设置" "输入语言名称" diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index bf9d0cc070b205cad2dca1ae5e84ffe817888009..e01ad3bd629aec075497c9f1dba5280149f87235 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -95,6 +95,7 @@ "留言訊息" "Wi-Fi 通話" "SIM 卡狀態" + "重要 SIM 卡狀態" "對方曾要求 TTY 完整模式" "對方曾要求 TTY 模式 (HCO)" "對方曾要求 TTY 模式 (VCO)" @@ -200,7 +201,7 @@ "開啟無線網絡" "關閉無線網絡" "螢幕鎖定" - "關閉" + "關機" "鈴聲關閉" "鈴聲震動" "鈴聲開啟" @@ -224,7 +225,7 @@ "電視選項" "手機選項" "螢幕鎖定" - "關閉" + "關機" "緊急" "錯誤報告" "結束工作階段" @@ -550,11 +551,11 @@ "指紋圖示" - "管理臉孔驗證硬件" + "管理臉孔解鎖硬件" "允許應用程式調用方法,以加入和刪除可用的臉孔範本。" - "使用臉孔驗證硬件" - "允許應用程式使用臉孔驗證硬件來驗證" - "臉孔驗證" + "使用臉孔解鎖硬件" + "允許應用程式使用臉孔解鎖硬件來驗證" + "臉孔解鎖" "重新註冊臉孔" "如要提高識別能力,請重新註冊您的臉孔" "無法擷取準確的臉容資料。請再試一次。" @@ -567,7 +568,7 @@ "請將手機向左移。" "請將手機向右移。" "請以更直視的角度看著裝置。" - "看不到您的臉。請看著手機。" + "將手機對準您的臉孔正面。" "裝置不夠穩定。請拿穩手機。" "請重新註冊臉孔。" "無法再識別臉孔。請再試一次。" @@ -576,19 +577,19 @@ "減少頭部上下轉動幅度。" "減少頭部左右轉動幅度。" "移除遮住您臉孔的任何東西。" - "請清潔螢幕頂部邊緣的感應器。" + "請清理螢幕頂部,包括黑色列" "無法驗證臉孔,硬件無法使用。" - "請再次嘗試驗證臉孔。" + "請再次嘗試「臉孔解鎖」。" "無法儲存新的臉容資料,請先刪除舊資料。" - "臉孔操作已取消" - "使用者已取消臉孔驗證" + "臉孔操作已取消。" + "使用者已取消「臉孔解鎖」。" "嘗試次數過多,請稍後再試。" - "嘗試次數過多,臉孔驗證已停用。" + "嘗試次數過多,「臉孔解鎖」已停用。" "無法驗證臉孔。請再試一次。" - "您尚未設定臉孔驗證" - "此裝置不支援臉孔驗證" + "您尚未設定「臉孔解鎖」。" + "此裝置不支援「臉孔解鎖」。" "臉孔 %d" @@ -817,7 +818,7 @@ "再試一次" "再試一次" "解鎖即可使用所有功能和資料" - "已超過臉容解鎖嘗試次數上限" + "已超過臉孔解鎖嘗試次數上限" "找不到 SIM 卡" "平板電腦中沒有 SIM 卡。" "電視沒有 SIM 卡。" @@ -887,7 +888,7 @@ "展開解鎖區域。" "滑動解鎖。" "圖案解鎖。" - "臉容解鎖。" + "臉孔解鎖。" "PIN 解鎖。" "SIM 卡 PIN 碼解鎖。" "SIM 卡 PUK 解鎖。" @@ -1254,10 +1255,10 @@ "輕按即可查看所有網絡" "連線" "所有網絡" - "要連線至 Wi-Fi 網絡嗎?" - "由 %s 推薦" - "是" - "否" + "要允許連線至建議的 Wi-Fi 網絡嗎?" + "「%s」已建議網絡連線,裝置可能會自動連接網絡。" + "允許" + "不用了,謝謝" "Wi-Fi 將會自動開啟" "當您位於已儲存的高品質網絡信號範圍內時" "不要重新開啟" @@ -1887,8 +1888,8 @@ "未分類" "您可以設定這些通知的重要性。" "列為重要的原因:涉及的人。" - "要允許 %1$s 使用 %2$s 建立新使用者嗎?" - "要允許 %1$s 使用 %2$s 建立新使用者 (此帳戶目前已有此使用者) 嗎?" + "要允許 %1$s 使用 %2$s 建立新使用者 (此帳戶目前已有此使用者) 嗎?" + "要允許 %1$s 使用 %2$s 建立新使用者嗎?" "新增語言" "地區偏好設定" "輸入語言名稱" diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c50b10cec7459c51528d23549f3c89487aab5fab..cf86a1ce6a0b8586e9bb2b569f0f03f5a9d5f3e9 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -95,6 +95,7 @@ "語音留言" "Wi-Fi 通話" "SIM 卡狀態" + "高優先順序 SIM 卡狀態" "通訊對象要求使用 TTY 的 FULL 模式" "通訊對象要求使用 TTY 的 HCO 模式" "通訊對象要求使用 TTY 的 VCO 模式" @@ -550,11 +551,11 @@ "指紋圖示" - "管理臉孔驗證硬體" + "管理人臉解鎖硬體" "允許應用程式呼叫方法來新增及移除可用的臉孔範本。" - "使用臉孔驗證硬體" - "允許應用程式使用臉孔驗證硬體進行驗證" - "臉孔驗證" + "使用人臉解鎖硬體" + "允許應用程式使用人臉解鎖硬體進行驗證" + "人臉解鎖" "請重新註冊你的臉孔" "為提升辨識精準度,請重新註冊你的臉孔" "無法擷取精準臉孔資料,請再試一次。" @@ -567,7 +568,7 @@ "請將手機向左移動。" "請將手機向右移動。" "請儘可能直視裝置正面。" - "無法偵測你的臉孔,請直視手機。" + "將你的臉孔正對手機。" "鏡頭過度晃動,請拿穩手機。" "請重新註冊你的臉孔。" "已無法辨識臉孔,請再試一次。" @@ -576,19 +577,19 @@ "請將你的頭部稍微向上或向下傾斜。" "請將你的頭部稍微向左或向右旋轉。" "請移除任何會遮住臉孔的物體。" - "請清除螢幕頂端感應器的髒汙。" + "請清理螢幕頂端,包括黑色橫列" "相關硬體無法使用,因此無法驗證臉孔。" - "請重新驗證臉孔。" + "請重新進行人臉解鎖。" "無法儲存新的臉孔資料,請先刪除舊的資料。" - "臉孔處理作業已取消" - "使用者已取消臉孔驗證作業" + "臉孔處理作業已取消。" + "使用者已取消人臉解鎖作業。" "嘗試次數過多,請稍後再試。" - "嘗試次數過多,因此系統已停用臉孔驗證。" + "嘗試次數過多,因此系統已停用人臉解鎖功能。" "無法驗證臉孔,請再試一次。" - "你尚未設定臉孔驗證" - "這個裝置不支援臉孔驗證" + "你尚未設定人臉解鎖功能。" + "這個裝置不支援人臉解鎖功能。" "臉孔 %d" @@ -624,7 +625,7 @@ "修改網路使用量計算方式" "允許應用程式修改應用程式網路使用量的計算方式 (不建議一般應用程式使用)。" "存取通知" - "允許應用程式擷取、檢查及清除通知 (包括由其他應用程式發佈的通知)。" + "允許應用程式擷取、檢查及清除通知 (包括由其他應用程式發布的通知)。" "繫結至通知接聽器服務" "允許應用程式繫結至通知接聽器服務的頂層介面 (一般應用程式不需使用)。" "繫結至條件提供者服務" @@ -1254,10 +1255,10 @@ "輕觸即可查看所有網路" "連線" "所有網路" - "要連線到 Wi-Fi 網路嗎?" - "「%s」建議的無線網路" - "是" - "否" + "是否允許系統連線到建議的 Wi‑Fi 網路?" + "「%s」建議的網路。裝置可能會自動連線到這些網路。" + "允許" + "不用了,謝謝" "Wi‑Fi 將自動開啟" "當你位於已儲存的高品質網路範圍內時" "不要重新開啟" @@ -1361,7 +1362,7 @@ "USB 連接埠中有液體或灰塵" "系統已自動停用 USB 連接埠。輕觸即可瞭解詳情。" "現在可以使用 USB 連接埠" - "手機目前無法偵測液體或灰塵。" + "手機目前沒有偵測到液體或灰塵。" "正在接收錯誤報告…" "要分享錯誤報告嗎?" "正在分享錯誤報告…" @@ -1566,13 +1567,13 @@ "「%s」的數據用量比平常多" "安全性憑證" "憑證有效。" - "發佈至:" + "發布至:" "常用名稱:" "機構:" "機構單位:" - "發佈者:" + "發布者:" "有效期間:" - "發佈日期:" + "發布日期:" "到期日:" "序號:" "指紋" @@ -1887,8 +1888,8 @@ "未分類" "這些通知的重要性由你決定。" "這則通知涉及特定人士,因此被歸為重要通知。" - "要允許 %1$s%2$s 建立新使用者嗎?" - "要允許 %1$s%2$s 建立新使用者嗎 (這個帳戶目前已有使用者)?" + "要允許「%1$s」替 %2$s (這個帳戶目前已有使用者) 建立新使用者嗎?" + "要允許「%1$s」替 %2$s 建立新使用者嗎?" "新增語言" "地區偏好設定" "請輸入語言名稱" diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 0c20cf4a10ebfc184ddbe454c156a05e4c9b7a82..aa6bdac3368745d4f26bd6827899a96a479ab3e8 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -95,6 +95,7 @@ "Imilayezo yevoyisimeyili" "Ukushaya kwe-Wi-Fi" "Isimo se-SIM" + "Isimo se-SIM esiphezulu kakhulu" "Umngani ucele imodi ye-TTY ephelele" "Umngani ucele imodi ye-TTY HCO" "Umngani ucele imodi ye-TTY VCO" @@ -550,11 +551,11 @@ "Isithonjana sezigxivizo zeminwe" - "phatha izingxenyekazi zekhompuyutha zokufakazela ubuqiniso zobuso" + "phatha izingxenyekazi zekhompuyutha ze-face unlock" "Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa." - "sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso" - "Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso" - "Ukufakazela ubuqiniso bobuso" + "sebenzisa izingxenyekazi zekhompuyutha ze-face unlock" + "Ivumela uhlelo lokusebenza ukuthi lusebenzise izingxenyekazi zekhompuyutha ze-face unlock ukuze kufakazelwe ubuqiniso" + "I-Face unlock" "Phinda ubhalise ubuso bakho" "Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho" "Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi." @@ -567,7 +568,7 @@ "Hambisa ifoni ngakwesokunxele." "Hambisa ifoni ngakwesokudla." "Sicela ubheke ngokuqondile kakhulu kudivayisi yakho." - "Ayikwazi ukubona ubuso bakho. Bheka ifoni" + "Beka ubuso bakho ngqo phambi kwefoni." "Ukunyakaza okuningi kakhulu. Bamba ifoni iqine." "Sicela uphinde ubhalise ubuso bakho." "Ayisakwazi ukubona ubuso. Zama futhi." @@ -576,19 +577,19 @@ "Jikisa ikhanda lakho kancane." "Jikisa ikhanda lakho kancane." "Susa noma yini efihle ubuso bakho." - "Hlanza inzwa kunqenqema oluphezulu lwesikrini." + "Hlanza okuphezulu kwesikrini sakho, kufaka phakathi ibha emnyama" "Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali." - "Zama ukufakazela ubuqiniso bobuso futhi." + "Zama i-face unlock futhi." "Ayikwazi ukulondoloza idatha yobuso. Susa endala." - "Umsebenzi wobuso ukhanselwe" - "Ukufakazela ubuqiniso kobuso kukhanselwe umsebenzisi" + "Umsebenzi wobuso ukhanselwe." + "I-face unlock ikhanselwe umsebenzisi." "Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi." - "Imizamo eminingi kakhulu. Ukugunyaza ubuso kukhutshaziwe." + "Imizamo eminingi kakhulu. I-Face unlock ikhutshaziwe." "Ayikwazi ukuqinisekisa ubuso. Zama futhi." - "Awukakasethi ukufakazela ubuqiniso bobuso" - "Ukufakazela ubuqiniso bobuso akusekelwe kule divayisi" + "Awukakasethi i-face unlock." + "I-face unlock ayisekelwe kule divayisi." "Ubuso be-%d" @@ -1254,10 +1255,10 @@ "Thepha ukuze ubone onke amanethiwekhi" "Xhuma" "Onke amanethiwekhi" - "Xhumeka kumanethiwekhi e-Wi-Fi?" - "Kuphakanyiswe ngu-%s" - "Yebo" - "Cha" + "Vumela amanethiwekhi e-Wi-Fi aphakanyisiwe?" + "%s amanethiwekhi aphakanyisiwe. Idivayisi ingaxhumeka ngokuzenzakalela." + "Vumela" + "Cha ngiyabonga" "I-Wi-Fi izovuleka ngokuzenzakalela" "Uma useduze kwenethiwekhi yekhwalithi ephezulu elondoloziwe" "Ungaphindi uvule" @@ -1887,8 +1888,8 @@ "Akufakwanga esigabeni" "Usethe ukubaluleka kwalezi zaziso." "Lokhu kubalulekile ngenxa yabantu ababandakanyekayo." - "Vumela i-%1$s ukudala umsebenzisi omusha nge-%2$s ?" - "Vumela i-%1$s ukudala umsebenzisi omusha nge-%2$s (umsebenzisi onale akhawunti usuvel ukhona) ?" + "Vumela i-%1$s ukuthi idale umsebenzisi omusha nge-%2$s (Umsebenzisi onale akhawunti usevele ukhona) ?" + "Vumela i-%1$s ukuthi idale umsebenzisi omusha nge-%2$s ?" "Engeza ulwimi" "Okuncamelayo kwesifunda" "Thayipha igama lolimi" diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 3aa5a96cf767a08ea3c5fa3558912f954b7e60cd..6920d8b03bc000152453bb3368f0f4d0e333c146 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1127,6 +1127,22 @@ regularly selected color mode will be used if this value is negative. --> -1 + + + + + + 5 - 240000 + 330000 2000 @@ -2331,7 +2347,7 @@ false - 1500 + 300 - false + + + "DE" + @@ -4052,15 +4070,61 @@ - 10.0 + A float array containing a list of ambient brightnesses, in Lux. This array, + together with config_displayWhiteBalanceLowLightAmbientBiases, is used to generate a + lookup table used in DisplayWhiteBalanceController. This lookup table is used to map + ambient brightness readings to a bias, where the bias is used to linearly interpolate + between ambient color temperature and + config_displayWhiteBalanceLowLightAmbientColorTemperature. + This table is optional. If used, this array must, + 1) Contain at least two entries + 2) Be the same length as config_displayWhiteBalanceLowLightAmbientBiases. --> + + 10.0 + 10.0 + + An array containing a list of biases. See + config_displayWhiteBalanceLowLightAmbientBrightnesses for additional details. + This array must be in the range of [0.0, 1.0]. --> + + 0.0 + 1.0 + + + 6500.0 + + + + + + + + + + 8000.0 + + + M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09-2.08L20.59,22L22,20.59l-2.08-2.09 L22,16.41z + + + 11 + 11 + false @@ -4103,6 +4176,32 @@ for higher refresh rates to be automatically used out of the box --> 60 + + + + + + + + + + 0 + @@ -4165,6 +4264,9 @@ + + true + @@ -4181,6 +4283,15 @@ 3 + + + + + false + false diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5363ef9208868dd91cb488d27a021fdecd49e949..609659b62948d8538b3ea75e28c8d114fdf2c9c0 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. --> 0dp + + 0px + + 0px + + 0px + 48dp @@ -261,7 +279,7 @@ 1dp - 92dp + 106dp 64dp @@ -730,6 +748,8 @@ 1.22 + 48dp + 8dp 25dp diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 152b131af8f5f2746529fe8207c235f945ecef8d..71bd8022983092017d5f890ac199a5ced7435b42 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -187,6 +187,9 @@ Wi-Fi calling SIM status + + High priority SIM status + Peer requested TTY Mode FULL @@ -1502,16 +1505,16 @@ Fingerprint icon - manage face authentication hardware + manage face unlock hardware Allows the app to invoke methods to add and delete facial templates for use. - use face authentication hardware + use face unlock hardware - Allows the app to use face authentication hardware for authentication + Allows the app to use face unlock hardware for authentication - Face Authentication + Face unlock Re-enroll your face @@ -1538,7 +1541,7 @@ Please look more directly at your device. - Can\u2019t see your face. Look at the phone. + Position your face directly in front of the phone. Too much motion. Hold phone steady. @@ -1555,8 +1558,8 @@ Turn your head a little less. Remove anything hiding your face. - - Clean the sensor at the top edge of the screen. + + Clean the top of your screen, including the black bar @@ -1564,23 +1567,23 @@ Can\u2019t verify face. Hardware not available. - Try face authentication again. + Try face unlock again. Can\u2019t store new face data. Delete an old one first. - Face operation canceled - - Face authentication canceled by user + Face operation canceled. + + Face unlock canceled by user. Too many attempts. Try again later. - Too many attempts. Face authentication disabled. + Too many attempts. Face unlock disabled. Can\u2019t verify face. Try again. - You haven\u2019t set up face authentication - - Face authentication is not supported on this device + You haven\u2019t set up face unlock. + + Face unlock is not supported on this device. Face %d @@ -3387,13 +3390,13 @@ All networks - Connect to Wi\u2011Fi networks? + Allow suggested Wi\u2011Fi networks? - Suggested by %s + %s suggested networks. Device may connect automatically. - Yes + Allow - No + No thanks Wi\u2011Fi will turn on automatically @@ -5006,9 +5009,9 @@ This is important because of the people involved. - Allow %1$s to create a new User with %2$s ? + Allow %1$s to create a new User with %2$s (a User with this account already exists) ? - Allow %1$s to create a new User with %2$s (a User with this account already exists) ? + Allow %1$s to create a new User with %2$s ? diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b1ac7bd0d40b43fde32ec2099333f3d035b5084c..0a8c5d3f951209165f1c3ab77a576b888c453f42 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -650,6 +650,7 @@ + @@ -2289,14 +2290,10 @@ + - - - - - @@ -2607,6 +2604,7 @@ + @@ -3216,6 +3214,8 @@ + + @@ -3289,6 +3289,9 @@ + + + @@ -3573,7 +3576,7 @@ - + @@ -3735,6 +3738,9 @@ + + + @@ -3784,8 +3790,12 @@ - + + + + + @@ -3813,11 +3823,15 @@ + + + + @@ -3836,6 +3850,7 @@ + @@ -3847,9 +3862,13 @@ + + + + diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java index 1b6560322a132acaff372614fd3a83b69cb492f9..707d7b30e09bcb4bc6bbb90ce67da9636df004c5 100644 --- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java @@ -19,13 +19,22 @@ package android.net; import com.google.caliper.BeforeExperiment; import com.google.caliper.Param; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class NetworkStatsBenchmark { - private static final String UNDERLYING_IFACE = "wlan0"; + private static final String[] UNDERLYING_IFACES = {"wlan0", "rmnet0"}; private static final String TUN_IFACE = "tun0"; private static final int TUN_UID = 999999999; @Param({"100", "1000"}) private int mSize; + /** + * Should not be more than the length of {@link #UNDERLYING_IFACES}. + */ + @Param({"1", "2"}) + private int mNumUnderlyingIfaces; private NetworkStats mNetworkStats; @BeforeExperiment @@ -33,8 +42,10 @@ public class NetworkStatsBenchmark { mNetworkStats = new NetworkStats(0, mSize + 2); int uid = 0; NetworkStats.Entry recycle = new NetworkStats.Entry(); + final List allIfaces = getAllIfacesForBenchmark(); // also contains TUN_IFACE. + final int totalIfaces = allIfaces.size(); for (int i = 0; i < mSize; i++) { - recycle.iface = (i < mSize / 2) ? TUN_IFACE : UNDERLYING_IFACE; + recycle.iface = allIfaces.get(i % totalIfaces); recycle.uid = uid; recycle.set = i % 2; recycle.tag = NetworkStats.TAG_NONE; @@ -48,22 +59,39 @@ public class NetworkStatsBenchmark { uid++; } } - recycle.iface = UNDERLYING_IFACE; - recycle.uid = TUN_UID; - recycle.set = NetworkStats.SET_FOREGROUND; - recycle.tag = NetworkStats.TAG_NONE; - recycle.rxBytes = 90000 * mSize; - recycle.rxPackets = 40 * mSize; - recycle.txBytes = 180000 * mSize; - recycle.txPackets = 1200 * mSize; - recycle.operations = 0; - mNetworkStats.addValues(recycle); + + for (int i = 0; i < mNumUnderlyingIfaces; i++) { + recycle.iface = UNDERLYING_IFACES[i]; + recycle.uid = TUN_UID; + recycle.set = NetworkStats.SET_FOREGROUND; + recycle.tag = NetworkStats.TAG_NONE; + recycle.rxBytes = 90000 * mSize; + recycle.rxPackets = 40 * mSize; + recycle.txBytes = 180000 * mSize; + recycle.txPackets = 1200 * mSize; + recycle.operations = 0; + mNetworkStats.addValues(recycle); + } + } + + private String[] getVpnUnderlyingIfaces() { + return Arrays.copyOf(UNDERLYING_IFACES, mNumUnderlyingIfaces); + } + + /** + * Same as {@link #getVpnUnderlyingIfaces}, but also contains {@link #TUN_IFACE}. + */ + private List getAllIfacesForBenchmark() { + List ifaces = new ArrayList<>(); + ifaces.add(TUN_IFACE); + ifaces.addAll(Arrays.asList(getVpnUnderlyingIfaces())); + return ifaces; } public void timeMigrateTun(int reps) { for (int i = 0; i < reps; i++) { NetworkStats stats = mNetworkStats.clone(); - stats.migrateTun(TUN_UID, TUN_IFACE, UNDERLYING_IFACE); + stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces()); } } diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml index 68de2c0caf1892dcfa690a5a4782820fbf30d568..6503f3ee6d577787f4344dd72e518b3d7fe91dce 100644 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -20,15 +20,18 @@ @*android:drawable/ic_audio_alarm @*android:drawable/ic_audio_alarm_mute + @*android:drawable/ic_battery_80_24dp @*android:drawable/ic_bluetooth_share_icon @*android:drawable/ic_bt_headphones_a2dp @*android:drawable/ic_bt_headset_hfp @*android:drawable/ic_bt_hearing_aid @*android:drawable/ic_bt_laptop + @*android:drawable/ic_bt_misc_hid @*android:drawable/ic_bt_network_pan @*android:drawable/ic_bt_pointing_hid @*android:drawable/ic_corp_badge @*android:drawable/ic_expand_more + @*android:drawable/ic_faster_emergency @*android:drawable/ic_file_copy @*android:drawable/ic_lock @*android:drawable/ic_lock_bugreport @@ -36,6 +39,7 @@ @*android:drawable/ic_lock_power_off @*android:drawable/ic_lockscreen_ime @*android:drawable/ic_mode_edit + @*android:drawable/ic_notifications_alerted @*android:drawable/ic_phone @*android:drawable/ic_qs_airplane @*android:drawable/ic_qs_auto_rotate @@ -44,6 +48,7 @@ @*android:drawable/ic_qs_dnd @*android:drawable/ic_qs_flashlight @*android:drawable/ic_qs_night_display_on + @*android:drawable/ic_qs_ui_mode_night @*android:drawable/ic_restart @*android:drawable/ic_screenshot @*android:drawable/ic_settings_bluetooth @@ -65,6 +70,7 @@ @*android:drawable/ic_wifi_signal_3 @*android:drawable/ic_wifi_signal_4 @*android:drawable/perm_group_activity_recognition + @*android:drawable/perm_group_aural @*android:drawable/perm_group_calendar @*android:drawable/perm_group_call_log @*android:drawable/perm_group_camera diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 2bc150a564b21e96b8bb443773b41ab88ef422c0..e60e5555cc9d9fbb88547915698641361dc184f2 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -93,6 +93,7 @@ public class SettingsBackupTest { Settings.System.VOLUME_VOICE, // deprecated since API 2? Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug? Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only + Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities ); @@ -264,6 +265,7 @@ public class SettingsBackupTest { Settings.Global.EUICC_PROVISIONED, Settings.Global.EUICC_SUPPORTED_COUNTRIES, Settings.Global.EUICC_FACTORY_RESET_TIMEOUT_MILLIS, + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, Settings.Global.FANCY_IME_ANIMATIONS, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, @@ -721,7 +723,7 @@ public class SettingsBackupTest { Settings.Secure.BIOMETRIC_DEBUG_ENABLED, Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED, Settings.Secure.FACE_UNLOCK_DIVERSITY_REQUIRED, - Settings.Secure.FACE_UNLOCK_EDUCATION_INFO_DISPLAYED); + Settings.Secure.FACE_UNLOCK_RE_ENROLL); @Test public void systemSettingsBackedUpOrBlacklisted() { diff --git a/core/tests/coretests/src/android/widget/AbsSeekBarTest.java b/core/tests/coretests/src/android/widget/AbsSeekBarTest.java new file mode 100644 index 0000000000000000000000000000000000000000..aec60963c389a9a287c793bb0f5b5b6a3d6e222e --- /dev/null +++ b/core/tests/coretests/src/android/widget/AbsSeekBarTest.java @@ -0,0 +1,136 @@ +/* + * 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 android.widget; + +import static android.view.View.MeasureSpec.EXACTLY; +import static android.view.View.MeasureSpec.makeMeasureSpec; + +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RectShape; +import android.platform.test.annotations.Presubmit; +import android.view.View; + +import androidx.test.filters.SmallTest; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Arrays; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +@SmallTest +@Presubmit +public class AbsSeekBarTest { + + private Context mContext; + private AbsSeekBar mBar; + + @Before + public void setUp() throws Exception { + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + mBar = new SeekBar(mContext); + } + + @Test + public void testExclusionForThumb_limitedTo48dp() { + mBar.setPadding(10, 10, 10, 10); + mBar.setThumb(newThumb(dpToPx(20))); + mBar.setMin(0); + mBar.setMax(100); + mBar.setProgress(50); + measureAndLayout(dpToPx(200), dpToPx(100)); + List exclusions = mBar.getSystemGestureExclusionRects(); + + assertEquals("exclusions should be size 1, but was " + exclusions, 1, exclusions.size()); + assertEquals("exclusion should be centered on thumb", + center(mBar), center(exclusions.get(0))); + assertEquals("exclusion should be 48dp high", dpToPx(48), exclusions.get(0).height()); + assertEquals("exclusion should be 48dp wide", dpToPx(48), exclusions.get(0).width()); + } + + @Test + public void testExclusionForThumb_limitedToHeight() { + mBar.setPadding(10, 10, 10, 10); + mBar.setThumb(newThumb(dpToPx(20))); + mBar.setMin(0); + mBar.setMax(100); + mBar.setProgress(50); + measureAndLayout(dpToPx(200), dpToPx(32)); + List exclusions = mBar.getSystemGestureExclusionRects(); + + assertEquals("exclusions should be size 1, but was " + exclusions, 1, exclusions.size()); + assertEquals("exclusion should be centered on thumb", + center(mBar), center(exclusions.get(0))); + assertEquals("exclusion should be 32dp high", dpToPx(32), exclusions.get(0).height()); + assertEquals("exclusion should be 32dp wide", dpToPx(32), exclusions.get(0).width()); + } + + @Test + public void testExclusionForThumb_passesThroughUserExclusions() { + mBar.setSystemGestureExclusionRects(Arrays.asList(new Rect(1, 2, 3, 4))); + + mBar.setPadding(10, 10, 10, 10); + mBar.setThumb(newThumb(dpToPx(20))); + mBar.setMin(0); + mBar.setMax(100); + mBar.setProgress(50); + measureAndLayout(dpToPx(200), dpToPx(32)); + + assertThat(mBar.getSystemGestureExclusionRects(), hasItem(new Rect(1, 2, 3, 4))); + assertThat(mBar.getSystemGestureExclusionRects(), hasSize(2)); + + mBar.setSystemGestureExclusionRects(Arrays.asList(new Rect(3, 4, 5, 6))); + assertThat(mBar.getSystemGestureExclusionRects(), hasItem(new Rect(3, 4, 5, 6))); + assertThat(mBar.getSystemGestureExclusionRects(), hasSize(2)); + } + + private Point center(Rect rect) { + return new Point(rect.centerX(), rect.centerY()); + } + + private Point center(View view) { + return center(new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); + } + + private ShapeDrawable newThumb(int size) { + final ShapeDrawable thumb = new ShapeDrawable(new RectShape()); + thumb.setIntrinsicWidth(size); + thumb.setIntrinsicHeight(size); + return thumb; + } + + private void measureAndLayout(int wPx, int hPx) { + mBar.measure(makeMeasureSpec(wPx, EXACTLY), makeMeasureSpec(hPx, EXACTLY)); + mBar.layout(0, 0, wPx, hPx); + } + + private int dpToPx(int dp) { + return (int) (mContext.getResources().getDisplayMetrics().density * dp); + } +} diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index 767ec0e38a865c8987c47803aa73c2ea809c5c15..c44b7d81868d8e5baecd1f302f0291c2f7b7fec6 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -24,12 +24,19 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static com.android.internal.app.ChooserActivity.CALLER_TARGET_SCORE_BOOST; +import static com.android.internal.app.ChooserActivity.SHORTCUT_TARGET_SCORE_BOOST; +import static com.android.internal.app.ChooserActivity.TARGET_TYPE_CHOOSER_TARGET; +import static com.android.internal.app.ChooserActivity.TARGET_TYPE_DEFAULT; +import static com.android.internal.app.ChooserActivity.TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE; +import static com.android.internal.app.ChooserActivity.TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER; import static com.android.internal.app.ChooserWrapperActivity.sOverrides; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -45,6 +52,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager.ShareShortcutInfo; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -770,6 +779,139 @@ public class ChooserActivityTest { onView(withId(R.id.content_preview_file_icon)).check(matches(isDisplayed())); } + @Test + public void testGetBaseScore() { + final float testBaseScore = 0.89f; + + Intent sendIntent = createSendTextIntent(); + List resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + when(sOverrides.resolverListController.getScore(Mockito.isA( + ResolverActivity.DisplayResolveInfo.class))).thenReturn(testBaseScore); + + final ChooserWrapperActivity activity = mActivityRule + .launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + + final ResolverActivity.DisplayResolveInfo testDri = + activity.createTestDisplayResolveInfo(sendIntent, + ResolverDataProvider.createResolveInfo(3, 0), "testLabel", "testInfo", sendIntent); + final ChooserActivity.ChooserListAdapter adapter = activity.getAdapter(); + + assertThat(adapter.getBaseScore(null, 0), is(CALLER_TARGET_SCORE_BOOST)); + assertThat(adapter.getBaseScore(testDri, TARGET_TYPE_DEFAULT), is(testBaseScore)); + assertThat(adapter.getBaseScore(testDri, TARGET_TYPE_CHOOSER_TARGET), is(testBaseScore)); + assertThat(adapter.getBaseScore(testDri, TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE), + is(SHORTCUT_TARGET_SCORE_BOOST)); + assertThat(adapter.getBaseScore(testDri, TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER), + is(testBaseScore * SHORTCUT_TARGET_SCORE_BOOST)); + } + + /** + * The case when AppPrediction service is not defined in PackageManager is already covered + * as a test parameter {@link ChooserActivityTest#packageManagers}. This test is checking the + * case when the prediction service is defined but the component is not available on the device. + */ + @Test + public void testIsAppPredictionServiceAvailable() { + Intent sendIntent = createSendTextIntent(); + List resolvedComponentInfos = createResolvedComponentsForTest(2); + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + + final ChooserWrapperActivity activity = mActivityRule + .launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + + if (activity.getPackageManager().getAppPredictionServicePackageName() == null) { + assertThat(activity.isAppPredictionServiceAvailable(), is(false)); + } else { + assertThat(activity.isAppPredictionServiceAvailable(), is(true)); + + sOverrides.resources = Mockito.spy(activity.getResources()); + when(sOverrides.resources.getString(R.string.config_defaultAppPredictionService)) + .thenReturn("ComponentNameThatDoesNotExist"); + + assertThat(activity.isAppPredictionServiceAvailable(), is(false)); + } + } + + @Test + public void testConvertToChooserTarget_predictionService() { + Intent sendIntent = createSendTextIntent(); + List resolvedComponentInfos = createResolvedComponentsForTest(2); + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + + final ChooserWrapperActivity activity = mActivityRule + .launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + + List shortcuts = createShortcuts(activity); + + int[] expectedOrderAllShortcuts = {0, 1, 2, 3}; + float[] expectedScoreAllShortcuts = {1.0f, 0.99f, 0.98f, 0.97f}; + + List chooserTargets = activity.convertToChooserTarget(shortcuts, shortcuts, + null, TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); + assertCorrectShortcutToChooserTargetConversion(shortcuts, chooserTargets, + expectedOrderAllShortcuts, expectedScoreAllShortcuts); + + List subset = new ArrayList<>(); + subset.add(shortcuts.get(1)); + subset.add(shortcuts.get(2)); + subset.add(shortcuts.get(3)); + + int[] expectedOrderSubset = {1, 2, 3}; + float[] expectedScoreSubset = {0.99f, 0.98f, 0.97f}; + + chooserTargets = activity.convertToChooserTarget(subset, shortcuts, null, + TARGET_TYPE_SHORTCUTS_FROM_PREDICTION_SERVICE); + assertCorrectShortcutToChooserTargetConversion(shortcuts, chooserTargets, + expectedOrderSubset, expectedScoreSubset); + } + + @Test + public void testConvertToChooserTarget_shortcutManager() { + Intent sendIntent = createSendTextIntent(); + List resolvedComponentInfos = createResolvedComponentsForTest(2); + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + + final ChooserWrapperActivity activity = mActivityRule + .launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + + List shortcuts = createShortcuts(activity); + + int[] expectedOrderAllShortcuts = {2, 0, 3, 1}; + float[] expectedScoreAllShortcuts = {1.0f, 0.99f, 0.99f, 0.98f}; + + List chooserTargets = activity.convertToChooserTarget(shortcuts, shortcuts, + null, TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER); + assertCorrectShortcutToChooserTargetConversion(shortcuts, chooserTargets, + expectedOrderAllShortcuts, expectedScoreAllShortcuts); + + List subset = new ArrayList<>(); + subset.add(shortcuts.get(1)); + subset.add(shortcuts.get(2)); + subset.add(shortcuts.get(3)); + + int[] expectedOrderSubset = {2, 3, 1}; + float[] expectedScoreSubset = {1.0f, 0.99f, 0.98f}; + + chooserTargets = activity.convertToChooserTarget(subset, shortcuts, null, + TARGET_TYPE_SHORTCUTS_FROM_SHORTCUT_MANAGER); + assertCorrectShortcutToChooserTargetConversion(shortcuts, chooserTargets, + expectedOrderSubset, expectedScoreSubset); + } + // This test is too long and too slow and should not be taken as an example for future tests. @Test public void testDirectTargetSelectionLogging() throws InterruptedException { @@ -800,7 +942,7 @@ public class ChooserActivityTest { "testInfo", sendIntent), serviceTargets, - false) + TARGET_TYPE_CHOOSER_TARGET) ); // Thread.sleep shouldn't be a thing in an integration test but it's // necessary here because of the way the code is structured @@ -866,7 +1008,7 @@ public class ChooserActivityTest { "testInfo", sendIntent), serviceTargets, - false) + TARGET_TYPE_CHOOSER_TARGET) ); // Thread.sleep shouldn't be a thing in an integration test but it's // necessary here because of the way the code is structured @@ -927,7 +1069,7 @@ public class ChooserActivityTest { "testInfo", sendIntent), serviceTargets, - false) + TARGET_TYPE_CHOOSER_TARGET) ); // Thread.sleep shouldn't be a thing in an integration test but it's // necessary here because of the way the code is structured @@ -1066,4 +1208,43 @@ public class ChooserActivityTest { return bitmap; } + + private List createShortcuts(Context context) { + Intent testIntent = new Intent("TestIntent"); + + List shortcuts = new ArrayList<>(); + shortcuts.add(new ShareShortcutInfo( + new ShortcutInfo.Builder(context, "shortcut1") + .setIntent(testIntent).setShortLabel("label1").setRank(3).build(), // 0 2 + new ComponentName("package1", "class1"))); + shortcuts.add(new ShareShortcutInfo( + new ShortcutInfo.Builder(context, "shortcut2") + .setIntent(testIntent).setShortLabel("label2").setRank(7).build(), // 1 3 + new ComponentName("package2", "class2"))); + shortcuts.add(new ShareShortcutInfo( + new ShortcutInfo.Builder(context, "shortcut3") + .setIntent(testIntent).setShortLabel("label3").setRank(1).build(), // 2 0 + new ComponentName("package3", "class3"))); + shortcuts.add(new ShareShortcutInfo( + new ShortcutInfo.Builder(context, "shortcut4") + .setIntent(testIntent).setShortLabel("label4").setRank(3).build(), // 3 2 + new ComponentName("package4", "class4"))); + + return shortcuts; + } + + private void assertCorrectShortcutToChooserTargetConversion(List shortcuts, + List chooserTargets, int[] expectedOrder, float[] expectedScores) { + assertEquals(expectedOrder.length, chooserTargets.size()); + for (int i = 0; i < chooserTargets.size(); i++) { + ChooserTarget ct = chooserTargets.get(i); + ShortcutInfo si = shortcuts.get(expectedOrder[i]).getShortcutInfo(); + ComponentName cn = shortcuts.get(expectedOrder[i]).getTargetComponent(); + + assertEquals(si.getId(), ct.getIntentExtras().getString(Intent.EXTRA_SHORTCUT_ID)); + assertEquals(si.getShortLabel(), ct.getTitle()); + assertThat(Math.abs(expectedScores[i] - ct.getScore()) < 0.000001, is(true)); + assertEquals(cn.flattenToString(), ct.getComponentName().flattenToString()); + } + } } diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java index 44e56eaf0593108e1fefdd68373e9cfd3d67ebe6..1d567c73f3761cab9ed61d1b2155df28808dcb65 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java @@ -24,6 +24,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; @@ -84,6 +85,14 @@ public class ChooserWrapperActivity extends ChooserActivity { return super.getPackageManager(); } + @Override + public Resources getResources() { + if (sOverrides.resources != null) { + return sOverrides.resources; + } + return super.getResources(); + } + @Override protected Bitmap loadThumbnail(Uri uri, Size size) { if (sOverrides.previewThumbnail != null) { @@ -145,6 +154,7 @@ public class ChooserWrapperActivity extends ChooserActivity { public Bitmap previewThumbnail; public MetricsLogger metricsLogger; public int alternateProfileSetting; + public Resources resources; public void reset() { onSafelyStartCallback = null; @@ -157,6 +167,7 @@ public class ChooserWrapperActivity extends ChooserActivity { resolverListController = mock(ResolverListController.class); metricsLogger = mock(MetricsLogger.class); alternateProfileSetting = 0; + resources = null; } } } diff --git a/core/tests/screenshothelpertests/Android.bp b/core/tests/screenshothelpertests/Android.bp new file mode 100644 index 0000000000000000000000000000000000000000..3d54b68b7ddc1d888c7aeaf28ea7114fbbb640fb --- /dev/null +++ b/core/tests/screenshothelpertests/Android.bp @@ -0,0 +1,28 @@ +android_test { + name: "ScreenshotHelperTests", + + srcs: [ + "src/**/*.java", + ], + + static_libs: [ + "frameworks-base-testutils", + "androidx.test.runner", + "androidx.test.rules", + "androidx.test.ext.junit", + "mockito-target-minus-junit4", + "platform-test-annotations", + ], + + libs: [ + "android.test.runner", + "android.test.base", + "android.test.mock", + ], + + platform_apis: true, + test_suites: ["device-tests"], + + certificate: "platform", +} + diff --git a/core/tests/screenshothelpertests/AndroidManifest.xml b/core/tests/screenshothelpertests/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e12ef4db3581708d6c030c839ff0987d074d83a --- /dev/null +++ b/core/tests/screenshothelpertests/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..848364584ef3e5b4fbdf14d90ea5abacb7f114af --- /dev/null +++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java @@ -0,0 +1,98 @@ +/* + * 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.internal.util; + +import static android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN; +import static android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.fail; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +@RunWith(AndroidJUnit4.class) +public final class ScreenshotHelperTest { + private Context mContext; + private ScreenshotHelper mScreenshotHelper; + private Handler mHandler; + + + @Before + public void setUp() { + // `ScreenshotHelper.notifyScreenshotError()` calls `Context.sendBroadcastAsUser()` and + // `Context.bindServiceAsUser`. + // + // This raises a `SecurityException` if the device is locked. Calling either `Context` + // method results in a broadcast of `android.intent.action. USER_PRESENT`. Only the system + // process is allowed to broadcast that `Intent`. + mContext = Mockito.spy(Context.class); + Mockito.doNothing().when(mContext).sendBroadcastAsUser(any(), any()); + Mockito.doReturn(true).when(mContext).bindServiceAsUser(any(), any(), anyInt(), any()); + + mHandler = new Handler(Looper.getMainLooper()); + mScreenshotHelper = new ScreenshotHelper(mContext); + } + + @Test + public void testFullscreenScreenshot() { + mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, false, false, mHandler, null); + } + + @Test + public void testSelectedRegionScreenshot() { + mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_SELECTED_REGION, false, false, mHandler, + null); + } + + @Test + public void testScreenshotTimesOut() { + long timeoutMs = 10; + + CountDownLatch lock = new CountDownLatch(1); + mScreenshotHelper.takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN, false, false, timeoutMs, + mHandler, + worked -> { + assertFalse(worked); + lock.countDown(); + }); + + try { + // Add tolerance for delay to prevent flakes. + long awaitDurationMs = timeoutMs + 100; + if (!lock.await(awaitDurationMs, TimeUnit.MILLISECONDS)) { + fail("lock never freed"); + } + } catch (InterruptedException e) { + fail("lock interrupted"); + } + } +} diff --git a/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java index 2596ecefe53df246ea4456ac2ebb7a671557bf3c..27f3596f239ba0cb5d112da5716435f735c6c4ee 100644 --- a/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/XmlUtilsTest.java @@ -16,13 +16,22 @@ package com.android.internal.util; +import static org.junit.Assert.assertArrayEquals; + +import android.util.Xml; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; + import junit.framework.TestCase; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlSerializer; + public class XmlUtilsTest extends TestCase { // https://code.google.com/p/android/issues/detail?id=63717 @@ -38,4 +47,23 @@ public class XmlUtilsTest extends TestCase { assertEquals("nullValue", deserialized.get(null)); assertEquals("fooValue", deserialized.get("foo")); } + + public void testreadWriteXmlByteArrayValue() throws Exception { + byte[] testByteArray = {0x1 , 0xa, 0xb, 0x9, 0x34, (byte) 0xaa, (byte) 0xba, (byte) 0x99}; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); + XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(baos, StandardCharsets.UTF_8.name()); + serializer.startDocument(null, true); + XmlUtils.writeValueXml(testByteArray, "testByteArray", serializer); + serializer.endDocument(); + + InputStream bais = new ByteArrayInputStream(baos.toByteArray()); + XmlPullParser pullParser = Xml.newPullParser(); + pullParser.setInput(bais, StandardCharsets.UTF_8.name()); + String[] name = new String[1]; + byte[] testByteArrayDeserialized = (byte[]) XmlUtils.readValueXml(pullParser, name); + assertEquals("testByteArray", name[0]); + assertArrayEquals(testByteArray, testByteArrayDeserialized); + } } diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 233f82640a203370d516964a38e31f455eb12396..65f784dbee8324297b9ff58c0c4689fb0dcee054 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -205,6 +205,10 @@ targetSdk="29"> + + + diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index 072beae8baf7e12e0f910b8a7da83e2ae3095b5e..c6920977f6b9c8f0d7dfeeff2c2f70bf6f7fb933 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -323,14 +323,16 @@ NotoSansLaoUI-Bold.ttf - NotoSansMyanmar-Regular-ZawDecode.ttf - NotoSansMyanmar-Bold-ZawDecode.ttf + NotoSansMyanmar-Regular.otf + NotoSansMyanmar-Medium.otf + NotoSansMyanmar-Bold.otf NotoSerifMyanmar-Regular.otf NotoSerifMyanmar-Bold.otf - NotoSansMyanmarUI-Regular-ZawDecode.ttf - NotoSansMyanmarUI-Bold-ZawDecode.ttf + NotoSansMyanmarUI-Regular.otf + NotoSansMyanmarUI-Medium.otf + NotoSansMyanmarUI-Bold.otf NotoSansThaana-Regular.ttf diff --git a/graphics/java/android/graphics/RectF.java b/graphics/java/android/graphics/RectF.java index 3361fa21e44b7f0ba498dfae69ef25a8db3be9e0..1d294d51a2357e43c59e5511b1d667a07819f456 100644 --- a/graphics/java/android/graphics/RectF.java +++ b/graphics/java/android/graphics/RectF.java @@ -27,7 +27,7 @@ import java.io.PrintWriter; /** * RectF holds four float coordinates for a rectangle. The rectangle is - * represented by the coordinates of its 4 edges (left, top, right bottom). + * represented by the coordinates of its 4 edges (left, top, right, bottom). * These fields can be accessed directly. Use width() and height() to retrieve * the rectangle's width and height. Note: most methods do not check to see that * the coordinates are sorted correctly (i.e. left <= right and top <= bottom). diff --git a/libs/androidfw/DisplayEventDispatcher.cpp b/libs/androidfw/DisplayEventDispatcher.cpp index 6606148956031bce27cbf6780258cc2095867cdb..d8a3f42690f4f0b76915290c0695da412f4b6ba1 100644 --- a/libs/androidfw/DisplayEventDispatcher.cpp +++ b/libs/androidfw/DisplayEventDispatcher.cpp @@ -34,8 +34,9 @@ namespace android { static const size_t EVENT_BUFFER_SIZE = 100; DisplayEventDispatcher::DisplayEventDispatcher(const sp& looper, - ISurfaceComposer::VsyncSource vsyncSource) : - mLooper(looper), mReceiver(vsyncSource), mWaitingForVsync(false) { + ISurfaceComposer::VsyncSource vsyncSource, + ISurfaceComposer::ConfigChanged configChanged) : + mLooper(looper), mReceiver(vsyncSource, configChanged), mWaitingForVsync(false) { ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this); } diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h index 5381c0174cb0b27915ce07582de32529ae71bf63..8bc25202b3ab1cf5fb4eb26d123073b5500111b7 100644 --- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h +++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h @@ -23,7 +23,8 @@ namespace android { class DisplayEventDispatcher : public LooperCallback { public: explicit DisplayEventDispatcher(const sp& looper, - ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp); + ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::ConfigChanged configChanged = ISurfaceComposer::eConfigChangedSuppress); status_t initialize(); void dispose(); diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 0ec3554335fb0fb3c21778ec6db2a656ffb5831c..911b5453cd4474fcf6b660315934c8ee9b80ef8a 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -148,7 +148,8 @@ void CanvasContext::setSurface(sp&& surface) { if (surface) { mNativeSurface = new ReliableSurface{std::move(surface)}; - mNativeSurface->setDequeueTimeout(1000_ms); + // TODO: Fix error handling & re-shorten timeout + mNativeSurface->setDequeueTimeout(4000_ms); } else { mNativeSurface = nullptr; } diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 41cb8fdc66bd59f4d26d794472a92205a6f0c002..71c5b53f727a451b882d5e8631a2960054770e93 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -156,7 +156,9 @@ void RenderThread::initializeDisplayEventReceiver() { LOG_ALWAYS_FATAL_IF(mVsyncSource, "Initializing a second DisplayEventReceiver?"); if (!Properties::isolatedProcess) { - auto receiver = std::make_unique(); + auto receiver = std::make_unique( + ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::eConfigChangedDispatch); status_t status = receiver->initCheck(); LOG_ALWAYS_FATAL_IF(status != NO_ERROR, "Initialization of DisplayEventReceiver " diff --git a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java index 78239714ca3ba9f31a5dcd1cc8e9719a63b4702b..b6a24e41d95837c68c5113cf5a7c50585de9aac5 100644 --- a/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java +++ b/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java @@ -31,7 +31,9 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.location.nano.GnssLogsProto.GnssLog; import com.android.internal.location.nano.GnssLogsProto.PowerMetrics; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; /** * GnssMetrics: Is used for logging GNSS metrics @@ -60,13 +62,20 @@ public class GnssMetrics { /** Default time between location fixes (in millisecs) */ private static final int DEFAULT_TIME_BETWEEN_FIXES_MILLISECS = 1000; + /** The number of hertz in one MHz */ + private static final double HZ_PER_MHZ = 1e6; + /* The time since boot when logging started */ private String logStartInElapsedRealTime; /* GNSS power metrics */ private GnssPowerMetrics mGnssPowerMetrics; - /** + /** Frequency range of GPS L5, Galileo E5a, QZSS J5 frequency band */ + private static final double L5_CARRIER_FREQ_RANGE_LOW_HZ = 1164 * HZ_PER_MHZ; + private static final double L5_CARRIER_FREQ_RANGE_HIGH_HZ = 1189 * HZ_PER_MHZ; + + /** * A boolean array indicating whether the constellation types have been used in fix. */ private boolean[] mConstellationTypes; @@ -78,6 +87,11 @@ public class GnssMetrics { timeToFirstFixSecStatistics = new Statistics(); positionAccuracyMeterStatistics = new Statistics(); topFourAverageCn0Statistics = new Statistics(); + mTopFourAverageCn0StatisticsL5 = new Statistics(); + mNumSvStatus = 0; + mNumL5SvStatus = 0; + mNumSvStatusUsedInFix = 0; + mNumL5SvStatusUsedInFix = 0; reset(); } @@ -133,11 +147,16 @@ public class GnssMetrics { return; } - /* + /** * Logs CN0 when at least 4 SVs are available * + * @param cn0s + * @param numSv + * @param svCarrierFreqs */ - public void logCn0(float[] cn0s, int numSv) { + public void logCn0(float[] cn0s, int numSv, float[] svCarrierFreqs) { + // Calculate L5 Cn0 + logCn0L5(numSv, cn0s, svCarrierFreqs); if (numSv == 0 || cn0s == null || cn0s.length == 0 || cn0s.length < numSv) { if (numSv == 0) { mGnssPowerMetrics.reportSignalQuality(null, 0); @@ -161,6 +180,76 @@ public class GnssMetrics { return; } + /* Helper function to check if a SV is L5 */ + private static boolean isL5Sv(float carrierFreq) { + return (carrierFreq >= L5_CARRIER_FREQ_RANGE_LOW_HZ + && carrierFreq <= L5_CARRIER_FREQ_RANGE_HIGH_HZ); + } + + /** + * Logs sv status data + * + * @param svCount + * @param svidWithFlags + * @param svCarrierFreqs + */ + public void logSvStatus(int svCount, int[] svidWithFlags, float[] svCarrierFreqs) { + boolean isL5 = false; + // Calculate SvStatus Information + for (int i = 0; i < svCount; i++) { + if ((svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) != 0) { + mNumSvStatus++; + isL5 = isL5Sv(svCarrierFreqs[i]); + if (isL5) { + mNumL5SvStatus++; + } + if ((svidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) { + mNumSvStatusUsedInFix++; + if (isL5) { + mNumL5SvStatusUsedInFix++; + } + } + } + } + return; + } + + /** + * Logs CN0 when at least 4 SVs are available L5 Only + * + * @param svCount + * @param cn0s + * @param svCarrierFreqs + */ + private void logCn0L5(int svCount, float[] cn0s, float[] svCarrierFreqs) { + if (svCount == 0 || cn0s == null || cn0s.length == 0 || cn0s.length < svCount + || svCarrierFreqs == null || svCarrierFreqs.length == 0 + || svCarrierFreqs.length < svCount) { + return; + } + // Create array list of all L5 satellites in report. + ArrayList CnoL5Array = new ArrayList(); + for (int i = 0; i < svCount; i++) { + if (isL5Sv(svCarrierFreqs[i])) { + CnoL5Array.add(cn0s[i]); + } + } + if (CnoL5Array.size() == 0 || CnoL5Array.size() < 4) { + return; + } + int numSvL5 = CnoL5Array.size(); + Collections.sort(CnoL5Array); + if (CnoL5Array.get(numSvL5 - 4) > 0.0) { + double top4AvgCn0 = 0.0; + for (int i = numSvL5 - 4; i < numSvL5; i++) { + top4AvgCn0 += (double) CnoL5Array.get(i); + } + top4AvgCn0 /= 4; + mTopFourAverageCn0StatisticsL5.addItem(top4AvgCn0); + } + return; + } + /** * Logs that a constellation type has been observed. @@ -201,6 +290,24 @@ public class GnssMetrics { msg.standardDeviationTopFourAverageCn0DbHz = topFourAverageCn0Statistics.getStandardDeviation(); } + if (mNumSvStatus > 0) { + msg.numSvStatusProcessed = mNumSvStatus; + } + if (mNumL5SvStatus > 0) { + msg.numL5SvStatusProcessed = mNumL5SvStatus; + } + if (mNumSvStatusUsedInFix > 0) { + msg.numSvStatusUsedInFix = mNumSvStatusUsedInFix; + } + if (mNumL5SvStatusUsedInFix > 0) { + msg.numL5SvStatusUsedInFix = mNumL5SvStatusUsedInFix; + } + if (mTopFourAverageCn0StatisticsL5.getCount() > 0) { + msg.numL5TopFourAverageCn0Processed = mTopFourAverageCn0StatisticsL5.getCount(); + msg.meanL5TopFourAverageCn0DbHz = mTopFourAverageCn0StatisticsL5.getMean(); + msg.standardDeviationL5TopFourAverageCn0DbHz = + mTopFourAverageCn0StatisticsL5.getStandardDeviation(); + } msg.powerMetrics = mGnssPowerMetrics.buildProto(); msg.hardwareRevision = SystemProperties.get("ro.boot.revision", ""); String s = Base64.encodeToString(GnssLog.toByteArray(msg), Base64.DEFAULT); @@ -248,6 +355,22 @@ public class GnssMetrics { topFourAverageCn0Statistics.getMean()).append("\n"); s.append(" Top 4 Avg CN0 standard deviation (dB-Hz): ").append( topFourAverageCn0Statistics.getStandardDeviation()).append("\n"); + } + s.append(" Total number of sv status messages processed: ").append( + mNumSvStatus).append("\n"); + s.append(" Total number of L5 sv status messages processed: ").append( + mNumL5SvStatus).append("\n"); + s.append(" Total number of sv status messages processed, where sv is used in fix: ").append( + mNumSvStatusUsedInFix).append("\n"); + s.append(" Total number of L5 sv status messages processed, where sv is used in fix: ").append( + mNumL5SvStatusUsedInFix).append("\n"); + s.append(" Number of L5 CN0 reports: ").append( + mTopFourAverageCn0StatisticsL5.getCount()).append("\n"); + if (mTopFourAverageCn0StatisticsL5.getCount() > 0) { + s.append(" L5 Top 4 Avg CN0 mean (dB-Hz): ").append( + mTopFourAverageCn0StatisticsL5.getMean()).append("\n"); + s.append(" L5 Top 4 Avg CN0 standard deviation (dB-Hz): ").append( + mTopFourAverageCn0StatisticsL5.getStandardDeviation()).append("\n"); } s.append(" Used-in-fix constellation types: "); for (int i = 0; i < mConstellationTypes.length; i++) { @@ -333,6 +456,21 @@ public class GnssMetrics { /** Top 4 average CN0 statistics */ private Statistics topFourAverageCn0Statistics; + /** Top 4 average CN0 statistics L5 */ + private Statistics mTopFourAverageCn0StatisticsL5; + + /** Total number of sv status messages processed */ + private int mNumSvStatus; + + /** Total number of L5 sv status messages processed */ + private int mNumL5SvStatus; + + /** Total number of sv status messages processed, where sv is used in fix */ + private int mNumSvStatusUsedInFix; + + /** Total number of L5 sv status messages processed, where sv is used in fix */ + private int mNumL5SvStatusUsedInFix; + /** * Resets GNSS metrics */ @@ -344,6 +482,11 @@ public class GnssMetrics { timeToFirstFixSecStatistics.reset(); positionAccuracyMeterStatistics.reset(); topFourAverageCn0Statistics.reset(); + mTopFourAverageCn0StatisticsL5.reset(); + mNumSvStatus = 0; + mNumL5SvStatus = 0; + mNumSvStatusUsedInFix = 0; + mNumL5SvStatusUsedInFix = 0; resetConstellationTypes(); return; } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index e29e5698439df8982a9629c4a4983e5a305ff6b9..7cd09de413464955c41cd5dfd983ea24947c4ade 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -1184,8 +1184,15 @@ public class AudioTrack extends PlayerBase int bufferSizeInBytes, int mode) { // If no attributes, OK // otherwise check attributes for USAGE_MEDIA and CONTENT_UNKNOWN, MUSIC, or MOVIE. + // Only consider flags that are not compatible with FLAG_DEEP_BUFFER. We include + // FLAG_DEEP_BUFFER because if set the request is explicit and + // shouldEnablePowerSaving() should return false. + final int flags = attributes.getAllFlags() + & (AudioAttributes.FLAG_DEEP_BUFFER | AudioAttributes.FLAG_LOW_LATENCY + | AudioAttributes.FLAG_HW_AV_SYNC | AudioAttributes.FLAG_BEACON); + if (attributes != null && - (attributes.getAllFlags() != 0 // cannot have any special flags + (flags != 0 // cannot have any special flags || attributes.getUsage() != AudioAttributes.USAGE_MEDIA || (attributes.getContentType() != AudioAttributes.CONTENT_TYPE_UNKNOWN && attributes.getContentType() != AudioAttributes.CONTENT_TYPE_MUSIC diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp index cfcba76d3af298ae80b98573517f133fc6c1376d..7a0eeee17b0d286ec23bfd0c321f6e74ffb51903 100644 --- a/media/jni/android_media_ImageWriter.cpp +++ b/media/jni/android_media_ImageWriter.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -126,7 +127,7 @@ private: Condition mCondition; std::deque> mQueue; - static const nsecs_t kWaitDuration = 20000000; // 20 ms + static const nsecs_t kWaitDuration = 500000000; // 500 ms }; sp mThread; @@ -401,8 +402,28 @@ static jlong ImageWriter_init(JNIEnv* env, jobject thiz, jobject weakThiz, jobje return 0; } } else { + // Set consumer buffer format to user specified format + PublicFormat publicFormat = static_cast(userFormat); + int nativeFormat = mapPublicFormatToHalFormat(publicFormat); + android_dataspace nativeDataspace = mapPublicFormatToHalDataspace(publicFormat); + res = native_window_set_buffers_format(anw.get(), nativeFormat); + if (res != OK) { + ALOGE("%s: Unable to configure consumer native buffer format to %#x", + __FUNCTION__, nativeFormat); + jniThrowRuntimeException(env, "Failed to set Surface format"); + return 0; + } + + res = native_window_set_buffers_data_space(anw.get(), nativeDataspace); + if (res != OK) { + ALOGE("%s: Unable to configure consumer dataspace %#x", + __FUNCTION__, nativeDataspace); + jniThrowRuntimeException(env, "Failed to set Surface dataspace"); + return 0; + } surfaceFormat = userFormat; } + ctx->setBufferFormat(surfaceFormat); env->SetIntField(thiz, gImageWriterClassInfo.mWriterFormat, reinterpret_cast(surfaceFormat)); diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index e08dab48ce3938799dcaa7721d943de1f5facc05..2a4a68dd4c674c0892a1eb6279f43c5ceb2fdfc9 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -17,7 +17,9 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "SoundPool" +#include #include +#include #include @@ -950,6 +952,8 @@ void SoundChannel::process(int event, void *info, unsigned long toggle) ALOGV("process %p channel %d event %s", this, mChannelID, (event == AudioTrack::EVENT_UNDERRUN) ? "UNDERRUN" : "BUFFER_END"); + // Only BUFFER_END should happen as we use static tracks. + setVolume_l(0.f, 0.f); // set volume to 0 to indicate no need to ramp volume down. mSoundPool->addToStopList(this); } else if (event == AudioTrack::EVENT_LOOP_END) { ALOGV("End loop %p channel %d", this, mChannelID); @@ -965,8 +969,18 @@ void SoundChannel::process(int event, void *info, unsigned long toggle) bool SoundChannel::doStop_l() { if (mState != IDLE) { - setVolume_l(0, 0); ALOGV("stop"); + if (mLeftVolume != 0.f || mRightVolume != 0.f) { + setVolume_l(0.f, 0.f); + if (mSoundPool->attributes()->usage != AUDIO_USAGE_GAME) { + // Since we're forcibly halting the previously playing content, + // we sleep here to ensure the volume is ramped down before we stop the track. + // Ideally the sleep time is the mixer period, or an approximation thereof + // (Fast vs Normal tracks are different). + ALOGV("sleeping: ChannelID:%d SampleID:%d", mChannelID, mSample->sampleID()); + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } + } mAudioTrack->stop(); mPrevSampleID = mSample->sampleID(); mSample.clear(); diff --git a/packages/BackupRestoreConfirmation/res/values-in/strings.xml b/packages/BackupRestoreConfirmation/res/values-in/strings.xml index 63a3772d863d25c11a212f801c93db20095ce555..5c82adff83faf24e1c878371cfa831357e042556 100644 --- a/packages/BackupRestoreConfirmation/res/values-in/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-in/strings.xml @@ -16,9 +16,9 @@ - "Backup sepenuhnya" + "Pencadangan lengkap" "Pemulihan sepenuhnya" - "Backup lengkap semua data ke komputer yang tersambung telah diminta. Apakah Anda ingin mengizinkan hal ini dilakukan?\n\nJika Anda tidak meminta backup ini, jangan izinkan operasi dilanjutkan." + "Pencadangan semua data ke komputer yang tersambung telah diminta. Apakah Anda ingin mengizinkan hal ini dilakukan?\n\nJika Anda tidak meminta pencadangan ini, jangan izinkan operasi dilanjutkan." "Cadangkan data saya" "Jangan mencadangkan" "Pemulihan lengkap semua data dari komputer desktop yang tersambung telah diminta. Apakah Anda ingin mengizinkan hal ini?\n\nJika Anda tidak meminta pemulihan ini, jangan izinkan operasi dilanjutkan. Operasi ini akan mengganti data apa pun yang saat ini ada dalam perangkat!" @@ -31,8 +31,8 @@ "Jika Anda ingin mengenkripsi data cadangan lengkap, masukkan sandi di bawah:" "Karena perangkat Anda dienkripsi, Anda perlu mengenkripsi cadangan. Masukkan sandi di bawah:" "Jika data pemulihan dienkripsi, masukkan sandi di bawah:" - "Backup dimulai..." - "Backup selesai" + "Pencadangan dimulai..." + "Pencadangan selesai" "Pemulihan dimulai..." "Pemulihan berakhir" "Waktu tunggu operasi habis" diff --git a/packages/CaptivePortalLogin/res/values-bs/strings.xml b/packages/CaptivePortalLogin/res/values-bs/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..60c153a06471b6ee20675781c0ae9bf75e86bebb --- /dev/null +++ b/packages/CaptivePortalLogin/res/values-bs/strings.xml @@ -0,0 +1,24 @@ + + + "Prijava na zaštitnom portalu" + "Koristi ovu mrežu kakva jeste" + "Ne koristi ovu mrežu" + "Prijava na mrežu" + "Prijava na %1$s" + "Mreža kojoj pokušavate pristupiti ima sigurnosnih problema." + "Naprimjer, stranica za prijavu možda ne pripada prikazanoj organizaciji." + "Ipak nastavi preko preglednika" + "Ova potvrda ne potiče iz pouzdanog izvora." + "Naziv web lokacije se ne podudara s nazivom na potvrdi." + "Ova potvrda je istekla." + "Ova potvrda još uvijek nije važeća." + "Ova potvrda sadrži nevažeći datum." + "Ova potvrda je nevažeća." + "Nepoznata greška potvrde." + "Sigurnosno upozorenje" + "Prikaži potvrdu" + "UREDU" + "Adresa:" + "Informacije o stranici" + diff --git a/packages/CarSystemUI/Android.bp b/packages/CarSystemUI/Android.bp index 589623b0d6cd89381986f350b7520c81f9e500d0..672879ae6e9d492c688ab69e467ca848cd436271 100644 --- a/packages/CarSystemUI/Android.bp +++ b/packages/CarSystemUI/Android.bp @@ -13,21 +13,22 @@ // See the License for the specific language governing permissions and // limitations under the License. // -android_app { - name: "CarSystemUI", - - overrides: [ - "SystemUI", - ], +android_library { + name: "CarSystemUI-core", srcs: [ "src/**/*.java", "src/**/I*.aidl", ], + resource_dirs: [ + "res-keyguard", + "res", + ], + static_libs: [ - "CarNotificationLib", "SystemUI-core", + "CarNotificationLib", "SystemUIPluginLib", "SystemUISharedLib", "SettingsLib", @@ -47,6 +48,8 @@ android_app { "androidx.lifecycle_lifecycle-extensions", "SystemUI-tags", "SystemUI-proto", + "dagger2-2.19", + "//external/kotlinc:kotlin-annotations", ], libs: [ @@ -56,6 +59,28 @@ android_app { manifest: "AndroidManifest.xml", + plugins: ["dagger2-compiler-2.19"], + +} + +android_app { + name: "CarSystemUI", + + static_libs: [ + "CarSystemUI-core", + ], + + libs: [ + "telephony-common", + "android.car", + ], + + resource_dirs: [], + + overrides: [ + "SystemUI", + ], + platform_apis: true, product_specific: true, certificate: "platform", @@ -66,12 +91,6 @@ android_app { "proguard.flags", ], }, - resource_dirs: [ - "res-keyguard", - "res", - ], - - dxflags: ["--multi-dex"], aaptflags: [ @@ -79,6 +98,8 @@ android_app { "com.android.keyguard", ], + kotlincflags: ["-Xjvm-default=enable"], + plugins: ["dagger2-compiler-2.19"], required: ["privapp_whitelist_com.android.systemui"], diff --git a/packages/CarSystemUI/AndroidManifest.xml b/packages/CarSystemUI/AndroidManifest.xml index 195d4fee5162713e4884436185ad2d0a67f428b2..261b9f508ccd665a2dde2bd3f3ab09f927a02bb4 100644 --- a/packages/CarSystemUI/AndroidManifest.xml +++ b/packages/CarSystemUI/AndroidManifest.xml @@ -21,4 +21,8 @@ coreApp="true"> + + + + diff --git a/packages/SystemUI/res/layout/left_docked_overlay.xml b/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml similarity index 58% rename from packages/SystemUI/res/layout/left_docked_overlay.xml rename to packages/CarSystemUI/res/drawable/unlock_dialog_background.xml index 430143ca3bc285ccd2d622dc3426dddfc6c604ad..bec6ba7b7c4fcf39cda5232e89278f1d66ef84ff 100644 --- a/packages/SystemUI/res/layout/left_docked_overlay.xml +++ b/packages/CarSystemUI/res/drawable/unlock_dialog_background.xml @@ -12,8 +12,15 @@ ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and - ~ limitations under the License. + ~ limitations under the License --> - - - + + + + + \ No newline at end of file diff --git a/packages/CarSystemUI/res/layout/super_status_bar.xml b/packages/CarSystemUI/res/layout/super_status_bar.xml index 728a239a4ca940a073e1ad286e416ca5431b770f..e1bcc2e5f86c28ff5d19d873b289991c05cd9a8d 100644 --- a/packages/CarSystemUI/res/layout/super_status_bar.xml +++ b/packages/CarSystemUI/res/layout/super_status_bar.xml @@ -41,6 +41,14 @@ android:visibility="invisible"/> + + + + + + + + + + + + + + + + +